ZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGY4MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJhOTc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUgCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDg4ODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3ZTNiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZW52amF2YWRvY3RvYy54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UvLFwKLSAgICAgICAgICAgICAgIHRvcGljc0Vudl9SZWZlcmVuY2UueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sLFwKLSAgICAgICAgICAgICAgIGJvb2suY3NzLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS5jc3MKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRW52SmF2YWRvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEVudkphdmFkb2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzFjMmE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRW52SmF2YWRvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QKLSAgICBuYW1lPSJqYXZhZG9jIgotICAgIGRlZmF1bHQ9Im1haW4iCi0gICAgYmFzZWRpcj0iLiI+Ci0JCi0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9ImJ1aWxkRGlyZWN0b3J5IgotICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIgLz4KLQotICAgIDwhLS0gPSA9ID0gc3RhbmRhcmQgcHJvcGVydGllcyBwYXR0ZXJuID0gPSA9IC0tPgotICAgIDwhLS0gCi0gICAgICAgIEZpcnN0IGdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICAgICAgTm90ZSB0byBiZSBjcm9zcy1wbGF0Zm9ybSwgImVudmlyb25tZW50IHZhcmlhYmxlcyIgYXJlIG9ubHkgYXBwcm9wcmlhdGUgZm9yIAotICAgICAgICBzb21lIHZhcmlhYmxlcywgZS5nLiBvbmVzIHdlIHNldCwgc2luY2UgcHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUsIGV2ZW4gaWYgCi0gICAgICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb24geW91ciBvcGVyYXRpbmcgc3lzdGVtIGFyZSBub3QsIGUuZy4gaXQgd2lsbCAKLSAgICAgICAgYmUgJHtlbnYuUGF0aH0gbm90ICR7ZW52LlBBVEh9IG9uIFdpbmRvd3MgLS0+Ci0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0KLSAgICA8IS0tIAotICAgICAgICBMZXQgdXNlcnMgb3ZlcnJpZGUgc3RhbmRhcmQgcHJvcGVydGllcywgaWYgZGVzaXJlZC4KLSAgICAgICAgSWYgdGhpcyBkaXJlY3RvcnkvZmlsZXMgZG9lcyBub3QgZXhpc3QsIHRoZW4gaXQgd2lsbCBiZSBpZ25vcmVkLCAKLSAgICAgICAgYW5kIGRlZmF1bHRzIHVzZWQuCi0gICAgLS0+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIGZpbGU9IiR7ZW52LkxPQ0FMX0JVSUxEX1BST1BFUlRJRVNfRElSfS8ke2FudC5wcm9qZWN0Lm5hbWV9LnByb3BlcnRpZXMiIC8+Ci0KLQotCi0gICAgPHByb3BlcnR5IGZpbGU9ImVudmphdmFkb2MucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0ib3V0cHV0RGlyIgotICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfSIgLz4KLQotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0ibWFpbiIKLSAgICAgICAgZGVwZW5kcz0iamF2YWRvYywgcGFja2FnZXRvYyIKLSAgICAgICAgZGVzY3JpcHRpb249IkJ1aWxkcyBQbHVnaW4gSmF2YWRvYyIgLz4KLQotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0iamF2YWRvYyIKLSAgICAgICAgZGVwZW5kcz0iZ2V0U2tpcEphdmFEb2NQYXJhbSIKLSAgICAgICAgdW5sZXNzPSJkb3NraXBKYXZhRG9jIj4KLSAgICAJPGVjaG8gbWVzc2FnZT0iYmFzZWRpcjogJHtiYXNlZGlyfSIgLz4KLSAgICAJPGVjaG8gbWVzc2FnZT0ib3V0cHV0ZGlyOiAke291dHB1dERpcn0iIC8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9ImNsYXNzcGF0aDogJHtKMlNFLTEuNX0iIC8+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkRGlyZWN0b3J5OiAke2J1aWxkRGlyZWN0b3J5fSIgLz4KLQotICAgICAgICA8amF2YWRvYwotICAgICAgICAgICAgYWNjZXNzPSJwdWJsaWMiCi0gICAgICAgICAgICBhdXRob3I9ImZhbHNlIgotICAgICAgICAgICAgZGVzdGRpcj0iJHtvdXRwdXREaXJ9L3JlZmVyZW5jZS9lbnZhcGkiCi0gICAgICAgICAgICBkb2N0aXRsZT0iJHthcGkudGl0bGV9IgotICAgICAgICAgICAgbm9kZXByZWNhdGVkPSJmYWxzZSIKLSAgICAgICAgICAgIG5vZGVwcmVjYXRlZGxpc3Q9ImZhbHNlIgotICAgICAgICAgICAgbm9pbmRleD0iZmFsc2UiCi0gICAgICAgICAgICBub25hdmJhcj0iZmFsc2UiCi0gICAgICAgICAgICBub3RyZWU9ImZhbHNlIgotICAgICAgICAgICAgRW5jb2Rpbmc9IklTTy04ODU5LTEiCi0gICAgICAgICAgICBwYWNrYWdlbmFtZXM9IiR7YXBpLnBhY2thZ2VzfSIKLSAgICAgICAgICAgIHNvdXJjZXBhdGg9IiR7cGx1Z2luLnNvdXJjZWZvbGRlcnN9IgotICAgICAgICAgICAgc3BsaXRpbmRleD0idHJ1ZSIKLSAgICAgICAgICAgIHVzZT0idHJ1ZSIKLSAgICAgICAgICAgIHZlcnNpb249InRydWUiCi0gICAgICAgICAgICBicmVha2l0ZXJhdG9yPSJ5ZXMiCi0gICAgICAgICAgICB2ZXJib3NlPSJmYWxzZSIKLSAgICAgICAgCWNsYXNzcGF0aD0iIgotICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgCQotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMiPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIAotCi0gICAgICAgIDwvamF2YWRvYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnZXRvYyI+Ci0gICAgICAgIDxsb2FkZmlsZQotICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIgotICAgICAgICAgICAgcHJvcGVydHk9Ind0cC5wYWNrYWdlcyIKLSAgICAgICAgICAgIHNyY0ZpbGU9IiR7b3V0cHV0RGlyfS9yZWZlcmVuY2UvZW52YXBpL3BhY2thZ2UtbGlzdCI+Ci0gICAgICAgICAgICA8ZmlsdGVyY2hhaW4+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcnJlYWRlcgotICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuUHJlZml4TGluZXMiPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InByZWZpeCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSImbHQ7L3BhY2thZ2UmZ3Q7Jmx0O3BhY2thZ2UmZ3Q7IiAvPgotICAgICAgICAgICAgICAgIDwvZmlsdGVycmVhZGVyPgotICAgICAgICAgICAgICAgIDxzdHJpcGxpbmVicmVha3MgLz4KLSAgICAgICAgICAgIDwvZmlsdGVyY2hhaW4+Ci0gICAgICAgIDwvbG9hZGZpbGU+Ci0KLSAgICAgICAgPCEtLSBDcmVhdGUgcGFja2FnZXMueG1sIGZpbGUgLS0+Ci0gICAgICAgIDxlY2hvIGZpbGU9ImVudnBhY2thZ2VzLnhtbCI+Ci0gICAgICAgICAgICAmbHQ7cGFja2FnZXMmZ3Q7Jmx0O3BhY2thZ2UmZ3Q7JHt3dHAucGFja2FnZXN9Jmx0Oy9wYWNrYWdlJmd0OyZsdDsvcGFja2FnZXMmZ3Q7Ci0gICAgICAgIDwvZWNobz4KLQotICAgICAgICA8eHNsdAotICAgICAgICAgICAgYmFzZWRpcj0iJHtiYXNlZGlyfSIKLSAgICAgICAgICAgIGluPSJlbnZwYWNrYWdlcy54bWwiCi0gICAgICAgICAgICBvdXQ9ImVudmphdmFkb2N0b2MueG1sIgotICAgICAgICAgICAgc3R5bGU9ImVudmphdmFkb2NUb2MueHNsIj4KLSAgICAgICAgICAgIDxvdXRwdXRwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9Im1ldGhvZCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0ieG1sIiAvPgotICAgICAgICAgICAgPG91dHB1dHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iaW5kZW50IgotICAgICAgICAgICAgICAgIHZhbHVlPSJ5ZXMiIC8+Ci0gICAgICAgIDwveHNsdD4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImdldFNraXBKYXZhRG9jUGFyYW0iCi0gICAgICAgIGlmPSJza2lwSmF2YURvYyI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InNraXBKYXZhRG9jOiAke3NraXBKYXZhRG9jfSIgLz4KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZG9za2lwSmF2YURvYyI+Ci0gICAgICAgICAgICA8ZXF1YWxzCi0gICAgICAgICAgICAgICAgYXJnMT0iJHtza2lwSmF2YURvY30iCi0gICAgICAgICAgICAgICAgYXJnMj0idHJ1ZSIKLSAgICAgICAgICAgICAgICB0cmltPSJ0cnVlIgotICAgICAgICAgICAgICAgIGNhc2VzZW5zaXRpdmU9ImZhbHNlIiAvPgotICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEV4dERvY3MucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRXh0RG9jcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM5MTU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2J1aWxkRXh0RG9jcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBJbmZvcm1hdGlvbiBmb3IgZXh0ZW5zaW9uIHBvaW50IG92ZXJ2aWV3IGRvY3VtZW50Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE92ZXJ2aWV3IGRvY3VtZW50IHRpdGxlCi10aXRsZSA9IFVSSSByZXNvbHZlciBFeHRlbnNpb24gUG9pbnRzCi1oZWFkZXIgPSBVUkkgcmVzb2x2ZXIgRXh0ZW5zaW9uIFBvaW50cyAKLSMgSW50cm9kdWN0aW9uIHBhcmFncmFwaAotb3ZlcnZpZXcgPSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludHMgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIFVSSSByZXNvbHZlci4gCi0KLSMgQSBsaXN0IG9mIHRoZSBleHRlbnNpb24gcG9pbnRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZQotIyBleHRlbnNpb24gcG9pbnQgZG9jdW1lbnRhdGlvbi4KLWxpc3RlZC1leHQtcG9pbnRzPW9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEV4dERvY3MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvYnVpbGRFeHREb2NzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3MmY1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9idWlsZEV4dERvY3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIEV4dGVuc2lvbiBQb2ludCBEb2N1bWVudGF0aW9uIiBkZWZhdWx0PSJjcmVhdGVFeHREb2NzIiBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBmaWxlPSJidWlsZEV4dERvY3MucHJvcGVydGllcyIvPgotCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFwaW91dHB1dERpciIgdmFsdWU9IiR7b3V0cHV0RGlyfSR7ZmlsZS5zZXBhcmF0b3J9cmVmZXJlbmNlJHtmaWxlLnNlcGFyYXRvcn1leHQiLz4KLQotCTx0YXJnZXQgbmFtZT0iY3JlYXRlRXh0RG9jcyIgZGVwZW5kcz0iYnVpbGRFeHREb2NzLCBjcmVhdGVEb2NMaXN0aW5ncyIvPgotCQotCTx0YXJnZXQgbmFtZT0iYnVpbGRFeHREb2NzIiBkZXBlbmRzPSJidWlsZEpTRkV4dERvY3MiLz4KLQkJCi0gCTx0YXJnZXQgbmFtZT0iYnVpbGRKU0ZFeHREb2NzIj4KLSAJCQotIAkJPCEtLSBjbGVhbnVwIG9sZCAtLT4KLSAJCTxkZWxldGU+Ci0gCSAJCTxmaWxlc2V0IGRpcj0iJHthcGlvdXRwdXREaXJ9IiBjYXNlc2Vuc2l0aXZlPSJ5ZXMiIGlkPSJleHQtZG9jcy1saXN0LWVudCI+Ci0gCSAJCQk8aW5jbHVkZSBuYW1lPSIqLmh0bWwiLz4KLSAJCQk8L2ZpbGVzZXQ+Ci0gCQk8L2RlbGV0ZT4KLSAJCQotIAkJPCEtLSBnZW5lcmF0ZSBuZXcgaHRtbCBmcm9tIGV4dC1wdCBzY2hlbWFzIC0tPgotIAkJPHBkZS5jb252ZXJ0U2NoZW1hVG9IVE1MIG1hbmlmZXN0PSIuLi9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwiIGRlc3RpbmF0aW9uPSIke2FwaW91dHB1dERpcn0iIC8+Ci0gCQkKLSAJCTwhLS0gR2V0IHRoZSBsaXN0IG9mIGV4dGVuc2lvbiBkb2MgZmlsZXMuIC0tPgotIAkJPGZpbGVzZXQgZGlyPSIke2FwaW91dHB1dERpcn0iIGNhc2VzZW5zaXRpdmU9InllcyIgaWQ9ImV4dC1kb2NzLWxpc3QtZW50IiA+Ci0gCQkJPGluY2x1ZGUgbmFtZT0iKi5odG1sIi8+Ci0JCTwvZmlsZXNldD4KLSAJCQotIAkJPCEtLSBDb252ZXJ0IHRoZSBsaXN0IHRvIGFuIFhNTCByZXByZXNlbnRhdGlvbi4gLS0+Ci0gCQk8cGF0aGNvbnZlcnQgcHJvcGVydHk9ImV4dC1kb2MtZW50IiByZWZpZD0iZXh0LWRvY3MtbGlzdC1lbnQiIHBhdGhzZXA9IiZsdDsvZmlsZSZndDsvbi9uJmx0O2ZpbGUmZ3Q7IiA+Ci0gCQkJPG1hcCBmcm9tPSIke2FwaW91dHB1dERpcn0ke2ZpbGUuc2VwYXJhdG9yfSIgdG89IiIvPgotIAkJPC9wYXRoY29udmVydD4KLSAJCTxlY2hvIGZpbGU9ImV4dGRvY3MueG1sIj4mbHQ7ZmlsZXMgY29tcG9uZW50PSJ3ZWJzZXJ2aWNlIiZndDsmbHQ7ZmlsZSZndDske2V4dC1kb2MtZW50fSZsdDsvZmlsZSZndDsmbHQ7L2ZpbGVzJmd0OzwvZWNobz4KLSAJCSAJCQkJCQkKLSAJPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjcmVhdGVEb2NMaXN0aW5ncyI+Ci0JCTxkZWxldGUgZmlsZT0iJHthcGlvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIi8+Ci0JCTwhLS0gQ3JlYXRlIHRoZSBvdmVydmlldyBkb2N1bWVudC4gLS0+Ci0JCTx4c2x0IGJhc2VkaXI9IiR7YmFzZWRpcn0iIGluPSJleHREb2NMaXN0aW5ncy54bWwiIG91dD0iJHthcGlvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIiBzdHlsZT0iZXh0RG9jT3ZlcnZpZXcueHNsIj4KLQkgIAkJPHBhcmFtIG5hbWU9InRpdGxlIiBleHByZXNzaW9uPSIke3RpdGxlfSIvPgotCSAgCQk8cGFyYW0gbmFtZT0iaGVhZGVyIiBleHByZXNzaW9uPSIke2hlYWRlcn0iLz4KLQkgIAkJPHBhcmFtIG5hbWU9Im92ZXJ2aWV3IiBleHByZXNzaW9uPSIke292ZXJ2aWV3fSIvPgotCQkJPHBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIiBleHByZXNzaW9uPSIke2xpc3RlZC1leHQtcG9pbnRzfSIvPgotCQk8L3hzbHQ+Ci0JCQkKLQkJPCEtLSBDcmVhdGUgdGhlIGV4dGVudGlvbiBwb2ludCB0b2MuIC0tPgotCQk8eHNsdCBiYXNlZGlyPSIke2Jhc2VkaXJ9IiBpbj0iZXh0RG9jTGlzdGluZ3MueG1sIiBvdXQ9InRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIiBzdHlsZT0iZXh0RG9jVG9jLnhzbCI+Ci0JCQk8cGFyYW0gbmFtZT0ibGlzdGVkLWV4dC1wb2ludHMiIGV4cHJlc3Npb249IiR7bGlzdGVkLWV4dC1wb2ludHN9Ii8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0ibWV0aG9kIiB2YWx1ZT0ieG1sIi8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0iaW5kZW50IiB2YWx1ZT0ieWVzIi8+Ci0JCTwveHNsdD4KLQkJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2MucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzYWIzZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZqYXZhZG9jLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotcGx1Z2luLnNvdXJjZWZvbGRlcnM9Li4vb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmM7Ci0KLWFwaS5wYWNrYWdlcz1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LFwKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLAotCi0KLWFwaS50aXRsZT1XZWIgVG9vbHMgUGxhdGZvcm06IEVudmlyb25tZW50IGZyYW1ld29yayBBUEkgZG9jdW1lbnRhdGlvbgotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZqYXZhZG9jVG9jLnhzbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2NUb2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWIxOTZjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2NUb2MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4YWxhbiI+Ci0gICAgCi0gICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2VzIj4KLSAgICAgPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotJmx0Oz9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPyZndDsKLQkgPC94c2w6dGV4dD4KLQkgPHRvYyBsYWJlbD0iSmF2YWRvYyBQYWNrYWdlcyBSZWZlcmVuY2UiPgotCSA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFja2FnZSI+Ci0JIDx4c2w6c29ydCBzZWxlY3Q9InRleHQoKSIvPgotCSAJPHhzbDppZiB0ZXN0PSJ0ZXh0KCkgIT0gJyciPgotCSAJCTx0b3BpYyBsYWJlbD0ie3RleHQoKX0iIGhyZWY9InJlZmVyZW5jZS9lbnZhcGkve3RyYW5zbGF0ZSh0ZXh0KCksJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIi8+Ci0JIAk8L3hzbDppZj4KLQkgPC94c2w6Zm9yLWVhY2g+Ci0JCi0JIDwvdG9jPiAKLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZqYXZhZG9jdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2N0b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTUzMTY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2VudmphdmFkb2N0b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCSA8dG9jIGxhYmVsPSJKYXZhZG9jIFBhY2thZ2VzIFJlZmVyZW5jZSI+Ci08dG9waWMgaHJlZj0icmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIiBsYWJlbD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIvPgotPHRvcGljIGhyZWY9InJlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZwYWNrYWdlcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9lbnZwYWNrYWdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTQ3M2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZW52cGFja2FnZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLSAgICAgICAgICAgIDxwYWNrYWdlcz48cGFja2FnZT48L3BhY2thZ2U+PHBhY2thZ2U+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvcGFja2FnZT48cGFja2FnZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvcGFja2FnZT48L3BhY2thZ2VzPgotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NMaXN0aW5ncy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NMaXN0aW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNzA4ZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0RG9jTGlzdGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudHM+Ci0JPGNvbXBvbmVudCBuYW1lPSJVUkkgUmVzb2x2ZXIgQVBJIiBpZD0idXJpcmVzb2x2ZXIiIGZpbGU9ImV4dGRvY3MueG1sIi8+Ci08L2NvbXBvbmVudHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NPdmVydmlldy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NPdmVydmlldy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YWIyYzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0RG9jT3ZlcnZpZXcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0Ij4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJoZWFkZXIiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Im92ZXJ2aWV3Ii8+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJsaXN0ZWQtZXh0LXBvaW50cyIvPgotICAgIAotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbXBvbmVudHMiPgotICAgIAkKLSAgICAJPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotICAgIAkmbHQ7IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRSQU5TSVRJT05BTC8vRU4iJmd0OwotCQk8L3hzbDp0ZXh0PgotCQk8aHRtbD4KLQkJPGhlYWQ+Ci0JCTx4c2w6dGV4dCBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIj4KLQkJJmx0O21ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iICZndDsKLQotICAgCQkmbHQ7bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiZndDsKLSAgIAkJPC94c2w6dGV4dD4KLSAgIAkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotICAgCQk8eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyI+Ci0JCSZsdDtMSU5LIFJFTD0iU1RZTEVTSEVFVCIgSFJFRj0iLi4vLi4vYm9vay5jc3MiIENIQVJTRVQ9IklTTy04ODU5LTEiIFRZUEU9InRleHQvY3NzIiZndDsKLQkJPC94c2w6dGV4dD4KLQkJPC9oZWFkPgotCQk8Ym9keSBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzgwMDA4MCI+Ci0KLQkJPGNlbnRlcj4KLQkJPGgxPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyIi8+PC9oMT4KLQkJPC9jZW50ZXI+Ci0KLQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdmVydmlldyIvPgotICAgIAk8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29tcG9uZW50Ij4KLSAgICAJCTx4c2w6c29ydCBzZWxlY3Q9IkBpZCIvPgotICAgIAkJPGgzPjxhIG5hbWU9IntAaWR9Ij48L2E+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KLSAgICAJCTx1bD4KLSAgICAJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jdW1lbnQoQGZpbGUpL2ZpbGVzL2ZpbGUiPgotICAgIAkJCQk8eHNsOnNvcnQgc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICAJCQkJPCEtLSA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRsaXN0ZWQtZXh0LXBvaW50cywgdHJhbnNsYXRlKHN1YnN0cmluZyh0ZXh0KCksIDAsIHN0cmluZy1sZW5ndGgodGV4dCgpKSAtIDQpLCdfJywnLicpKSI+IC0tPiAKLSAgCQkJCQkJPGxpPgotICAJCQkJCQkJPGEgaHJlZj0ie3RleHQoKX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJykiLz48L2E+IAotICAJCQkJCQk8L2xpPgotICAJCQkJCTwhLS0gPC94c2w6aWY+IC0tPgotICAgIAkJCTwveHNsOmZvci1lYWNoPgotICAgIAkJPC91bD4KLSAgICAJPC94c2w6Zm9yLWVhY2g+Ci0gICAgCTwvYm9keT4KLQkJPC9odG1sPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2V4dERvY1RvYy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9leHREb2NUb2MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIyNzQxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2V4dERvY1RvYy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhhbGFuIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIi8+Ci0gICAgCi0gICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbXBvbmVudHMiPgotICAgICAJPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotJmx0Oz9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPyZndDsKLQkgCTwveHNsOnRleHQ+Ci0JIAk8dG9jIGxhYmVsPSJFeHRlbnNpb24gUG9pbnRzIFJlZmVyZW5jZSI+Ci0JIAkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImRvY3VtZW50KGNvbXBvbmVudC9AZmlsZSkvZmlsZXMvZmlsZSI+Ci0JIAkJCTx4c2w6c29ydCBzZWxlY3Q9InRleHQoKSIvPgotCSAJCQk8IS0tIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJGxpc3RlZC1leHQtcG9pbnRzLCB0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJykpIj4gLS0+Ci0JIAkJCQk8dG9waWMgbGFiZWw9Int0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJyl9IiBocmVmPSJyZWZlcmVuY2UvZXh0L3t0ZXh0KCl9Ij4KLQkgCQkJCTwvdG9waWM+Ci0JIAkJCTwhLS0gPC94c2w6aWY+IC0tPgotCSAJCTwveHNsOmZvci1lYWNoPgotCSAJPC90b2M+IAotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL2V4dGRvY3MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0ZG9jcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTk1NjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvZXh0ZG9jcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08ZmlsZXMgY29tcG9uZW50PSJ3ZWJzZXJ2aWNlIj48ZmlsZT5vcmdfZWNsaXBzZV93c3RfY29tbW9uX3VyaXJlc29sdmVyX3Jlc29sdmVyRXh0ZW5zaW9ucy5odG1sPC9maWxlPjwvZmlsZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkNzE4My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9RW52aXJvbm1lbnQgQVBJIERvY3VtZW50YXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2Mzg0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0JCi08IS0tCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAotIERlZmluZSBTdWJzZWN0aW9uIFRhYmxlIG9mIENvbnRlbnRzCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0tLT4gCi0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InRvcGljc0Vudl9SZWZlcmVuY2UueG1sIi8+Ci0JCTx0b2MgZmlsZT0iZW52amF2YWRvY3RvYy54bWwiLz4KLQkJPHRvYyBmaWxlPSJ0b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbCIvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2FsbGNsYXNzZXMtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM2YjMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLTxCPkFsbCBDbGFzc2VzPC9CPjwvRk9OVD4KLTxCUj4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5DaG9pY2U8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklFbnZpcm9ubWVudDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklMb2c8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVN0YXR1c0hhbmRsZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUkk8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVVJJRmFjdG9yeTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSUZpbHRlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSVNjaGVtZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUklWaXNpdG9yPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5TaW1wbGVVUklGYWN0b3J5PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+U3RhdHVzRXhjZXB0aW9uPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5VUklFeGNlcHRpb248L0E+Ci08QlI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljMTNlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLTxCPkFsbCBDbGFzc2VzPC9CPjwvRk9OVD4KLTxCUj4KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRFeGNlcHRpb248L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48ST5JRW52aXJvbm1lbnQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEk+SUxvZzwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEk+SVN0YXR1c0hhbmRsZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48ST5JVVJJPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxJPklVUklGYWN0b3J5PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEk+SVVSSUZpbHRlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxJPklVUklTY2hlbWU8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEk+SVVSSVZpc2l0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+U2ltcGxlVVJJRmFjdG9yeTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+Ci08QlI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2NvbnN0YW50LXZhbHVlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9jb25zdGFudC12YWx1ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3ZTM0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2NvbnN0YW50LXZhbHVlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUNvbnN0YW50IEZpZWxkIFZhbHVlcwotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkNvbnN0YW50IEZpZWxkIFZhbHVlcyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9jb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJjb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotQ29uc3RhbnQgRmllbGQgVmFsdWVzPC9IMT4KLTwvQ0VOVEVSPgotPEhSIFNJWkU9IjQiIE5PU0hBREU+Ci08Qj5Db250ZW50czwvQj48VUw+Ci08TEk+PEEgSFJFRj0iI29yZy5lY2xpcHNlIj5vcmcuZWNsaXBzZS4qPC9BPgotPC9VTD4KLQotPEEgTkFNRT0ib3JnLmVjbGlwc2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Rk9OVCBTSVpFPSIrMiI+Ci1vcmcuZWNsaXBzZS4qPC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5FUlJPUiI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI0VSUk9SIj5FUlJPUjwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjQ8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5JTkZPIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjSU5GTyI+SU5GTzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjE8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5PSyI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI09LIj5PSzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjA8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5XQVJOSU5HIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjV0FSTklORyI+V0FSTklORzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjI8L0NPREU+PC9URD4KLTwvVFI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP2NvbnN0YW50LXZhbHVlcy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImNvbnN0YW50LXZhbHVlcy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9kZXByZWNhdGVkLWxpc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvZGVwcmVjYXRlZC1saXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjQ3MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9kZXByZWNhdGVkLWxpc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1EZXByZWNhdGVkIExpc3QKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJEZXByZWNhdGVkIExpc3QiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPkRlcHJlY2F0ZWQgQVBJPC9CPjwvSDI+Ci08L0NFTlRFUj4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotPEI+Q29udGVudHM8L0I+PFVMPgotPC9VTD4KLQotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9kZXByZWNhdGVkLWxpc3QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaGVscC1kb2MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaGVscC1kb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0M2E1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2hlbHAtZG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQVBJIEhlbHAKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJBUEkgSGVscCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/aGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJoZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDE+Ci1Ib3cgVGhpcyBBUEkgRG9jdW1lbnQgSXMgT3JnYW5pemVkPC9IMT4KLTwvQ0VOVEVSPgotVGhpcyBBUEkgKEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZSkgZG9jdW1lbnQgaGFzIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGl0ZW1zIGluIHRoZSBuYXZpZ2F0aW9uIGJhciwgZGVzY3JpYmVkIGFzIGZvbGxvd3MuPEgzPgotT3ZlcnZpZXc8L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotVGhlIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+T3ZlcnZpZXc8L0E+IHBhZ2UgaXMgdGhlIGZyb250IHBhZ2Ugb2YgdGhpcyBBUEkgZG9jdW1lbnQgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbGwgcGFja2FnZXMgd2l0aCBhIHN1bW1hcnkgZm9yIGVhY2guICBUaGlzIHBhZ2UgY2FuIGFsc28gY29udGFpbiBhbiBvdmVyYWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXQgb2YgcGFja2FnZXMuPC9CTE9DS1FVT1RFPgotPEgzPgotUGFja2FnZTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIHBhY2thZ2UgaGFzIGEgcGFnZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBpdHMgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgd2l0aCBhIHN1bW1hcnkgZm9yIGVhY2guIFRoaXMgcGFnZSBjYW4gY29udGFpbiBmb3VyIGNhdGVnb3JpZXM6PFVMPgotPExJPkludGVyZmFjZXMgKGl0YWxpYyk8TEk+Q2xhc3NlczxMST5FbnVtczxMST5FeGNlcHRpb25zPExJPkVycm9yczxMST5Bbm5vdGF0aW9uIFR5cGVzPC9VTD4KLTwvQkxPQ0tRVU9URT4KLTxIMz4KLUNsYXNzL0ludGVyZmFjZTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIGNsYXNzLCBpbnRlcmZhY2UsIG5lc3RlZCBjbGFzcyBhbmQgbmVzdGVkIGludGVyZmFjZSBoYXMgaXRzIG93biBzZXBhcmF0ZSBwYWdlLiBFYWNoIG9mIHRoZXNlIHBhZ2VzIGhhcyB0aHJlZSBzZWN0aW9ucyBjb25zaXN0aW5nIG9mIGEgY2xhc3MvaW50ZXJmYWNlIGRlc2NyaXB0aW9uLCBzdW1tYXJ5IHRhYmxlcywgYW5kIGRldGFpbGVkIG1lbWJlciBkZXNjcmlwdGlvbnM6PFVMPgotPExJPkNsYXNzIGluaGVyaXRhbmNlIGRpYWdyYW08TEk+RGlyZWN0IFN1YmNsYXNzZXM8TEk+QWxsIEtub3duIFN1YmludGVyZmFjZXM8TEk+QWxsIEtub3duIEltcGxlbWVudGluZyBDbGFzc2VzPExJPkNsYXNzL2ludGVyZmFjZSBkZWNsYXJhdGlvbjxMST5DbGFzcy9pbnRlcmZhY2UgZGVzY3JpcHRpb24KLTxQPgotPExJPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PExJPkZpZWxkIFN1bW1hcnk8TEk+Q29uc3RydWN0b3IgU3VtbWFyeTxMST5NZXRob2QgU3VtbWFyeQotPFA+Ci08TEk+RmllbGQgRGV0YWlsPExJPkNvbnN0cnVjdG9yIERldGFpbDxMST5NZXRob2QgRGV0YWlsPC9VTD4KLUVhY2ggc3VtbWFyeSBlbnRyeSBjb250YWlucyB0aGUgZmlyc3Qgc2VudGVuY2UgZnJvbSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gZm9yIHRoYXQgaXRlbS4gVGhlIHN1bW1hcnkgZW50cmllcyBhcmUgYWxwaGFiZXRpY2FsLCB3aGlsZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb25zIGFyZSBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGlzIHByZXNlcnZlcyB0aGUgbG9naWNhbCBncm91cGluZ3MgZXN0YWJsaXNoZWQgYnkgdGhlIHByb2dyYW1tZXIuPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPEgzPgotQW5ub3RhdGlvbiBUeXBlPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggYW5ub3RhdGlvbiB0eXBlIGhhcyBpdHMgb3duIHNlcGFyYXRlIHBhZ2Ugd2l0aCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOjxVTD4KLTxMST5Bbm5vdGF0aW9uIFR5cGUgZGVjbGFyYXRpb248TEk+QW5ub3RhdGlvbiBUeXBlIGRlc2NyaXB0aW9uPExJPlJlcXVpcmVkIEVsZW1lbnQgU3VtbWFyeTxMST5PcHRpb25hbCBFbGVtZW50IFN1bW1hcnk8TEk+RWxlbWVudCBEZXRhaWw8L1VMPgotPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPEgzPgotRW51bTwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1FYWNoIGVudW0gaGFzIGl0cyBvd24gc2VwYXJhdGUgcGFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PFVMPgotPExJPkVudW0gZGVjbGFyYXRpb248TEk+RW51bSBkZXNjcmlwdGlvbjxMST5FbnVtIENvbnN0YW50IFN1bW1hcnk8TEk+RW51bSBDb25zdGFudCBEZXRhaWw8L1VMPgotPC9CTE9DS1FVT1RFPgotPEgzPgotVXNlPC9IMz4KLTxCTE9DS1FVT1RFPgotRWFjaCBkb2N1bWVudGVkIHBhY2thZ2UsIGNsYXNzIGFuZCBpbnRlcmZhY2UgaGFzIGl0cyBvd24gVXNlIHBhZ2UuICBUaGlzIHBhZ2UgZGVzY3JpYmVzIHdoYXQgcGFja2FnZXMsIGNsYXNzZXMsIG1ldGhvZHMsIGNvbnN0cnVjdG9ycyBhbmQgZmllbGRzIHVzZSBhbnkgcGFydCBvZiB0aGUgZ2l2ZW4gY2xhc3Mgb3IgcGFja2FnZS4gR2l2ZW4gYSBjbGFzcyBvciBpbnRlcmZhY2UgQSwgaXRzIFVzZSBwYWdlIGluY2x1ZGVzIHN1YmNsYXNzZXMgb2YgQSwgZmllbGRzIGRlY2xhcmVkIGFzIEEsIG1ldGhvZHMgdGhhdCByZXR1cm4gQSwgYW5kIG1ldGhvZHMgYW5kIGNvbnN0cnVjdG9ycyB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSBBLiAgWW91IGNhbiBhY2Nlc3MgdGhpcyBwYWdlIGJ5IGZpcnN0IGdvaW5nIHRvIHRoZSBwYWNrYWdlLCBjbGFzcyBvciBpbnRlcmZhY2UsIHRoZW4gY2xpY2tpbmcgb24gdGhlICJVc2UiIGxpbmsgaW4gdGhlIG5hdmlnYXRpb24gYmFyLjwvQkxPQ0tRVU9URT4KLTxIMz4KLVRyZWUgKENsYXNzIEhpZXJhcmNoeSk8L0gzPgotPEJMT0NLUVVPVEU+Ci1UaGVyZSBpcyBhIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+Q2xhc3MgSGllcmFyY2h5PC9BPiBwYWdlIGZvciBhbGwgcGFja2FnZXMsIHBsdXMgYSBoaWVyYXJjaHkgZm9yIGVhY2ggcGFja2FnZS4gRWFjaCBoaWVyYXJjaHkgcGFnZSBjb250YWlucyBhIGxpc3Qgb2YgY2xhc3NlcyBhbmQgYSBsaXN0IG9mIGludGVyZmFjZXMuIFRoZSBjbGFzc2VzIGFyZSBvcmdhbml6ZWQgYnkgaW5oZXJpdGFuY2Ugc3RydWN0dXJlIHN0YXJ0aW5nIHdpdGggPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4uIFRoZSBpbnRlcmZhY2VzIGRvIG5vdCBpbmhlcml0IGZyb20gPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4uPFVMPgotPExJPldoZW4gdmlld2luZyB0aGUgT3ZlcnZpZXcgcGFnZSwgY2xpY2tpbmcgb24gIlRyZWUiIGRpc3BsYXlzIHRoZSBoaWVyYXJjaHkgZm9yIGFsbCBwYWNrYWdlcy48TEk+V2hlbiB2aWV3aW5nIGEgcGFydGljdWxhciBwYWNrYWdlLCBjbGFzcyBvciBpbnRlcmZhY2UgcGFnZSwgY2xpY2tpbmcgIlRyZWUiIGRpc3BsYXlzIHRoZSBoaWVyYXJjaHkgZm9yIG9ubHkgdGhhdCBwYWNrYWdlLjwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1EZXByZWNhdGVkIEFQSTwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZSA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+RGVwcmVjYXRlZCBBUEk8L0E+IHBhZ2UgbGlzdHMgYWxsIG9mIHRoZSBBUEkgdGhhdCBoYXZlIGJlZW4gZGVwcmVjYXRlZC4gQSBkZXByZWNhdGVkIEFQSSBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSwgZ2VuZXJhbGx5IGR1ZSB0byBpbXByb3ZlbWVudHMsIGFuZCBhIHJlcGxhY2VtZW50IEFQSSBpcyB1c3VhbGx5IGdpdmVuLiBEZXByZWNhdGVkIEFQSXMgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlIGltcGxlbWVudGF0aW9ucy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1JbmRleDwvSDM+Ci08QkxPQ0tRVU9URT4KLVRoZSA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPkluZGV4PC9BPiBjb250YWlucyBhbiBhbHBoYWJldGljIGxpc3Qgb2YgYWxsIGNsYXNzZXMsIGludGVyZmFjZXMsIGNvbnN0cnVjdG9ycywgbWV0aG9kcywgYW5kIGZpZWxkcy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1QcmV2L05leHQ8L0gzPgotVGhlc2UgbGlua3MgdGFrZSB5b3UgdG8gdGhlIG5leHQgb3IgcHJldmlvdXMgY2xhc3MsIGludGVyZmFjZSwgcGFja2FnZSwgb3IgcmVsYXRlZCBwYWdlLjxIMz4KLUZyYW1lcy9ObyBGcmFtZXM8L0gzPgotVGhlc2UgbGlua3Mgc2hvdyBhbmQgaGlkZSB0aGUgSFRNTCBmcmFtZXMuICBBbGwgcGFnZXMgYXJlIGF2YWlsYWJsZSB3aXRoIG9yIHdpdGhvdXQgZnJhbWVzLgotPFA+Ci08SDM+Ci1TZXJpYWxpemVkIEZvcm08L0gzPgotRWFjaCBzZXJpYWxpemFibGUgb3IgZXh0ZXJuYWxpemFibGUgY2xhc3MgaGFzIGEgZGVzY3JpcHRpb24gb2YgaXRzIHNlcmlhbGl6YXRpb24gZmllbGRzIGFuZCBtZXRob2RzLiBUaGlzIGluZm9ybWF0aW9uIGlzIG9mIGludGVyZXN0IHRvIHJlLWltcGxlbWVudG9ycywgbm90IHRvIGRldmVsb3BlcnMgdXNpbmcgdGhlIEFQSS4gV2hpbGUgdGhlcmUgaXMgbm8gbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIsIHlvdSBjYW4gZ2V0IHRvIHRoaXMgaW5mb3JtYXRpb24gYnkgZ29pbmcgdG8gYW55IHNlcmlhbGl6ZWQgY2xhc3MgYW5kIGNsaWNraW5nICJTZXJpYWxpemVkIEZvcm0iIGluIHRoZSAiU2VlIGFsc28iIHNlY3Rpb24gb2YgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLgotPFA+Ci08SDM+Ci1Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0gzPgotVGhlIDxhIGhyZWY9ImNvbnN0YW50LXZhbHVlcy5odG1sIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L2E+IHBhZ2UgbGlzdHMgdGhlIHN0YXRpYyBmaW5hbCBmaWVsZHMgYW5kIHRoZWlyIHZhbHVlcy4KLTxQPgotPEZPTlQgU0laRT0iLTEiPgotPEVNPgotVGhpcyBoZWxwIGZpbGUgYXBwbGllcyB0byBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGRvY2xldC48L0VNPgotPC9GT05UPgotPEJSPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/aGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJoZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2MjBlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1BLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQS1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIExFVFRFUiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfQV8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkE8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwjYWNjZXB0cyhvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PEI+YWNjZXB0cyhJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT4KLTxERD5GaWx0ZXJzIHRoZSBnaXZlbiBJVVJJLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhcHBlbmQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPmFwcGVuZChJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXNGaWxlKCkiPjxCPmFzRmlsZSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc1N0cmluZygpIj48Qj5hc1N0cmluZygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc1VSTCgpIj48Qj5hc1VSTCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBMRVRURVImbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjFjOGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVItSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJSLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEwLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfUl8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlI8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjcmVnaXN0ZXJTY2hlbWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZSkiPjxCPnJlZ2lzdGVyU2NoZW1lKFN0cmluZywgSVVSSVNjaGVtZSk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5TaW1wbGVVUklGYWN0b3J5PC9BPgotPEREPlRoaXMgbWV0aG9kIHJlZ2lzdGVycyBhIHNjaGVtZSBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNyZW5hbWUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPnJlbmFtZShJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5SZW5hbWVzIG9yIG1vdmVzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSQotIHRvIHRoZSBuZXcgSVVSSS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+PEI+cmVwb3J0KElTdGF0dXMsIENob2ljZVtdKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+cmVwb3J0KElTdGF0dXMpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+Ci08REQ+UmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIHdpdGggaW1wbGllZCBvcHRpb25zIHRvIGVpdGhlcgotIGNvbnRpbnVlIG9yIGFib3J0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj48Qj5yZXBvcnQoSVN0YXR1cywgQ2hvaWNlW10pPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPk51bGxTdGF0dXNIYW5kbGVyPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48Qj5yZXBvcnQoSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+cmVwb3J0RXJyb3IoSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEVycm9yIFN0YXR1cy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48Qj5yZXBvcnRFcnJvcihJU3RhdHVzKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5OdWxsU3RhdHVzSGFuZGxlcjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxCPnJlcG9ydEluZm8oSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEluZm8gU3RhdHVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+cmVwb3J0SW5mbyhJU3RhdHVzKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5OdWxsU3RhdHVzSGFuZGxlcjwvQT4KLTxERD4mbmJzcDsKLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEwLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOTNmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTExLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotUy1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlMtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTExLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfU18iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlM8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI3NldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpIj48Qj5zZXREZXNjcmlwdGlvbihTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+U2V0cyB0aGUgZGVzY3JpcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKSI+PEI+c2V0TGFiZWwoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEREPlNldHMgdGhlIGxhYmVsLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjc2V0U2hvcnRjdXQoY2hhcikiPjxCPnNldFNob3J0Y3V0KGNoYXIpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+U2V0cyB0aGUgc2hvcnRjdXQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPlNpbXBsZVVSSUZhY3Rvcnk8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48REQ+VGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElVUklGYWN0b3J5IGludGVyZmFjZS48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI1NpbXBsZVVSSUZhY3RvcnkoKSI+PEI+U2ltcGxlVVJJRmFjdG9yeSgpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+U2ltcGxlVVJJRmFjdG9yeTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+U3RhdHVzRXhjZXB0aW9uPC9CPjwvQT4gLSBFeGNlcHRpb24gaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+VGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgYnkgU3RhdHVzSGFuZGxlcnMgdG8gdGVsbCB0aGVpcgotIGNhbGxlcnMgdGhhdCBwcm9jZXNzaW5nIHNob3VsZCBzdG9wLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI1N0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxCPlN0YXR1c0V4Y2VwdGlvbihJU3RhdHVzKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBTdGF0dXMuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2UpIj48Qj5TdGF0dXNFeGNlcHRpb24oQ2hvaWNlKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlKSI+PEI+U3RhdHVzRXhjZXB0aW9uKElTdGF0dXMsIENob2ljZSk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gYW5kIHN0YXR1cyBvYmplY3QuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0xMi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI5MmU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1ULUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVC1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9UXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+VDwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN0b1N0cmluZygpIj48Qj50b1N0cmluZygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCN0b1N0cmluZygpIj48Qj50b1N0cmluZygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN0b3VjaEZvbGRlcigpIj48Qj50b3VjaEZvbGRlcigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgZm9sZGVyIHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gdGhlIElVUkkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvdWNoTGVhZigpIj48Qj50b3VjaExlYWYoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5DcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotIHRoZSBJVVJJLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiMDdjNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTEzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVS1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlUtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfVV8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlU8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5VUklFeGNlcHRpb248L0I+PC9BPiAtIEV4Y2VwdGlvbiBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PEREPlRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCNVUklFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48Qj5VUklFeGNlcHRpb24oSVN0YXR1cyk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+Ci08REQ+Q3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI1VSSUV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPlVSSUV4Y2VwdGlvbihJU3RhdHVzLCBJVVJJKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT4KLTxERD5DcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTEzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2YTlhZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTE0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVi1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlYtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfVl8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPlY8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPnZhbGlkYXRlKElVUkkpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcikiPjxCPnZpc2l0KElVUklWaXNpdG9yKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5WaXNpdHMgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGRlY2VuZGFudHMgaW4gcHJlLW9yZGVyIGZhc2hpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyKSI+PEI+dmlzaXQoSVVSSVZpc2l0b3IsIElVUklGaWx0ZXIpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPkFzIGZvciB2aXNpdChJVVJJVmlzaXRvciksIGV4Y2VwdCBvbmx5IHJlc291cmNlIFVSSXMgdGhhdCBhcmUKLSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwjdmlzaXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPnZpc2l0KElVUkkpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Ci08REQ+VmlzaXRzIHRoZSBnaXZlbiBJVVJJLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMTUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhMjAyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTE1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVy1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlctSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBMRVRURVI8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0xNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX1dfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5XPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjV0FSTklORyI+PEI+V0FSTklORzwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5UaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIHdhcm5pbmcuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xNC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIExFVFRFUjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTE1Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMGZjM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC0yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotQy1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkMtSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMS5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9DXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+QzwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5DaG9pY2U8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPlRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgSVN0YXR1c0hhbmRsZXIgaW50ZXJmYWNlLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI0Nob2ljZSgpIj48Qj5DaG9pY2UoKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNDaG9pY2UoY2hhciwgamF2YS5sYW5nLlN0cmluZykiPjxCPkNob2ljZShjaGFyLCBTdHJpbmcpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+Q29uc3RydWN0b3IgZm9yIENob2ljZS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI0Nob2ljZShjaGFyLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PEI+Q2hvaWNlKGNoYXIsIFN0cmluZywgU3RyaW5nKTwvQj48L0E+IC0gCi1Db25zdHJ1Y3RvciBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0xLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRhZjM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtMy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUUtSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJFLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTIuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfRV8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkU8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj48L0E+IC0gRXhjZXB0aW9uIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPlRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgY29uZGl0aW9ucyByYWlzZWQgYnkgdGhlIElFbnZpcm9ubWVudC48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI0Vudmlyb25tZW50RXhjZXB0aW9uKCkiPjxCPkVudmlyb25tZW50RXhjZXB0aW9uKCk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI0Vudmlyb25tZW50RXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+RW52aXJvbm1lbnRFeGNlcHRpb24oSVN0YXR1cyk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPgotPEREPkNyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkVudmlyb25tZW50U2VydmljZTwvQj48L0E+IC0gQ2xhc3MgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+VGhpcyBjbGFzcyBjcmVhdGVzIGEgY29uc29sZSBlbnZpcm9ubWVudC48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNFbnZpcm9ubWVudFNlcnZpY2UoKSI+PEI+RW52aXJvbm1lbnRTZXJ2aWNlKCk8L0I+PC9BPiAtIAotQ29uc3RydWN0b3IgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZXJhc2UoKSI+PEI+ZXJhc2UoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD5FcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJLgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI0VSUk9SIj48Qj5FUlJPUjwvQj48L0E+IC0gCi1TdGF0aWMgdmFyaWFibGUgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5UaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGFuIGVycm9yLgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC0zLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtMy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC00Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiOWZmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1HLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRy1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC0zLmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX0dfIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5HPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNnZXRDaG9pY2UoKSI+PEI+Z2V0Q2hvaWNlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNnZXREZXNjcmlwdGlvbigpIj48Qj5nZXREZXNjcmlwdGlvbigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Ci08REQ+R2V0cyB0aGUgZGVzY3JpcHRpb24uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCkiPjxCPmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEVjbGlwc2VMb2coKSI+PEI+Z2V0RWNsaXBzZUxvZygpPC9CPjwvQT4gLSAKLVN0YXRpYyBtZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZVNjaGVtZSgpIj48Qj5nZXRFY2xpcHNlU2NoZW1lKCk8L0I+PC9BPiAtIAotU3RhdGljIG1ldGhvZCBpbiBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudFNlcnZpY2U8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRGaWxlU2NoZW1lKCkiPjxCPmdldEZpbGVTY2hlbWUoKTwvQj48L0E+IC0gCi1TdGF0aWMgbWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZ2V0SW5wdXRTdHJlYW0oKSI+PEI+Z2V0SW5wdXRTdHJlYW0oKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI2dldExhYmVsKCkiPjxCPmdldExhYmVsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4KLTxERD5HZXRzIHRoZSBsYWJlbC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldExvZygpIj48Qj5nZXRMb2coKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JRW52aXJvbm1lbnQ8L0E+Ci08REQ+UmV0dXJucyBhIGxvZ2dpbmcgZmFjaWxpdHkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2dldE91dHB1dFN0cmVhbSgpIj48Qj5nZXRPdXRwdXRTdHJlYW0oKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI2dldFNob3J0Y3V0KCkiPjxCPmdldFNob3J0Y3V0KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4KLTxERD5HZXRzIHRoZSBzaG9ydGN1dC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwjZ2V0U3RhdHVzKCkiPjxCPmdldFN0YXR1cygpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBleGNlcHRpb24gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4KLTxERD5SZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI2dldFN0YXR1cygpIj48Qj5nZXRTdGF0dXMoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gZXhjZXB0aW9uIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldFN0YXR1c0hhbmRsZXIoKSI+PEI+Z2V0U3RhdHVzSGFuZGxlcigpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklFbnZpcm9ubWVudDwvQT4KLTxERD5SZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwjZ2V0VVJJKCkiPjxCPmdldFVSSSgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBleGNlcHRpb24gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwjZ2V0VVJJRmFjdG9yeSgpIj48Qj5nZXRVUklGYWN0b3J5KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPgotPEREPlJldHVybnMgYSBJVVJJIGZhY3RvcnkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2dldFVSSVNjaGVtZSgpIj48Qj5nZXRVUklTY2hlbWUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTMuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNS5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC01Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMThjMzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC01Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotSS1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkktSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNC5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC02Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC01Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9JXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+STwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUVudmlyb25tZW50PC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+QW4gSUVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgZ2V0dGluZyBhIAotIAotIEEgbG9nIGZvciB3cml0aW5nIG1lc3NhZ2VzIHRvIGEgbG9nZ2luZyBmYWNpbGl0eSwKLSBBIHByb2dyZXNzIG1vbml0b3IgZm9yIHJlY2VpdmluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbiwKLSBBIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsCi0gQSBmYWN0b3J5IGZvciB0aGUgaGFuZGxpbmcgb2YgVVJJcyAocmVzb3VyY2VzKS48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPklMb2cgb2JqZWN0cyBwcm92aWRlIGEgbWVhbnMgZm9yIGxvZ2dpbmcgaW5mb3JtYXRpb24gZm9yIEZGREMgZXRjLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNJTkZPIj48Qj5JTkZPPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPlRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgaW5mb3JtYXRpb25hbC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNBdmFpbGFibGVBc0ZpbGUoKSI+PEI+aXNBdmFpbGFibGVBc0ZpbGUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNBdmFpbGFibGVBc1VSTCgpIj48Qj5pc0F2YWlsYWJsZUFzVVJMKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjaXNFbmFibGVkKCkiPjxCPmlzRW5hYmxlZCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPlJldHVybnMgdHJ1ZSBpZiBsb2dnaW5nIGlzIGVuYWJsZWQuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjaXNFbmFibGVkKGphdmEubGFuZy5TdHJpbmcpIj48Qj5pc0VuYWJsZWQoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5SZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzSGllcmFyY2hpY2FsKCkiPjxCPmlzSGllcmFyY2hpY2FsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI2lzSGllcmFyY2hpY2FsKCkiPjxCPmlzSGllcmFyY2hpY2FsKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzTGVhZigpIj48Qj5pc0xlYWYoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNQcmVzZW50KCkiPjxCPmlzUHJlc2VudCgpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc1JlYWRhYmxlKCkiPjxCPmlzUmVhZGFibGUoKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNSZWxhdGl2ZSgpIj48Qj5pc1JlbGF0aXZlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPklTdGF0dXNIYW5kbGVyPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48REQ+UHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjaXNWYWxpZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PEI+aXNWYWxpZChJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNXcml0YWJsZSgpIj48Qj5pc1dyaXRhYmxlKCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjxERD5BIElVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci48RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZhY3Rvcnk8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PEREPlRoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgSVVSSSBhbmQgSVVSSVNjaGVtZSBvYmplY3RzLjxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGaWx0ZXI8L0I+PC9BPiAtIEludGVyZmFjZSBpbiA8QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PEREPlRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBvciBsaXN0IFVSSXMuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVNjaGVtZTwvQj48L0E+IC0gSW50ZXJmYWNlIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48REQ+QSBJVVJJU2NoZW1lIHJlcHJlc2VudHMgYSBzaW5nbGUgc2NoZW1lIGZvciBzb21lIGEgZmFtaWx5IG9mCi0gVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmllcnMuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklWaXNpdG9yPC9CPjwvQT4gLSBJbnRlcmZhY2UgaW4gPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjxERD5UaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgVVJJcy48L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC00Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC01Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE3N2Q0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUwtSW5kZXgKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJMLUluZGV4IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtYWluIj48L0E+Ci08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci08QSBOQU1FPSJfTF8iPjwhLS0gLS0+PC9BPjxIMj4KLTxCPkw8L0I+PC9IMj4KLTxETD4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjbGlzdCgpIj48Qj5saXN0KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+UmV0dXJucyBhIGxpc3Qgb2YgVVJJcyBmb3IgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSBoaWVyYXJjaGljYWwsIG5vbi1sZWFmIElVUkkuCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3Qob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPjxCPmxpc3QoSVVSSUZpbHRlcik8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpIj48Qj5sb2coaW50LCBpbnQsIE9iamVjdCwgU3RyaW5nLCBUaHJvd2FibGUpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPkxvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkiPjxCPmxvZyhpbnQsIFN0cmluZywgaW50LCBPYmplY3QsIFN0cmluZywgVGhyb3dhYmxlKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5Mb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PEI+bG9nKGludCwgaW50LCBPYmplY3QsIFN0cmluZywgSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+Ci08REQ+TG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxCPmxvZyhpbnQsIFN0cmluZywgaW50LCBPYmplY3QsIFN0cmluZywgSVN0YXR1cyk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+Ci08REQ+TG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+PEI+bG9nKGludCwgaW50LCBPYmplY3QsIFN0cmluZywgT2JqZWN0KTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT4KLTxERD5Mb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+PEI+bG9nKGludCwgU3RyaW5nLCBpbnQsIE9iamVjdCwgU3RyaW5nLCBPYmplY3QpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPkxvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9ImluZGV4LTUuaHRtbCI+PEI+UFJFViBMRVRURVI8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5ORVhUIExFVFRFUjwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi9pbmRleC5odG1sP2luZGV4LWZpbGVzaW5kZXgtNi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTYuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08QSBIUkVGPSJpbmRleC0xLmh0bWwiPkE8L0E+IDxBIEhSRUY9ImluZGV4LTIuaHRtbCI+QzwvQT4gPEEgSFJFRj0iaW5kZXgtMy5odG1sIj5FPC9BPiA8QSBIUkVGPSJpbmRleC00Lmh0bWwiPkc8L0E+IDxBIEhSRUY9ImluZGV4LTUuaHRtbCI+STwvQT4gPEEgSFJFRj0iaW5kZXgtNi5odG1sIj5MPC9BPiA8QSBIUkVGPSJpbmRleC03Lmh0bWwiPk48L0E+IDxBIEhSRUY9ImluZGV4LTguaHRtbCI+TzwvQT4gPEEgSFJFRj0iaW5kZXgtOS5odG1sIj5QPC9BPiA8QSBIUkVGPSJpbmRleC0xMC5odG1sIj5SPC9BPiA8QSBIUkVGPSJpbmRleC0xMS5odG1sIj5TPC9BPiA8QSBIUkVGPSJpbmRleC0xMi5odG1sIj5UPC9BPiA8QSBIUkVGPSJpbmRleC0xMy5odG1sIj5VPC9BPiA8QSBIUkVGPSJpbmRleC0xNC5odG1sIj5WPC9BPiA8QSBIUkVGPSJpbmRleC0xNS5odG1sIj5XPC9BPiA8SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXgtZmlsZXMvaW5kZXgtNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC03Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTM2ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC03Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU4IEVEVCAyMDA4IC0tPgotPFRJVExFPgotTi1JbmRleAotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik4tSW5kZXgiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC03Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9OXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+TjwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUkkoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj48Qj5uZXdVUkkoVVJMKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUkkoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPjxCPm5ld1VSSShVUkwpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPgotPEREPiZuYnNwOwotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjxCPm5ld1VSSShJVVJJKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gaW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4KLTxERD4mbmJzcDsKLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUkkoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj48Qj5uZXdVUkkoVVJMKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPjxCPm5ld1VSSVNjaGVtZShTdHJpbmcpPC9CPjwvQT4gLSAKLU1ldGhvZCBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+Ci08REQ+Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLTxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj48Qj5uZXdVUklTY2hlbWUoU3RyaW5nKTwvQj48L0E+IC0gCi1NZXRob2QgaW4gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+Ci08REQ+Jm5ic3A7Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+PC9BPiAtIENsYXNzIGluIDxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PEREPlRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNOdWxsU3RhdHVzSGFuZGxlcigpIj48Qj5OdWxsU3RhdHVzSGFuZGxlcigpPC9CPjwvQT4gLSAKLUNvbnN0cnVjdG9yIGZvciBjbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPk51bGxTdGF0dXNIYW5kbGVyPC9BPgotPEREPiZuYnNwOwotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNi5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC03Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC04Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwZDcyYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1PLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iTy1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC03Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTkuaHRtbCI+PEI+TkVYVCBMRVRURVI8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vaW5kZXguaHRtbD9pbmRleC1maWxlc2luZGV4LTguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEEgSFJFRj0iaW5kZXgtMS5odG1sIj5BPC9BPiA8QSBIUkVGPSJpbmRleC0yLmh0bWwiPkM8L0E+IDxBIEhSRUY9ImluZGV4LTMuaHRtbCI+RTwvQT4gPEEgSFJFRj0iaW5kZXgtNC5odG1sIj5HPC9BPiA8QSBIUkVGPSJpbmRleC01Lmh0bWwiPkk8L0E+IDxBIEhSRUY9ImluZGV4LTYuaHRtbCI+TDwvQT4gPEEgSFJFRj0iaW5kZXgtNy5odG1sIj5OPC9BPiA8QSBIUkVGPSJpbmRleC04Lmh0bWwiPk88L0E+IDxBIEhSRUY9ImluZGV4LTkuaHRtbCI+UDwvQT4gPEEgSFJFRj0iaW5kZXgtMTAuaHRtbCI+UjwvQT4gPEEgSFJFRj0iaW5kZXgtMTEuaHRtbCI+UzwvQT4gPEEgSFJFRj0iaW5kZXgtMTIuaHRtbCI+VDwvQT4gPEEgSFJFRj0iaW5kZXgtMTMuaHRtbCI+VTwvQT4gPEEgSFJFRj0iaW5kZXgtMTQuaHRtbCI+VjwvQT4gPEEgSFJFRj0iaW5kZXgtMTUuaHRtbCI+VzwvQT4gPEhSPgotPEEgTkFNRT0iX09fIj48IS0tIC0tPjwvQT48SDI+Ci08Qj5PPC9CPjwvSDI+Ci08REw+Ci08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjT0siPjxCPk9LPC9CPjwvQT4gLSAKLVN0YXRpYyB2YXJpYWJsZSBpbiBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPgotPEREPlRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgT2suCi08RFQ+PEEgSFJFRj0iLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+IC0gcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PEREPiZuYnNwOzxEVD48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9BPiAtIHBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8REQ+Jm5ic3A7PC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9vdmVydmlldy10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iaW5kZXgtNy5odG1sIj48Qj5QUkVWIExFVFRFUjwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC05Lmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC04Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC1maWxlcy9pbmRleC05Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4ODM4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL2luZGV4LWZpbGVzL2luZGV4LTkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTggRURUIDIwMDggLS0+Ci08VElUTEU+Ci1QLUluZGV4Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iUC1JbmRleCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC05Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLTxBIE5BTUU9Il9QXyI+PCEtLSAtLT48L0E+PEgyPgotPEI+UDwvQj48L0gyPgotPERMPgotPERUPjxBIEhSRUY9Ii4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNwYXJlbnQoKSI+PEI+cGFyZW50KCk8L0I+PC9BPiAtIAotTWV0aG9kIGluIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Ci08REQ+Jm5ic3A7Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSJpbmRleC04Lmh0bWwiPjxCPlBSRVYgTEVUVEVSPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPjxCPk5FWFQgTEVUVEVSPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uL2luZGV4Lmh0bWw/aW5kZXgtZmlsZXNpbmRleC05Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaW5kZXgtOS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxBIEhSRUY9ImluZGV4LTEuaHRtbCI+QTwvQT4gPEEgSFJFRj0iaW5kZXgtMi5odG1sIj5DPC9BPiA8QSBIUkVGPSJpbmRleC0zLmh0bWwiPkU8L0E+IDxBIEhSRUY9ImluZGV4LTQuaHRtbCI+RzwvQT4gPEEgSFJFRj0iaW5kZXgtNS5odG1sIj5JPC9BPiA8QSBIUkVGPSJpbmRleC02Lmh0bWwiPkw8L0E+IDxBIEhSRUY9ImluZGV4LTcuaHRtbCI+TjwvQT4gPEEgSFJFRj0iaW5kZXgtOC5odG1sIj5PPC9BPiA8QSBIUkVGPSJpbmRleC05Lmh0bWwiPlA8L0E+IDxBIEhSRUY9ImluZGV4LTEwLmh0bWwiPlI8L0E+IDxBIEhSRUY9ImluZGV4LTExLmh0bWwiPlM8L0E+IDxBIEhSRUY9ImluZGV4LTEyLmh0bWwiPlQ8L0E+IDxBIEhSRUY9ImluZGV4LTEzLmh0bWwiPlU8L0E+IDxBIEhSRUY9ImluZGV4LTE0Lmh0bWwiPlY8L0E+IDxBIEhSRUY9ImluZGV4LTE1Lmh0bWwiPlc8L0E+IDxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM4NjJiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2Mgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOC0tPgotPFRJVExFPgotR2VuZXJhdGVkIERvY3VtZW50YXRpb24gKFVudGl0bGVkKQotPC9USVRMRT4KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB0YXJnZXRQYWdlID0gIiIgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoOwotICAgIGlmICh0YXJnZXRQYWdlICE9ICIiICYmIHRhcmdldFBhZ2UgIT0gInVuZGVmaW5lZCIpCi0gICAgICAgdGFyZ2V0UGFnZSA9IHRhcmdldFBhZ2Uuc3Vic3RyaW5nKDEpOwotICAgIGZ1bmN0aW9uIGxvYWRGcmFtZXMoKSB7Ci0gICAgICAgIGlmICh0YXJnZXRQYWdlICE9ICIiICYmIHRhcmdldFBhZ2UgIT0gInVuZGVmaW5lZCIpCi0gICAgICAgICAgICAgdG9wLmNsYXNzRnJhbWUubG9jYXRpb24gPSB0b3AudGFyZ2V0UGFnZTsKLSAgICB9Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci08L0hFQUQ+Ci08RlJBTUVTRVQgY29scz0iMjAlLDgwJSIgdGl0bGU9IiIgb25Mb2FkPSJ0b3AubG9hZEZyYW1lcygpIj4KLTxGUkFNRVNFVCByb3dzPSIzMCUsNzAlIiB0aXRsZT0iIiBvbkxvYWQ9InRvcC5sb2FkRnJhbWVzKCkiPgotPEZSQU1FIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIgdGl0bGU9IkFsbCBQYWNrYWdlcyI+Ci08RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VGcmFtZSIgdGl0bGU9IkFsbCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIChleGNlcHQgbm9uLXN0YXRpYyBuZXN0ZWQgdHlwZXMpIj4KLTwvRlJBTUVTRVQ+Ci08RlJBTUUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiIHRpdGxlPSJQYWNrYWdlLCBjbGFzcyBhbmQgaW50ZXJmYWNlIGRlc2NyaXB0aW9ucyIgc2Nyb2xsaW5nPSJ5ZXMiPgotPE5PRlJBTUVTPgotPEgyPgotRnJhbWUgQWxlcnQ8L0gyPgotCi08UD4KLVRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgotPEJSPgotTGluayB0bzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Tm9uLWZyYW1lIHZlcnNpb24uPC9BPgotPC9OT0ZSQU1FUz4KLTwvRlJBTUVTRVQ+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDNiN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUNob2ljZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlIGNsYXNzIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJDaG9pY2UiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9DaG9pY2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUNsYXNzIENob2ljZTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5DaG9pY2U8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS4KLSBJdCBhbGxvd3MgY29kZSB0aGF0IGlzIHJlcG9ydGluZyBzdGF0dXMgdG8gc3BlY2lmeSBjaG9pY2VzIHRvIHRoZSB1c2VyCi0gd2hpY2ggdGhpcyByZXBvcnRpbmcgY29kZSBjYW4gcmVhY3QgdG8uCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNDaG9pY2UoKSI+Q2hvaWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29uc3RydWN0b3IgZm9yIENob2ljZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjQ2hvaWNlKGNoYXIsIGphdmEubGFuZy5TdHJpbmcpIj5DaG9pY2U8L0E+PC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2xhYmVsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q29uc3RydWN0b3IgZm9yIENob2ljZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjQ2hvaWNlKGNoYXIsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj5DaG9pY2U8L0E+PC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2xhYmVsLAotICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZXNjcmlwdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NvbnN0cnVjdG9yIGZvciBDaG9pY2UuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjZ2V0RGVzY3JpcHRpb24oKSI+Z2V0RGVzY3JpcHRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtHZXRzIHRoZSBkZXNjcmlwdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI2dldExhYmVsKCkiPmdldExhYmVsPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7R2V0cyB0aGUgbGFiZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2NoYXI8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNnZXRTaG9ydGN1dCgpIj5nZXRTaG9ydGN1dDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0dldHMgdGhlIHNob3J0Y3V0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwjc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykiPnNldERlc2NyaXB0aW9uPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2Rlc2NyaXB0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgZGVzY3JpcHRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TGFiZWw8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGFiZWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBsYWJlbC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sI3NldFNob3J0Y3V0KGNoYXIpIj5zZXRTaG9ydGN1dDwvQT48L0I+KGNoYXImbmJzcDtzaG9ydGN1dCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHNob3J0Y3V0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iQ2hvaWNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLUNob2ljZTwvSDM+Ci08UFJFPgotcHVibGljIDxCPkNob2ljZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08UD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkNob2ljZShjaGFyLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotQ2hvaWNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+Q2hvaWNlPC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCk8L1BSRT4KLTxETD4KLTxERD5Db25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnNob3J0Y3V0PC9DT0RFPiAtIHRoZSBzaW5nbGUgbGV0dGVyIHNob3J0Y3V0IGZvciB0aGlzIGNob2ljZS48REQ+PENPREU+bGFiZWw8L0NPREU+IC0gdGhlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBjaG9pY2UuPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkNob2ljZShjaGFyLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotQ2hvaWNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+Q2hvaWNlPC9CPihjaGFyJm5ic3A7c2hvcnRjdXQsCi0gICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCwKLSAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2Rlc2NyaXB0aW9uKTwvUFJFPgotPERMPgotPEREPkNvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi08UD4KLTxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2hvcnRjdXQ8L0NPREU+IC0gdGhlIHNpbmdsZSBsZXR0ZXIgc2hvcnRjdXQgZm9yIHRoaXMgY2hvaWNlLjxERD48Q09ERT5sYWJlbDwvQ09ERT4gLSB0aGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIGNob2ljZS48REQ+PENPREU+ZGVzY3JpcHRpb248L0NPREU+IC0gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNob2ljZS48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRMYWJlbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRMYWJlbDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TGFiZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5HZXRzIHRoZSBsYWJlbC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIGEgU3RyaW5nPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TGFiZWw8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldExhYmVsPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGFiZWwpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgbGFiZWwuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmxhYmVsPC9DT0RFPiAtIFRoZSBsYWJlbCB0byBzZXQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERlc2NyaXB0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERlc2NyaXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXREZXNjcmlwdGlvbjwvQj4oKTwvUFJFPgotPERMPgotPEREPkdldHMgdGhlIGRlc2NyaXB0aW9uLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBTdHJpbmc8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXREZXNjcmlwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0RGVzY3JpcHRpb248L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZXNjcmlwdGlvbik8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBkZXNjcmlwdGlvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZGVzY3JpcHRpb248L0NPREU+IC0gVGhlIGRlc2NyaXB0aW9uIHRvIHNldDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U2hvcnRjdXQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2hvcnRjdXQ8L0gzPgotPFBSRT4KLXB1YmxpYyBjaGFyIDxCPmdldFNob3J0Y3V0PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+R2V0cyB0aGUgc2hvcnRjdXQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIGNoYXI8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNob3J0Y3V0KGNoYXIpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTaG9ydGN1dDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U2hvcnRjdXQ8L0I+KGNoYXImbmJzcDtzaG9ydGN1dCk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBzaG9ydGN1dC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2hvcnRjdXQ8L0NPREU+IC0gVGhlIHNob3J0Y3V0IHRvIHNldDwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9DaG9pY2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGRkZmQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NSBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUVudmlyb25tZW50RXhjZXB0aW9uCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbiBjbGFzcyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRW52aXJvbm1lbnRFeGNlcHRpb24iOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBFbnZpcm9ubWVudEV4Y2VwdGlvbjwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLlRocm93YWJsZQotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5FeGNlcHRpb24KLSAgICAgICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlPC9ERD4KLTwvREw+Ci08REw+Ci08RFQ+PEI+RGlyZWN0IEtub3duIFN1YmNsYXNzZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uPC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgY29uZGl0aW9ucyByYWlzZWQgYnkgdGhlIElFbnZpcm9ubWVudC4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50RXhjZXB0aW9uIj5TZXJpYWxpemVkIEZvcm08L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI0Vudmlyb25tZW50RXhjZXB0aW9uKCkiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCNFbnZpcm9ubWVudEV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI2dldFN0YXR1cygpIj5nZXRTdGF0dXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmZpbGxJblN0YWNrVHJhY2UsIGdldENhdXNlLCBnZXRMb2NhbGl6ZWRNZXNzYWdlLCBnZXRNZXNzYWdlLCBnZXRTdGFja1RyYWNlLCBpbml0Q2F1c2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBwcmludFN0YWNrVHJhY2UsIHNldFN0YWNrVHJhY2UsIHRvU3RyaW5nPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJFbnZpcm9ubWVudEV4Y2VwdGlvbigpIj48IS0tIC0tPjwvQT48SDM+Ci1FbnZpcm9ubWVudEV4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPkVudmlyb25tZW50RXhjZXB0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi4KLTxQPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iRW52aXJvbm1lbnRFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1FbnZpcm9ubWVudEV4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPkVudmlyb25tZW50RXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRTdGF0dXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U3RhdHVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgPEI+Z2V0U3RhdHVzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkVudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzYTBiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU1IEVEVCAyMDA4IC0tPgotPFRJVExFPgotRW52aXJvbm1lbnRTZXJ2aWNlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2UgY2xhc3MiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkVudmlyb25tZW50U2VydmljZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0Vudmlyb25tZW50U2VydmljZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkVudmlyb25tZW50U2VydmljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUNsYXNzIEVudmlyb25tZW50U2VydmljZTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5FbnZpcm9ubWVudFNlcnZpY2U8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGNyZWF0ZXMgYSBjb25zb2xlIGVudmlyb25tZW50LiAgSXQgYWxzbyBjb250YWlucyBzdGF0aWMKLSBjb252aWVuY2VzIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuIElMb2cgb2JqZWN0IGFzIHdlbGwgYXMgYW4gRWNsaXBzZSBhbmQKLSBGaWxlIFNjaGVtZS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI0Vudmlyb25tZW50U2VydmljZSgpIj5FbnZpcm9ubWVudFNlcnZpY2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKSI+Z2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEVjbGlwc2VMb2coKSI+Z2V0RWNsaXBzZUxvZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZVNjaGVtZSgpIj5nZXRFY2xpcHNlU2NoZW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRGaWxlU2NoZW1lKCkiPmdldEZpbGVTY2hlbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkVudmlyb25tZW50U2VydmljZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1FbnZpcm9ubWVudFNlcnZpY2U8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5FbnZpcm9ubWVudFNlcnZpY2U8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPiA8Qj5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgYW4gRWNsaXBzZSBjb25zb2xlIGVudmlyb25tZW50LjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RWNsaXBzZUxvZygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRFY2xpcHNlTG9nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+IDxCPmdldEVjbGlwc2VMb2c8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhbiBFY2xpcHNlIGxvZ2dlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEVjbGlwc2VTY2hlbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RWNsaXBzZVNjaGVtZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPmdldEVjbGlwc2VTY2hlbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhbiBFY2xpcHNlIHNjaGVtZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEZpbGVTY2hlbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RmlsZVNjaGVtZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPmdldEZpbGVTY2hlbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhIEZpbGUgc2NoZW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJFbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI0MjZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTUgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JRW52aXJvbm1lbnQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCBpbnRlcmZhY2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklFbnZpcm9ubWVudCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lFbnZpcm9ubWVudC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElFbnZpcm9ubWVudDwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklFbnZpcm9ubWVudDwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotQW4gSUVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgZ2V0dGluZyBhIAotIDxvbD4KLSA8bGk+QSBsb2cgZm9yIHdyaXRpbmcgbWVzc2FnZXMgdG8gYSBsb2dnaW5nIGZhY2lsaXR5LDwvbGk+Ci0gPGxpPkEgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgcmVjZWl2aW5nIHByb2dyZXNzIGluZm9ybWF0aW9uLDwvbGk+Ci0gPGxpPkEgc3RhdHVzIGhhbmRsZXIgZm9yIHJlY2VpdmluZyBhbmQgcHJvY2Vzc2luZyBzdGF0dXMgcmVwb3J0cyw8L2xpPgotIDxsaT5BIGZhY3RvcnkgZm9yIHRoZSBoYW5kbGluZyBvZiBVUklzIChyZXNvdXJjZXMpLjwvbGk+Ci0gPC9vbD4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCNnZXRMb2coKSI+Z2V0TG9nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIGxvZ2dpbmcgZmFjaWxpdHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCNnZXRTdGF0dXNIYW5kbGVyKCkiPmdldFN0YXR1c0hhbmRsZXI8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldFVSSUZhY3RvcnkoKSI+Z2V0VVJJRmFjdG9yeTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBJVVJJIGZhY3RvcnkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRMb2coKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TG9nPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPiA8Qj5nZXRMb2c8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFN0YXR1c0hhbmRsZXIoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U3RhdHVzSGFuZGxlcjwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPiA8Qj5nZXRTdGF0dXNIYW5kbGVyPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIHN0YXR1cyBoYW5kbGVyLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgYSBzdGF0dXMgaGFuZGxlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFVSSUZhY3RvcnkoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VVJJRmFjdG9yeTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+IDxCPmdldFVSSUZhY3Rvcnk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGEgSVVSSSBmYWN0b3J5LgotIEhpbnQ6IEltcGxlbWVudGVycyBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIEZhY3RvcnkgdGhleSByZXR1cm4KLSBoYXMgYSByZWZlcmVuY2UgdG8gdGhpcyBJRW52aXJvbm1lbnQgc28gdGhhdCBJVVJJIG9iamVjdHMgY2FuCi0gcmVwb3J0IHByb2dyZXNzIGFuZCBhbm5vdW5jZSBzdGF0dXMuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+cmV0dXJucyBhIFVSSSBmYWN0b3J5LjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JRW52aXJvbm1lbnQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklFbnZpcm9ubWVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxMDhjZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NSBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUlMb2cKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cgaW50ZXJmYWNlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJTG9nIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSUxvZy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJTG9nPC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SUxvZzwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotSUxvZyBvYmplY3RzIHByb3ZpZGUgYSBtZWFucyBmb3IgbG9nZ2luZyBpbmZvcm1hdGlvbiBmb3IgRkZEQyBldGMuCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI0VSUk9SIj5FUlJPUjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGFuIGVycm9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjSU5GTyI+SU5GTzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGluZm9ybWF0aW9uYWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNPSyI+T0s8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBPay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sI1dBUk5JTkciPldBUk5JTkc8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyB3YXJuaW5nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNpc0VuYWJsZWQoKSI+aXNFbmFibGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0cnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNpc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZykiPmlzRW5hYmxlZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPmxvZzwvQT48L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWV0aG9kLAotICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+bG9nPC9BPjwvQj4oaW50Jm5ic3A7c2V2ZXJpdHksCi0gICAgaW50Jm5ic3A7bWVzc2FnZU51bSwKLSAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpIj5sb2c8L0E+PC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtjYWxsZXIsCi0gICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICBqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7dGhyb3dhYmxlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPmxvZzwvQT48L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24sCi0gICAgaW50Jm5ic3A7bWVzc2FnZU51bSwKLSAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtMb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCNsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj5sb2c8L0E+PC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7b3B0aW9uLAotICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWV0aG9kLAotICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtMb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKSI+bG9nPC9BPjwvQj4oaW50Jm5ic3A7c2V2ZXJpdHksCi0gICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO29wdGlvbiwKLSAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtjYWxsZXIsCi0gICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICBqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7dGhyb3dhYmxlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iT0siPjwhLS0gLS0+PC9BPjxIMz4KLU9LPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPk9LPC9CPjwvUFJFPgotPERMPgotPEREPlRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgT2suCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZy5PSyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJJTkZPIj48IS0tIC0tPjwvQT48SDM+Ci1JTkZPPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPklORk88L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBpbmZvcm1hdGlvbmFsLgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cuSU5GTyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJXQVJOSU5HIj48IS0tIC0tPjwvQT48SDM+Ci1XQVJOSU5HPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPldBUk5JTkc8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyB3YXJuaW5nLgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cuV0FSTklORyI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJFUlJPUiI+PCEtLSAtLT48L0E+PEgzPgotRVJST1I8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+RVJST1I8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBhbiBlcnJvci4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nLkVSUk9SIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iaXNFbmFibGVkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzRW5hYmxlZDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0VuYWJsZWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRydWUgaWYgbG9nZ2luZyBpcyBlbmFibGVkLgotIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGF0dGVtcHRpbmcKLSBhIGNhbGwgdG8gb25lIG9mIHRoZSA8Y29kZT5sb2c8L2NvZGU+IG1ldGhvZHMsIGFzIHRoZXkgd2lsbAotIHF1aWV0bHkgZG8gbm90aGluZyBpZiBsb2dnaW5nIGlzIGRpc2FibGVkLiBUaGlzIG1ldGhvZCBjYW4gYmUKLSB1c2VmdWwsIGhvd2V2ZXIsIGFueXdoZXJlIHRoZSBjb3N0IG9mIGJ1aWxkaW5nIHVwIHRoZSBwYXJhbWV0ZXJzCi0gdG8gYSBsb2cgbWV0aG9kIG1pZ2h0IGJlIGhpZ2ggYW5kIGJlc3QgYXZvaWRlZCBleGNlcHQgd2hlbiBsb2dnaW5nCi0gaXMgZW5hYmxlZC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5UcnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotaXNFbmFibGVkPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzRW5hYmxlZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO29wdGlvbik8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9wdGlvbjwvQ09ERT4gLSB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlYnVnIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWxvZzwvSDM+Ci08UFJFPgotdm9pZCA8Qj5sb2c8L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgICAgICAgaW50Jm5ic3A7bWVzc2FnZU51bSwKLSAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtjYWxsZXIsCi0gICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWV0aG9kLAotICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZSZuYnNwO3Rocm93YWJsZSk8L1BSRT4KLTxETD4KLTxERD5Mb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2V2ZXJpdHk8L0NPREU+IC0gVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LjxERD48Q09ERT5tZXNzYWdlTnVtPC9DT0RFPiAtIFRoZSBtZXNzYWdlIG51bWJlci48REQ+PENPREU+Y2FsbGVyPC9DT0RFPiAtIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuPEREPjxDT0RFPm1ldGhvZDwvQ09ERT4gLSBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLjxERD48Q09ERT50aHJvd2FibGU8L0NPREU+IC0gVGhlIFRocm93YWJsZSB0byBsb2cuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24sCi0gICAgICAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlJm5ic3A7dGhyb3dhYmxlKTwvUFJFPgotPERMPgotPEREPkxvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm9wdGlvbjwvQ09ERT4gLSB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPnRocm93YWJsZTwvQ09ERT4gLSBUaGUgVGhyb3dhYmxlIHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvUFJFPgotPERMPgotPEREPkxvZ3MgYSA8Y29kZT5TdGF0dXM8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSBUaGUgU3RhdHVzIHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtvcHRpb24sCi0gICAgICAgICBpbnQmbmJzcDttZXNzYWdlTnVtLAotICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO2NhbGxlciwKLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXRob2QsCi0gICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5Mb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2V2ZXJpdHk8L0NPREU+IC0gVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LjxERD48Q09ERT5vcHRpb248L0NPREU+IC0gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLjxERD48Q09ERT5tZXNzYWdlTnVtPC9DT0RFPiAtIFRoZSBtZXNzYWdlIG51bWJlci48REQ+PENPREU+Y2FsbGVyPC9DT0RFPiAtIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuPEREPjxDT0RFPm1ldGhvZDwvQ09ERT4gLSBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gVGhlIFN0YXR1cyB0byBsb2cuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1sb2c8L0gzPgotPFBSRT4KLXZvaWQgPEI+bG9nPC9CPihpbnQmbmJzcDtzZXZlcml0eSwKLSAgICAgICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9QUkU+Ci08REw+Ci08REQ+TG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPm9iamVjdDwvQ09ERT4gLSBUaGUgT2JqZWN0IHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImxvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWxvZzwvSDM+Ci08UFJFPgotdm9pZCA8Qj5sb2c8L0I+KGludCZuYnNwO3NldmVyaXR5LAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO29wdGlvbiwKLSAgICAgICAgIGludCZuYnNwO21lc3NhZ2VOdW0sCi0gICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7Y2FsbGVyLAotICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO21ldGhvZCwKLSAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9QUkU+Ci08REw+Ci08REQ+TG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXZlcml0eTwvQ09ERT4gLSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuPEREPjxDT0RFPm9wdGlvbjwvQ09ERT4gLSB0aGlzIGRlYnVnIG9wdGlvbiBzdHJpbmcuPEREPjxDT0RFPm1lc3NhZ2VOdW08L0NPREU+IC0gVGhlIG1lc3NhZ2UgbnVtYmVyLjxERD48Q09ERT5jYWxsZXI8L0NPREU+IC0gVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy48REQ+PENPREU+bWV0aG9kPC9DT0RFPiAtIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuPEREPjxDT0RFPm9iamVjdDwvQ09ERT4gLSBUaGUgT2JqZWN0IHRvIGxvZy48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSUxvZy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM1NWRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NSBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUlTdGF0dXNIYW5kbGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklTdGF0dXNIYW5kbGVyIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVN0YXR1c0hhbmRsZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJU3RhdHVzSGFuZGxlcjwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIEtub3duIEltcGxlbWVudGluZyBDbGFzc2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPk51bGxTdGF0dXNIYW5kbGVyPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JU3RhdHVzSGFuZGxlcjwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotUHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLgotPFA+Ci0KLTxQPgotPERMPgotPERUPjxCPlNpbmNlOjwvQj48L0RUPgotICA8REQ+MS4wPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2VbXSkiPnJlcG9ydDwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+W10mbmJzcDtjaG9pY2VzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBzZXQgb2YgcG9zc2libGUgcmVzcG9uc2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydEVycm9yPC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXBvcnQgdGhlIGdpdmVuIEVycm9yIFN0YXR1cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydEluZm88L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydCB0aGUgZ2l2ZW4gSW5mbyBTdGF0dXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnQ8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+IDxCPnJlcG9ydDwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+W10mbmJzcDtjaG9pY2VzKTwvUFJFPgotPERMPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgdG8gcmVwb3J0LjxERD48Q09ERT5jaG9pY2VzPC9DT0RFPiAtIHRoZSBjaG9pY2VzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdGhlIGNob2ljZSBtYWRlIGJ5IHRoZSB1c2VyL2hhbmRsZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnQ8L0gzPgotPFBSRT4KLXZvaWQgPEI+cmVwb3J0PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cykKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgdG8gcmVwb3J0LgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0NPREU+IC0gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaGFuZGxlciBkZWNpZGVzIHRoZSBjYWxsZXIKLSBzaG91bGQgc3RvcCBwcm9jZXNzaW5nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnRFcnJvcjwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZXBvcnRFcnJvcjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9QUkU+Ci08REw+Ci08REQ+UmVwb3J0IHRoZSBnaXZlbiBFcnJvciBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIGVycm9yIHN0YXR1cyB0byByZXBvcnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0SW5mbzwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZXBvcnRJbmZvPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEluZm8gU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBpbmZvIHN0YXR1cyB0byByZXBvcnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lTdGF0dXNIYW5kbGVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMDA1OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTUgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1OdWxsU3RhdHVzSGFuZGxlcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIgY2xhc3MiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik51bGxTdGF0dXNIYW5kbGVyIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik51bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9GT05UPgotPEJSPgotQ2xhc3MgTnVsbFN0YXR1c0hhbmRsZXI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXI8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDxEVD5pbXBsZW1lbnRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjTnVsbFN0YXR1c0hhbmRsZXIoKSI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydDwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIHdpdGggaW1wbGllZCBvcHRpb25zIHRvIGVpdGhlcgotIGNvbnRpbnVlIG9yIGFib3J0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+cmVwb3J0PC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT5bXSZuYnNwO2Nob2ljZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgYW5kIHNldCBvZiBwb3NzaWJsZSByZXNwb25zZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+cmVwb3J0RXJyb3I8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydCB0aGUgZ2l2ZW4gRXJyb3IgU3RhdHVzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+cmVwb3J0SW5mbzwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVwb3J0IHRoZSBnaXZlbiBJbmZvIFN0YXR1cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik51bGxTdGF0dXNIYW5kbGVyKCkiPjwhLS0gLS0+PC9BPjxIMz4KLU51bGxTdGF0dXNIYW5kbGVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0icmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4gPEI+cmVwb3J0PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+W10mbmJzcDtjaG9pY2VzKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2VbXSkiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5SZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgYW5kIHNldCBvZiBwb3NzaWJsZSByZXNwb25zZXMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2VbXSkiPnJlcG9ydDwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgdG8gcmVwb3J0LjxERD48Q09ERT5jaG9pY2VzPC9DT0RFPiAtIHRoZSBjaG9pY2VzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdGhlIGNob2ljZSBtYWRlIGJ5IHRoZSB1c2VyL2hhbmRsZXIuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+b3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5yZXBvcnQ8L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5TdGF0dXNFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+cmVwb3J0PC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIHN0YXR1cyB0byByZXBvcnQuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBoYW5kbGVyIGRlY2lkZXMgdGhlIGNhbGxlcgotIHNob3VsZCBzdG9wIHByb2Nlc3NpbmcuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PENPREU+b3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBvcnRFcnJvcjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVwb3J0RXJyb3I8L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlJlcG9ydCB0aGUgZ2l2ZW4gRXJyb3IgU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5yZXBvcnRFcnJvcjwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBlcnJvciBzdGF0dXMgdG8gcmVwb3J0LjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPjxDT0RFPklTdGF0dXNIYW5kbGVyLnJlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotcmVwb3J0SW5mbzwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVwb3J0SW5mbzwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5SZXBvcnQgdGhlIGdpdmVuIEluZm8gU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydEluZm88L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSB0aGUgaW5mbyBzdGF0dXMgdG8gcmVwb3J0LjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PENPREU+SVN0YXR1c0hhbmRsZXIucmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9OdWxsU3RhdHVzSGFuZGxlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg5MWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1TdGF0dXNFeGNlcHRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbiBjbGFzcyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iU3RhdHVzRXhjZXB0aW9uIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJTdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBTdGF0dXNFeGNlcHRpb248L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5UaHJvd2FibGUKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRFeGNlcHRpb248L0E+Ci0gICAgICAgICAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlPC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+U3RhdHVzRXhjZXB0aW9uPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCBieSBTdGF0dXNIYW5kbGVycyB0byB0ZWxsIHRoZWlyCi0gY2FsbGVycyB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc2VyaWFsaXplZC1mb3JtLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb24iPlNlcmlhbGl6ZWQgRm9ybTwvQT48L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI1N0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSkiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Jm5ic3A7Y2hvaWNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5TdGF0dXNFeGNlcHRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwjU3RhdHVzRXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSkiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+Jm5ic3A7Y2hvaWNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gYW5kIHN0YXR1cyBvYmplY3QuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI2dldENob2ljZSgpIj5nZXRDaG9pY2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRFeGNlcHRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRFeGNlcHRpb248L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sI2dldFN0YXR1cygpIj5nZXRTdGF0dXM8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmZpbGxJblN0YWNrVHJhY2UsIGdldENhdXNlLCBnZXRMb2NhbGl6ZWRNZXNzYWdlLCBnZXRNZXNzYWdlLCBnZXRTdGFja1RyYWNlLCBpbml0Q2F1c2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBwcmludFN0YWNrVHJhY2UsIHNldFN0YWNrVHJhY2UsIHRvU3RyaW5nPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj48IS0tIC0tPjwvQT48SDM+Ci1TdGF0dXNFeGNlcHRpb248L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5TdGF0dXNFeGNlcHRpb248L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlN0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSkiPjwhLS0gLS0+PC9BPjxIMz4KLVN0YXR1c0V4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIDxCPlN0YXR1c0V4Y2VwdGlvbjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4mbmJzcDtjaG9pY2UpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlLgotIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi08UD4KLTxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+Y2hvaWNlPC9DT0RFPiAtIHRoZSBjaG9pY2UgZm9yIHRoaXMgZXhjZXB0aW9uLjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJTdGF0dXNFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlKSI+PCEtLSAtLT48L0E+PEgzPgotU3RhdHVzRXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+U3RhdHVzRXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4mbmJzcDtjaG9pY2UpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gYW5kIHN0YXR1cyBvYmplY3QuIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi08UD4KLTxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3RhdHVzPC9DT0RFPiAtIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLjxERD48Q09ERT5jaG9pY2U8L0NPREU+IC0gdGhlIGNob2ljZSBmb3IgdGhpcyBleGNlcHRpb24uPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0Q2hvaWNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENob2ljZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+IDxCPmdldENob2ljZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRoZSBDaG9pY2Ugb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJTdGF0dXNFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9DaG9pY2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvQ2hvaWNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTdmYjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9DaG9pY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZUNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkNob2ljZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlN0YXR1c0V4Y2VwdGlvbi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCNnZXRDaG9pY2UoKSI+Z2V0Q2hvaWNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk51bGxTdGF0dXNIYW5kbGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+cmVwb3J0PC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT5bXSZuYnNwO2Nob2ljZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVN0YXR1c0hhbmRsZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPltdJm5ic3A7Y2hvaWNlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk51bGxTdGF0dXNIYW5kbGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwjcmVwb3J0KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZVtdKSI+cmVwb3J0PC9BPjwvQj4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMmbmJzcDtzdGF0dXMsCi0gICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT5bXSZuYnNwO2Nob2ljZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVN0YXR1c0hhbmRsZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlW10pIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPltdJm5ic3A7Y2hvaWNlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNvbnN0cnVjdG9ycyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwjU3RhdHVzRXhjZXB0aW9uKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlKSI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkNob2ljZTwvQT4mbmJzcDtjaG9pY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sI1N0YXR1c0V4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2UpIj5TdGF0dXNFeGNlcHRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPiZuYnNwO2Nob2ljZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIENob2ljZQotIGFuZCBzdGF0dXMgb2JqZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlQ2hvaWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQ2hvaWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2U5ZmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbiI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJFbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRFeGNlcHRpb248L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5TdWJjbGFzc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPkVudmlyb25tZW50RXhjZXB0aW9uPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPlN0YXR1c0V4Y2VwdGlvbjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCBieSBTdGF0dXNIYW5kbGVycyB0byB0ZWxsIHRoZWlyCi0gY2FsbGVycyB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZUVudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50U2VydmljZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJiNDY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZQotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2UiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1xjbGFzcy11c2VFbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJFbnZpcm9ubWVudFNlcnZpY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTwvQj48L0gyPgotPC9DRU5URVI+Ci1ObyB1c2FnZSBvZiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lFbnZpcm9ubWVudC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9JRW52aXJvbm1lbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzYzYzNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lFbnZpcm9ubWVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50PC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklFbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JRW52aXJvbm1lbnQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklFbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUVudmlyb25tZW50PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5FbnZpcm9ubWVudFNlcnZpY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpIj5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSUVudmlyb25tZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lMb2cuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSUxvZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNlYTNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSUxvZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZwotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklMb2cuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JTG9nPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkVudmlyb25tZW50U2VydmljZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuaHRtbCNnZXRFY2xpcHNlTG9nKCkiPmdldEVjbGlwc2VMb2c8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SUxvZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SUVudmlyb25tZW50LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5odG1sI2dldExvZygpIj5nZXRMb2c8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSUxvZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklMb2cuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSVN0YXR1c0hhbmRsZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSVN0YXR1c0hhbmRsZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmZWZlMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lTdGF0dXNIYW5kbGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1xjbGFzcy11c2VJU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCBpbXBsZW1lbnQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+TnVsbFN0YXR1c0hhbmRsZXI8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklTdGF0dXNIYW5kbGVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JRW52aXJvbm1lbnQuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50Lmh0bWwjZ2V0U3RhdHVzSGFuZGxlcigpIj5nZXRTdGF0dXNIYW5kbGVyPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIHN0YXR1cyBoYW5kbGVyLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9OdWxsU3RhdHVzSGFuZGxlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9OdWxsU3RhdHVzSGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRkNTgwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZU51bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Lk51bGxTdGF0dXNIYW5kbGVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXIKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9cY2xhc3MtdXNlTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJOdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9TdGF0dXNFeGNlcHRpb24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODIyMDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9TdGF0dXNFeGNlcHRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbiI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZVN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCB0aHJvdyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5OdWxsU3RhdHVzSGFuZGxlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykiPnJlcG9ydDwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVN0YXR1c0hhbmRsZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5yZXBvcnQ8L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSBjb250aW51ZSBvciBhYm9ydC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvXGNsYXNzLXVzZVN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlN0YXR1c0V4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTFlMDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IHBhY2thZ2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lVGl0bGVGb250Ij4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUludGVyZmFjZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJJRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklFbnZpcm9ubWVudDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JTG9nPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JU3RhdHVzSGFuZGxlcjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUNsYXNzZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJDaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+Q2hvaWNlPC9BPgotPEJSPgotPEEgSFJFRj0iRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkVudmlyb25tZW50U2VydmljZTwvQT4KLTxCUj4KLTxBIEhSRUY9Ik51bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk51bGxTdGF0dXNIYW5kbGVyPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLQotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1FeGNlcHRpb25zPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+RW52aXJvbm1lbnRFeGNlcHRpb248L0E+Ci08QlI+Ci08QSBIUkVGPSJTdGF0dXNFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHRhcmdldD0iY2xhc3NGcmFtZSI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg5YmZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCBwYWNrYWdlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBQQUNLQUdFJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+TkVYVCBQQUNLQUdFPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLTwvSDI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+SW50ZXJmYWNlIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JRW52aXJvbm1lbnQ8L0E+PC9CPjwvVEQ+Ci08VEQ+QW4gSUVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgZ2V0dGluZyBhIAotIAotIEEgbG9nIGZvciB3cml0aW5nIG1lc3NhZ2VzIHRvIGEgbG9nZ2luZyBmYWNpbGl0eSwKLSBBIHByb2dyZXNzIG1vbml0b3IgZm9yIHJlY2VpdmluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbiwKLSBBIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsCi0gQSBmYWN0b3J5IGZvciB0aGUgaGFuZGxpbmcgb2YgVVJJcyAocmVzb3VyY2VzKS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPklMb2c8L0E+PC9CPjwvVEQ+Ci08VEQ+SUxvZyBvYmplY3RzIHByb3ZpZGUgYSBtZWFucyBmb3IgbG9nZ2luZyBpbmZvcm1hdGlvbiBmb3IgRkZEQyBldGMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+UHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5DbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5DaG9pY2U8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+RW52aXJvbm1lbnRTZXJ2aWNlPC9BPjwvQj48L1REPgotPFREPlRoaXMgY2xhc3MgY3JlYXRlcyBhIGNvbnNvbGUgZW52aXJvbm1lbnQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5OdWxsU3RhdHVzSGFuZGxlcjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVN0YXR1c0hhbmRsZXIgaW50ZXJmYWNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FeGNlcHRpb24gU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgZm9yIGNvbmRpdGlvbnMgcmFpc2VkIGJ5IHRoZSBJRW52aXJvbm1lbnQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+U3RhdHVzRXhjZXB0aW9uPC9BPjwvQj48L1REPgotPFREPlRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIGJ5IFN0YXR1c0hhbmRsZXJzIHRvIHRlbGwgdGhlaXIKLSBjYWxsZXJzIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgUEFDS0FHRSZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPk5FWFQgUEFDS0FHRTwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODZmYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCBDbGFzcyBIaWVyYXJjaHkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwiPjxCPk5FWFQ8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci1IaWVyYXJjaHkgRm9yIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudAotPC9IMj4KLTwvQ0VOVEVSPgotPERMPgotPERUPjxCPlBhY2thZ2UgSGllcmFyY2hpZXM6PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy10cmVlLmh0bWwiPkFsbCBQYWNrYWdlczwvQT48L0RMPgotPEhSPgotPEgyPgotQ2xhc3MgSGllcmFyY2h5Ci08L0gyPgotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLk9iamVjdDxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkNob2ljZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+RW52aXJvbm1lbnRTZXJ2aWNlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPk51bGxTdGF0dXNIYW5kbGVyPC9CPjwvQT4gKGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+SVN0YXR1c0hhbmRsZXI8L0E+KQotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLlRocm93YWJsZSAoaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSkKLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5FeGNlcHRpb248VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkVudmlyb25tZW50RXhjZXB0aW9uPC9CPjwvQT48VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5TdGF0dXNFeGNlcHRpb248L0I+PC9BPjwvVUw+Ci08L1VMPgotPC9VTD4KLTwvVUw+Ci08L1VMPgotPEgyPgotSW50ZXJmYWNlIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5JRW52aXJvbm1lbnQ8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SVN0YXR1c0hhbmRsZXI8L0I+PC9BPjwvVUw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtdHJlZS5odG1sIj48Qj5ORVhUPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXVzZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmEyM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIFBhY2thZ2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Nob2ljZS5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPkNob2ljZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIElTdGF0dXNIYW5kbGVyIGludGVyZmFjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+RW52aXJvbm1lbnRFeGNlcHRpb248L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIGZvciBjb25kaXRpb25zIHJhaXNlZCBieSB0aGUgSUVudmlyb25tZW50LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvSUVudmlyb25tZW50Lmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUVudmlyb25tZW50PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FuIElFbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgbWVhbnMgZm9yIGdldHRpbmcgYSAKLSAKLSBBIGxvZyBmb3Igd3JpdGluZyBtZXNzYWdlcyB0byBhIGxvZ2dpbmcgZmFjaWxpdHksCi0gQSBwcm9ncmVzcyBtb25pdG9yIGZvciByZWNlaXZpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24sCi0gQSBzdGF0dXMgaGFuZGxlciBmb3IgcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIHN0YXR1cyByZXBvcnRzLAotIEEgZmFjdG9yeSBmb3IgdGhlIGhhbmRsaW5nIG9mIFVSSXMgKHJlc291cmNlcykuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L2NsYXNzLXVzZS9JTG9nLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJTG9nIG9iamVjdHMgcHJvdmlkZSBhIG1lYW5zIGZvciBsb2dnaW5nIGluZm9ybWF0aW9uIGZvciBGRkRDIGV0Yy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvY2xhc3MtdXNlL0lTdGF0dXNIYW5kbGVyLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SVN0YXR1c0hhbmRsZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSBpbmRpY2F0aW9uIG9mIGNob2ljZXMgbWFkZSBieSB0aGUgcmVjaXBpZW50IG9mIHRoZSBzdGF0dXMgYW5kCi0gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gcHJvY2VzaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9jbGFzcy11c2UvU3RhdHVzRXhjZXB0aW9uLmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+U3RhdHVzRXhjZXB0aW9uPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIGJ5IFN0YXR1c0hhbmRsZXJzIHRvIHRlbGwgdGhlaXIKLSBjYWxsZXJzIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiMTJmOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JVVJJCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSBpbnRlcmZhY2UiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklVUkkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUkkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElVUkk8L0gyPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JVVJJPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1BIElVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXBwZW5kKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5hcHBlbmQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7cmVsYXRpdmVVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5pby5GaWxlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc0ZpbGUoKSI+YXNGaWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2FzU3RyaW5nKCkiPmFzU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubmV0LlVSTDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXNVUkwoKSI+YXNVUkw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZXJhc2UoKSI+ZXJhc2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLklucHV0U3RyZWFtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNnZXRJbnB1dFN0cmVhbSgpIj5nZXRJbnB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLk91dHB1dFN0cmVhbTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZ2V0T3V0cHV0U3RyZWFtKCkiPmdldE91dHB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNnZXRVUklTY2hlbWUoKSI+Z2V0VVJJU2NoZW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzQXZhaWxhYmxlQXNGaWxlKCkiPmlzQXZhaWxhYmxlQXNGaWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzQXZhaWxhYmxlQXNVUkwoKSI+aXNBdmFpbGFibGVBc1VSTDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc0hpZXJhcmNoaWNhbCgpIj5pc0hpZXJhcmNoaWNhbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc0xlYWYoKSI+aXNMZWFmPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzUHJlc2VudCgpIj5pc1ByZXNlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjaXNSZWFkYWJsZSgpIj5pc1JlYWRhYmxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2lzUmVsYXRpdmUoKSI+aXNSZWxhdGl2ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNpc1dyaXRhYmxlKCkiPmlzV3JpdGFibGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNsaXN0KCkiPmxpc3Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbGlzdCBvZiBVUklzIGZvciB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotIGhpZXJhcmNoaWNhbCwgbm9uLWxlYWYgSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNsaXN0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj5saXN0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciBsaXN0KCksIGV4Y2VwdCBvbmx5IFVSSXMgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuCi0gZmlsdGVyIGFyZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3BhcmVudCgpIj5wYXJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjcmVuYW1lKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5yZW5hbWU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7bmV3VVJJKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVuYW1lcyBvciBtb3ZlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkKLSB0byB0aGUgbmV3IElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvdWNoRm9sZGVyKCkiPnRvdWNoRm9sZGVyPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlcyBhIG5ldyBmb2xkZXIgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIGlkZW50aWZpZWQgYnkKLSB0aGUgSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjdG91Y2hMZWFmKCkiPnRvdWNoTGVhZjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcsIGVtcHR5IHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gdGhlIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmlzaXRzIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBkZWNlbmRhbnRzIGluIHByZS1vcmRlciBmYXNoaW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvciwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPnZpc2l0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Jm5ic3A7dXJpVmlzaXRvciwKLSAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT4mbmJzcDt1cmlGaWx0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlciBhcmUgdmlzaXRlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InRvU3RyaW5nKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXRvU3RyaW5nPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgSVVSSS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRVUklTY2hlbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VVJJU2NoZW1lPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPmdldFVSSVNjaGVtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRoZSBJVVJJU2NoZW1lIGZvciB0aGUgc2NoZW1lIG9mIHRoaXMgSVVSSS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1ByZXNlbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNQcmVzZW50PC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzUHJlc2VudDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0xlYWYoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNMZWFmPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzTGVhZjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSBhbmQgaXMgYSBsZWFmLiBSZXR1cm5zIHRydWUgYWx3YXlzIGZvciBub24taGllcmFyY2hpY2FsIHNjaGVtZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1JlYWRhYmxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzUmVhZGFibGU8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+aXNSZWFkYWJsZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSBhbmQgaXMgcmVhZGFibGUuIEEgcmVhZGFibGUgbGVhZiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBhbgotIGlucHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSByZWFkYWJsZSBmb2xkZXIKLSByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGZvbGRlciwgaWYgYW55LAotIGNhbiBiZSBkZXRlcm1pbmVkIHZpYSB0aGUgbGlzdCgpIG9yIHZpc2l0KCkgbWV0aG9kcy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzV3JpdGFibGUoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNXcml0YWJsZTwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc1dyaXRhYmxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJIGV4aXN0cwotIGFuZCBpcyB3cml0YWJsZS4gQSB3cml0YWJsZSBsZWFmIHJlc291cmNlIGluZGljYXRlcyB0aGF0IGFuCi0gb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSB3cml0YWJsZSBmb2xkZXIKLSByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBuZXcgcmVzb3VyY2VzIGNhbiBiZSBjcmVhdGVkIGluIHRoZSBmb2xkZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0hpZXJhcmNoaWNhbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0hpZXJhcmNoaWNhbDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0hpZXJhcmNoaWNhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWZmIHRoaXMgSVVSSSBiZWxvbmdzIHRvIGEgaGllcmFyY2hpY2FsIHNjaGVtZS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gdGhpcy5pc0hpZXJhcmNoaWNhbCgpID09IHRoaXMuZ2V0VVJJU2NoZW1lKCkuaXNIaWVyYXJjaGljYWwoKS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzUmVsYXRpdmUoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNSZWxhdGl2ZTwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc1JlbGF0aXZlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZmYgdGhpcyBJVVJJIGlzIGEgcmVsYXRpdmUgSVVSSS4KLSBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJwYXJlbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotcGFyZW50PC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPnBhcmVudDwvQj4oKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyB0aGUgSVVSSSBvZiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhpcyBJVVJJLgotIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlcmUgaXMgbm8gcGFyZW50IFVSSS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFwcGVuZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotYXBwZW5kPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPmFwcGVuZDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3JlbGF0aXZlVVJJKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlbGF0aXZlVVJJPC9DT0RFPiAtIGEgcmVsYXRpdmUgVVJJLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIGEgbmV3LCBub3JtYWxpemVkIElVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4KLSByZWxhdGl2ZSBJVVJJIHRvIHRoaXMgSVVSSS4gQm90aCBVUklzIG11c3QgYmUgaGllcmFyY2hpY2FsLgotIFRoZSByZXN1bHRpbmcgSVVSSSB3aWxsIGFsd2F5cyBiZSBoaWVyYXJjaGljYWwuIFRoZSBnaXZlbgotIElVUkkgbXVzdCBiZSByZWxhdGl2ZS4gVGhpcyBJVVJJIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4KLSB0aGUgcmVzdWx0aW5nIElVUkkgd2lsbCBiZSBlcXVpdmFsZW50bHkgcmVsYXRpdmUgb3IgYWJzb2x1dGUuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIHJlbGF0aXZlVVJJIGlzIG5vdCByZWxhdGl2ZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElucHV0U3RyZWFtKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElucHV0U3RyZWFtPC9IMz4KLTxQUkU+Ci1qYXZhLmlvLklucHV0U3RyZWFtIDxCPmdldElucHV0U3RyZWFtPC9CPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPkdldHMgYW4gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgZnJvbSB0aGUgcmVzb3VyY2UKLSBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIElVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGEgc3RyZWFtIGZvciB0aGlzIFVSSSBjYW4gbm90IGJlIGNyZWF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRPdXRwdXRTdHJlYW0oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0T3V0cHV0U3RyZWFtPC9IMz4KLTxQUkU+Ci1qYXZhLmlvLk91dHB1dFN0cmVhbSA8Qj5nZXRPdXRwdXRTdHJlYW08L0I+KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5HZXRzIGFuIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGUgcmVzb3VyY2UKLSBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIElVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGEgc3RyZWFtIGZvciB0aGlzIFVSSSBjYW4gbm90IGJlIGNyZWF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ0b3VjaExlYWYoKSI+PCEtLSAtLT48L0E+PEgzPgotdG91Y2hMZWFmPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnRvdWNoTGVhZjwvQj4oKQotICAgICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotIHRoZSBJVVJJLiBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IHRydWUuIElmIGEgbGVhZgotIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEKLSBub24tbGVhZiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyB1bmRlciB0aGlzIElVUkksIGNyZWF0aW9uCi0gd2lsbCBmYWlsIGFuZCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHRvdWNoaW5nIHRoaXMgbGVhZiByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InRvdWNoRm9sZGVyKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXRvdWNoRm9sZGVyPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnRvdWNoRm9sZGVyPC9CPigpCi0gICAgICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlcyBhIG5ldyBmb2xkZXIgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIGlkZW50aWZpZWQgYnkKLSB0aGUgSVVSSS4gVGhlIHNjaGVtZSBvZiB0aGUgSVVSSSBtdXN0IGJlIGhpZXJhcmNoaWNhbC4KLSBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IGZhbHNlLiBJZiBhIGZvbGRlciByZXNvdXJjZQotIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEgbGVhZiByZXNvdXJjZQotIGFscmVhZHkgZXhpc3RzIHVuZGVyIHRoaXMgSVVSSSwgY3JlYXRpb24gd2lsbCBmYWlsIGFuZCBhbgotIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiBhbiBlcnJvciBvY2N1cnMgdG91Y2hpbmcgdGhpcyBmb2xkZXIgcmVzb3VyY2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJlcmFzZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1lcmFzZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5lcmFzZTwvQj4oKQotICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkVyYXNlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIGVyYXNpbmcgdGhpcyByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbmFtZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotcmVuYW1lPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnJlbmFtZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO25ld1VSSSkKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+UmVuYW1lcyBvciBtb3ZlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkKLSB0byB0aGUgbmV3IElVUkkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5ld1VSSTwvQ09ERT4gLSB0aGUgbmV3IFVSSSBuYW1lIGZvciB0aGlzIFVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHJlbmFtaW5nIHRoaXMgcmVzb3VyY2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZpc2l0PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnZpc2l0PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yKQotICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPlZpc2l0cyB0aGlzIHJlc291cmNlIGFuZCBpdHMgZGVjZW5kYW50cyBpbiBwcmUtb3JkZXIgZmFzaGlvbi4KLSBGb3IgZWFjaCByZXNvdXJjZSwgd2hldGhlciBhIGZvbGRlciBvciBhIGxlYWYsIHRoZSBnaXZlbgotIElVUklWaXNpdG9yJ3MgdmlzaXQoKSBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIElVUkkgb2YgdGhlCi0gcmVzb3VyY2UuIElmIElVUklWaXNpdG9yLnZpc2l0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHZpc2l0aW5nCi0gYWxnb3JpdGhtIHdpbGwgInBydW5lIiB0aGUgZGVjZW5kYW50cyBvZiB0aGUgcmVzb3VyY2UgYW5kCi0gY2Fycnkgb24gdmlzaXRpbmcgdGhlIHJlc3Qgb2YgdGhlIHRyZWUuIElmIElVUklWaXNpdG9yLnZpc2l0KCkKLSByZXR1cm5zIHRydWUsIHRoZSB2aXNpdGluZyBhbGdvcml0aG0gd2lsbCBjb250aW51ZSBpdHMgd2FsawotIGRvd24gdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaVZpc2l0b3I8L0NPREU+IC0gdGhlIHZpc2l0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCByZXNvdXJjZSB2aXNpdGVkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiBhbiBlcnJvciBvY2N1cnMgdmlzaXRpbmcgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmlzaXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3IsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj48IS0tIC0tPjwvQT48SDM+Ci12aXNpdDwvSDM+Ci08UFJFPgotdm9pZCA8Qj52aXNpdDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Jm5ic3A7dXJpVmlzaXRvciwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcikKLSAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD5BcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlciBhcmUgdmlzaXRlZC4gSWYgYSBmb2xkZXIgcmVzb3VyY2UKLSBmYWlscyB0byBiZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyLCB0aGlzIHdpbGwgbm90IHByZXZlbnQgdGhlCi0gdmlzaXRpbmcgYWxnb3JpdGhtIGZyb20gd2Fsa2luZyB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cy4KLSBJdCByZW1haW5zIHRoZSBqb2Igb2YgdGhlIHZpc2l0b3IgdG8gY2hvb3NlIHdoZXRoZXIgb3Igbm90IHRvCi0gcHJ1bmUgYSBicmFuY2ggYnkgcmV0dXJuaW5nIGZhbHNlIG9yIHRydWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaVZpc2l0b3I8L0NPREU+IC0gdGhlIHZpc2l0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCByZXNvdXJjZSB2aXNpdGVkLjxERD48Q09ERT51cmlGaWx0ZXI8L0NPREU+IC0gdGhlIHJlc291cmNlIGZpbHRlci4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHZpc2l0aW5nIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Imxpc3QoKSI+PCEtLSAtLT48L0E+PEgzPgotbGlzdDwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdIDxCPmxpc3Q8L0I+KCkKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhIGxpc3Qgb2YgVVJJcyBmb3IgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSBoaWVyYXJjaGljYWwsIG5vbi1sZWFmIElVUkkuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwKLSB0aG91Z2ggaXQgbWF5IHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5LgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnJldHVybnMgdGhlIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIGxvY2F0aW5nIHRoZSBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsaXN0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj48IS0tIC0tPjwvQT48SDM+Ci1saXN0PC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W10gPEI+bGlzdDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcikKLSAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLAotIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaUZpbHRlcjwvQ09ERT4gLSB0aGUgY2hpbGQgZmlsdGVyLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIHRoZSBmaWx0ZXJlZCBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGFuIGVycm9yIG9jY3VycyBsb2NhdGluZyB0aGUgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNBdmFpbGFibGVBc1VSTCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0F2YWlsYWJsZUFzVVJMPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQXZhaWxhYmxlQXNVUkw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyB0cnVlIGlmIHRoZSBhc1VSTCgpIG1ldGhvZCBpcyBmYWlyIGdhbWUsCi0gaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgSVVSSSBjYW4gYmUgY29udmVydGVkIGludG8gYSBVUkwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhc1VSTCgpIj48IS0tIC0tPjwvQT48SDM+Ci1hc1VSTDwvSDM+Ci08UFJFPgotamF2YS5uZXQuVVJMIDxCPmFzVVJMPC9CPigpCi0gICAgICAgICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIFVSTCBvYmplY3QgZm9yIHRoZSByZXNvdXJjZSB1bmRlciB0aGlzIElVUkkuCi0gVGhlcmUgYXJlIG1hbnkgVVJJcyBhbmQgVVJJU2NoZW1lcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QKLSB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIHJlcHJlc2VudGFibGUgYXMgVVJMcy4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIHJldHVybmluZyB0aGlzIFVSTC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQXZhaWxhYmxlQXNGaWxlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQXZhaWxhYmxlQXNGaWxlPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQXZhaWxhYmxlQXNGaWxlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZiB0aGUgYXNGaWxlKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSBpbiBvdGhlciB3b3JkcywgaWYgdGhpcyBJVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIEZpbGUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhc0ZpbGUoKSI+PCEtLSAtLT48L0E+PEgzPgotYXNGaWxlPC9IMz4KLTxQUkU+Ci1qYXZhLmlvLkZpbGUgPEI+YXNGaWxlPC9CPigpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgSVVSSS4KLSBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gaW4gY2FzZXMgd2hlcmUgVVJJcyBhcmUga25vd24gdG8gYmUgYmFja2VkIGJ5IHBoeXNpY2FsIGZpbGVzLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiBhbiBlcnJvciBvY2N1cnMgcmV0dXJuaW5nIHRoaXMgRmlsZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzU3RyaW5nKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzU3RyaW5nPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmFzU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdGhlIElVUkkgYXMgYSBzdHJpbmcuCi0gRXF1aXZhbGVudCB0byB0b1N0cmluZygpLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUkkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc1ZTE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JVVJJRmFjdG9yeQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5IGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVVSSUZhY3RvcnkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJRmFjdG9yeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElVUklGYWN0b3J5PC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgS25vd24gSW1wbGVtZW50aW5nIENsYXNzZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklVUklGYWN0b3J5PC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElVUkkgYW5kIElVUklTY2hlbWUgb2JqZWN0cy4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSVNjaGVtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzY2hlbWVPclVSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLW5ld1VSSTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiA8Qj5uZXdVUkk8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dXJpPC9DT0RFPiAtIHRoZSB1cmkgdG8gYmUgY3JlYXRlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG5ldyBVUkkuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIHRoZSB1cmkgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbGlkIFVSSS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Im5ld1VSSShqYXZhLm5ldC5VUkwpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUkk8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gPEI+bmV3VVJJPC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dXJsPC9DT0RFPiAtIHRoZSB1cmwgdG8gdXNlIHRvIGNyZWF0ZSB0aGlzIFVSSQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbmV3IFVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlIHVybCBwYXJhbWV0ZXIgaXMgbm90IGEgdmFsaWQgdXJsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUklTY2hlbWU8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT4gPEI+bmV3VVJJU2NoZW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuCi0gSWYgdGhlIHN0cmluZyBjb250YWlucyBubyBjb2xvbnMsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGludGVycHJldHRlZAotIGFzIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWUuIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYSBjb2xvbiwgdGhlbiB0aGUKLSBzdWJzdHJpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgZmlyc3QgY29sb24gaXMgaW50ZXJwcmV0dGVkIGFzIHRoZQotIG5hbWUgb2YgdGhlIHNjaGVtZSwgbWVhbmluZyB0aGUgY2FsbGVyIGNhbiBwYXNzIGluIGFueSBJVVJJIHN0cmluZyBpbgotIG9yZGVyIHRvIGdldCBhIElVUklTY2hlbWUgb2JqZWN0LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zY2hlbWVPclVSSTwvQ09ERT4gLSB0aGUgc2NoZW1lIG9yIFVSSSBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgc2NoZW1lLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbmV3IFNjaGVtZS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgc2NoZW1lT3JVcmkgcGFyYW1ldGVyIGRvZXMgbm90IGNvbnRhaW4KLSBhIHZhbGlkIHNjaGVtZSBvciBVUkkgbmFtZS48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVVSSUZhY3RvcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MzQ2YjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU2IEVEVCAyMDA4IC0tPgotPFRJVExFPgotSVVSSUZpbHRlcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIgaW50ZXJmYWNlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJVVJJRmlsdGVyIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVVSSUZpbHRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVVSSUZpbHRlcjwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklVUklGaWx0ZXI8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBvciBsaXN0IFVSSXMuCi0gUmVmZXIgdG8gPENPREU+SVVSSSNnZXRDaGlsZHJlbjwvQ09ERT4uCi08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2luY2U6PC9CPjwvRFQ+Ci0gIDxERD4xLjA8L0REPgotPC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sI2FjY2VwdHMob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmFjY2VwdHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RmlsdGVycyB0aGUgZ2l2ZW4gSVVSSS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFjY2VwdHMob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjwhLS0gLS0+PC9BPjxIMz4KLWFjY2VwdHM8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+YWNjZXB0czwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPkZpbHRlcnMgdGhlIGdpdmVuIElVUkkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdG8gZmlsdGVyLjxERD48Q09ERT51cmk8L0NPREU+IC0gdGhlIHVyaSB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlRydWUgaWYgdGhlIHJlc291cmNlIG1hdGNoZXMgdGhlIGZpbHRlciwKLSBmYWxzZSBpZiBpdCBkb2VzIG5vdC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gSWYgdGhlIGZpbHRlciBmYWlscyB0byBhbmFseXplIHRoZSByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVVSSUZpbHRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVkNGYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NiBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUlVUklTY2hlbWUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lIGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVVSSVNjaGVtZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklTY2hlbWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElVUklTY2hlbWU8L0gyPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JVVJJU2NoZW1lPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1BIElVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmaWVycy4gRXhhbXBsZXMgaW5jbHVkZSAiZmlsZSIsICJodHRwIgotIGFuZCAicGxhdGZvcm0iIChFY2xpcHNlKS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjaXNIaWVyYXJjaGljYWwoKSI+aXNIaWVyYXJjaGljYWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjaXNWYWxpZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+aXNWYWxpZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5uZXdVUkk8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkoamF2YS5uZXQuVVJMKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5uZXQuVVJMJm5ic3A7dXJsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLW5ld1VSSTwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiA8Qj5uZXdVUkk8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dXJpPC9DT0RFPiAtIHRoZSBVUkkgdG8gYmUgY3JlYXRlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIG5ldyBJVVJJLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBpZiB0aGUgdXJpIHNwZWNpZmllZCBpcyBub3QgdmFsaWQgb3IKLSBjYW4gbm90IGJlIGNyZWF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJuZXdVUkkoamF2YS5uZXQuVVJMKSI+PCEtLSAtLT48L0E+PEgzPgotbmV3VVJJPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPm5ld1VSSTwvQj4oamF2YS5uZXQuVVJMJm5ic3A7dXJsKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVybDwvQ09ERT4gLSB0aGUgdXJsIHVzZWQgdG8gY3JlYXRlIHRoZSBVUkkuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBuZXcgSVVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlIHVybCBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gY2FuIG5vdCBiZSBjcmVhdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUkk8L0gzPgotPFBSRT4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gPEI+bmV3VVJJPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaTwvQ09ERT4gLSB0aGUgVVJJIHRvIGJlIGNyZWF0ZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgYSBuZXcgSVVSSS4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgdGhlIHVyaSBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gY2FuIG5vdCBiZSBjcmVhdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+dG9TdHJpbmc8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+dG9TdHJpbmc8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEubGFuZy5PYmplY3Q8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdGhlIHByb3BlciBuYW1lIG9mIHRoZSBzY2hlbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0hpZXJhcmNoaWNhbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0hpZXJhcmNoaWNhbDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0hpZXJhcmNoaWNhbDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5SZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBzY2hlbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1ZhbGlkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj48IS0tIC0tPjwvQT48SDM+Ci1pc1ZhbGlkPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzVmFsaWQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT51cmk8L0NPREU+IC0gdGhlIHVyaSB0byBjaGVjayBmb3IgdmFsaWRpdHkuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPlJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gSVVSSSBzYXRpc2ZpZXMgdGhlCi0gZ3JhbW1hdGljYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBzY2hlbWUuIEFic29sdXRlIFVSSXMgbXVzdAotIGJlZ2luIHdpdGggIjxzY2hlbWU+OiIuIFJlbGF0aXZlIFVSSXMgbXVzdCBlaXRoZXIgbm90IGNvbnRhaW4KLSBhIGNvbG9uLCAiOiIsIG9yIGl0IG11c3QgYmVnaW4gd2l0aCAiLi8iLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyA8Qj52YWxpZGF0ZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVyaTwvQ09ERT4gLSB0aGUgdXJpIHRvIGNoZWNrIGZvciB2YWxpZGl0eS4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+UmV0dXJucyBhIFN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4KLSBJVVJJIGlzIHZhbGlkLiBUaGUgc2V2ZXJpdHkgYW5kIG1lc3NhZ2Ugb2YgdGhlIFN0YXR1cyBvYmplY3QKLSB3aWxsIGRlc2NyaWJlIHRoaXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklTY2hlbWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUzZTA3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTYgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1JVVJJVmlzaXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yIGludGVyZmFjZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVVSSVZpc2l0b3IiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJVmlzaXRvci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVVSSVZpc2l0b3I8L0gyPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JVVJJVmlzaXRvcjwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IFVSSXMuCi0gUmVmZXIgdG8gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yKSI+PENPREU+SVVSSS52aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcik8L0NPREU+PC9BPi4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj52aXNpdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWaXNpdHMgdGhlIGdpdmVuIElVUkkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotdmlzaXQ8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+dmlzaXQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpCi0gICAgICAgICAgICAgIHRocm93cyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9QUkU+Ci08REw+Ci08REQ+VmlzaXRzIHRoZSBnaXZlbiBJVVJJLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT51cmk8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIHZpc2l0LgotPERUPjxCPlJldHVybnM6PC9CPjxERD5UcnVlIGlmIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzIHNob3VsZCBiZSB2aXNpdGVkLAotIG9yIGZhbHNlIGlmIHRoZXkgc2hvdWxkIG5vdCBiZSB2aXNpdGVkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQ09ERT4gLSBJZiB0aGUgdmlzaXQgbWV0aG9kIGZhaWxzLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVVJJVmlzaXRvci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOThjYTk3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NiBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVNpbXBsZVVSSUZhY3RvcnkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5IGNsYXNzIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJTaW1wbGVVUklGYWN0b3J5IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvU2ltcGxlVVJJRmFjdG9yeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlNpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9GT05UPgotPEJSPgotQ2xhc3MgU2ltcGxlVVJJRmFjdG9yeTwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuU2ltcGxlVVJJRmFjdG9yeTwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGNsYXNzIDxCPlNpbXBsZVVSSUZhY3Rvcnk8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDxEVD5pbXBsZW1lbnRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVVSSUZhY3RvcnkgaW50ZXJmYWNlLgotPFA+Ci0KLTxQPgotPERMPgotPERUPjxCPlNpbmNlOjwvQj48L0RUPgotICA8REQ+MS4wPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCNTaW1wbGVVUklGYWN0b3J5KCkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPm5ld1VSSTwvQT48L0I+KGphdmEubmV0LlVSTCZuYnNwO3VybCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5uZXdVUklTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUklTY2hlbWUgZm9yIHRoZSBnaXZlbiBzY2hlbWUgc3RyaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCNyZWdpc3RlclNjaGVtZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lKSI+cmVnaXN0ZXJTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvdG9jb2wsCi0gICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+Jm5ic3A7c2NoZW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2QgcmVnaXN0ZXJzIGEgc2NoZW1lIGZvciBhIHBhcnRpY3VsYXIgcHJvdG9jb2wuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJTaW1wbGVVUklGYWN0b3J5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLVNpbXBsZVVSSUZhY3Rvcnk8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5TaW1wbGVVUklGYWN0b3J5PC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Im5ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotbmV3VVJJPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiA8Qj5uZXdVUkk8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpCi0gICAgICAgICAgICB0aHJvd3MgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5DcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT51cmk8L0NPREU+IC0gdGhlIHVyaSB0byBiZSBjcmVhdGVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5DcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Im5ld1VSSShqYXZhLm5ldC5VUkwpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUkk8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPm5ld1VSSTwvQj4oamF2YS5uZXQuVVJMJm5ic3A7dXJsKQotICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5DcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5uZXQuVVJMKSI+bmV3VVJJPC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnVybDwvQ09ERT4gLSB0aGUgdXJsIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB1cmkuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPkNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0NPREU+IC0gaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoaXMgVVJJLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1uZXdVUklTY2hlbWU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+IDxCPm5ld1VSSVNjaGVtZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3NjaGVtZU9yVVJJKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5JVVJJRmFjdG9yeTwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbG9ucywgdGhlIGVudGlyZSBzdHJpbmcgaXMgaW50ZXJwcmV0dGVkCi0gYXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtZS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhIGNvbG9uLCB0aGVuIHRoZQotIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gbmFtZSBvZiB0aGUgc2NoZW1lLCBtZWFuaW5nIHRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gYW55IElVUkkgc3RyaW5nIGluCi0gb3JkZXIgdG8gZ2V0IGEgSVVSSVNjaGVtZSBvYmplY3QuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSVNjaGVtZTwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zY2hlbWVPclVSSTwvQ09ERT4gLSB0aGUgc2NoZW1lIG5hbWUgb3IgVVJJIGZyb20gd2hpY2ggdGhpcyBzY2hlbWUgaXMgCi0gdG8gYmUgY3JlYXRlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+Q3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbG9ucywgdGhlIGVudGlyZSBzdHJpbmcgaXMgaW50ZXJwcmV0dGVkCi0gYXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtZS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhIGNvbG9uLCB0aGVuIHRoZQotIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gbmFtZSBvZiB0aGUgc2NoZW1lLCBtZWFuaW5nIHRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gYW55IElVUkkgc3RyaW5nIGluCi0gb3JkZXIgdG8gZ2V0IGEgSVVSSVNjaGVtZSBvYmplY3QuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9DT0RFPiAtIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSSBzY2hlbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZWdpc3RlclNjaGVtZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lKSI+PCEtLSAtLT48L0E+PEgzPgotcmVnaXN0ZXJTY2hlbWU8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlZ2lzdGVyU2NoZW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklTY2hlbWU8L0E+Jm5ic3A7c2NoZW1lKTwvUFJFPgotPERMPgotPEREPlRoaXMgbWV0aG9kIHJlZ2lzdGVycyBhIHNjaGVtZSBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm90b2NvbDwvQ09ERT4gLSB0aGUgcHJvdG9jb2wuPEREPjxDT0RFPnNjaGVtZTwvQ09ERT4gLSB0aGUgc2NoZW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3ZDYyZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NiBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVSSUV4Y2VwdGlvbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbiBjbGFzcyI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVVJJRXhjZXB0aW9uIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVVJJRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBVUklFeGNlcHRpb248L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5UaHJvd2FibGUKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEuaW8uU2VyaWFsaXphYmxlPC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+VVJJRXhjZXB0aW9uPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb248L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBleGNlcHRpb25zIHRocm93biBieSBJVVJJIGNsYXNzZXMuCi0gRXZlcnkgVVJJRXhjZXB0aW9uIGNhcnJpZXMgYSBJVVJJIGFuZCBhIFN0YXR1cywgZWFjaCBvZiB3aGljaCBtYXkKLSBiZSBudWxsLiBUaGUgZ2V0TWVzc2FnZSgpIG1ldGhvZCBhcyBpbmhlcml0ZWQgZnJvbSBFeGNlcHRpb24gd2lsbAotIHJldHVybiB0aGUgbWVzc2FnZSBmcm9tIHRoZSBVUklFeGNlcHRpbidzIFN0YXR1cyBvYmplY3QsIGlmIGFueS4KLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TaW5jZTo8L0I+PC9EVD4KLSAgPEREPjEuMDwvREQ+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zZXJpYWxpemVkLWZvcm0uaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb24iPlNlcmlhbGl6ZWQgRm9ybTwvQT48L0RMPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCNVUklFeGNlcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpIj5VUklFeGNlcHRpb248L0E+PC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgVVJJRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI1VSSUV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPlVSSUV4Y2VwdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwjZ2V0U3RhdHVzKCkiPmdldFN0YXR1czwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI2dldFVSSSgpIj5nZXRVUkk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5UaHJvd2FibGUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5UaHJvd2FibGU8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5maWxsSW5TdGFja1RyYWNlLCBnZXRDYXVzZSwgZ2V0TG9jYWxpemVkTWVzc2FnZSwgZ2V0TWVzc2FnZSwgZ2V0U3RhY2tUcmFjZSwgaW5pdENhdXNlLCBwcmludFN0YWNrVHJhY2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBzZXRTdGFja1RyYWNlLCB0b1N0cmluZzwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVVJJRXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKSI+PCEtLSAtLT48L0E+PEgzPgotVVJJRXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VVJJRXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cyk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBTdGF0dXMuCi0gVGhlIHN0YXR1cyBtYXkgYmUgbnVsbC4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdGF0dXM8L0NPREU+IC0gdGhlIHN0YXVzIGZvciB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iVVJJRXhjZXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+PCEtLSAtLT48L0E+PEgzPgotVVJJRXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VVJJRXhjZXB0aW9uPC9CPihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyZuYnNwO3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L1BSRT4KLTxETD4KLTxERD5DcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN0YXR1czwvQ09ERT4gLSB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi48REQ+PENPREU+dXJpPC9DT0RFPiAtIHRoZSB1cmkgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24uPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0U3RhdHVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFN0YXR1czwvSDM+Ci08UFJFPgotcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIDxCPmdldFN0YXR1czwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFVSSSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRVUkk8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+IDxCPmdldFVSSTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5yZXR1cm5zIHRoZSBJVVJJIGluc2lkZSB0aGlzIGV4Y2VwdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVVJJRXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIENMQVNTPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NWMxOGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhcHBlbmQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmFwcGVuZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDtyZWxhdGl2ZVVSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlVSSUV4Y2VwdGlvbi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwjZ2V0VVJJKCkiPmdldFVSSTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3QoKSI+bGlzdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBsaXN0IG9mIFVSSXMgZm9yIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gaGllcmFyY2hpY2FsLCBub24tbGVhZiBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3Qob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPmxpc3Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGaWx0ZXI8L0E+Jm5ic3A7dXJpRmlsdGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5uZXdVUkk8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklTY2hlbWUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPm5ld1VSSTwvQT48L0I+KGphdmEubmV0LlVSTCZuYnNwO3VybCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3BhcmVudCgpIj5wYXJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklGaWx0ZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCNhY2NlcHRzKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5hY2NlcHRzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0ZpbHRlcnMgdGhlIGdpdmVuIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2FwcGVuZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+YXBwZW5kPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3JlbGF0aXZlVVJJKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSVNjaGVtZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI2lzVmFsaWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmlzVmFsaWQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSVNjaGVtZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI25ld1VSSShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+bmV3VVJJPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNyZW5hbWUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPnJlbmFtZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDtuZXdVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW5hbWVzIG9yIG1vdmVzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSQotIHRvIHRoZSBuZXcgSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSVNjaGVtZS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj52YWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJVmlzaXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmlzaXRzIHRoZSBnaXZlbiBJVVJJLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+Q29uc3RydWN0b3JzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sI1VSSUV4Y2VwdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPlVSSUV4Y2VwdGlvbjwvQT48L0I+KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzJm5ic3A7c3RhdHVzLAotICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgSVVSSSwKLSBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZhY3RvcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGYWN0b3J5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZmM2MmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZhY3RvcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeQotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklFbnZpcm9ubWVudC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCNnZXRVUklGYWN0b3J5KCkiPmdldFVSSUZhY3Rvcnk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgSVVSSSBmYWN0b3J5LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gdGhhdCBpbXBsZW1lbnQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZhY3Rvcnk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+U2ltcGxlVVJJRmFjdG9yeTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVVSSUZhY3RvcnkgaW50ZXJmYWNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZpbHRlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSUZpbHRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTAyNzU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGaWx0ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlciI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklGaWx0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGaWx0ZXI8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNsaXN0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXIpIj5saXN0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciBsaXN0KCksIGV4Y2VwdCBvbmx5IFVSSXMgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuCi0gZmlsdGVyIGFyZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yLAotICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciB2aXNpdChJVVJJVmlzaXRvciksIGV4Y2VwdCBvbmx5IHJlc291cmNlIFVSSXMgdGhhdCBhcmUKLSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJRmlsdGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSUZpbHRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVNjaGVtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVNjaGVtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2FmMjUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklVUklTY2hlbWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9CPjwvQT48L1REPgotPFREPiZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5FbnZpcm9ubWVudFNlcnZpY2UuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwjZ2V0RWNsaXBzZVNjaGVtZSgpIj5nZXRFY2xpcHNlU2NoZW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RW52aXJvbm1lbnRTZXJ2aWNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5odG1sI2dldEZpbGVTY2hlbWUoKSI+Z2V0RmlsZVNjaGVtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2dldFVSSVNjaGVtZSgpIj5nZXRVUklTY2hlbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TaW1wbGVVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5uZXdVUklTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUklTY2hlbWUoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSVNjaGVtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzY2hlbWVPclVSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5TaW1wbGVVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwjcmVnaXN0ZXJTY2hlbWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZSkiPnJlZ2lzdGVyU2NoZW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3Byb3RvY29sLAotICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPiZuYnNwO3NjaGVtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHJlZ2lzdGVycyBhIHNjaGVtZSBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VJVVJJU2NoZW1lLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVVSSVNjaGVtZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVZpc2l0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklWaXNpdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ODJjNDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSVZpc2l0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklWaXNpdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklWaXNpdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjdmlzaXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3IpIj52aXNpdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklWaXNpdG9yPC9BPiZuYnNwO3VyaVZpc2l0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWaXNpdHMgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGRlY2VuZGFudHMgaW4gcHJlLW9yZGVyIGZhc2hpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yLAotICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmlsdGVyPC9BPiZuYnNwO3VyaUZpbHRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FzIGZvciB2aXNpdChJVVJJVmlzaXRvciksIGV4Y2VwdCBvbmx5IHJlc291cmNlIFVSSXMgdGhhdCBhcmUKLSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlSVVSSVZpc2l0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvU2ltcGxlVVJJRmFjdG9yeS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvU2ltcGxlVVJJRmFjdG9yeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjYwNGFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL1NpbXBsZVVSSUZhY3RvcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3RvcnkKLTwvVElUTEU+Ci0KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3RvcnkiOwotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlNpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5PC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3RvcnkKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2UtdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1xjbGFzcy11c2VTaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvVVJJRXhjZXB0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9VUklFeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNmEzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9VUklFeGNlcHRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS41LjApIG9uIFR1ZSBNYXkgMjAgMTM6MDI6NTcgRURUIDIwMDggLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbgotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9cY2xhc3MtdXNlVVJJRXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVVJJRXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5VUklFeGNlcHRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB0aGF0IHRocm93IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlVSSUV4Y2VwdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSUZpbHRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5odG1sI2FjY2VwdHMob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSkiPmFjY2VwdHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RmlsdGVycyB0aGUgZ2l2ZW4gSVVSSS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXBwZW5kKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5hcHBlbmQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7cmVsYXRpdmVVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5pby5GaWxlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNhc0ZpbGUoKSI+YXNGaWxlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubmV0LlVSTDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjYXNVUkwoKSI+YXNVUkw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZXJhc2UoKSI+ZXJhc2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtFcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLklucHV0U3RyZWFtPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNnZXRJbnB1dFN0cmVhbSgpIj5nZXRJbnB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmlvLk91dHB1dFN0cmVhbTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwjZ2V0T3V0cHV0U3RyZWFtKCkiPmdldE91dHB1dFN0cmVhbTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3QoKSI+bGlzdDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBsaXN0IG9mIFVSSXMgZm9yIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gaGllcmFyY2hpY2FsLCBub24tbGVhZiBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI2xpc3Qob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPmxpc3Q8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGaWx0ZXI8L0E+Jm5ic3A7dXJpRmlsdGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj5uZXdVUkk8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+Jm5ic3A7dXJpKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3VyaSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklTY2hlbWUuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykiPm5ld1VSSTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVVJJU2NoZW1lLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmh0bWwjbmV3VVJJKGphdmEubmV0LlVSTCkiPm5ld1VSSTwvQT48L0I+KGphdmEubmV0LlVSTCZuYnNwO3VybCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklGYWN0b3J5LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sI25ld1VSSShqYXZhLm5ldC5VUkwpIj5uZXdVUkk8L0E+PC9CPihqYXZhLm5ldC5VUkwmbmJzcDt1cmwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBVUkwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+U2ltcGxlVVJJRmFjdG9yeS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sI25ld1VSSVNjaGVtZShqYXZhLmxhbmcuU3RyaW5nKSI+bmV3VVJJU2NoZW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3NjaGVtZU9yVVJJKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVNjaGVtZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSUZhY3RvcnkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwjbmV3VVJJU2NoZW1lKGphdmEubGFuZy5TdHJpbmcpIj5uZXdVUklTY2hlbWU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c2NoZW1lT3JVUkkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUklTY2hlbWUgZm9yIHRoZSBnaXZlbiBzY2hlbWUgc3RyaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCNwYXJlbnQoKSI+cGFyZW50PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3JlbmFtZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJKSI+cmVuYW1lPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJPC9BPiZuYnNwO25ld1VSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbmFtZXMgb3IgbW92ZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJCi0gdG8gdGhlIG5ldyBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN0b3VjaEZvbGRlcigpIj50b3VjaEZvbGRlcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZXMgYSBuZXcgZm9sZGVyIHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gdGhlIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3RvdWNoTGVhZigpIj50b3VjaExlYWY8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotIHRoZSBJVVJJLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUklWaXNpdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkpIj52aXNpdDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4mbmJzcDt1cmkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWaXNpdHMgdGhlIGdpdmVuIElVUkkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVVSSS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5odG1sI3Zpc2l0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yKSI+dmlzaXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJVmlzaXRvcjwvQT4mbmJzcDt1cmlWaXNpdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmlzaXRzIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBkZWNlbmRhbnRzIGluIHByZS1vcmRlciBmYXNoaW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklVUkkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCN2aXNpdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJVmlzaXRvciwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcikiPnZpc2l0PC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+Jm5ic3A7dXJpVmlzaXRvciwKLSAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT4mbmJzcDt1cmlGaWx0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlciBhcmUgdmlzaXRlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvXGNsYXNzLXVzZVVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlVSSUV4Y2VwdGlvbi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2YjdkNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkgcGFja2FnZSI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1JbnRlcmZhY2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iSVVSSS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUkk8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVVJJRmFjdG9yeTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSUZpbHRlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJVVJJU2NoZW1lLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVVSSVNjaGVtZTwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklVUklWaXNpdG9yPC9JPjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotQ2xhc3NlczwvRk9OVD4mbmJzcDsKLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KLTxCUj4KLTxBIEhSRUY9IlNpbXBsZVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUV4Y2VwdGlvbnM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJVUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlVSSUV4Y2VwdGlvbjwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQwZTg0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSBwYWNrYWdlIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPlBSRVYgUEFDS0FHRTwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIFBBQ0tBR0U8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPEgyPgotUGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaQotPC9IMj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5JbnRlcmZhY2UgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUkk8L0E+PC9CPjwvVEQ+Ci08VEQ+QSBJVVJJIHJlcHJlc2VudHMgYSBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmZXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT48L0I+PC9URD4KLTxURD5UaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElVUkkgYW5kIElVUklTY2hlbWUgb2JqZWN0cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSUZpbHRlcjwvQT48L0I+PC9URD4KLTxURD5UaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgb3IgbGlzdCBVUklzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJU2NoZW1lPC9BPjwvQj48L1REPgotPFREPkEgSVVSSVNjaGVtZSByZXByZXNlbnRzIGEgc2luZ2xlIHNjaGVtZSBmb3Igc29tZSBhIGZhbWlseSBvZgotIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSVZpc2l0b3I8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IFVSSXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPlNpbXBsZVVSSUZhY3Rvcnk8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElVUklGYWN0b3J5IGludGVyZmFjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RXhjZXB0aW9uIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+VVJJRXhjZXB0aW9uPC9BPjwvQj48L1REPgotPFREPlRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08UD4KLTxETD4KLTwvREw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+UFJFViBQQUNLQUdFPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgUEFDS0FHRTwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtdHJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWZlZDExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkgQ2xhc3MgSGllcmFyY2h5Ci08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkgQ2xhc3MgSGllcmFyY2h5IjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08QSBOQU1FPSJtYWluIj48L0E+Ci08Q0VOVEVSPgotPEgyPgotSGllcmFyY2h5IEZvciBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpCi08L0gyPgotPC9DRU5URVI+Ci08REw+Ci08RFQ+PEI+UGFja2FnZSBIaWVyYXJjaGllczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXRyZWUuaHRtbCI+QWxsIFBhY2thZ2VzPC9BPjwvREw+Ci08SFI+Ci08SDI+Ci1DbGFzcyBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPlNpbXBsZVVSSUZhY3Rvcnk8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5JVVJJRmFjdG9yeTwvQT4pCi08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuVGhyb3dhYmxlIChpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlKQotPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+amF2YS5sYW5nLkV4Y2VwdGlvbjxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1VSSUV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPlVSSUV4Y2VwdGlvbjwvQj48L0E+PC9VTD4KLTwvVUw+Ci08L1VMPgotPC9VTD4KLTxIMj4KLUludGVyZmFjZSBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUkk8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGYWN0b3J5PC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGaWx0ZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVNjaGVtZTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVZpc2l0b3I8L0I+PC9BPjwvVUw+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvcGFja2FnZS10cmVlLmh0bWwiPjxCPlBSRVY8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzMDJiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxBIE5BTUU9Im1haW4iPjwvQT4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIFBhY2thZ2U8YnI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQj48L0E+PC9URD4KLTxURD4mbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9BPjwvVEQ+Ci08VEQ+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJRmFjdG9yeS5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiPjxCPklVUklGYWN0b3J5PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgSVVSSSBhbmQgSVVSSVNjaGVtZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5JVVJJU2NoZW1lPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgSVVSSVNjaGVtZSByZXByZXNlbnRzIGEgc2luZ2xlIHNjaGVtZSBmb3Igc29tZSBhIGZhbWlseSBvZgotIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLUNsYXNzZXMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9jbGFzcy11c2UvSVVSSS5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgSVVSSSByZXByZXNlbnRzIGEgVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmVyLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGYWN0b3J5Lmh0bWwjb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPjxCPklVUklGYWN0b3J5PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgSVVSSSBhbmQgSVVSSVNjaGVtZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklGaWx0ZXIuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZpbHRlcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgb3IgbGlzdCBVUklzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvY2xhc3MtdXNlL0lVUklTY2hlbWUuaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSVNjaGVtZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIElVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmaWVycy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9JVVJJVmlzaXRvci5odG1sI29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJVmlzaXRvcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgVVJJcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL2NsYXNzLXVzZS9VUklFeGNlcHRpb24uaHRtbCNvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+VVJJRXhjZXB0aW9uPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS10cmVlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VHJlZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4LWZpbGVzL2luZGV4LTEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5JbmRleDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vdmVydmlldy1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9vdmVydmlldy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVmZTFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctZnJhbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1NyBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLU92ZXJ2aWV3Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iT3ZlcnZpZXcsIFdlYiBUb29scyBQbGF0Zm9ybTogRW52aXJvbm1lbnQgZnJhbWV3b3JrIEFQSSBkb2N1bWVudGF0aW9uIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxUSCBBTElHTj0ibGVmdCIgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEI+PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+QWxsIENsYXNzZXM8L0E+PC9GT05UPgotPFA+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotUGFja2FnZXM8L0ZPTlQ+Ci08QlI+Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPjwvRk9OVD4KLTxCUj4KLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9wYWNrYWdlLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0ZPTlQ+Ci08QlI+Ci08L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotJm5ic3A7Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDhjZGVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLU92ZXJ2aWV3Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iT3ZlcnZpZXcsIFdlYiBUb29scyBQbGF0Zm9ybTogRW52aXJvbm1lbnQgZnJhbWV3b3JrIEFQSSBkb2N1bWVudGF0aW9uIj4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJPdmVydmlldyI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMT4KLVdlYiBUb29scyBQbGF0Zm9ybTogRW52aXJvbm1lbnQgZnJhbWV3b3JrIEFQSSBkb2N1bWVudGF0aW9uCi08L0gxPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZXM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIyMCUiPjxCPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotJm5ic3A7PEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEEgSFJFRj0iI21haW4iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL292ZXJ2aWV3LXRyZWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctdHJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFiZTgxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvb3ZlcnZpZXctdHJlZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMCkgb24gVHVlIE1heSAyMCAxMzowMjo1OCBFRFQgMjAwOCAtLT4KLTxUSVRMRT4KLUNsYXNzIEhpZXJhcmNoeQotPC9USVRMRT4KLQotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkNsYXNzIEhpZXJhcmNoeSI7Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxBIEhSRUY9IiNtYWluIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXRyZWUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEEgTkFNRT0ibWFpbiI+PC9BPgotPENFTlRFUj4KLTxIMj4KLUhpZXJhcmNoeSBGb3IgQWxsIFBhY2thZ2VzPC9IMj4KLTwvQ0VOVEVSPgotPERMPgotPERUPjxCPlBhY2thZ2UgSGllcmFyY2hpZXM6PC9CPjxERD48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3BhY2thZ2UtdHJlZS5odG1sIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50PC9BPiwgPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvcGFja2FnZS10cmVlLmh0bWwiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpPC9BPjwvREw+Ci08SFI+Ci08SDI+Ci1DbGFzcyBIaWVyYXJjaHkKLTwvSDI+Ci08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuT2JqZWN0PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+Q2hvaWNlPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5FbnZpcm9ubWVudFNlcnZpY2U8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+TnVsbFN0YXR1c0hhbmRsZXI8L0I+PC9BPiAoaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5JU3RhdHVzSGFuZGxlcjwvQT4pCi08TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+U2ltcGxlVVJJRmFjdG9yeTwvQj48L0E+IChpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkiPklVUklGYWN0b3J5PC9BPikKLTxMSSBUWVBFPSJjaXJjbGUiPmphdmEubGFuZy5UaHJvd2FibGUgKGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUpCi08VUw+Ci08TEkgVFlQRT0iY2lyY2xlIj5qYXZhLmxhbmcuRXhjZXB0aW9uPFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQj48L0E+PFVMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+U3RhdHVzRXhjZXB0aW9uPC9CPjwvQT48L1VMPgotPExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+VVJJRXhjZXB0aW9uPC9CPjwvQT48L1VMPgotPC9VTD4KLTwvVUw+Ci08L1VMPgotPEgyPgotSW50ZXJmYWNlIEhpZXJhcmNoeQotPC9IMj4KLTxVTD4KLTxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij48Qj5JRW52aXJvbm1lbnQ8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SUxvZzwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+PEI+SVN0YXR1c0hhbmRsZXI8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSTwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZhY3Rvcnk8L0I+PC9BPjxMSSBUWVBFPSJjaXJjbGUiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+PEI+SVVSSUZpbHRlcjwvQj48L0E+PExJIFRZUEU9ImNpcmNsZSI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJU2NoZW1lPC9CPjwvQT48TEkgVFlQRT0iY2lyY2xlIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj48Qj5JVVJJVmlzaXRvcjwvQj48L0E+PC9VTD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8QSBIUkVGPSIjbWFpbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9vdmVydmlldy10cmVlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9wYWNrYWdlLWxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3BhY2thZ2UtbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YzhlOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3BhY2thZ2UtbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudA0KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2VudmFwaS9yZXNvdXJjZXMvaW5oZXJpdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNDg2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3NlcmlhbGl6ZWQtZm9ybS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTliOGQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNS4wKSBvbiBUdWUgTWF5IDIwIDEzOjAyOjU3IEVEVCAyMDA4IC0tPgotPFRJVExFPgotU2VyaWFsaXplZCBGb3JtCi08L1RJVExFPgotCi0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iU2VyaWFsaXplZCBGb3JtIjsKLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctdHJlZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlRyZWU8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJpbmRleC1maWxlcy9pbmRleC0xLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SW5kZXg8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP3NlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InNlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDE+Ci1TZXJpYWxpemVkIEZvcm08L0gxPgotPC9DRU5URVI+Ci08SFIgU0laRT0iNCIgTk9TSEFERT4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJjZW50ZXIiPjxGT05UIFNJWkU9IisyIj4KLTxCPlBhY2thZ2U8L0I+IDxCPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50RXhjZXB0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q2xhc3MgPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotPEI+c2VyaWFsVmVyc2lvblVJRDombmJzcDs8L0I+Mzk3ODk4MzI3NTg5OTQwMjAzNkwKLQotPFA+Ci08QSBOQU1FPSJzZXJpYWxpemVkRm9ybSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPlNlcmlhbGl6ZWQgRmllbGRzPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxIMz4KLXN0YXR1czwvSDM+Ci08UFJFPgotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgPEI+c3RhdHVzPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIDxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjwvQT4gZXh0ZW5kcyA8QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij5FbnZpcm9ubWVudEV4Y2VwdGlvbjwvQT4gaW1wbGVtZW50cyBTZXJpYWxpemFibGU8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08Qj5zZXJpYWxWZXJzaW9uVUlEOiZuYnNwOzwvQj4zNjE4MTQxMTYwMzIyMTE5OTkyTAotCi08UD4KLTxBIE5BTUU9InNlcmlhbGl6ZWRGb3JtIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+U2VyaWFsaXplZCBGaWVsZHM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEgzPgotY2hvaWNlPC9IMz4KLTxQUkU+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCI+Q2hvaWNlPC9BPiA8Qj5jaG9pY2U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGhlIENob2ljZSB0aGF0IGxlYWQgdG8gdGhlIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24sCi0gaWYgYW55IChpZS4gbWF5IGJlIG51bGwpLgotPFA+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUiBTSVpFPSI0IiBOT1NIQURFPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImNlbnRlciI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZTwvQj4gPEI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5DbGFzcyA8QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb248L0E+IGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxCPnNlcmlhbFZlcnNpb25VSUQ6Jm5ic3A7PC9CPjMyNTgxMzAyNzE0MjQ3NTYwMThMCi0KLTxQPgotPEEgTkFNRT0ic2VyaWFsaXplZEZvcm0iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5TZXJpYWxpemVkIEZpZWxkczwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08SDM+Ci1zdGF0dXM8L0gzPgotPFBSRT4KLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIDxCPnN0YXR1czwvQj48L1BSRT4KLTxETD4KLTxERD5BIFN0YXR1cyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBleGNlcHRpb24sCi0gaWYgYXBwbGljYWJsZS4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci08SDM+Ci11cmk8L0gzPgotPFBSRT4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaSI+SVVSSTwvQT4gPEI+dXJpPC9CPjwvUFJFPgotPERMPgotPEREPlRoZSBJVVJJIGZvciB3aGljaCB0aGUgZXhjZXB0aW9uIG9jY3VyZWQsCi0gaWYgYXBwbGljYWJsZS4KLTxQPgotPERMPgotPC9ETD4KLTwvREw+Ci0KLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXRyZWUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5UcmVlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaW5kZXgtZmlsZXMvaW5kZXgtMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkluZGV4PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9zZXJpYWxpemVkLWZvcm0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJzZXJpYWxpemVkLWZvcm0uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc3R5bGVzaGVldC5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZW52YXBpL3N0eWxlc2hlZXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGMzNzM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9lbnZhcGkvc3R5bGVzaGVldC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBKYXZhZG9jIHN0eWxlIHNoZWV0ICovDQotDQotLyogRGVmaW5lIGNvbG9ycywgZm9udHMgYW5kIG90aGVyIHN0eWxlIGF0dHJpYnV0ZXMgaGVyZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgKi8NCi0NCi0vKiBQYWdlIGJhY2tncm91bmQgY29sb3IgKi8NCi1ib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRiB9DQotDQotLyogSGVhZGluZ3MgKi8NCi1oMSB7IGZvbnQtc2l6ZTogMTQ1JSB9DQotDQotLyogVGFibGUgY29sb3JzICovDQotLlRhYmxlSGVhZGluZ0NvbG9yICAgICB7IGJhY2tncm91bmQ6ICNDQ0NDRkYgfSAvKiBEYXJrIG1hdXZlICovDQotLlRhYmxlU3ViSGVhZGluZ0NvbG9yICB7IGJhY2tncm91bmQ6ICNFRUVFRkYgfSAvKiBMaWdodCBtYXV2ZSAqLw0KLS5UYWJsZVJvd0NvbG9yICAgICAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGIH0gLyogV2hpdGUgKi8NCi0NCi0vKiBGb250IHVzZWQgaW4gbGVmdC1oYW5kIGZyYW1lIGxpc3RzICovDQotLkZyYW1lVGl0bGVGb250ICAgeyBmb250LXNpemU6IDEwMCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIH0NCi0uRnJhbWVIZWFkaW5nRm9udCB7IGZvbnQtc2l6ZTogIDkwJTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgfQ0KLS5GcmFtZUl0ZW1Gb250ICAgIHsgZm9udC1zaXplOiAgOTAlOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9DQotDQotLyogTmF2aWdhdGlvbiBiYXIgZm9udHMgYW5kIGNvbG9ycyAqLw0KLS5OYXZCYXJDZWxsMSAgICB7IGJhY2tncm91bmQtY29sb3I6I0VFRUVGRjt9IC8qIExpZ2h0IG1hdXZlICovDQotLk5hdkJhckNlbGwxUmV2IHsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDhCO30gLyogRGFyayBCbHVlICovDQotLk5hdkJhckZvbnQxICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiMwMDAwMDA7fQ0KLS5OYXZCYXJGb250MVJldiB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojRkZGRkZGO30NCi0NCi0uTmF2QmFyQ2VsbDIgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGO30NCi0uTmF2QmFyQ2VsbDMgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGO30NCi0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZXh0L2luZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZXh0L2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNGU1ZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvcmVmZXJlbmNlL2V4dC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSAgICAJPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUUkFOU0lUSU9OQUwvL0VOIj4KLQkJPGh0bWwgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0Ij4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotCQk8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotCi0gICAJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgCQk8dGl0bGU+VVJJIHJlc29sdmVyIEV4dGVuc2lvbiBQb2ludHM8L3RpdGxlPgotCQk8TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9Ii4uLy4uL2Jvb2suY3NzIiBDSEFSU0VUPSJJU08tODg1OS0xIiBUWVBFPSJ0ZXh0L2NzcyI+Ci0JCTwvaGVhZD4KLTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLTxjZW50ZXI+Ci08aDE+VVJJIHJlc29sdmVyIEV4dGVuc2lvbiBQb2ludHMgPC9oMT4KLTwvY2VudGVyPlRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50cyBjYW4gYmUgdXNlZCB0byBleHRlbmQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgVVJJIHJlc29sdmVyLiA8aDM+Ci08YSBuYW1lPSJ1cmlyZXNvbHZlciI+PC9hPlVSSSBSZXNvbHZlciBBUEk8L2gzPgotPHVsPgotPGxpPgotPGEgaHJlZj0ib3JnX2VjbGlwc2Vfd3N0X2NvbW1vbl91cmlyZXNvbHZlcl9yZXNvbHZlckV4dGVuc2lvbnMuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnM8L2E+Ci08L2xpPgotPC91bD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9leHQvb3JnX2VjbGlwc2Vfd3N0X2NvbW1vbl91cmlyZXNvbHZlcl9yZXNvbHZlckV4dGVuc2lvbnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3JlZmVyZW5jZS9leHQvb3JnX2VjbGlwc2Vfd3N0X2NvbW1vbl91cmlyZXNvbHZlcl9yZXNvbHZlckV4dGVuc2lvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5NTFiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9yZWZlcmVuY2UvZXh0L29yZ19lY2xpcHNlX3dzdF9jb21tb25fdXJpcmVzb2x2ZXJfcmVzb2x2ZXJFeHRlbnNpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5VUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBQb2ludDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+VVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgUG9pbnQ8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9uczxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PjxiPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPC9iPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5UaGUgVVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gcmVnaXN0ZXIgY3VzdG9tIFVSSSByZXNvbHZlcnMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlc29sdXRpb24gb2YgcmVzb3VyY2VzIGJ5IHRvb2xzIHN1Y2ggYXMgZWRpdG9ycywgZ2VuZXJhdG9ycywgdmFsaWRhdG9ycywgYW5kIHdpemFyZHMuPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5yZXNvbHZlckV4dGVuc2lvbiI+cmVzb2x2ZXJFeHRlbnNpb248L2E+KykmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnBvaW50PC9iPiAtIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQ8L2xpPgotPGxpPjxiPmlkPC9iPiAtIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnJlc29sdmVyRXh0ZW5zaW9uIj5yZXNvbHZlckV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLnByb2plY3ROYXR1cmUiPnByb2plY3ROYXR1cmU8L2E+KikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcmVzb2x2ZXJFeHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5zdGFnZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2xhc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wcmlvcml0eSZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnN0YWdlPC9iPiAtIFRoZSBzdGFnZSBpbiB3aGljaCB0byBydW4gdGhpcyBleHRlbnNpb24gcmVzb2x2ZXI6IHByZW5vcm1hbGl6YXRpb24sIHBvc3Rub3JtYWxpemF0aW9uLCBvciBwaHlzaWNhbC4gRGVmYXVsdHMgdG8gcG9zdG5vcm1hbGl6YXRpb24uPGJyPgotcHJlbm9ybWFsaXphdGlvbjogIHJ1biBiZWZvcmUgbm9ybWFsaXphdGlvbiBvZiB0aGUgaW5wdXQ8YnI+Ci1wb3N0bm9ybWFsaXphdGlvbjogcnVuIGFmdGVyIG5vcm1hbGl6YXRpb24gb2YgdGhlIGlucHV0PGJyPgotcGh5c2ljYWw6ICAgICAgICAgIHJ1biBhZnRlciBhbGwgcHJlIGFuZCBwb3N0bm9ybWFsaXphdGlvbiByZXNvbHZlcnM8L2xpPgotPGxpPjxiPmNsYXNzPC9iPiAtIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjwvY29kZT4uPC9saT4KLTxsaT48Yj5wcmlvcml0eTwvYj4gLSBUaGUgcHJpb3JpdHkgb2YgdGhpcyByZXNvbHZlcjogaGlnaCwgbWVkaXVtLCBvciBsb3cuIERlZmF1bHRzIHRvIG1lZGl1bS4gVGhlIHByaW9yaXR5IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGVuIHRoaXMgcmVzb2x2ZXIgc2hvdWxkIHJ1biB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgcmVzb2x2ZXJzIGRlZmluZWQgZm9yIHRoZSBzYW1lIHN0YWdlLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucHJvamVjdE5hdHVyZSI+cHJvamVjdE5hdHVyZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcHJvamVjdE5hdHVyZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnZhbHVlJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1JZiBhIHByb2plY3QgbmF0dXJlIGlzIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgb25seSBiZSB1c2VkIGZvciBwcm9qZWN0cyB0aGF0IGNvbnRhaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBuYXR1cmVzLiBJZiBubyBwcm9qZWN0IG5hdHVyZXMgYXJlIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgYmUgdXNlZCBmb3IgYWxsIHByb2plY3RzLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnZhbHVlPC9iPiAtIEEgcHJvamVjdCBuYXR1cmUgSUQgZm9yIHdoaWNoIHRoZSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIHVzZWQuPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIFVSSSByZXNvbHZlciBjb250cmlidXRpb246Ci08cHJlIGNsYXNzPSJFeGFtcGxlIj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAgJmx0O3Jlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7cGh5c2ljYWwmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIHByaW9yaXR5PTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtsb3cmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4KLSAgICAgICAgICAgIGNsYXNzPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLlNhbXBsZVJlc29sdmVyJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAgJmx0Oy9yZXNvbHZlckV4dGVuc2lvbiZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotPC9zcGFuPjwvcHJlPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TdXBwbGllZCBJbXBsZW1lbnRhdGlvbjogPC9oNj48Y29kZT4KLW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlc29sdmVyCi08L2NvZGU+Ci1wcm92aWRlcyBhbiBVUkkgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGEgcHJvamVjdCB3aXRoIG11bHRpcGxlIGNvbXBvbmVudHMKLTxjb2RlPgotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24KLTwvY29kZT4KLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgaW4gYSBjYWNoZQotPGNvZGU+Ci1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24KLTwvY29kZT4KLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgY2F0YWxvZwotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9zY2hlbWEuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2Mvc2NoZW1hLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmYyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy9zY2hlbWEuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotSDYuQ2FwdGlvbkZpZ0NvbHVtbiNoZWFkZXIgew0KLQlmb250LXNpemU6MTZweDsgDQotCWRpc3BsYXk6aW5saW5lDQotfQ0KLQ0KLVAuTm90ZSNjb3B5cmlnaHQgew0KLQlmb250LXNpemU6IHNtYWxsZXI7IA0KLQlmb250LXN0eWxlOiBub3JtYWw7DQotCWNvbG9yOiAjMzM2Njk5OyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjZHRkIHsNCi0JY29sb3I6ICM4MDAwMDA7IA0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI2R0ZEF0dGxpc3Qgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDIwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjdGFnIHsNCi0JY29sb3I6ICMwMDAwODA7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI2NzdHJpbmcgew0KLQljb2xvcjogIzAwODAwMDsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0OwkNCi19DQotDQotLkNvbmZpZ01hcmt1cCNlbGVtZW50RGVzYyB7DQotCWNvbG9yOiBibGFjazsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTAuMDAwMDAwcHQ7DQotfQ0KLQ0KLS5Db25maWdNYXJrdXAjYXR0bGlzdERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDMyLjAwMDAwMHB0Ow0KLX0NCi0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYy90b3BpY3NFbnZfUmVmZXJlbmNlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3RvcGljc0Vudl9SZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ2YWMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3RvcGljc0Vudl9SZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBEZWZpbmUgdG9waWNzIGZvciB0aGUgcmVmZXJlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dG9jIGxhYmVsPSJFbnZpcm9ubWVudCByZWZlcmVuY2UiIGxpbmtfdG89Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9yZWZlcmVuY2VfdG9jLnhtbCNqYXZhZG9jX2NvbW1vbiI+Ci0JPHRvcGljIGxhYmVsPSJFbnZpcm9ubWVudCBmcmFtZXdvcmsgQVBJIFJlZmVyZW5jZSIgaHJlZj0icmVmZXJlbmNlL2VudmFwaS9pbmRleC5odG1sIj4KLQkKLQkJPCEtLSBUaGUgZW52amF2YWRvY3RvYy54bWwgdG9jIGlzIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQuIC0tPgotCQk8bGluayB0b2M9ImVudmphdmFkb2N0b2MueG1sIiAvPgotCTwvdG9waWM+CQotCQotCTx0b3BpYyBsYWJlbD0iVVJJIFJlc29sdmVyIEFQSSBSZWZlcmVuY2UiIGhyZWY9InJlZmVyZW5jZS9leHQvaW5kZXguaHRtbCI+Ci0JCi0JCTwhLS0gVGhlIHRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIHRvYyBpcyBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkLiAtLT4KLQkJPGxpbmsgdG9jPSJ0b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbCIgLz4KLQk8L3RvcGljPgkKLQkKLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5hcGkuZG9jL3RvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvdG9waWNzX0V4dFBvaW50X1JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMWVhMWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmFwaS5kb2MvdG9waWNzX0V4dFBvaW50X1JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0JIAk8dG9jIGxhYmVsPSJFeHRlbnNpb24gUG9pbnRzIFJlZmVyZW5jZSI+Ci08dG9waWMgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zIiBocmVmPSJyZWZlcmVuY2UvZXh0L29yZ19lY2xpcHNlX3dzdF9jb21tb25fdXJpcmVzb2x2ZXJfcmVzb2x2ZXJFeHRlbnNpb25zLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2Ly5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZThmMDZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3Y8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZGY5YTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjIwMi5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmhlbHAudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvUkVBRE1FLlRYVCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9SRUFETUUuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTgyYzQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9SRUFETUUuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0JCQkJCQlHZW5lcmF0aW5nIEphdmFEb2MgYW5kIEV4dGVuc2lvbiBQb2ludCBEb2N1bWVudGF0aW9uIGZvciAJCQkJCS0tCi0tLQkJCQkJCW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YgcGx1Zy1pbgkJCQkJCS0tCi0tLQkJCQkJCQkJMjAwOC8wNS8yMAkoR1JLKQkJCQkJCQkJLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSW50cm86Ci0JVGhpcyB0b29sIGFuZCByZWFkbWUgd2FzIGV4dHJhY3RlZCBmcm9tIGFuIGV4YW1wbGUgZG9uZSBieSB0aGUgSlNGIHRlYW0uIEl0IHdhcwotCXRoZW4gYWRvcHRlZCB0byBnZW5lcmF0ZSB0aGUgSmF2YURvY3MgYW5kIEV4dC1QdCBmb3IgdmFsaWRhdGlvbi4KLQkKLQkKLUphdmFEb2MgR2VuZXJhdGlvbiBUYXNrCi0JSW50cm86Ci0JCVRoZSBqYXZhZG9jQnVpbGQueG1sIGZpbGUgaXMgdXNlZCB0byBjcmVhdGUgdGhlIHJlZmVyZW5jZSBqYXZhZG9jcy4gSXQgaGFyZCBjb2RlcyB0aGUgcGFja2FnZQotCQluYW1lcyBpbnRvIHRoZSBBbnQgc2NyaXB0LCBzbyBpZiBBUEkgcGFja2FnZXMgYXJlIGFkZGVkIG9yIHJlbW92ZWQgdGhpcyB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZC4gICAKLQkJCQotCVNldHVwOgotCQktIGVuc3VyZSB0aGF0IHRoZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiBwbHVnLWluIGlzIHByZXNlbnQgaW4gdGhlIHdvcmtzcGFjZQotCQkKLQlHZW5lcmF0ZToKLQkJMSkgc2VsZWN0IGphdmFkb2NCdWlsZC54bWwgZmlsZSBpbiBwcm9qZWN0IGV4cGxvcmVyCi0JCTIpIFJ1biBhcyAiQW50IEJ1aWxkLi4uIiAtLT4gSlJFIFRhYiwgZW5zdXJlIHRoYXQgIlJ1biBpbiBzYW1lIEpSRSBhcyBXb3Jrc3BhY2UiIGlzIHNlbGVjdGVkCi0JCQotCVNhbml0eSBUZXN0OgotCQkxKSBEaXJlY3RseSBzZWxlY3QgdGhlIEFQSSBwYWNrYWdlcyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24gcGx1Zy1pbi4KLQkJMikgVXNlIHRoZSBFeHBvcnQtPkphdmFkb2MgY29tbWFuZCB0byBnZW5lcmF0ZSBqYXZhZG9jIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotCQkzKSBFeGFtaW5lIHRoZSBDb25zb2xlIGZvciB3YXJuaW5ncyBhbmQgZXJyb3JzLiBGaXggYXMgbmVjZXNzYXJ5LgotCQotRXh0ZW5zaW9uLXBvaW50IFJlZmVyZW5jZXMgVGFzawotCUludHJvOgotCQlUaGUgbGlzdGVkLWV4dC1wb2ludHMgcHJvcGVydHkgaW4gYnVpbGRFeHREb2NzLnByb3BlcnRpZXMgZmlsZSBpcyB1c2VkIHRvIGdlbmVyYXRlIAotCQl0aGUgSFRNTCBkb2N1bWVudGF0aW9uIGZyb20gdGhlIHNjaGVtYXMuICAgVGhpcyBsaXN0IG11c3QgYmUgdmVyaWZpZWQgZm9yIGFjY3VyYWN5IAotCQlhbmQgaXMgbm90IGdlbmVyYXRlZCBsaWtlIHRoZSBKYXZhZG9jIEFQSSBwYWNrYWdlcyBhcmUuCi0JCQkJCi0JR2VuZXJhdGU6Ci0JCTEpIHNlbGVjdCBidWlsZEV4dERvY3MueG1sIGZpbGUgaW4gcHJvamVjdCBleHBsb3JlcgotCQkyKSBSdW4gYXMgIkFudCBCdWlsZC4uLiIgLS0+IEpSRSBUYWIsIGVuc3VyZSB0aGF0ICJSdW4gaW4gc2FtZSBKUkUgYXMgV29ya3NwYWNlIiBpcyAKLQkJc2VsZWN0ZWQKLQotQ2hlY2tpbmctaW46Ci0JQ2hlY2sgaW46Ci0JLSBhbnkgY2hhbmdlcyBtYWRlIGluIHRoaXMgcHJvamVjdAotCi0JCQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ4ODgwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUBpbXBvcnQgIi4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMmU3NTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS8sXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzQ1NWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkRXh0RG9jcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSW5mb3JtYXRpb24gZm9yIGV4dGVuc2lvbiBwb2ludCBvdmVydmlldyBkb2N1bWVudAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPdmVydmlldyBkb2N1bWVudCB0aXRsZQotCi10aXRsZSA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHMKLWhlYWRlciA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHMgCi0jIEludHJvZHVjdGlvbiBwYXJhZ3JhcGgKLW92ZXJ2aWV3ID0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnRzIGNhbiBiZSB1c2VkIHRvIGFkZCBuZXcgdmFsaWRhdG9yczogCi0jIEEgbGlzdCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUKLSMgZXh0ZW5zaW9uIHBvaW50IGRvY3VtZW50YXRpb24uCi0KLWxpc3RlZC1leHQtcG9pbnRzPW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyLFwKLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckdyb3VwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2J1aWxkRXh0RG9jcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5YjU3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvYnVpbGRFeHREb2NzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBFeHRlbnNpb24gUG9pbnQgRG9jdW1lbnRhdGlvbiIgZGVmYXVsdD0iY3JlYXRlRXh0RG9jcyIgYmFzZWRpcj0iLiI+Ci0KLQk8cHJvcGVydHkgZmlsZT0iYnVpbGRFeHREb2NzLnByb3BlcnRpZXMiLz4KLQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cyIvPgotCTxwcm9wZXJ0eSBuYW1lPSJ2Zk91dHB1dERpciIgdmFsdWU9IiR7b3V0cHV0RGlyfSR7ZmlsZS5zZXBhcmF0b3J9dmYke2ZpbGUuc2VwYXJhdG9yfSIvPgotCi0JPCEtLSA8dGFza2RlZiBuYW1lPSJwZGUuY29udmVydFNjaGVtYVRvSFRNTCIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS5hbnQuQ29udmVydFNjaGVtYVRvSFRNTCIvPiAtLT4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNyZWF0ZUV4dERvY3MiIGRlcGVuZHM9ImJ1aWxkRXh0RG9jcywgY3JlYXRlRG9jTGlzdGluZ3MiLz4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkRXh0RG9jcyIgZGVwZW5kcz0iYnVpbGRWRkV4dERvY3MiLz4KLQkJCi0gCTx0YXJnZXQgbmFtZT0iYnVpbGRWRkV4dERvY3MiPgotIAkJPG1rZGlyIGRpcj0iJHt2Zk91dHB1dERpcn0iLz4KLSAJCTwhLS0gY2xlYW51cCBvbGQgLS0+Ci0gCQk8ZGVsZXRlPgotIAkgCQk8ZmlsZXNldCBkaXI9IiR7dmZPdXRwdXREaXJ9IiBjYXNlc2Vuc2l0aXZlPSJ5ZXMiIGlkPSJleHQtZG9jcy1saXN0LWVudCI+Ci0gCSAJCQk8aW5jbHVkZSBuYW1lPSIqLmh0bWwiLz4KLSAJCQk8L2ZpbGVzZXQ+Ci0gCQk8L2RlbGV0ZT4KLSAJCQotIAkJPCEtLSBnZW5lcmF0ZSBuZXcgaHRtbCBmcm9tIGV4dC1wdCBzY2hlbWFzIC0tPgotIAkJPHBkZS5jb252ZXJ0U2NoZW1hVG9IVE1MIG1hbmlmZXN0PSIuLi9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iJHt2Zk91dHB1dERpcn0iIC8+Ci0gCQkKLSAJCTwhLS0gR2V0IHRoZSBsaXN0IG9mIGV4dGVuc2lvbiBkb2MgZmlsZXMuIC0tPgotIAkJPGZpbGVzZXQgZGlyPSIke3ZmT3V0cHV0RGlyfSIgY2FzZXNlbnNpdGl2ZT0ieWVzIiBpZD0iZXh0LWRvY3MtbGlzdC1lbnQiPgotIAkJCTxpbmNsdWRlIG5hbWU9IiouaHRtbCIvPgotCQk8L2ZpbGVzZXQ+Ci0gCQkKLSAJCTwhLS0gQ29udmVydCB0aGUgbGlzdCB0byBhbiBYTUwgcmVwcmVzZW50YXRpb24uIC0tPgotIAkJPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJleHQtZG9jLWVudCIgcmVmaWQ9ImV4dC1kb2NzLWxpc3QtZW50IiBwYXRoc2VwPSImbHQ7L2ZpbGUmZ3Q7L24vbiZsdDtmaWxlJmd0OyI+Ci0gCQkJPG1hcCBmcm9tPSIke3ZmT3V0cHV0RGlyfSIgdG89IiIvPgotIAkJPC9wYXRoY29udmVydD4KLSAJCSAJCQkJCQkKLSAJPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjcmVhdGVEb2NMaXN0aW5ncyI+Ci0JCTxkZWxldGUgZmlsZT0iJHtvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIi8+Ci0JCTwhLS0gQ3JlYXRlIHRoZSBvdmVydmlldyBkb2N1bWVudC4gLS0+Ci0JCTx4c2x0IGJhc2VkaXI9IiR7YmFzZWRpcn0iIGluPSJleHREb2NMaXN0aW5ncy54bWwiIG91dD0iJHtvdXRwdXREaXJ9JHtmaWxlLnNlcGFyYXRvcn1pbmRleC5odG1sIiBzdHlsZT0iZXh0RG9jT3ZlcnZpZXcueHNsIj4KLQkgIAkJPHBhcmFtIG5hbWU9InRpdGxlIiBleHByZXNzaW9uPSIke3RpdGxlfSIvPgotCSAgCQk8cGFyYW0gbmFtZT0iaGVhZGVyIiBleHByZXNzaW9uPSIke2hlYWRlcn0iLz4KLQkgIAkJPHBhcmFtIG5hbWU9Im92ZXJ2aWV3IiBleHByZXNzaW9uPSIke292ZXJ2aWV3fSIvPgotCQkJPHBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIiBleHByZXNzaW9uPSIke2xpc3RlZC1leHQtcG9pbnRzfSIvPgotCQk8L3hzbHQ+Ci0JCQkKLQkJPCEtLSBDcmVhdGUgdGhlIGV4dGVudGlvbiBwb2ludCB0b2MuIC0tPgotCQk8eHNsdCBiYXNlZGlyPSIke2Jhc2VkaXJ9IiBpbj0iZXh0RG9jTGlzdGluZ3MueG1sIiBvdXQ9InRvcGljc19FeHRQb2ludF9SZWZlcmVuY2UueG1sIiBzdHlsZT0iZXh0RG9jVG9jLnhzbCI+Ci0JCQk8cGFyYW0gbmFtZT0ibGlzdGVkLWV4dC1wb2ludHMiIGV4cHJlc3Npb249IiR7bGlzdGVkLWV4dC1wb2ludHN9Ii8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0ibWV0aG9kIiB2YWx1ZT0ieG1sIi8+Ci0JCQk8b3V0cHV0cHJvcGVydHkgbmFtZT0iaW5kZW50IiB2YWx1ZT0ieWVzIi8+Ci0JCTwveHNsdD4KLQkJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NMaXN0aW5ncy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jTGlzdGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY1ZWM4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NMaXN0aW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50cz4KLQk8Y29tcG9uZW50IG5hbWU9IlZhbGlkYXRpb24gRnJhbWV3b3JrIiBpZD0idmYiIGZpbGU9InZmZXh0ZG9jcy54bWwiLz4KLTwvY29tcG9uZW50cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NPdmVydmlldy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jT3ZlcnZpZXcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQxOTg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9leHREb2NPdmVydmlldy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiPgotICAgIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImhlYWRlciIvPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ib3ZlcnZpZXciLz4KLSAgICA8eHNsOnBhcmFtIG5hbWU9Imxpc3RlZC1leHQtcG9pbnRzIi8+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tcG9uZW50cyI+Ci0gICAgCQotICAgIAk8eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyI+Ci0gICAgCSZsdDshRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVFJBTlNJVElPTkFMLy9FTiImZ3Q7Ci0JCTwveHNsOnRleHQ+Ci0JCTxodG1sPgotCQk8aGVhZD4KLQkJPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotCQkmbHQ7bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgT3JhY2xlIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgJmd0OwotCi0gICAJCSZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiJmd0OwotICAgCQk8L3hzbDp0ZXh0PgotICAgCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci0gICAJCTx4c2w6dGV4dCBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIj4KLQkJJmx0O0xJTksgUkVMPSJTVFlMRVNIRUVUIiBIUkVGPSIuLi8uLi9ib29rLmNzcyIgQ0hBUlNFVD0iSVNPLTg4NTktMSIgVFlQRT0idGV4dC9jc3MiJmd0OwotCQk8L3hzbDp0ZXh0PgotCQk8L2hlYWQ+Ci0JCTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLQotCQk8Y2VudGVyPgotCQk8aDE+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXIiLz48L2gxPgotCQk8L2NlbnRlcj4KLQotCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG92ZXJ2aWV3Ii8+Ci0gICAgCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjb21wb25lbnQiPgotICAgIAkJPHhzbDpzb3J0IHNlbGVjdD0iQGlkIi8+Ci0gICAgCQk8aDM+PGEgbmFtZT0ie0BpZH0iPjwvYT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gzPgotICAgIAkJPHVsPgotICAgIAkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJkb2N1bWVudChAZmlsZSkvZmlsZXMvZmlsZSI+Ci0gICAgCQkJCTx4c2w6c29ydCBzZWxlY3Q9InRleHQoKSIvPgotICAgIAkJCQk8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRsaXN0ZWQtZXh0LXBvaW50cywgdHJhbnNsYXRlKHN1YnN0cmluZyh0ZXh0KCksIDAsIHN0cmluZy1sZW5ndGgodGV4dCgpKSAtIDQpLCdfJywnLicpKSI+Ci0gIAkJCQkJCTxsaT4KLSAgCQkJCQkJCTxhIGhyZWY9InsuLi9AY29tcG9uZW50fS97dGV4dCgpfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZShzdWJzdHJpbmcodGV4dCgpLCAwLCBzdHJpbmctbGVuZ3RoKHRleHQoKSkgLSA0KSwnXycsJy4nKSIvPjwvYT4gCi0gIAkJCQkJCTwvbGk+Ci0gIAkJCQkJPC94c2w6aWY+Ci0gICAgCQkJPC94c2w6Zm9yLWVhY2g+Ci0gICAgCQk8L3VsPgotICAgIAk8L3hzbDpmb3ItZWFjaD4KLSAgICAJPC9ib2R5PgotCQk8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2V4dERvY1RvYy54c2wgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jVG9jLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNTRiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvZXh0RG9jVG9jLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgdmVyc2lvbj0iMS4wIgotICAgIHhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKLSAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGFsYW4iPgotICAgIDx4c2w6cGFyYW0gbmFtZT0ibGlzdGVkLWV4dC1wb2ludHMiLz4KLSAgICAKLSAgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tcG9uZW50cyI+Ci0gICAgIAk8eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyI+Ci0mbHQ7P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/Jmd0OwotCSAJPC94c2w6dGV4dD4KLQkgCTx0b2MgbGFiZWw9IkV4dGVuc2lvbiBQb2ludHMgUmVmZXJlbmNlIj4KLQkgCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZG9jdW1lbnQoY29tcG9uZW50L0BmaWxlKS9maWxlcy9maWxlIj4KLQkgCQkJPHhzbDpzb3J0IHNlbGVjdD0idGV4dCgpIi8+Ci0JIAkJCTx4c2w6aWYgdGVzdD0iY29udGFpbnMoJGxpc3RlZC1leHQtcG9pbnRzLCB0cmFuc2xhdGUoc3Vic3RyaW5nKHRleHQoKSwgMCwgc3RyaW5nLWxlbmd0aCh0ZXh0KCkpIC0gNCksJ18nLCcuJykpIj4KLQkgCQkJCTx0b3BpYyBsYWJlbD0ie3RyYW5zbGF0ZShzdWJzdHJpbmcodGV4dCgpLCAwLCBzdHJpbmctbGVuZ3RoKHRleHQoKSkgLSA0KSwnXycsJy4nKX0iIGhyZWY9InJlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3suLi9AY29tcG9uZW50fS97dGV4dCgpfSI+Ci0JIAkJCQk8L3RvcGljPgotCSAJCQk8L3hzbDppZj4KLQkgCQk8L3hzbDpmb3ItZWFjaD4KLQkgCTwvdG9jPiAKLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvamF2YWRvYy5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2phdmFkb2MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YjhiYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvamF2YWRvYy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotYXBpLnRpdGxlPVdlYiBUb29scyBQbGF0Zm9ybTogVmFsaWRhdGlvbiBGcmFtZXdvcmsKLXNvdXJjZXBhdGg9Li4vb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyOy4uL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUKLWFwaS5wYWNrYWdlcz1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbixvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9qYXZhZG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2phdmFkb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmM1MTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L2phdmFkb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLQk8cHJvcGVydHkgZmlsZT0iamF2YWRvYy5wcm9wZXJ0aWVzIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UuaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4iLz4KLQkKLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLCBqYXZhZG9jIiBkZXNjcmlwdGlvbj0iQnVpbGRzIFBsdWdpbiBKYXZhZG9jIiAvPgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke291dHB1dERpcn0vcmVmZXJlbmNlL2FwaS8iID4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImphdmFkb2MiPgotCQk8ZWNobyBtZXNzYWdlPSI9PT09PT09PT0gJHtlY2xpcHNlLmhvbWV9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfS9yZWZlcmVuY2UvYXBpIiAvPgotCi0JCTxqYXZhZG9jIAotICAgICAgICAJYWNjZXNzPSJwdWJsaWMiIAotICAgIAkJYWRkaXRpb25hbHBhcmFtPSItYnJlYWtpdGVyYXRvciIKLQkJCWF1dGhvcj0iZmFsc2UiIAotCQkJY2xhc3NwYXRoPSIke2NsYXNzcGF0aH0iIAotCQkJZGVzdGRpcj0iJHtvdXRwdXREaXJ9L3JlZmVyZW5jZS9hcGkiIAotCQkJZG9jdGl0bGU9IiR7YXBpLnRpdGxlfSIgCi0JCQlub2RlcHJlY2F0ZWQ9ImZhbHNlIiAKLQkJCW5vZGVwcmVjYXRlZGxpc3Q9ImZhbHNlIiAKLQkJCW5vaW5kZXg9InRydWUiIAotCQkJbm9uYXZiYXI9ImZhbHNlIiAKLQkJCW5vdHJlZT0idHJ1ZSIgCi0gICAgICAgIAlvdmVydmlldz0iJHtiYXNlZGlyfS9vdmVydmlldy5odG1sIgotCQkJcGFja2FnZW5hbWVzPSIke2FwaS5wYWNrYWdlc30iIAotCQkJc291cmNlcGF0aD0iJHtzb3VyY2VwYXRofSIgCi0JCQl1c2U9InRydWUiIAotCQkJdmVyc2lvbj0idHJ1ZSIKLQkJCWJyZWFraXRlcmF0b3I9InllcyIKLSAgICAgICAgCXZlcmJvc2U9ImZhbHNlIgotICAgICAgICAJZmFpbG9uZXJyb3I9ImZhbHNlIj4KLQkJCTx0YWcgbmFtZT0iaWdub3JlIiAgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0iZ2VuZXJhdGVkIiAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0ibW9kZWwiICAgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0ibW9kaWZpYWJsZSIgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0iZXh0ZW5kcyIgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0iaW1wbGVtZW50cyIgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJCTx0YWcgbmFtZT0ib3JkZXJlZCIgICAgZGVzY3JpcHRpb249Imlnbm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPC9qYXZhZG9jPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L292ZXJ2aWV3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3Yvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxZWY3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3Yvb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VmFsaWRhdGlvbiBGcmFtZXdvcmsgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLjwvcD4KLTxoMj5BcHByb2FjaDwvaDI+Ci08cD5JbiBXVFAgMy4wIGEgbmV3IHZhbGlkYXRpb24gZnJhbWV3b3JrIGhhcyBiZWVuIGFkZGVkLiBUaGlzIHdhcyBkZXZlbG9wZWQgYXQgCi10aGUgcmVxdWVzdCBvZiB2YWxpZGF0b3Igb3duZXJzIGFuZCBlbmQgdXNlcnMuIFRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhpcyAKLW5ldyBmcmFtZXdvcmssIHRoYXQgYXBwcm9hY2ggdGhhdCBoYXMgYmVlbiB0YWtlbiBpcyB0byBzdXBwb3J0IGJvdGggdGhlIG9sZCBhbmQgCi10aGUgbmV3IGZyYW1ld29ya3MgZm9yIGEgd2hpbGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgb2xkIHZhbGlkYXRvcnMgd29yayBleGFjdGx5IAotbGlrZSB0aGV5IHVzZWQgdG8uIFRoZXkgY2FuIHN0aWxsIHBsdWcgaW50byB0aGUgb2xkIGZyYW1ld29yayBhbmQgd2lsbCBjb250aW51ZSAKLXRvIGJlIHJ1biBieSB0aGUgb2xkIGZyYW1ld29yay4gVGhpcyBhbGxvd3MgdmFsaWRhdG9yIG93bmVycyB0byBtaWdyYXRlIGF0IHRoZWlyIAotb3duIHBhY2UuPC9wPgotPHA+Rm9yIHZhbGlkYXRvciBvd25lcnMgdGhhdCB3aXNoIHRvIGV4cGxvaXQgdGhlIG5ldyBmcmFtZXdvcmssIGl0IGhhcyBiZWVuIAotZGVzaWduZWQgbiBzdWNoIGEgd2F5IHRvIG1pbmltaXplIHRoZSB0cmFuc2l0aW9uIGZyb20gdGhlIG9sZCBmcmFtZXdvcmsgdG8gdGhlIAotbmV3IGZyYW1ld29yay4gVGhlcmUgaXMgYSBuZXcgZXh0ZW5zaW9uIHBvaW50IHRoYXQgbmVlZHMgdG8gYmUgc3BlY2lmaWVkLCBhbmQgYSAKLW5ldyBhYnN0cmFjdCBjbGFzcyB0aGF0IG5lZWRzIHRvIGJlIGV4dGVuZGVkLjwvcD4KLTxoMz5CZW5lZml0czwvaDM+Ci08cD5XaGF0IGJlbmVmaXRzIGRvZXMgdGhlIG5ldyBmcmFtZXdvcmsgaGF2ZSB0byBvZmZlcj8gT3IgYXNrZWQgYW5vdGhlciB3YXksIGFzIAotYSB2YWxpZGF0b3Igb3duZXIsIHdoeSB3b3VsZCBJIHdhbnQgdG8gc3dpdGNoPzwvcD4KLTxoND5QZXJmb3JtYW5jZTwvaDQ+Ci08aDU+VHVuaW5nPC9oNT4KLTxwPlRoZSBtYWluIHJlYXNvbiBmb3IgY3JlYXRpbmcgYSBuZXcgZnJhbWV3b3JrIHdhcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLiBBcyAKLW1vcmUgYW5kIG1vcmUgdmFsaWRhdG9ycyBhcmUgYWRkZWQsIHZhbGlkYXRpb24gaXMgY29uc3VtaW5nIGEgYmlnZ2VyIHNsaWNlIG9mIAotdGhlIHJlc291cmNlcyB0aGF0IGl0IHRha2VzIHRvIHBlcmZvcm0gYSBidWlsZC48L3A+Ci08cD5UaGUgYmVzdCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpcyBlbGltaW5hdGluZyB1bm5lY2Vzc2FyeSB3b3JrLiBXZSAKLWVsaW1pbmF0ZSB3b3JrLCBieSBwcm92aWRpbmcgc2lnbmlmaWNhbnRseSBtb3JlIHR1bmluZyBvcHRpb25zLiBWYWxpZGF0aW9uIAotb3duZXJzIGNhbiB0dW5lIHdoaWNoIHJlc291cmNlcyB0aGV5IGFyZSBjYWxsZWQgb24uIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSB1c2UgCi1vZiBmaWx0ZXIgcnVsZXMuIFRoZXNlIGZpbHRlciBydWxlcyBhcmUgZ3JvdXBlZCBpbnRvIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIAotZ3JvdXBzLiBJZiB5b3UgaGF2ZSBtdWx0aXBsZSBpbmNsdXNpb24gZ3JvdXBzIHRoZXkgYXJlICZxdW90O2FuZGVkJnF1b3Q7IHRvZ2V0aGVyLCBtZWFuaW5nIAotdGhhdCBlYWNoIG9mIHRoZSBpbmNsdXNpb24gZ3JvdXBzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VjY2Vzc2Z1bCBmaWx0ZXIgcnVsZS4gCi1FeGNsdXNpb24gZ3JvdXBzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hhdCBkb2Vzbid0IGdldCB2YWxpZGF0ZWQuIEV4Y2x1c2lvbiAKLWdyb3VwcyBoYXZlIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBpbmNsdXNpb24gZ3JvdXBzLiBJZiBhbiBleGNsdXNpb24gZ3JvdXAgCi1leGNsdWRlcyBhIHJlc291cmNlIHRoYW4gaXQgaXMgZXhjbHVkZWQgbm8gbWF0dGVyIHdoYXQgdGhlIGluY2x1c2lvbiBncm91cHMgbWF5IAotc2F5LjwvcD4KLTxwPlRoZXkgYXJlIHNldmVyYWwgZGlmZmVyZW50IHR5cGVzIG9mIGZpbHRlciBydWxlczo8L3A+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+RmlsZSBleHRlbnNpb248L3N0cm9uZz4gLSBSdWxlcyBiYXNlZCBvbiB0aGUgZmlsZSBleHRlbnNpb24uIEZvciAKLQlleGFtcGxlLCBpbmNsdWRlIGFsbCB0aGUgZmlsZXMgd2l0aCBleHRlbnNpb24gKi54bWwuPC9saT4KLQk8bGk+PHN0cm9uZz5Gb2xkZXIgb3IgRmlsZSBuYW1lPC9zdHJvbmc+IC0gUnVsZXMgYmFzZWQgb24gdGhlIGZvbGRlciBvciBmaWxlIAotCW5hbWUuIEZvciBleGFtcGxlIGV4Y2x1ZGUgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIGJ1aWxkIGZvbGRlci4gRmlsZSBuYW1lcyAKLQljYW4gYmUgZnVsbHkgcXVhbGlmaWVkLCBwcm9qZWN0IHJlbGF0aXZlIG5hbWVzLCBlLmcuIDxzdHJvbmc+V2ViQ29udGVudC9XRUItSU5GL3dlYi54bWw8L3N0cm9uZz4sIAotCW9yIHNpbXBsZSBuYW1lcywgPHN0cm9uZz53ZWIueG1sPC9zdHJvbmc+LjwvbGk+Ci0JPGxpPjxzdHJvbmc+UHJvamVjdCBuYXR1cmU8L3N0cm9uZz4gLSBQcm9qZWN0cyB3aXRoIGNlcnRhaW4gbmF0dXJlcyBjYW4gYmUgCi0JZWl0aGVyIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLjwvbGk+Ci0JPGxpPjxzdHJvbmc+RmFjZXQ8L3N0cm9uZz4gLSBQcm9qZWN0cyB3aXRoIGNlcnRhaW4gZmFjZXRzIGNhbiBiZSBlaXRoZXIgCi0JaW5jbHVkZWQgb3IgZXhjbHVkZWQuPC9saT4KLQk8bGk+PHN0cm9uZz5Db250ZW50IFR5cGUgPC9zdHJvbmc+LSBSZXNvdXJjZXMgb2YgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSAKLQljYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQuPC9saT4KLTwvdWw+Ci08cD5UaGUgZmlsdGVyIHJ1bGVzIGFuZCBncm91cHMgZm9ybSB0aGUgYnVpbGRpbmcgYmxvY2tzIG9mIHdoYXQgZ2V0cyB2YWxpZGF0ZWQuCi08L3A+Ci08cD5JbiB0ZXJtcyBvZiB0dW5pbmcgaG93ZXZlciwgdGhlIGVuZCB1c2VyIGhhcyB0aGUgZmluYWwgc2F5LiBUaGUgdmFsaWRhdG9yIAotb3duZXJzIHNwZWNpZnkgdGhlIGRlZmF1bHQgZmlsdGVyIHJ1bGVzIGFuZCBncm91cHMgZm9yIHRoZWlyIHZhbGlkYXRvciwgYnV0IHRoZSAKLWVuZCB1c2VyIHRocm91Z2ggdGhlIHVzZSBvZiBwcmVmZXJlbmNlcyBjYW4gb3ZlcnJpZGUgdGhlc2Ugc2V0dGluZ3MuIDwvcD4KLTxoNT5DYWNoaW5nPC9oNT4KLTxwPkFub3RoZXIgd2F5IHRoYXQgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQgaXMgdGhyb3VnaCBtb3JlIGVmZmVjdGl2ZSBjYWNoaW5nLiAKLVdpdGggdGhlIHByZXZpb3VzIGZyYW1ld29yayB3ZSB3ZXJlIG5vdGljaW5nIHRoYXQgZGlmZmVyZW50IHZhbGlkYXRvcnMgd291bGQgYmUgCi1vcGVuaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBzYW1lIGZpbGUsIGJ1dCB0aGF0IHRoaXMgd291bGQgaGFwcGVuIGZhciBlbm91Z2ggCi1hcGFydCwgdGhhdCBjYWNoZXMgd2VyZW4ndCBlZmZlY3RpdmUuIEV2ZW4gaWYgZmlsZXMgd2VyZSBiZWluZyBjYWNoZWQsIHRoZSAKLXNlY29uZCAob3IgdGhpcmQsIG9yIGZvcnRoLCAuLi4pIG9wZW4gd291bGQgaGFwcGVuIGZhciBlbm91Z2ggYSBtZWFucyB0aGF0IHdheSAKLXRoYXQgdGhlIGZpbGUgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gZXZpY3RlZCBmcm9tIHRoZSBjYWNoZS4gSW4gdGhlIG5ldyAKLWZyYW1ld29yaywgdGhlIHByb2Nlc3Npbmcgb3JkZXIgaXMgbW9yZSB0aWdodGx5IGNvbnRyb2xsZWQuIFRoZSBmcmFtZXdvcmsgY2FsbHMgCi10aGUgdmFsaWRhdG9yIGFuZCB0ZWxscyBpdCB3aGF0IHRvIHZhbGlkYXRlLiBUaGlzIHdheSBmaWxlcyBhcmUgcHJvY2Vzc2VkIGluIAotb3JkZXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNoYW5jZSBvZiB0aGVtIGJlaW5nIGEgY2FjaGUgaXMgbXVjaCBoaWdoZXIuIEV2ZXJ5IAotdmFsaWRhdG9yIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiBmaWxlIEEgcHJvY2Vzc2VzIGl0LCBhbmQgdGhlbiB3ZSBtb3ZlIG9uIGFuZCAKLWV2ZXJ5IHZhbGlkYXRvciB0aGF0IGlzIGludGVyZXN0ZWQgaW4gZmlsZSBCIHByb2Nlc3NlcyBpdCwgZXRjLjwvcD4KLTxwPkFsc28gYmVjYXVzZSBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBrZXB0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbGlkYXRpb24gCi1vcGVyYXRpb24sIHZhbGlkYXRvcnMgY2FuIGNhY2hlIGV4cGVuc2l2ZSBvcGVyYXRpb25zLCBsaWtlIG1vZGVsIGNyZWF0aW9uLCB0aGF0IAotbWlnaHQgYmUgbmVlZGVkIGFzIHBhcnQgb2YgdmFsaWRhdGluZyBzZXZlcmFsIGZpbGVzLiA8L3A+Ci08aDU+Sm9iIENvbnRyb2w8L2g1PgotPHA+V2l0aCB0aGUgZWFybGllciBmcmFtZXdvcmssIHRoZXJlIHdlcmUgdG9vIG1hbnkgam9icy90aHJlYWRzIHJ1bm5pbmcgCi1jb25jdXJyZW50bHkuIFRoaXMgaXMgbm93IG1vcmUgdGlnaHRseSBjb250cm9sbGVkLjwvcD4KLTxoND5EZXBlbmRlbmN5IFN1cHBvcnQ8L2g0PgotPHA+QW5vdGhlciBuZXcgZmVhdHVyZSBpcyBkZXBlbmRlbmN5IHN1cHBvcnQuIEEgdmFsaWRhdG9yIGNhbiBub3cgYXNzZXJ0IHRoYXQgYSAKLXJlc291cmNlIGlzIGRlcGVuZGFudCBvbiBzb21lIG90aGVyIHJlc291cmNlcy4gRm9yIGV4YW1wbGUgdGhhdCBhIFhNTCBmaWxlIGlzIAotZGVwZW5kYW50IG9uIGEgWFNEIGZpbGUuIE5vdyBpZiB0aGUgWFNEIGZpbGUgY2hhbmdlcyB0aGUgWE1MIGNhbiBiZSByZXZhbGlkYXRlZC4gCi1BcyB0aGUgdXNlciBjb21lcyB0byB0cnVzdCB0aGlzIGRlcGVuZGVuY3kgc3VwcG9ydCwgdGhleSB3b250IHBlcmZvcm0gYXMgbWFueSAKLWNsZWFuIGJ1aWxkcy48L3A+Ci08aDQ+UHJpbWFyeSBGcmFtZXdvcms8L2g0PgotPHA+VGhpcyBpcyB0aGUgcHJpbWFyeSB2YWxpZGF0aW9uIGZyYW1ld29yay4gQXQgc29tZSBwb2ludCwgdGhlIGVhcmxpZXIgCi1mcmFtZXdvcmsgd2lsbCBiZSBkZXByZWNhdGVkIGFuZCB0aGVuIHJlbW92ZWQuIEFsbCB0aGUgbmV3IGludmVzdG1lbnQgd2lsbCAKLWhhcHBlbiBpbiB0aGlzIGZyYW1ld29yay4gPC9wPgotPHA+VGhlIGZyYW1ld29yayBjb2xsYXRlcmFsIHdpbGwgY29udGludWUgdG8gYmUgZW5oYW5jZWQgKGp1bml0IHRlc3RjYXNlcywgCi1kb2N1bWVudGF0aW9uLCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMsIC4uLik8L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGI5ODViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1CdW5kbGUtTmFtZS4wID0gVmFsaWRhdGlvbiBGcmFtZXdvcmsgLSBEZXZlbG9wZXIgR3VpZGUKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzVhNWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9InRvYy54bWwiPgotICAgICAgPC90b2M+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjQ5YTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1mcmFtZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotQWxsIENsYXNzZXMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotPEI+QWxsIENsYXNzZXM8L0I+PC9GT05UPgotPEJSPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+RnJpZW5kPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklEZXBlbmRlbmN5SW5kZXg8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SU1lc3NhZ2U8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SU1ldGFNb2RlbENvbnRleHQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JTXV0YWJsZVZhbGlkYXRvcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVBlcmZvcm1hbmNlTW9uaXRvcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVJlcG9ydGVyPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdGlvbkNvbnRleHQ8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9yPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9yRXh0ZW5kZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklWYWxpZGF0b3JKb2I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+TWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+UmVwb3J0ZXJIZWxwZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25FdmVudDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25GcmFtZXdvcms8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25SZXN1bHQ8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdGlvblJlc3VsdHM8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25TdGF0ZTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvci5MZXZlbDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYxPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYyPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yTWVzc2FnZTwvQT4KLTxCUj4KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTMwYjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1BbGwgQ2xhc3NlcwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIj4KLTxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci08Qj5BbGwgQ2xhc3NlczwvQj48L0ZPTlQ+Ci08QlI+Ci0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+RGVwZW5kZW50UmVzb3VyY2U8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5GcmllbmQ8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxJPklEZXBlbmRlbmN5SW5kZXg8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxJPklNZXNzYWdlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48ST5JTWV0YU1vZGVsQ29udGV4dDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48ST5JTXV0YWJsZVZhbGlkYXRvcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxJPklQZXJmb3JtYW5jZU1vbml0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEk+SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxJPklSZXBvcnRlcjwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxJPklWYWxpZGF0aW9uQ29udGV4dDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48ST5JVmFsaWRhdG9yPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEk+SVZhbGlkYXRvckV4dGVuZGVyPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxJPklWYWxpZGF0b3JHcm91cExpc3RlbmVyPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxJPklWYWxpZGF0b3JKb2I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlJlcG9ydGVySGVscGVyPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25GcmFtZXdvcms8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Ci08QlI+Ci08QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT4KLTxCUj4KLTxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPgotPEJSPgotPEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+Ci08QlI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9jb25zdGFudC12YWx1ZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2NvbnN0YW50LXZhbHVlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mzg4YjEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2NvbnN0YW50LXZhbHVlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUNvbnN0YW50IEZpZWxkIFZhbHVlcwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkNvbnN0YW50IEZpZWxkIFZhbHVlcyI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9jb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJjb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotQ29uc3RhbnQgRmllbGQgVmFsdWVzPC9IMT4KLTwvQ0VOVEVSPgotPEhSIFNJWkU9IjQiIE5PU0hBREU+Ci08Qj5Db250ZW50czwvQj48VUw+Ci08TEk+PEEgSFJFRj0iI29yZy5lY2xpcHNlIj5vcmcuZWNsaXBzZS4qPC9BPgotPC9VTD4KLQotPEEgTkFNRT0ib3JnLmVjbGlwc2UiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Rk9OVCBTSVpFPSIrMiI+Ci1vcmcuZWNsaXBzZS4qPC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZS5WYWxpZGF0aW9uSWQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI1ZhbGlkYXRpb25JZCI+VmFsaWRhdGlvbklkPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+IlZhbGlkYXRpb25JZCI8L0NPREU+PC9URD4KLTwvVFI+Ci08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIzIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5BTExfTUVTU0FHRVMiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjQUxMX01FU1NBR0VTIj5BTExfTUVTU0FHRVM8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT43PC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0VSUk9SX0FORF9XQVJOSU5HIj5FUlJPUl9BTkRfV0FSTklORzwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjM8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuSElHSF9TRVZFUklUWSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNISUdIX1NFVkVSSVRZIj5ISUdIX1NFVkVSSVRZPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MTwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5MSU5FTk9fVU5TRVQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjTElORU5PX1VOU0VUIj5MSU5FTk9fVU5TRVQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4wPC9DT0RFPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLkxPV19TRVZFUklUWSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQgQUxJR049ImxlZnQiPjxDT0RFPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNMT1dfU0VWRVJJVFkiPkxPV19TRVZFUklUWTwvQT48L0NPREU+PC9URD4KLTxURCBBTElHTj0icmlnaHQiPjxDT0RFPjQ8L0NPREU+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZIj48IS0tIC0tPjwvQT48VEQgQUxJR049InJpZ2h0Ij48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5wdWJsaWMmbmJzcDtzdGF0aWMmbmJzcDtmaW5hbCZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURCBBTElHTj0ibGVmdCI+PENPREU+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI05PUk1BTF9TRVZFUklUWSI+Tk9STUFMX1NFVkVSSVRZPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+MjwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5PRkZTRVRfVU5TRVQiPjwhLS0gLS0+PC9BPjxURCBBTElHTj0icmlnaHQiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnB1YmxpYyZuYnNwO3N0YXRpYyZuYnNwO2ZpbmFsJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjT0ZGU0VUX1VOU0VUIj5PRkZTRVRfVU5TRVQ8L0E+PC9DT0RFPjwvVEQ+Ci08VEQgQUxJR049InJpZ2h0Ij48Q09ERT4tMTwvQ09ERT48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5UYXJnZXRSZXNvdXJjZSI+PCEtLSAtLT48L0E+PFREIEFMSUdOPSJyaWdodCI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+cHVibGljJm5ic3A7c3RhdGljJm5ic3A7ZmluYWwmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREIEFMSUdOPSJsZWZ0Ij48Q09ERT48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjVGFyZ2V0UmVzb3VyY2UiPlRhcmdldFJlc291cmNlPC9BPjwvQ09ERT48L1REPgotPFREIEFMSUdOPSJyaWdodCI+PENPREU+IlRhcmdldFJlc291cmNlIjwvQ09ERT48L1REPgotPC9UUj4KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9jb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJjb25zdGFudC12YWx1ZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2RlcHJlY2F0ZWQtbGlzdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvZGVwcmVjYXRlZC1saXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzU5ZjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvZGVwcmVjYXRlZC1saXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotRGVwcmVjYXRlZCBMaXN0Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iRGVwcmVjYXRlZCBMaXN0IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9kZXByZWNhdGVkLWxpc3QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+RGVwcmVjYXRlZCBBUEk8L0I+PC9IMj4KLTwvQ0VOVEVSPgotPEhSIFNJWkU9IjQiIE5PU0hBREU+Ci08Qj5Db250ZW50czwvQj48VUw+Ci08TEk+PEEgSFJFRj0iI2V4Y2VwdGlvbiI+RGVwcmVjYXRlZCBFeGNlcHRpb25zPC9BPgotPExJPjxBIEhSRUY9IiNmaWVsZCI+RGVwcmVjYXRlZCBGaWVsZHM8L0E+Ci08TEk+PEEgSFJFRj0iI21ldGhvZCI+RGVwcmVjYXRlZCBNZXRob2RzPC9BPgotPC9VTD4KLQotPEEgTkFNRT0iZXhjZXB0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RGVwcmVjYXRlZCBFeGNlcHRpb25zPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjwvQT4KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxJPlRoaXMgY2xhc3MgaXMgbm90IGxvbmdlciB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsuIFRoZSBmcmFtZXdvcmsgaXMKLSAgbm90IGdvaW5nIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgZGlzcGxheWVkIGJ5IGEgdmFsaWRhdG9yLjwvST4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0iZmllbGQiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5EZXByZWNhdGVkIEZpZWxkczwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCNUcmlnZ2VyUmVzb3VyY2UiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZS5UcmlnZ2VyUmVzb3VyY2U8L0E+Ci08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8ST5UaGlzIGFwcHJvYWNoIGlzIG5vdCB0aHJlYWQgc2FmZSwgdGhlIGxvbmdlciBmb3JtIG9mIHRoZSBBYnN0cmFjdFZhbGlkYXRvciB2YWxpZGF0ZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC48L0k+Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im1ldGhvZCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkRlcHJlY2F0ZWQgTWV0aG9kczwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9yKGphdmEubGFuZy5TdHJpbmcpIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrLmdldFZhbGlkYXRvcihTdHJpbmcpPC9BPgotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PEk+VXNlIGdldFZhbGlkYXRvcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHdpdGggYSBudWxsIHByb2plY3QgaW5zdGVhZC48L0k+Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/ZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9oZWxwLWRvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvaGVscC1kb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyNGFiMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9oZWxwLWRvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUFQSSBIZWxwCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iQVBJIEhlbHAiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkhlbHA8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iaW5kZXguaHRtbD9oZWxwLWRvYy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9ImhlbHAtZG9jLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMT4KLUhvdyBUaGlzIEFQSSBEb2N1bWVudCBJcyBPcmdhbml6ZWQ8L0gxPgotPC9DRU5URVI+Ci1UaGlzIEFQSSAoQXBwbGljYXRpb24gUHJvZ3JhbW1pbmcgSW50ZXJmYWNlKSBkb2N1bWVudCBoYXMgcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgaXRlbXMgaW4gdGhlIG5hdmlnYXRpb24gYmFyLCBkZXNjcmliZWQgYXMgZm9sbG93cy48SDM+Ci1PdmVydmlldzwvSDM+Ci08QkxPQ0tRVU9URT4KLQotPFA+Ci1UaGUgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5PdmVydmlldzwvQT4gcGFnZSBpcyB0aGUgZnJvbnQgcGFnZSBvZiB0aGlzIEFQSSBkb2N1bWVudCBhbmQgcHJvdmlkZXMgYSBsaXN0IG9mIGFsbCBwYWNrYWdlcyB3aXRoIGEgc3VtbWFyeSBmb3IgZWFjaC4gIFRoaXMgcGFnZSBjYW4gYWxzbyBjb250YWluIGFuIG92ZXJhbGwgZGVzY3JpcHRpb24gb2YgdGhlIHNldCBvZiBwYWNrYWdlcy48L0JMT0NLUVVPVEU+Ci08SDM+Ci1QYWNrYWdlPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggcGFja2FnZSBoYXMgYSBwYWdlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGl0cyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLCB3aXRoIGEgc3VtbWFyeSBmb3IgZWFjaC4gVGhpcyBwYWdlIGNhbiBjb250YWluIGZvdXIgY2F0ZWdvcmllczo8VUw+Ci08TEk+SW50ZXJmYWNlcyAoaXRhbGljKTxMST5DbGFzc2VzPExJPkVudW1zPExJPkV4Y2VwdGlvbnM8TEk+RXJyb3JzPExJPkFubm90YXRpb24gVHlwZXM8L1VMPgotPC9CTE9DS1FVT1RFPgotPEgzPgotQ2xhc3MvSW50ZXJmYWNlPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggY2xhc3MsIGludGVyZmFjZSwgbmVzdGVkIGNsYXNzIGFuZCBuZXN0ZWQgaW50ZXJmYWNlIGhhcyBpdHMgb3duIHNlcGFyYXRlIHBhZ2UuIEVhY2ggb2YgdGhlc2UgcGFnZXMgaGFzIHRocmVlIHNlY3Rpb25zIGNvbnNpc3Rpbmcgb2YgYSBjbGFzcy9pbnRlcmZhY2UgZGVzY3JpcHRpb24sIHN1bW1hcnkgdGFibGVzLCBhbmQgZGV0YWlsZWQgbWVtYmVyIGRlc2NyaXB0aW9uczo8VUw+Ci08TEk+Q2xhc3MgaW5oZXJpdGFuY2UgZGlhZ3JhbTxMST5EaXJlY3QgU3ViY2xhc3NlczxMST5BbGwgS25vd24gU3ViaW50ZXJmYWNlczxMST5BbGwgS25vd24gSW1wbGVtZW50aW5nIENsYXNzZXM8TEk+Q2xhc3MvaW50ZXJmYWNlIGRlY2xhcmF0aW9uPExJPkNsYXNzL2ludGVyZmFjZSBkZXNjcmlwdGlvbgotPFA+Ci08TEk+TmVzdGVkIENsYXNzIFN1bW1hcnk8TEk+RmllbGQgU3VtbWFyeTxMST5Db25zdHJ1Y3RvciBTdW1tYXJ5PExJPk1ldGhvZCBTdW1tYXJ5Ci08UD4KLTxMST5GaWVsZCBEZXRhaWw8TEk+Q29uc3RydWN0b3IgRGV0YWlsPExJPk1ldGhvZCBEZXRhaWw8L1VMPgotRWFjaCBzdW1tYXJ5IGVudHJ5IGNvbnRhaW5zIHRoZSBmaXJzdCBzZW50ZW5jZSBmcm9tIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBmb3IgdGhhdCBpdGVtLiBUaGUgc3VtbWFyeSBlbnRyaWVzIGFyZSBhbHBoYWJldGljYWwsIHdoaWxlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgYXJlIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuIFRoaXMgcHJlc2VydmVzIHRoZSBsb2dpY2FsIGdyb3VwaW5ncyBlc3RhYmxpc2hlZCBieSB0aGUgcHJvZ3JhbW1lci48L0JMT0NLUVVPVEU+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1Bbm5vdGF0aW9uIFR5cGU8L0gzPgotPEJMT0NLUVVPVEU+Ci0KLTxQPgotRWFjaCBhbm5vdGF0aW9uIHR5cGUgaGFzIGl0cyBvd24gc2VwYXJhdGUgcGFnZSB3aXRoIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PFVMPgotPExJPkFubm90YXRpb24gVHlwZSBkZWNsYXJhdGlvbjxMST5Bbm5vdGF0aW9uIFR5cGUgZGVzY3JpcHRpb248TEk+UmVxdWlyZWQgRWxlbWVudCBTdW1tYXJ5PExJPk9wdGlvbmFsIEVsZW1lbnQgU3VtbWFyeTxMST5FbGVtZW50IERldGFpbDwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1FbnVtPC9IMz4KLTxCTE9DS1FVT1RFPgotCi08UD4KLUVhY2ggZW51bSBoYXMgaXRzIG93biBzZXBhcmF0ZSBwYWdlIHdpdGggdGhlIGZvbGxvd2luZyBzZWN0aW9uczo8VUw+Ci08TEk+RW51bSBkZWNsYXJhdGlvbjxMST5FbnVtIGRlc2NyaXB0aW9uPExJPkVudW0gQ29uc3RhbnQgU3VtbWFyeTxMST5FbnVtIENvbnN0YW50IERldGFpbDwvVUw+Ci08L0JMT0NLUVVPVEU+Ci08SDM+Ci1Vc2U8L0gzPgotPEJMT0NLUVVPVEU+Ci1FYWNoIGRvY3VtZW50ZWQgcGFja2FnZSwgY2xhc3MgYW5kIGludGVyZmFjZSBoYXMgaXRzIG93biBVc2UgcGFnZS4gIFRoaXMgcGFnZSBkZXNjcmliZXMgd2hhdCBwYWNrYWdlcywgY2xhc3NlcywgbWV0aG9kcywgY29uc3RydWN0b3JzIGFuZCBmaWVsZHMgdXNlIGFueSBwYXJ0IG9mIHRoZSBnaXZlbiBjbGFzcyBvciBwYWNrYWdlLiBHaXZlbiBhIGNsYXNzIG9yIGludGVyZmFjZSBBLCBpdHMgVXNlIHBhZ2UgaW5jbHVkZXMgc3ViY2xhc3NlcyBvZiBBLCBmaWVsZHMgZGVjbGFyZWQgYXMgQSwgbWV0aG9kcyB0aGF0IHJldHVybiBBLCBhbmQgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIEEuICBZb3UgY2FuIGFjY2VzcyB0aGlzIHBhZ2UgYnkgZmlyc3QgZ29pbmcgdG8gdGhlIHBhY2thZ2UsIGNsYXNzIG9yIGludGVyZmFjZSwgdGhlbiBjbGlja2luZyBvbiB0aGUgIlVzZSIgbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuPC9CTE9DS1FVT1RFPgotPEgzPgotRGVwcmVjYXRlZCBBUEk8L0gzPgotPEJMT0NLUVVPVEU+Ci1UaGUgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPkRlcHJlY2F0ZWQgQVBJPC9BPiBwYWdlIGxpc3RzIGFsbCBvZiB0aGUgQVBJIHRoYXQgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQuIEEgZGVwcmVjYXRlZCBBUEkgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UsIGdlbmVyYWxseSBkdWUgdG8gaW1wcm92ZW1lbnRzLCBhbmQgYSByZXBsYWNlbWVudCBBUEkgaXMgdXN1YWxseSBnaXZlbi4gRGVwcmVjYXRlZCBBUElzIG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMuPC9CTE9DS1FVT1RFPgotPEgzPgotUHJldi9OZXh0PC9IMz4KLVRoZXNlIGxpbmtzIHRha2UgeW91IHRvIHRoZSBuZXh0IG9yIHByZXZpb3VzIGNsYXNzLCBpbnRlcmZhY2UsIHBhY2thZ2UsIG9yIHJlbGF0ZWQgcGFnZS48SDM+Ci1GcmFtZXMvTm8gRnJhbWVzPC9IMz4KLVRoZXNlIGxpbmtzIHNob3cgYW5kIGhpZGUgdGhlIEhUTUwgZnJhbWVzLiAgQWxsIHBhZ2VzIGFyZSBhdmFpbGFibGUgd2l0aCBvciB3aXRob3V0IGZyYW1lcy4KLTxQPgotPEgzPgotU2VyaWFsaXplZCBGb3JtPC9IMz4KLUVhY2ggc2VyaWFsaXphYmxlIG9yIGV4dGVybmFsaXphYmxlIGNsYXNzIGhhcyBhIGRlc2NyaXB0aW9uIG9mIGl0cyBzZXJpYWxpemF0aW9uIGZpZWxkcyBhbmQgbWV0aG9kcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBvZiBpbnRlcmVzdCB0byByZS1pbXBsZW1lbnRvcnMsIG5vdCB0byBkZXZlbG9wZXJzIHVzaW5nIHRoZSBBUEkuIFdoaWxlIHRoZXJlIGlzIG5vIGxpbmsgaW4gdGhlIG5hdmlnYXRpb24gYmFyLCB5b3UgY2FuIGdldCB0byB0aGlzIGluZm9ybWF0aW9uIGJ5IGdvaW5nIHRvIGFueSBzZXJpYWxpemVkIGNsYXNzIGFuZCBjbGlja2luZyAiU2VyaWFsaXplZCBGb3JtIiBpbiB0aGUgIlNlZSBhbHNvIiBzZWN0aW9uIG9mIHRoZSBjbGFzcyBkZXNjcmlwdGlvbi4KLTxQPgotPEgzPgotQ29uc3RhbnQgRmllbGQgVmFsdWVzPC9IMz4KLVRoZSA8YSBocmVmPSJjb25zdGFudC12YWx1ZXMuaHRtbCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9hPiBwYWdlIGxpc3RzIHRoZSBzdGF0aWMgZmluYWwgZmllbGRzIGFuZCB0aGVpciB2YWx1ZXMuCi08UD4KLTxGT05UIFNJWkU9Ii0xIj4KLTxFTT4KLVRoaXMgaGVscCBmaWxlIGFwcGxpZXMgdG8gQVBJIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBkb2NsZXQuPC9FTT4KLTwvRk9OVD4KLTxCUj4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlBhY2thZ2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+VXNlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJkZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+SGVscDwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP2hlbHAtZG9jLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iaGVscC1kb2MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDIzM2Y5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEtLT4KLTxUSVRMRT4KLUdlbmVyYXRlZCBEb2N1bWVudGF0aW9uIChVbnRpdGxlZCkKLTwvVElUTEU+Ci08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdGFyZ2V0UGFnZSA9ICIiICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaDsKLSAgICBpZiAodGFyZ2V0UGFnZSAhPSAiIiAmJiB0YXJnZXRQYWdlICE9ICJ1bmRlZmluZWQiKQotICAgICAgICB0YXJnZXRQYWdlID0gdGFyZ2V0UGFnZS5zdWJzdHJpbmcoMSk7Ci0gICAgaWYgKHRhcmdldFBhZ2UuaW5kZXhPZigiOiIpICE9IC0xKQotICAgICAgICB0YXJnZXRQYWdlID0gInVuZGVmaW5lZCI7Ci0gICAgZnVuY3Rpb24gbG9hZEZyYW1lcygpIHsKLSAgICAgICAgaWYgKHRhcmdldFBhZ2UgIT0gIiIgJiYgdGFyZ2V0UGFnZSAhPSAidW5kZWZpbmVkIikKLSAgICAgICAgICAgICB0b3AuY2xhc3NGcmFtZS5sb2NhdGlvbiA9IHRvcC50YXJnZXRQYWdlOwotICAgIH0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLTwvSEVBRD4KLTxGUkFNRVNFVCBjb2xzPSIyMCUsODAlIiB0aXRsZT0iIiBvbkxvYWQ9InRvcC5sb2FkRnJhbWVzKCkiPgotPEZSQU1FU0VUIHJvd3M9IjMwJSw3MCUiIHRpdGxlPSIiIG9uTG9hZD0idG9wLmxvYWRGcmFtZXMoKSI+Ci08RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIiB0aXRsZT0iQWxsIFBhY2thZ2VzIj4KLTxGUkFNRSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUZyYW1lIiB0aXRsZT0iQWxsIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgKGV4Y2VwdCBub24tc3RhdGljIG5lc3RlZCB0eXBlcykiPgotPC9GUkFNRVNFVD4KLTxGUkFNRSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIgdGl0bGU9IlBhY2thZ2UsIGNsYXNzIGFuZCBpbnRlcmZhY2UgZGVzY3JpcHRpb25zIiBzY3JvbGxpbmc9InllcyI+Ci08Tk9GUkFNRVM+Ci08SDI+Ci1GcmFtZSBBbGVydDwvSDI+Ci0KLTxQPgotVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCi08QlI+Ci1MaW5rIHRvPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5Ob24tZnJhbWUgdmVyc2lvbi48L0E+Ci08L05PRlJBTUVTPgotPC9GUkFNRVNFVD4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODBmODQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotQWJzdHJhY3RWYWxpZGF0b3IKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJBYnN0cmFjdFZhbGlkYXRvciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgQWJzdHJhY3RWYWxpZGF0b3I8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgYWJzdHJhY3QgY2xhc3MgPEI+QWJzdHJhY3RWYWxpZGF0b3I8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGUgY2xhc3MgdGhhdCBhbGwgVmFsaWRhdG9ycyB0aGF0IHdpc2ggdG8gdXNlIHZlcnNpb24gdHdvIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBtdXN0IHN1YmNsYXNzLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI0Fic3RyYWN0VmFsaWRhdG9yKCkiPkFic3RyYWN0VmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjY2xlYW4oSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPmNsZWFuPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIGNhbGwgYmFjayBtZXRob2QgdGhhdCBsZXRzIHRoZSB2YWxpZGF0b3Iga25vdyB0aGF0IHRoZSBwcm9qZWN0IGlzIGJlaW5nCi0gY2xlYW5lZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI2dldFBhcmVudCgpIj5nZXRQYXJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvciB0aGF0IHlvdSBiZWxvbmcgdG8uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLSB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJBYnN0cmFjdFZhbGlkYXRvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1BYnN0cmFjdFZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxCPkFic3RyYWN0VmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiA8Qj52YWxpZGF0ZTwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdGUgdGhlIHJlc291cmNlLiBUaGUgdmFsaWRhdG9yIGlzIGNhbGxlZCBmcm9tIGEgV29ya3NwYWNlSm9iLCBzbwotIHRoZSB2YWxpZGF0b3IgaXRzZWxmIGRvZXMgbm90IG5lZWQgdG8gZXN0YWJsaXNoIGl0J3Mgb3duIElXb3Jrc3BhY2VSdW5uYWJsZS4KLSA8cD4KLSBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgdGhlbiB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgb3RoZXIgdmFsaWRhdGUgbWV0aG9kLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC48REQ+PENPREU+a2luZDwvQ09ERT4gLSBUaGUgd2F5IHRoZSByZXNvdXJjZSBjaGFuZ2VkLiBJdCB1c2VzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUga2luZAotICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpbiBJUmVzb3VyY2VEZWx0YS48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gQSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZQotICAgICAgICAgICAgICAgIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS4KLSAgICAgICAgICAgICAgICBBdCB0aGUgZW5kIG9mIHRoZSB2YWxpZGF0aW9uIHBoYXNlLCB0aGlzIG9iamVjdCB3aWxsIGJlIGNsZWFyZWQsCi0gICAgICAgICAgICAgICAgdGhlcmVieSBhbGxvd2luZyBhbnkgb2YgdGhpcyBzdGF0ZSBpbmZvcm1hdGlvbiB0byBiZSBnYXJiYWdlZAotICAgICAgICAgICAgICAgIGNvbGxlY3RlZC48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBBIG1vbml0b3IgdGhhdCB5b3UgY2FuIHVzZSB0byByZXBvcnQgeW91ciBwcm9ncmVzcy4gVG8gYmUgYSB3ZWxsCi0gICAgICAgICAgICAgICAgYmVoYXZlZCB2YWxpZGF0b3IgeW91IG5lZWQgdG8gY2hlY2sgdGhlIGlzQ2FuY2VsbGVkKCkgbWV0aG9kIGF0Ci0gICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgdGltZXMuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSByZXN1bHQgb2YgdGhlIHZhbGlkYXRpb24uIFRoaXMgbWF5IGJlLCBidXQgdXN1YWxseSBpc24ndCwgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4gPEI+dmFsaWRhdGU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlIHRoZSByZXNvdXJjZS4gVGhlIHZhbGlkYXRvciBpcyBjYWxsZWQgZnJvbSBhIFdvcmtzcGFjZUpvYiwgc28KLSB0aGUgdmFsaWRhdG9yIGl0c2VsZiBkb2VzIG5vdCBuZWVkIHRvIGVzdGFibGlzaCBpdCdzIG93bgotIElXb3Jrc3BhY2VSdW5uYWJsZS4KLSA8cD4KLSBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgdGhlbiB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgb3RoZXIKLSB2YWxpZGF0ZSBtZXRob2QuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5ldmVudDwvQ09ERT4gLSBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZCBhbmQgd2h5Ci0gICAgICAgICAgICBpdCBzaG91bGQgYmUgdmFsaWRhdGVkLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0gICAgICAgICAgICBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24KLSAgICAgICAgICAgIHBoYXNlLiBBdCB0aGUgZW5kIG9mIHRoZSB2YWxpZGF0aW9uIHBoYXNlLCB0aGlzIG9iamVjdCB3aWxsIGJlCi0gICAgICAgICAgICBjbGVhcmVkLCB0aGVyZWJ5IGFsbG93aW5nIGFueSBvZiB0aGlzIHN0YXRlIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICAgICAgICBnYXJiYWdlZCBjb2xsZWN0ZWQuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gQSBtb25pdG9yIHRoYXQgeW91IGNhbiB1c2UgdG8gcmVwb3J0IHlvdXIgcHJvZ3Jlc3MuIFRvIGJlIGEKLSAgICAgICAgICAgIHdlbGwgYmVoYXZlZCB2YWxpZGF0b3IgeW91IG5lZWQgdG8gY2hlY2sgdGhlIGlzQ2FuY2VsbGVkKCkKLSAgICAgICAgICAgIG1ldGhvZCBhdCBhcHByb3ByaWF0ZSB0aW1lcy4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc3VsdCBvZiB0aGUgdmFsaWRhdGlvbi4gTnVsbCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQuIElmCi0gICAgICAgICBudWxsIGlzIHJldHVybmVkIHRoZW4gdGhlIG90aGVyIHZhbGlkYXRlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcwotICAgICAgICAgd2VsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1jbGVhbjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+Y2xlYW48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPkEgY2FsbCBiYWNrIG1ldGhvZCB0aGF0IGxldHMgdGhlIHZhbGlkYXRvciBrbm93IHRoYXQgdGhlIHByb2plY3QgaXMgYmVpbmcKLSBjbGVhbmVkLiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgdmFsaWRhdG9yIGEgY2hhbmNlIHRvIGRvIGFueSBzcGVjaWFsCi0gY2xlYW51cC4gVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KLSA8cD4KLSBJZiB0aGUgZW50aXJlIHdvcmtzcGFjZSBpcyBiZWluZyBjbGVhbmVkLCB0aGVuIHRoZSBmaXJzdCBjYWxsIHdpbGwgaGF2ZSBhCi0gbnVsbCBwcm9qZWN0LCBhbmQgdGhlbiB0aGVyZSB3aWxsIGJlIHN1YnNlcXVlbnQgY2FsbHMgZm9yIGVhY2ggb3BlbgotIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS48L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gVGhlIHByb2plY3QgYmVpbmcgY2xlYW5lZC4gVGhpcyBtYXkgYmUgbnVsbCwgd2hpY2ggaXMgYW4gaW5kaWNhdGlvbgotICAgICAgICAgICAgICAgIHRoYXQgdGhlIHdvcmtzcGFjZSBpcyBiZWluZyBjbGVhbmVkLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0gICAgICAgICAgICAgICAgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0byB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIFRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgY2xlYW4KLSAgICAgICAgICAgICAgICB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGlvblN0YXJ0aW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj52YWxpZGF0aW9uU3RhcnRpbmc8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+VGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS4gSXQgYWxsb3dzCi0gdmFsaWRhdG9ycyB0byBwZXJmb3JtIGFueSBpbml0aWFsaXphdGlvbiB0aGF0IHRoZXkgbWlnaHQgbmVlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gRm9yIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgaW4gdGhlCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbiBwaGFzZSwgdGhpcyB3aWxsIGJlIG51bGwuIEEgbnVsbCBwcm9qZWN0IGlzIHRoZSBzaWduYWwKLSAgICAgICAgICAgICAgICB0aGF0IGEgdG9wIGxldmVsIHZhbGlkYXRpb24gaXMgc3RhcnRpbmcuIFN1YnNlcXVlbnRseSwgdGhlIHByb2plY3QKLSAgICAgICAgICAgICAgICB3aWxsIGJlIHNldCwgYXMgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBwcm9qZWN0cyBhcmUgdmFsaWRhdGVkLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBBIHdheSB0byBwYXNzIGFyYml0cmFyeSwgdmFsaWRhdG9yIHNwZWNpZmljLCBkYXRhIGZyb20gb25lCi0gICAgICAgICAgICAgICAgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0byB0aGUgbmV4dCwgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHBoYXNlLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIFRoZSBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBpZiB0aGUgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgICAgICB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRpb25GaW5pc2hpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnZhbGlkYXRpb25GaW5pc2hpbmc8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIEl0IGFsbG93cwotIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkgY2xlYW51cCB0aGF0IHRoZXkgbWlnaHQgbmVlZCB0byBkby4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHdhcyB2YWxpZGF0ZWQuIFRoZSB2ZXJ5IGxhc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgIHNldHMgdGhpcyB0byBudWxsIHNvIHRoYXQgdGhlIHZhbGlkYXRvciBrbm93cyB0aGF0IGFsbCB0aGUKLSAgICAgICAgICAgICAgICBwcm9qZWN0cyBoYXZlIG5vdyBiZWVuIHZhbGlkYXRlZC48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gQSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZQotICAgICAgICAgICAgICAgIGludm9jYXRpb24gb2YgYSB2YWxpZGF0b3IgdG8gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBUaGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFudXAKLSAgICAgICAgICAgICAgICB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRDbGVhck1hcmtlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNob3VsZENsZWFyTWFya2VyczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvUFJFPgotPERMPgotPEREPlNob3VsZCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZmlyc3QgY2xlYXIgdGhlIG1hcmtlcnMgdGhhdCB0aGlzCi0gdmFsaWRhdG9yIGhhcyBwbGFjZWQgb24gdGhpcyByZXNvdXJjZT8gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkKLSB2YWxpZGF0b3IgaW1wbGVtZW50b3JzIHRvIHByb3ZpZGUgYSB2YWxpZGF0b3Igc3BlY2lmaWMgYmVoYXZpb3IuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmV2ZW50PC9DT0RFPiAtIFRoZSB2YWxpZGF0aW9uIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB2YWxpZGF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgZmlyc3QgY2xlYXIgYWxsIHRoZQotICAgICAgICAgbWFya2VycyB0aGF0IHRoaXMgdmFsaWRhdG9yIHByb2R1Y2VkLiBUaGlzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICBiZWhhdmlvci4gUmV0dXJuIGZhbHNlIHRvIGxlYXZlIHRoZSBtYXJrZXJzIHVuY2hhbmdlZC4gSXQgdGhlbgotICAgICAgICAgYmVjb21lcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHZhbGlkYXRvciB0byBtYW5hZ2UgaXQncyBvd24KLSAgICAgICAgIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UsIGZvciB0aGlzIHZhbGlkYXRpb24gZXZlbnQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQYXJlbnQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UGFyZW50PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPiA8Qj5nZXRQYXJlbnQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHZhbGlkYXRvciB0aGF0IHlvdSBiZWxvbmcgdG8uIFRoZSB2YWxpZGF0b3IgY29udHJvbHMgdGhlCi0gZmlsdGVycyBhbmQgdmFyaW91cyBvdGhlciBzZXR0aW5ncy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgQ0xBU1MmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2QyNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjYgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1EZXBlbmRlbnRSZXNvdXJjZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IkRlcGVuZGVudFJlc291cmNlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkRlcGVuZGVudFJlc291cmNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIERlcGVuZGVudFJlc291cmNlPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5EZXBlbmRlbnRSZXNvdXJjZTwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGNsYXNzIDxCPkRlcGVuZGVudFJlc291cmNlPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotQSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiBhbm90aGVyIHJlc291cmNlLgotIDxwPgotIFRoaXMgaXMgcmV0dXJuZWQgYnkgdGhlIElEZXBlbmRlbmN5SW5kZXguCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxDT0RFPklEZXBlbmRlbmN5SW5kZXg8L0NPREU+PC9BPjwvREw+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwjRGVwZW5kZW50UmVzb3VyY2UoSVJlc291cmNlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVJlc291cmNlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwjZ2V0UmVzb3VyY2UoKSI+Z2V0UmVzb3VyY2U8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHJlc291cmNlIHRoYXQgaXMgZGVwZW5kZWQgb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCNnZXRWYWxpZGF0b3IoKSI+Z2V0VmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0b3IgdGhhdCBhc3NlcnRlZCB0aGUgZGVwZW5kZW5jeS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IkRlcGVuZGVudFJlc291cmNlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotRGVwZW5kZW50UmVzb3VyY2U8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5EZXBlbmRlbnRSZXNvdXJjZTwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0UmVzb3VyY2UoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UmVzb3VyY2U8L0gzPgotPFBSRT4KLXB1YmxpYyBJUmVzb3VyY2UgPEI+Z2V0UmVzb3VyY2U8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHJlc291cmNlIHRoYXQgaXMgZGVwZW5kZWQgb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmdldFZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgdmFsaWRhdG9yIHRoYXQgYXNzZXJ0ZWQgdGhlIGRlcGVuZGVuY3kuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0RlcGVuZGVudFJlc291cmNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkNmM5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjYgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1GcmllbmQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJGcmllbmQiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0ZyaWVuZC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkZyaWVuZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBGcmllbmQ8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkZyaWVuZDwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGNsYXNzIDxCPkZyaWVuZDwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgY2xhc3MgaXMgb25seSB0byBiZSBjYWxsZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCBpdCdzIHRlc3QgY2FzZXMuCi0gVGhpcyBjbGFzcyBpcyBOT1QgcGFydCBvZiB0aGUgQVBJLgotIDxwPgotIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHNvbWUgaW50ZXJuYWwgbWV0aG9kcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sI0ZyaWVuZCgpIj5GcmllbmQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjaXNMb2FkZWQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+aXNMb2FkZWQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SGFzIHRoZSB2YWxpZGF0b3IncyBpbXBsZW1lbnRhdGlvbiBiZWVuIGxvYWRlZCB5ZXQ/PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2V0TWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBqYXZhLnV0aWwuTWFwKSI+c2V0TWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDsmbmJzcDttYXApPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNzZXRNaWdyYXRlZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIGJvb2xlYW4pIj5zZXRNaWdyYXRlZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICBib29sZWFuJm5ic3A7bWlncmF0ZWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNzaG91bGRWYWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyKSI+c2hvdWxkVmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlciZuYnNwO2NvbnRlbnRUeXBlV3JhcHBlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sI3Nob3VsZFZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciwgSVJlc291cmNlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXIpIj5zaG91bGRWYWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICBJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUmbmJzcDt2YWxUeXBlLAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyJm5ic3A7Y29udGVudFR5cGVXcmFwcGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJGcmllbmQoKSI+PCEtLSAtLT48L0E+PEgzPgotRnJpZW5kPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+RnJpZW5kPC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InNldE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciwgamF2YS51dGlsLk1hcCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE1lc3NhZ2VzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+c2V0TWVzc2FnZXM8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDsmbmJzcDttYXApPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0xvYWRlZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0xvYWRlZDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBib29sZWFuIDxCPmlzTG9hZGVkPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yKTwvUFJFPgotPERMPgotPEREPkhhcyB0aGUgdmFsaWRhdG9yJ3MgaW1wbGVtZW50YXRpb24gYmVlbiBsb2FkZWQgeWV0PyBUaGlzIGlzIHVzZWQgYnkgc29tZSB0ZXN0IGNhc2VzIHRvIGVuc3VyZSB0aGF0IAotIHBsdWctaW5zIGFyZSBub3QgbG9hZGVkIHRvbyBlYXJseS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2hvdWxkVmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4sIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcikiPjwhLS0gLS0+PC9BPjxIMz4KLXNob3VsZFZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGJvb2xlYW4gPEI+c2hvdWxkVmFsaWRhdGU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlciZuYnNwO2NvbnRlbnRUeXBlV3JhcHBlcik8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZFZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciwgSVJlc291cmNlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXIpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRWYWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBib29sZWFuIDxCPnNob3VsZFZhbGlkYXRlPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUmbmJzcDt2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlciZuYnNwO2NvbnRlbnRUeXBlV3JhcHBlcik8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE1pZ3JhdGVkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciwgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE1pZ3JhdGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIHZvaWQgPEI+c2V0TWlncmF0ZWQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO21pZ3JhdGVkKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvRnJpZW5kLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRnJpZW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkNWFiNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotSURlcGVuZGVuY3lJbmRleAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklEZXBlbmRlbmN5SW5kZXgiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lEZXBlbmRlbmN5SW5kZXguaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJRGVwZW5kZW5jeUluZGV4PC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SURlcGVuZGVuY3lJbmRleDwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVzb3VyY2VzIHRoYXQgYSBwYXJ0aWN1bGFyIHJlc291cmNlIGRlcGVuZHMgb24uCi0gPHA+Ci0gVGhpcyBpcyBhbiBvcHRpb25hbCBzZXJ2aWNlLCB2YWxpZGF0b3JzIGRvIG5vdCBuZWVkIHRvIHVzZSB0aGlzIEludGVyZmFjZSBhbmQgY2FuIHNpbXBseSBzdXBwbHkKLSB0aGVpciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIFZhbGlkYXRpb25SZXN1bHQgcmV0dXJuIHJlc3VsdC4KLSA8L3A+Ci0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PENPREU+VmFsaWRhdGlvblJlc3VsdDwvQ09ERT48L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sI2FkZChqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UsIElSZXNvdXJjZSkiPmFkZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICBJUmVzb3VyY2UmbmJzcDtkZXBlbmRlbnQsCi0gICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kc09uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXNzZXJ0IHRoYXQgb25lIHJlc291cmNlIGRlcGVuZHMgb24gYW5vdGhlciByZXNvdXJjZSBhcyBwYXJ0IG9mIGl0J3MgdmFsaWRpdHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sI2NsZWFyKElQcm9qZWN0KSI+Y2xlYXI8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmUgYWxsIHRoZSBkZXBlbmRlbmN5IGFzc2VydGlvbnMgZm9yIHRoaXMgcHJvamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCNnZXQoSVJlc291cmNlKSI+Z2V0PC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgb24gdGhpcyByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVJlc291cmNlW108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sI2dldChqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UpIj5nZXQ8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgb24gdGhpcyByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwjaXNEZXBlbmRlZE9uKElSZXNvdXJjZSkiPmlzRGVwZW5kZWRPbjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRydWUgaWYgb3RoZXIgcmVzb3VyY2VzIGRlcGVuZCBvbiB0aGlzIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCNzZXQoamF2YS5sYW5nLlN0cmluZywgSVJlc291cmNlLCBJUmVzb3VyY2VbXSkiPnNldDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICBJUmVzb3VyY2UmbmJzcDtkZXBlbmRlbnQsCi0gICAgSVJlc291cmNlW10mbmJzcDtkZXBlbmRzT24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXBsYWNlIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgdGhlIGRlcGVuZGVudCBkZXBlbmRzIG9uLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iYWRkKGphdmEubGFuZy5TdHJpbmcsIElSZXNvdXJjZSwgSVJlc291cmNlKSI+PCEtLSAtLT48L0E+PEgzPgotYWRkPC9IMz4KLTxQUkU+Ci12b2lkIDxCPmFkZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kZW50LAotICAgICAgICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kc09uKTwvUFJFPgotPERMPgotPEREPkFzc2VydCB0aGF0IG9uZSByZXNvdXJjZSBkZXBlbmRzIG9uIGFub3RoZXIgcmVzb3VyY2UgYXMgcGFydCBvZiBpdCdzIHZhbGlkaXR5LgotIDxwPgotIEZvciBleGFtcGxlLCBpZiBhbiBYTUwgZmlsZSBpcyBkZXBlbmRlbnQgb24gYW4gWFNEIGZpbGUgdG8gYmUgdmFsaWQsIHRoZQotIHJlc291cmNlIHRoYXQgaG9sZHMgdGhlIFhNTCBmaWxlIHdvdWxkIGJlIHRoZSBkZXBlbmRlbnQsIGFuZCB0aGUgcmVzb3VyY2UKLSB0aGF0IGhvbGRzIHRoZSBYU0Qgd291bGQgYmUgdGhlIGRlcGVuZHNPbi4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmlkPC9DT0RFPiAtIFRoZSB2YWxpZGF0b3IgaWQgdGhhdCBpcyBhc3NlcnRpbmcgdGhhdCB0aGUgZGVwZW5kZW5jeSBleGlzdHMuPEREPjxDT0RFPmRlcGVuZGVudDwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIHJlc291cmNlLiBGb3IgZXhhbXBsZSBhIFhNTCBmaWxlLjxERD48Q09ERT5kZXBlbmRzT248L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgdGhpcyBiZWluZyBkZXBlbmRlZCBvbi4gRm9yIGV4YW1wbGUgYSBYU0QgZmlsZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNsZWFyKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotY2xlYXI8L0gzPgotPFBSRT4KLXZvaWQgPEI+Y2xlYXI8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5SZW1vdmUgYWxsIHRoZSBkZXBlbmRlbmN5IGFzc2VydGlvbnMgZm9yIHRoaXMgcHJvamVjdC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHdpbGwgaGF2ZSBpdCdzIGRlcGVuZGVuY3kgYXNzZXJ0aW9ucyByZW1vdmVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0KElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotamF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT4mZ3Q7IDxCPmdldDwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBpZgotIHRoaXMgcmVzb3VyY2Ugd2FzIGEgWFNELCB0aGlzIGNvdWxkIGFuc3dlciBhbGwgdGhlIFhNTCBmaWxlcyB0aGF0Ci0gZGVwZW5kZWQgb24gaXQgZm9yIHRoZWlyIHZhbGlkaXR5LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBBIHJlc291cmNlIHRoYXQgb3RoZXIgcmVzb3VyY2VzIG1heSBkZXBlbmQgb24uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBkZXBlbmRlbnQgcmVzb3VyY2VzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0KGphdmEubGFuZy5TdHJpbmcsIElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotSVJlc291cmNlW10gPEI+Z2V0PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBpZgotIHRoaXMgcmVzb3VyY2Ugd2FzIGEgWFNELCB0aGlzIGNvdWxkIGFuc3dlciBhbGwgdGhlIFhNTCBmaWxlcyB0aGF0Ci0gZGVwZW5kZWQgb24gaXQgZm9yIHRoZWlyIHZhbGlkaXR5LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSBUaGUgdmFsaWRhdG9yIGlkIHRoYXQgYXNzZXJ0ZWQgdGhhdCB0aGUgZGVwZW5kZW5jeSBleGlzdHMuPEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIEEgcmVzb3VyY2UgdGhhdCBvdGhlciByZXNvdXJjZXMgbWF5IGRlcGVuZCBvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGRlcGVuZGVudCByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCBvciBhbiBlbXB0eSBhcnJheSwgaWYKLSAgICAgICAgdGhlcmUgYXJlIG5vIGRlcGVuZGVudCByZXNvdXJjZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0RlcGVuZGVkT24oSVJlc291cmNlKSI+PCEtLSAtLT48L0E+PEgzPgotaXNEZXBlbmRlZE9uPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzRGVwZW5kZWRPbjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRydWUgaWYgb3RoZXIgcmVzb3VyY2VzIGRlcGVuZCBvbiB0aGlzIHJlc291cmNlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgYmVpbmcgdGVzdGVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIGFueSBvZiB0aGUgdmFsaWRhdG9ycyBhc3NlcnRlZCBhIGRlcGVuZGVuY3kgb24gdGhpcyByZXNvdXJjZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldChqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UsIElSZXNvdXJjZVtdKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0PC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgSVJlc291cmNlJm5ic3A7ZGVwZW5kZW50LAotICAgICAgICAgSVJlc291cmNlW10mbmJzcDtkZXBlbmRzT24pPC9QUkU+Ci08REw+Ci08REQ+UmVwbGFjZSBhbGwgdGhlIHJlc291cmNlcyB0aGF0IHRoZSBkZXBlbmRlbnQgZGVwZW5kcyBvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+aWQ8L0NPREU+IC0gVGhlIHZhbGlkYXRvciBpZCB0aGF0IGlzIGFzc2VydGluZyB0aGF0IHRoZSBkZXBlbmRlbmN5IGV4aXN0cy48REQ+PENPREU+ZGVwZW5kZW50PC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgcmVzb3VyY2UuPEREPjxDT0RFPmRlcGVuZHNPbjwvQ09ERT4gLSBBbGwgdGhlIHJlc291cmNlcyB0aGF0IGFyZSBkZXBlbmRlZCBvbi4gVGhpcyBjYW4gYmUgbnVsbCBvciBhIHplcm8KLSAgICAgICAgICAgICAgICBsZW5ndGggYXJyYXkuIE51bGwgb3IgYSB6ZXJvIGxlbmd0aCBhcnJheSByZW1vdmVzIGFsbCB0aGUgZGVwZW5kZW5jaWVzLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSURlcGVuZGVuY3lJbmRleC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZGVmNzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjYgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1JTXV0YWJsZVZhbGlkYXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklNdXRhYmxlVmFsaWRhdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JTXV0YWJsZVZhbGlkYXRvci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElNdXRhYmxlVmFsaWRhdG9yPC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SU11dGFibGVWYWxpZGF0b3I8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLUEgdmFsaWRhdG9yIHRoYXQgaGFzIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGVkLgotIDxwPgotIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQgdG8gY2hhbmdlIGEgVmFsaWRhdG9yJ3Mgc2V0dGluZ3MuCi0gPG9sPgotIDxsaT5BbiBJTXV0YWJsZVZhbGlkYXRvciBpcyByZXRyaWV2ZWQuPC9saT4KLSA8bGk+VGhlIElNdXRhYmxlVmFsaWRhdG9yIGlzIGNoYW5nZWQuPC9saT4KLSA8bGk+VGhlIElNdXRhYmxlVmFsaWRhdG9yIGlzICJhY3RpdmF0ZWQiLjwvbGk+Ci0gPC9vbD4KLSA8L3A+Ci0gPHA+VGhlIG1ldGhvZHMgPENPREU+VmFsaWRhdGlvbkZyYW1ld29yayNnZXRQcm9qZWN0U2V0dGluZ3Mob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpPC9DT0RFPiBhbmQgCi0gPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFdvcmtzcGFjZVNldHRpbmdzKCkiPjxDT0RFPlZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0V29ya3NwYWNlU2V0dGluZ3MoKTwvQ09ERT48L0E+IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIElNdXRhYmxlVmFsaWRhdG9yJ3MuCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvcidzIGlkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0b3IncyBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwjZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPmdldFZhbGlkYXRvckNsYXNzbmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdG9yJ3MgY2xhc3MgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI2lzQnVpbGRWYWxpZGF0aW9uKCkiPmlzQnVpbGRWYWxpZGF0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGlmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj5pc01hbnVhbFZhbGlkYXRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgaWYgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIGZvciBtYW51YWwgYmFzZWQgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI3NldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuKSI+c2V0QnVpbGRWYWxpZGF0aW9uPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2J1aWxkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+PC9CPihib29sZWFuJm5ic3A7bWFudWFsKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgbWFudWFsIGJhc2VkIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRJZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJZDwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgdmFsaWRhdG9yJ3MgaWQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE5hbWU8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgdmFsaWRhdG9yJ3MgbmFtZS4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvckNsYXNzbmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JDbGFzc25hbWU8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSB2YWxpZGF0b3IncyBjbGFzcyBuYW1lLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNCdWlsZFZhbGlkYXRpb24oKSI+PCEtLSAtLT48L0E+PEgzPgotaXNCdWlsZFZhbGlkYXRpb248L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+aXNCdWlsZFZhbGlkYXRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgaWYgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc01hbnVhbFZhbGlkYXRpb24oKSI+PCEtLSAtLT48L0E+PEgzPgotaXNNYW51YWxWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzTWFudWFsVmFsaWRhdGlvbjwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciBpZiB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgZm9yIG1hbnVhbCBiYXNlZCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEJ1aWxkVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRCdWlsZFZhbGlkYXRpb248L0I+KGJvb2xlYW4mbmJzcDtidWlsZCk8L1BSRT4KLTxETD4KLTxERD5TZXQgd2hldGhlciB0aGUgdmFsaWRhdG9yIHNob3VsZCBiZSBlbmFibGVkIGZvciBidWlsZCBiYXNlZCB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRNYW51YWxWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldE1hbnVhbFZhbGlkYXRpb248L0I+KGJvb2xlYW4mbmJzcDttYW51YWwpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHdoZXRoZXIgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgbWFudWFsIGJhc2VkIHZhbGlkYXRpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzODdmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUlQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfc3VtbWFyeSI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9kZXRhaWwiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1FbnVtIElQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+Jmd0OwotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+amF2YS5pby5TZXJpYWxpemFibGUsIGphdmEubGFuZy5Db21wYXJhYmxlJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mZ3Q7PC9ERD4KLTwvREw+Ci08REw+Ci08RFQ+PEI+RW5jbG9zaW5nIGludGVyZmFjZTo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBzdGF0aWMgZW51bSA8Qj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+Jmd0OzwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGUgbGV2ZWwgb2YgaW5mb3JtYXRpb24gdG8gY29sbGVjdC4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwjRGVmYXVsdCI+RGVmYXVsdDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwjTm9uZSI+Tm9uZTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCN2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpIj52YWx1ZU9mPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwjdmFsdWVzKCkiPnZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLkVudW0iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5FbnVtPC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Y29tcGFyZVRvLCBlcXVhbHMsIGdldERlY2xhcmluZ0NsYXNzLCBoYXNoQ29kZSwgbmFtZSwgb3JkaW5hbCwgdG9TdHJpbmcsIHZhbHVlT2Y8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+Z2V0Q2xhc3MsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJlbnVtX2NvbnN0YW50X2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkVudW0gQ29uc3RhbnQgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik5vbmUiPjwhLS0gLS0+PC9BPjxIMz4KLU5vbmU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPiA8Qj5Ob25lPC9CPjwvUFJFPgotPERMPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkRlZmF1bHQiPjwhLS0gLS0+PC9BPjxIMz4KLURlZmF1bHQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPiA8Qj5EZWZhdWx0PC9CPjwvUFJFPgotPERMPgotPERMPgotPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0idmFsdWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbHVlczwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+W10gPEI+dmFsdWVzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuICBUaGlzIG1ldGhvZCBtYXkgYmUgdXNlZCB0byBpdGVyYXRlCi1vdmVyIHRoZSBjb25zdGFudHMgYXMgZm9sbG93czoKLTxwcmU+Ci1mb3IgKElQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsIGMgOiBJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC52YWx1ZXMoKSkKLSZuYnNwOyAgIFN5c3RlbS5vdXQucHJpbnRsbihjKTsKLTwvcHJlPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVPZjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+IDxCPnZhbHVlT2Y8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotVGhlIHN0cmluZyBtdXN0IG1hdGNoIDxJPmV4YWN0bHk8L0k+IGFuIGlkZW50aWZpZXIgdXNlZCB0byBkZWNsYXJlIGFuCi1lbnVtIGNvbnN0YW50IGluIHRoaXMgdHlwZS4gIChFeHRyYW5lb3VzIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgCi1ub3QgcGVybWl0dGVkLikKLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmFtZTwvQ09ERT4gLSB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudCB0byBiZSByZXR1cm5lZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGVudW0gY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L0NPREU+IC0gaWYgdGhpcyBlbnVtIHR5cGUgaGFzIG5vIGNvbnN0YW50Ci13aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotPEREPjxDT0RFPmphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1NDczMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotSVBlcmZvcm1hbmNlTW9uaXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklQZXJmb3JtYW5jZU1vbml0b3IiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVBlcmZvcm1hbmNlTW9uaXRvcjwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklQZXJmb3JtYW5jZU1vbml0b3I8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLUEgc2VydmljZSB0aGF0IGNvbGxlY3RzIHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uIG9uIHZhbGlkYXRpb24gb3BlcmF0aW9ucy4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09IE5FU1RFRCBDTEFTUyBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBsZXZlbCBvZiBpbmZvcm1hdGlvbiB0byBjb2xsZWN0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwjYWRkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnMpIj5hZGQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mbmJzcDtjb3VudGVycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FkZCB0aGlzIHBlcmZvcm1hbmNlIGNvdW50ZXIgdG8gdGhlIG1vbml0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI2dldENvbGxlY3Rpb25MZXZlbCgpIj5nZXRDb2xsZWN0aW9uTGV2ZWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGxldmVsIG9mIHBlcmZvcm1hbmNlIGV2ZW50cyB0aGF0IGFyZSBiZWluZyBjb2xsZWN0ZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNnZXRQZXJmb3JtYW5jZUNvdW50ZXJzKGJvb2xlYW4pIj5nZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2FzU3VtbWFyeSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHNvIGZhci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwjaXNDb2xsZWN0aW5nKCkiPmlzQ29sbGVjdGluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0cnVlIGlmIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGNvbGxlY3RpbmcgcGVyZm9ybWFuY2UgZXZlbnRzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNpc1N1bW1hcnlPbmx5KCkiPmlzU3VtbWFyeU9ubHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdHJ1ZSBpZiBvbmx5IHN1bW1hcnkgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNyZXNldFBlcmZvcm1hbmNlQ291bnRlcnMoKSI+cmVzZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RGVsZXRlIHRoZSBjb2xsZWN0ZWQgcGVyZm9ybWFuY2UgY291bnRlcnMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI3NldENvbGxlY3Rpb25MZXZlbChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbCkiPnNldENvbGxlY3Rpb25MZXZlbDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mbmJzcDtsZXZlbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB0aGUgcGVyZm9ybWFuY2UgZXZlbnQgY29sbGVjdGlvbiBsZXZlbC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzKSI+PCEtLSAtLT48L0E+PEgzPgotYWRkPC9IMz4KLTxQUkU+Ci12b2lkIDxCPmFkZDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+Jm5ic3A7Y291bnRlcnMpPC9QUkU+Ci08REw+Ci08REQ+QWRkIHRoaXMgcGVyZm9ybWFuY2UgY291bnRlciB0byB0aGUgbW9uaXRvci4gVGhlIG1vbml0b3Igd2lsbCBkZWNpZGUgd2hhdCB0byAKLSBkbyB3aXRoIHRoZSByZXN1bHRzLCBpdCBtYXkgbG9nIHRoZW0gdG8gYSBmaWxlLCBvciBpdCBtYXkgc2ltcGx5IGhvbGQgb24gdG8gdGhlbS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+Y291bnRlcnM8L0NPREU+IC0gPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0NvbGxlY3RpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNDb2xsZWN0aW5nPC9IMz4KLTxQUkU+Ci1ib29sZWFuIDxCPmlzQ29sbGVjdGluZzwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0cnVlIGlmIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGNvbGxlY3RpbmcgcGVyZm9ybWFuY2UgZXZlbnRzLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc1N1bW1hcnlPbmx5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzU3VtbWFyeU9ubHk8L0gzPgotPFBSRT4KLWJvb2xlYW4gPEI+aXNTdW1tYXJ5T25seTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0cnVlIGlmIG9ubHkgc3VtbWFyeSBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldENvbGxlY3Rpb25MZXZlbChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldENvbGxlY3Rpb25MZXZlbDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRDb2xsZWN0aW9uTGV2ZWw8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mbmJzcDtsZXZlbCk8L1BSRT4KLTxETD4KLTxERD5TZXQgdGhlIHBlcmZvcm1hbmNlIGV2ZW50IGNvbGxlY3Rpb24gbGV2ZWwuIFRoaXMgY29udHJvbHMgd2hpY2gKLSBwZXJmb3JtYW5jZSBldmVudHMgYXJlIGNvbGxlY3RlZCwgaW5jbHVkaW5nIG5vbmUgb2YgdGhlbS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bGV2ZWw8L0NPREU+IC0gVGhlIGxldmVsIHRvIGNvbGxlY3QuIFRoZSBkZWZhdWx0IGlzIHRvIG5vdCBjb2xsZWN0IGFueXRoaW5nLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q29sbGVjdGlvbkxldmVsKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENvbGxlY3Rpb25MZXZlbDwvSDM+Ci08UFJFPgotPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPiA8Qj5nZXRDb2xsZWN0aW9uTGV2ZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIGxldmVsIG9mIHBlcmZvcm1hbmNlIGV2ZW50cyB0aGF0IGFyZSBiZWluZyBjb2xsZWN0ZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQZXJmb3JtYW5jZUNvdW50ZXJzKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9IMz4KLTxQUkU+Ci1qYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mZ3Q7IDxCPmdldFBlcmZvcm1hbmNlQ291bnRlcnM8L0I+KGJvb2xlYW4mbmJzcDthc1N1bW1hcnkpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQgc28gZmFyLiBTb21lCi0gbW9uaXRvcnMgZG8gbm90IHNhdmUgY291bnRlcnMsIGFuZCB0aGV5IHdpbGwgYWx3YXlzIHJldHVybiBhbiBlbXB0eSBsaXN0LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hc1N1bW1hcnk8L0NPREU+IC0gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgb25seSBhbnN3ZXIgYSBzdW1tYXJ5IG9mIHRoZSBjb3VudGVycy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlc2V0UGVyZm9ybWFuY2VDb3VudGVycygpIj48IS0tIC0tPjwvQT48SDM+Ci1yZXNldFBlcmZvcm1hbmNlQ291bnRlcnM8L0gzPgotPFBSRT4KLXZvaWQgPEI+cmVzZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+RGVsZXRlIHRoZSBjb2xsZWN0ZWQgcGVyZm9ybWFuY2UgY291bnRlcnMuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxOTI1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUlWYWxpZGF0b3JHcm91cExpc3RlbmVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElWYWxpZGF0b3JHcm91cExpc3RlbmVyPC9IMj4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVZhbGlkYXRvckdyb3VwTGlzdGVuZXI8L0I+PC9ETD4KLTwvUFJFPgotCi08UD4KLVZhbGlkYXRvcnMgbWF5IHdpc2ggdG8gam9pbiB2YWxpZGF0b3IgZ3JvdXBzIGZvciBwZXJmb3JtYW5jZSBvciBvdGhlcgotIHJlYXNvbnMuIFRoYXQgd2F5IGV4cGVuc2l2ZSBvcGVyYXRpb25zIGxpa2UgY3JlYXRpbmcgYW5kIHJlbGVhc2luZyBtb2RlbHMgY2FuCi0gYmUgZG9uZSBpbiBhIGNvbW1vbiBsb2NhdGlvbiwgYW5kIGJlIGRvbmUgb25seSBvbmNlIHBlciByZXNvdXJjZS4gR3JvdXAgbGlzdGVuZXJzCi0gYXJlIGRlY2xhcmVkIHZpYSB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yR3JvdXA8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSA8cD4KLSBBcyB2YWxpZGF0aW9uIHByb2NlZWRzLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIG9uIGEgcmVzb3VyY2UgYnkgcmVzb3VyY2UKLSBiYXNlcywgZGV0ZXJtaW5lcyBpZiBhbnkgdmFsaWRhdG9ycyB0aGF0IGFyZSBtZW1iZXJzIG9mIGEgZ3JvdXAgYXJlCi0gaW50ZXJlc3RlZCBpbiB0aGUgcmVzb3VyY2UuIElmIHRoZXkgYXJlLCBiZWZvcmUgdGhlIGZpcnN0IHZhbGlkYXRvciBpbiB0aGUKLSBncm91cCBpcyBjYWxsZWQsIHRoZSA8Y29kZT52YWxpZGF0aW9uU3RhcnRpbmc8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoaXMgbWV0aG9kIHdhcwotIGNhbGxlZCwgdGhlbiB0aGUgPGNvZGU+dmFsaWRhdGlvbkZpbmlzaGluZzwvY29kZT4gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2UgYWxsIHRoZQotIHZhbGlkYXRvcnMgaGF2ZSBwcm9jZXNzZWQgdGhlIHJlc291cmNlLgotIDwvcD4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgdGhlIHZhbGlkYXRpb25TdGFydGluZyBtZXRob2Qgd2FzIGNhbGxlZCBvbiB0aGUgcmVzb3VyY2UsIHRoZW4gdGhpcwotIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCB2YWxpZGF0b3IgaGFzIHByb2Nlc3NlZCB0aGUKLSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSkiPnZhbGlkYXRpb25TdGFydGluZzwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgdmFsaWRhdG9yIGluIHRoZSBncm91cCB0aGF0IGlzIGludGVyZXN0ZWQKLSBpbiB0aGUgcmVzb3VyY2UgaXMgY2FsbGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0idmFsaWRhdGlvblN0YXJ0aW5nKElSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGlvblN0YXJ0aW5nPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnZhbGlkYXRpb25TdGFydGluZzwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSk8L1BSRT4KLTxETD4KLTxERD5UaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IHZhbGlkYXRvciBpbiB0aGUgZ3JvdXAgdGhhdCBpcyBpbnRlcmVzdGVkCi0gaW4gdGhlIHJlc291cmNlIGlzIGNhbGxlZC4gSWYgbm8gdmFsaWRhdG9ycyBpbiB0aGUgZ3JvdXAgYXJlIGludGVyZXN0ZWQKLSBpbiB0aGUgcmVzb3VyY2UsIHRoZW4gdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIEEgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IHRoZSBtZXRob2Qgc2hvdWxkIHVzZS48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gVGhlIHZhbGlkYXRpb24gc3RhdGUgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25GaW5pc2hpbmcoSVJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0aW9uRmluaXNoaW5nPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnZhbGlkYXRpb25GaW5pc2hpbmc8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSk8L1BSRT4KLTxETD4KLTxERD5JZiB0aGUgdmFsaWRhdGlvblN0YXJ0aW5nIG1ldGhvZCB3YXMgY2FsbGVkIG9uIHRoZSByZXNvdXJjZSwgdGhlbiB0aGlzCi0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IHZhbGlkYXRvciBoYXMgcHJvY2Vzc2VkIHRoZQotIHJlc291cmNlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyB2YWxpZGF0ZWQuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gQSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgdGhlIG1ldGhvZCBjYW4gdXNlLjxERD48Q09ERT5zdGF0ZTwvQ09ERT4gLSBUaGUgdmFsaWRhdGlvbiBzdGF0ZSBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmYzODUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLU1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X3N1bW1hcnkiPkVOVU0gQ09OU1RBTlRTPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2VudW1fY29uc3RhbnRfZGV0YWlsIj5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotRW51bSBNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiZndDsKLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+amF2YS5pby5TZXJpYWxpemFibGUsIGphdmEubGFuZy5Db21wYXJhYmxlJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Jmd0OzwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIHN0YXRpYyBlbnVtIDxCPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mZ3Q7PC9ETD4KLTwvUFJFPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCNFcnJvciI+RXJyb3I8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwjSWdub3JlIj5JZ25vcmU8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwjV2FybmluZyI+V2FybmluZzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwjZ2V0TWFya2VyU2V2ZXJpdHkoKSI+Z2V0TWFya2VyU2V2ZXJpdHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGFzc29jaWF0ZWQgSU1hcmtlciBzZXZlcml0eS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwjdG9TdHJpbmcoKSI+dG9TdHJpbmc8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPnZhbHVlT2Y8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCN2YWx1ZXMoKSI+dmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuRW51bSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLkVudW08L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5jb21wYXJlVG8sIGVxdWFscywgZ2V0RGVjbGFyaW5nQ2xhc3MsIGhhc2hDb2RlLCBuYW1lLCBvcmRpbmFsLCB2YWx1ZU9mPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmdldENsYXNzLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBFTlVNIENPTlNUQU5UIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5FbnVtIENvbnN0YW50IERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJFcnJvciI+PCEtLSAtLT48L0E+PEgzPgotRXJyb3I8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4gPEI+RXJyb3I8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iV2FybmluZyI+PCEtLSAtLT48L0E+PEgzPgotV2FybmluZzwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiA8Qj5XYXJuaW5nPC9CPjwvUFJFPgotPERMPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Iklnbm9yZSI+PCEtLSAtLT48L0E+PEgzPgotSWdub3JlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIGZpbmFsIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+IDxCPklnbm9yZTwvQj48L1BSRT4KLTxETD4KLTxETD4KLTwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InZhbHVlcygpIj48IS0tIC0tPjwvQT48SDM+Ci12YWx1ZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT5bXSA8Qj52YWx1ZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZC4gIFRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIHRvIGl0ZXJhdGUKLW92ZXIgdGhlIGNvbnN0YW50cyBhcyBmb2xsb3dzOgotPHByZT4KLWZvciAoTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSBjIDogTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS52YWx1ZXMoKSkKLSZuYnNwOyAgIFN5c3RlbS5vdXQucHJpbnRsbihjKTsKLTwvcHJlPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVPZjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiA8Qj52YWx1ZU9mPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBlbnVtIGNvbnN0YW50IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLVRoZSBzdHJpbmcgbXVzdCBtYXRjaCA8ST5leGFjdGx5PC9JPiBhbiBpZGVudGlmaWVyIHVzZWQgdG8gZGVjbGFyZSBhbgotZW51bSBjb25zdGFudCBpbiB0aGlzIHR5cGUuICAoRXh0cmFuZW91cyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIAotbm90IHBlcm1pdHRlZC4pCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5hbWU8L0NPREU+IC0gdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQgdG8gYmUgcmV0dXJuZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBlbnVtIGNvbnN0YW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5qYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoaXMgZW51bSB0eXBlIGhhcyBubyBjb25zdGFudAotd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLTxERD48Q09ERT5qYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb248L0NPREU+IC0gaWYgdGhlIGFyZ3VtZW50IGlzIG51bGw8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InRvU3RyaW5nKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXRvU3RyaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj50b1N0cmluZzwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT50b1N0cmluZzwvQ09ERT4gaW4gY2xhc3MgPENPREU+amF2YS5sYW5nLkVudW0mbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mZ3Q7PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TWFya2VyU2V2ZXJpdHkoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWFya2VyU2V2ZXJpdHk8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0TWFya2VyU2V2ZXJpdHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIGFzc29jaWF0ZWQgSU1hcmtlciBzZXZlcml0eS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0ZWYzYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotTWVzc2FnZVNldmVyaXR5U2V0dGluZwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmciOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIE1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotQXNzb2NpYXRlIGEgbWVzc2FnZSBzZXZlcml0eSB3aXRoIGEgbWVzc2FnZSBjYXRlZ29yeS4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09IE5FU1RFRCBDTEFTUyBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI01lc3NhZ2VTZXZlcml0eVNldHRpbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSkiPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mbmJzcDtkZWZhdWx0U2V2ZXJpdHkpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIGxhYmVsIGFuZCBhIG1lc3NhZ2Ugc2V2ZXJpdHkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI2NvcHkoKSI+Y29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGNvcHkgb2YgdGhpcyBvYmplY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNnZXRDdXJyZW50KCkiPmdldEN1cnJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGN1cnJlbnQgc2V2ZXJpdHkgZm9yIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwjZ2V0RGVmYXVsdCgpIj5nZXREZWZhdWx0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBkZWZhdWx0IHNldmVyaXR5IGFzIGRlZmluZWQgYnkgdGhlIHZhbGlkYXRvciBvd25lci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgaWQgdGhhdCB0aGUgdmFsaWRhdG9yIG93bmVyIGFzc2lnbmVkIHRvIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNnZXRMYWJlbCgpIj5nZXRMYWJlbDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI2hhc2hDb2RlKCkiPmhhc2hDb2RlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI3NldEN1cnJlbnQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSkiPnNldEN1cnJlbnQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiZuYnNwO3NldmVyaXR5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBjdXJyZW50IG1lc3NhZ2Ugc2V2ZXJpdHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI3RvU3RyaW5nKCkiPnRvU3RyaW5nPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iTWVzc2FnZVNldmVyaXR5U2V0dGluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5KSI+PCEtLSAtLT48L0E+PEgzPgotTWVzc2FnZVNldmVyaXR5U2V0dGluZzwvSDM+Ci08UFJFPgotcHVibGljIDxCPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Jm5ic3A7ZGVmYXVsdFNldmVyaXR5KTwvUFJFPgotPERMPgotPEREPkNyZWF0ZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgbGFiZWwgYW5kIGEgbWVzc2FnZSBzZXZlcml0eS4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSBBbiBpZCB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyIHNldHRpbmcuIFRoaXMgbXVzdCBiZQotICAgICAgICAgICAgICAgIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IuPEREPjxDT0RFPmxhYmVsPC9DT0RFPiAtIEFuIGVuZCB1c2VyIHN0cmluZywgdGhhdCBjYW4gZGVzY3JpYmUgZWl0aGVyIGFuIGluZGl2aWR1YWwgbWVzc2FnZQotICAgICAgICAgICAgICAgIG9yIGEgbWVzc2FnZSBjYXRlZ29yeS48REQ+PENPREU+ZGVmYXVsdFNldmVyaXR5PC9DT0RFPiAtIFRoZSBkZWZhdWx0IHNldmVyaXR5IGZvciB0aGlzIGxhYmVsLiBJZiB0aGUgZW5kIHVzZXIgZG9lc24ndCBjaGFuZ2UKLSAgICAgICAgICAgICAgICBhbnl0aGluZyB0aGlzIGlzIHdoYXQgdGhlIHNldmVyaXR5IHdpbGwgYmUuPC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iaGFzaENvZGUoKSI+PCEtLSAtLT48L0E+PEgzPgotaGFzaENvZGU8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+aGFzaENvZGU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+aGFzaENvZGU8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEubGFuZy5PYmplY3Q8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRMYWJlbCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRMYWJlbDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TGFiZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERlZmF1bHQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVmYXVsdDwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+IDxCPmdldERlZmF1bHQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIGRlZmF1bHQgc2V2ZXJpdHkgYXMgZGVmaW5lZCBieSB0aGUgdmFsaWRhdG9yIG93bmVyLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRDdXJyZW50KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEN1cnJlbnQ8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiA8Qj5nZXRDdXJyZW50PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBjdXJyZW50IHNldmVyaXR5IGZvciB0aGUgbWVzc2FnZS4gVGhlIGVuZCB1c2VyIG1heSBoYXZlIGNoYW5nZWQgdGhpcyB0aHJvdWdoIGEKLSBwcmVmZXJlbmNlIGRpYWxvZy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldElkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+VGhlIGlkIHRoYXQgdGhlIHZhbGlkYXRvciBvd25lciBhc3NpZ25lZCB0byB0aGUgbWVzc2FnZS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0Q3VycmVudChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0Q3VycmVudDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2V0Q3VycmVudDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4mbmJzcDtzZXZlcml0eSk8L1BSRT4KLTxETD4KLTxERD5TZXQgdGhlIGN1cnJlbnQgbWVzc2FnZSBzZXZlcml0eS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2V2ZXJpdHk8L0NPREU+IC0gCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHNldHRpbmcgY2hhbmdlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29weSgpIj48IS0tIC0tPjwvQT48SDM+Ci1jb3B5PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+IDxCPmNvcHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTI5ZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLU11dGFibGVQcm9qZWN0U2V0dGluZ3MKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJNdXRhYmxlUHJvamVjdFNldHRpbmdzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBNdXRhYmxlUHJvamVjdFNldHRpbmdzPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgZmluYWwgY2xhc3MgPEI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgY2xhc3MgaG9sZHMgdGhlIG92ZXJhbGwgcHJvamVjdCB2YWxpZGF0aW9uIHNldHRpbmdzLgotIDxwPgotIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlIGlzIHVzZWQgdG8gY2hhbmdlIGEgcHJvamVjdCdzIFZhbGlkYXRpb24gc2V0dGluZ3MuCi0gPG9sPgotIDxsaT5UaGUgTXV0YWJsZVByb2plY3RTZXR0aW5ncyBhcmUgcmV0cmlldmVkLjwvbGk+Ci0gPGxpPlRoZSBNdXRhYmxlUHJvamVjdFNldHRpbmdzIGFyZSBjaGFuZ2VkLjwvbGk+Ci0gPGxpPlRoZSBNdXRhYmxlUHJvamVjdFNldHRpbmdzIGFyZSAiYXBwbGllZCIuPC9saT4KLSA8L29sPgotIDwvcD4KLSA8cD5JbiBvcmRlciBmb3IgYSBwcm9qZWN0J3MgdmFsaWRhdGlvbiBzZXR0aW5nIHRvIGJlIGVmZmVjdGl2ZSwgYm90aCAKLSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwjZ2V0T3ZlcnJpZGUoKSI+PENPREU+Z2V0T3ZlcnJpZGUoKTwvQ09ERT48L0E+IGFuZCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNnZXRPdmVycmlkZSgpIj48Q09ERT5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuZ2V0T3ZlcnJpZGUoKTwvQ09ERT48L0E+Ci0gbXVzdCBiZSB0cnVlLgotIDwvcD4KLSA8cD4KLSBUaGVzZSBzZXR0aW5ncyBjYW4gYmUgcmV0cmlldmVkIHdpdGggPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFByb2plY3RTZXR0aW5ncyhJUHJvamVjdCkiPjxDT0RFPlZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0UHJvamVjdFNldHRpbmdzKElQcm9qZWN0KTwvQ09ERT48L0E+LgotIDwvcD4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sI011dGFibGVQcm9qZWN0U2V0dGluZ3MoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yW10pIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT5bXSZuYnNwO3ZhbGlkYXRvcnMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sI2dldE92ZXJyaWRlKCkiPmdldE92ZXJyaWRlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2FuIHRoaXMgcHJvamVjdCBvdmVycmlkZSB0aGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3M/PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lQcm9qZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNnZXRQcm9qZWN0KCkiPmdldFByb2plY3Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHByb2plY3QgdGhhdCB0aGVzZSBzZXR0aW5ncyBhcmUgZm9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNnZXRTdXNwZW5kKCkiPmdldFN1c3BlbmQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJcyB2YWxpZGF0aW9uIHN1c3BlbmRlZCBmb3IgdGhpcyBwcm9qZWN0PzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwjZ2V0VmFsaWRhdG9ycygpIj5nZXRWYWxpZGF0b3JzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sI3NldE92ZXJyaWRlKGJvb2xlYW4pIj5zZXRPdmVycmlkZTwvQT48L0I+KGJvb2xlYW4mbmJzcDtvdmVycmlkZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NoYW5nZSB3aGV0aGVyIHRoaXMgcHJvamVjdCBjYW4gb3ZlcnJpZGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sI3NldFN1c3BlbmQoYm9vbGVhbikiPnNldFN1c3BlbmQ8L0E+PC9CPihib29sZWFuJm5ic3A7c3VzcGVuZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NoYW5nZSB3aGV0aGVyIHRoaXMgcHJvamVjdCBpcyBzdXNwZW5kaW5nIGl0J3MgdmFsaWRhdGlvbi48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik11dGFibGVQcm9qZWN0U2V0dGluZ3MoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yW10pIj48IS0tIC0tPjwvQT48SDM+Ci1NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10mbmJzcDt2YWxpZGF0b3JzKTwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3JzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvcnM8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT5bXSA8Qj5nZXRWYWxpZGF0b3JzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRPdmVycmlkZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRPdmVycmlkZTwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+Z2V0T3ZlcnJpZGU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5DYW4gdGhpcyBwcm9qZWN0IG92ZXJyaWRlIHRoZSB3b3Jrc3BhY2UgbGV2ZWwgdmFsaWRhdGlvbiBzZXR0aW5ncz8KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0T3ZlcnJpZGUoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE92ZXJyaWRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRPdmVycmlkZTwvQj4oYm9vbGVhbiZuYnNwO292ZXJyaWRlKTwvUFJFPgotPERMPgotPEREPkNoYW5nZSB3aGV0aGVyIHRoaXMgcHJvamVjdCBjYW4gb3ZlcnJpZGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3MuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm92ZXJyaWRlPC9DT0RFPiAtIFNldCB0byB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGFsbG93ZWQgdG8gb3ZlcnJpZGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTdXNwZW5kKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFN1c3BlbmQ8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmdldFN1c3BlbmQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5JcyB2YWxpZGF0aW9uIHN1c3BlbmRlZCBmb3IgdGhpcyBwcm9qZWN0PwotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTdXNwZW5kKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTdXNwZW5kPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRTdXNwZW5kPC9CPihib29sZWFuJm5ic3A7c3VzcGVuZCk8L1BSRT4KLTxETD4KLTxERD5DaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgaXMgc3VzcGVuZGluZyBpdCdzIHZhbGlkYXRpb24uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnN1c3BlbmQ8L0NPREU+IC0gU2V0IHRvIHRydWUsIHRvIHN1c3BlbmQgdmFsaWRhdGlvbiBmb3IgdGhpcyBwcm9qZWN0LjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UHJvamVjdCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQcm9qZWN0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVByb2plY3QgPEI+Z2V0UHJvamVjdDwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgcHJvamVjdCB0aGF0IHRoZXNlIHNldHRpbmdzIGFyZSBmb3IuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZGVjZGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIE11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgZmluYWwgY2xhc3MgPEI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBjbGFzcyBob2xkcyB0aGUgb3ZlcmFsbCB3b3Jrc3BhY2UgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLSA8cD4KLSBUaGUgZm9sbG93aW5nIHByb2NlZHVyZSBpcyB1c2VkIHRvIGNoYW5nZSBhIHByb2plY3QncyBWYWxpZGF0aW9uIHNldHRpbmdzLgotIDxvbD4KLSA8bGk+VGhlIE11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyBhcmUgcmV0cmlldmVkLjwvbGk+Ci0gPGxpPlRoZSBNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MgYXJlIGNoYW5nZWQuPC9saT4KLSA8bGk+VGhlIE11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyBhcmUgImFwcGxpZWQiLjwvbGk+Ci0gPC9vbD4KLSA8L3A+Ci0gPHA+Ci0gVGhlc2Ugc2V0dGluZ3MgY2FuIGJlIHJldHJpZXZlZCB3aXRoIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRXb3Jrc3BhY2VTZXR0aW5ncygpIj48Q09ERT5WYWxpZGF0aW9uRnJhbWV3b3JrLmdldFdvcmtzcGFjZVNldHRpbmdzKCk8L0NPREU+PC9BPi4KLSA8L3A+Ci0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sI011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcltdLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcykiPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcyZuYnNwO3ZhbHVlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNnZXRBdXRvU2F2ZSgpIj5nZXRBdXRvU2F2ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5HbG9iYWxQcmVmZXJlbmNlc1ZhbHVlczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNnZXRHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlcygpIj5nZXRHbG9iYWxQcmVmZXJlbmNlc1ZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sI2dldE92ZXJyaWRlKCkiPmdldE92ZXJyaWRlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2FuIHRoaXMgcHJvamVjdCBvdmVycmlkZSB0aGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3M/PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjZ2V0U3VzcGVuZCgpIj5nZXRTdXNwZW5kPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SXMgdmFsaWRhdGlvbiBzdXNwZW5kZWQgZm9yIHRoaXMgcHJvamVjdD88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjZ2V0VmFsaWRhdG9ycygpIj5nZXRWYWxpZGF0b3JzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjc2V0QXV0b1NhdmUoYm9vbGVhbikiPnNldEF1dG9TYXZlPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2F1dG9TYXZlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjc2V0T3ZlcnJpZGUoYm9vbGVhbikiPnNldE92ZXJyaWRlPC9BPjwvQj4oYm9vbGVhbiZuYnNwO292ZXJyaWRlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2hhbmdlIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGNhbiBvdmVycmlkZSB3b3Jrc3BhY2UgbGV2ZWwgdmFsaWRhdGlvbiBzZXR0aW5ncy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNzZXRTdXNwZW5kKGJvb2xlYW4pIj5zZXRTdXNwZW5kPC9BPjwvQj4oYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgaXMgc3VzcGVuZGluZyBpdCdzIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3Mob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSU11dGFibGVWYWxpZGF0b3JbXSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMpIj48IS0tIC0tPjwvQT48SDM+Ci1NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMmbmJzcDt2YWx1ZXMpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvcnMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yczwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPltdIDxCPmdldFZhbGlkYXRvcnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMgPEI+Z2V0R2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEF1dG9TYXZlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEF1dG9TYXZlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5nZXRBdXRvU2F2ZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0QXV0b1NhdmUoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEF1dG9TYXZlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRBdXRvU2F2ZTwvQj4oYm9vbGVhbiZuYnNwO2F1dG9TYXZlKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0T3ZlcnJpZGUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0T3ZlcnJpZGU8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmdldE92ZXJyaWRlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+Q2FuIHRoaXMgcHJvamVjdCBvdmVycmlkZSB0aGUgd29ya3NwYWNlIGxldmVsIHZhbGlkYXRpb24gc2V0dGluZ3M/Ci08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE92ZXJyaWRlKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRPdmVycmlkZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0T3ZlcnJpZGU8L0I+KGJvb2xlYW4mbmJzcDtvdmVycmlkZSk8L1BSRT4KLTxETD4KLTxERD5DaGFuZ2Ugd2hldGhlciB0aGlzIHByb2plY3QgY2FuIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5vdmVycmlkZTwvQ09ERT4gLSBTZXQgdG8gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhbGxvd2VkIHRvIG92ZXJyaWRlIHdvcmtzcGFjZSBsZXZlbCB2YWxpZGF0aW9uIHNldHRpbmdzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U3VzcGVuZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTdXNwZW5kPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5nZXRTdXNwZW5kPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SXMgdmFsaWRhdGlvbiBzdXNwZW5kZWQgZm9yIHRoaXMgcHJvamVjdD8KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0U3VzcGVuZChib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U3VzcGVuZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U3VzcGVuZDwvQj4oYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9QUkU+Ci08REw+Ci08REQ+Q2hhbmdlIHdoZXRoZXIgdGhpcyBwcm9qZWN0IGlzIHN1c3BlbmRpbmcgaXQncyB2YWxpZGF0aW9uLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zdXNwZW5kPC9DT0RFPiAtIFNldCB0byB0cnVlLCB0byBzdXNwZW5kIHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvamVjdC48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjkzZjE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjYgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1QZXJmb3JtYW5jZUNvdW50ZXJzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iUGVyZm9ybWFuY2VDb3VudGVycyI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBQZXJmb3JtYW5jZUNvdW50ZXJzPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+UGVyZm9ybWFuY2VDb3VudGVyczwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLVNvbWUgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGEgdmFsaWRhdGlvbiBpbnZvY2F0aW9uLiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUuCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCNQZXJmb3JtYW5jZUNvdW50ZXJzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGludCwgbG9uZywgbG9uZykiPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsaWRhdG9ySWQsCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWxpZGF0b3JOYW1lLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7cmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtudW1iZXJJbnZvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgbG9uZyZuYnNwO2VsYXBzZWRUaW1lLAotICAgICAgICAgICAgICAgICAgICBsb25nJm5ic3A7Y3B1VGltZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7bG9uZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwjZ2V0Q3B1VGltZSgpIj5nZXRDcHVUaW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBhbW91bnQgb2YgQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2xvbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldEVsYXBzZWRUaW1lKCkiPmdldEVsYXBzZWRUaW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldE51bWJlckludm9jYXRpb25zKCkiPmdldE51bWJlckludm9jYXRpb25zPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldFJlc291cmNlTmFtZSgpIj5nZXRSZXNvdXJjZU5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwjZ2V0VmFsaWRhdG9ySWQoKSI+Z2V0VmFsaWRhdG9ySWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwjZ2V0VmFsaWRhdG9yTmFtZSgpIj5nZXRWYWxpZGF0b3JOYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2xvbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sI2dldFdoZW4oKSI+Z2V0V2hlbjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB3aGVuIHdhcyB0aGUgZXZlbnQgbG9nZ2VkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCN0b1N0cmluZygpIj50b1N0cmluZzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCN0b1N0cmluZyhib29sZWFuKSI+dG9TdHJpbmc8L0E+PC9CPihib29sZWFuJm5ic3A7YXNTdW1tYXJ5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlBlcmZvcm1hbmNlQ291bnRlcnMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgaW50LCBsb25nLCBsb25nKSI+PCEtLSAtLT48L0E+PEgzPgotUGVyZm9ybWFuY2VDb3VudGVyczwvSDM+Ci08UFJFPgotcHVibGljIDxCPlBlcmZvcm1hbmNlQ291bnRlcnM8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWxpZGF0b3JJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDt2YWxpZGF0b3JOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO3Jlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO251bWJlckludm9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyZuYnNwO2VsYXBzZWRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyZuYnNwO2NwdVRpbWUpPC9QUkU+Ci08REw+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcklkPC9DT0RFPiAtIDxERD48Q09ERT52YWxpZGF0b3JOYW1lPC9DT0RFPiAtIDxERD48Q09ERT5yZXNvdXJjZU5hbWU8L0NPREU+IC0gPEREPjxDT0RFPm51bWJlckludm9jYXRpb25zPC9DT0RFPiAtIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsaWRhdG9yIHdhcyBpbnZva2VkPEREPjxDT0RFPmVsYXBzZWRUaW1lPC9DT0RFPiAtIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHM8REQ+PENPREU+Y3B1VGltZTwvQ09ERT4gLSBDUFUgdGltZSBpbiBuYW5vc2Vjb25kczwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvcklkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvcklkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRWYWxpZGF0b3JJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TnVtYmVySW52b2NhdGlvbnMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TnVtYmVySW52b2NhdGlvbnM8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0TnVtYmVySW52b2NhdGlvbnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEVsYXBzZWRUaW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEVsYXBzZWRUaW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgbG9uZyA8Qj5nZXRFbGFwc2VkVGltZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q3B1VGltZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRDcHVUaW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgbG9uZyA8Qj5nZXRDcHVUaW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBhbW91bnQgb2YgQ1BVIHRpbWUgaW4gbmFub3NlY29uZHMuIElmIHRoaXMgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotIGFuc3dlciAtMS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotdG9TdHJpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPnRvU3RyaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPnRvU3RyaW5nPC9DT0RFPiBpbiBjbGFzcyA8Q09ERT5qYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idG9TdHJpbmcoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXRvU3RyaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj50b1N0cmluZzwvQj4oYm9vbGVhbiZuYnNwO2FzU3VtbWFyeSk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvck5hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yTmFtZTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VmFsaWRhdG9yTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0V2hlbigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRXaGVuPC9IMz4KLTxQUkU+Ci1wdWJsaWMgbG9uZyA8Qj5nZXRXaGVuPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHdoZW4gd2FzIHRoZSBldmVudCBsb2dnZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48Q09ERT5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFJlc291cmNlTmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRSZXNvdXJjZU5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldFJlc291cmNlTmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3MGM2MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVJlcG9ydGVySGVscGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iUmVwb3J0ZXJIZWxwZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1JlcG9ydGVySGVscGVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJSZXBvcnRlckhlbHBlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBSZXBvcnRlckhlbHBlcjwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uUmVwb3J0ZXJIZWxwZXI8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBjbGFzcyA8Qj5SZXBvcnRlckhlbHBlcjwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PERUPmltcGxlbWVudHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSA8cD4KLSBUaGlzIGlzIG5vdCBBUEkuCi08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjUmVwb3J0ZXJIZWxwZXIoSVByb2dyZXNzTW9uaXRvcikiPlJlcG9ydGVySGVscGVyPC9BPjwvQj4oSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmFkZE1lc3NhZ2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBBZGQgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjZGlzcGxheVN1YnRhc2sob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+ZGlzcGxheVN1YnRhc2s8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdyBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlLCBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQKLSBMb2NhbGUsIHRvIHRoZSB1c2VyIGltbWVkaWF0ZWx5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2dldE1lc3NhZ2VzKCkiPmdldE1lc3NhZ2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNpc0NhbmNlbGxlZCgpIj5pc0NhbmNlbGxlZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNtYWtlTWFya2VycygpIj5tYWtlTWFya2VyczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yKSI+cmVtb3ZlQWxsTWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcyBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCkiPnJlbW92ZUFsbE1lc3NhZ2VzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4sCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7b2JqZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvciwKLSBwZXJ0YWluaW5nIHRvIHRoZSBPYmplY3QgcHJvdmlkZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNyZW1vdmVNZXNzYWdlU3Vic2V0KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykiPnJlbW92ZU1lc3NhZ2VTdWJzZXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iaiwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2dyb3VwTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RvIHN1cHBvcnQgcmVtb3ZhbCBvZiBhIHN1YnNldCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbiBJVmFsaWRhdG9yIG1heQotIGFzc2lnbiBncm91cCBuYW1lcyB0byBJTWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJSZXBvcnRlckhlbHBlcihJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotUmVwb3J0ZXJIZWxwZXI8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5SZXBvcnRlckhlbHBlcjwvQj4oSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+PCEtLSAtLT48L0E+PEgzPgotYWRkTWVzc2FnZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+YWRkTWVzc2FnZTwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPklSZXBvcnRlcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+PHA+Ci0gQWRkIGEgbG9jYWxlLWluZGVwZW5kZW50IHZhbGlkYXRpb24gbWVzc2FnZS4gSXQgd2lsbCBiZSBkaXNwbGF5ZWQgbGF0ZXIsIHdpdGggYWxsIG9mIHRoZQotIG90aGVyIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gPC9wPgotIDxwPgotIFRoZSBJVmFsaWRhdG9yIHBhc3NlZCBpbiBpcyBuZWVkZWQgZm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24gKHdoZW4gYSBtZXNzYWdlIG5lZWRzIHRvIGJlCi0gcmVtb3ZlZCwgb25lIHZhbGlkYXRvciBzaG91bGQgbm90IHJlbW92ZSBtZXNzYWdlcyBlbnRlcmVkIGJ5IGFub3RoZXIgdmFsaWRhdG9yLikgVGhlCi0gdmFsaWRhdG9yIGlzIGFsc28gcXVlcmllZCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaXRzIHJlc291cmNlIGJ1bmRsZSwgdG8gZW5hYmxlIHN1cHBvcnQgZm9yCi0gbG9jYWxpemF0aW9uIG9mIG1lc3NhZ2VzIGluIGEgY2xpZW50LXNlcnZlciBlbnZpcm9ubWVudC4KLSA8L3A+Ci0gPHA+Ci0gQm90aCBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjYWRkTWVzc2FnZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5hZGRNZXNzYWdlPC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9yaWdpbjwvQ09ERT4gLSBUaGUgdmFsaWRhdG9yIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIG1lc3NhZ2UuPEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gQSBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZGlzcGxheVN1YnRhc2sob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+PCEtLSAtLT48L0E+PEgzPgotZGlzcGxheVN1YnRhc2s8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmRpc3BsYXlTdWJ0YXNrPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlNob3cgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSwgZm9ybWF0dGVkIGluIHRoZSBkZWZhdWx0Ci0gTG9jYWxlLCB0byB0aGUgdXNlciBpbW1lZGlhdGVseS4gVGhpcyBtZXNzYWdlIGluZGljYXRlcyB3aGljaCBzdWJ0YXNrIGlzCi0gY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIG1lc3NhZ2UgaXMgbm90IHN0b3JlZC4gVGhlIHN1YnRhc2sgbWVzc2FnZQotIGluIHRoaXMgY29udGV4dCBpcyB0aGUgc3VidGFzayBpbiBhIElQcm9ncmVzc01vbnRpb3IKLSA8cD4KLSBCb3RoIHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5kaXNwbGF5U3VidGFzazwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWxpZGF0b3I8L0NPREU+IC0gVGhlIHZhbGlkYXRvciBpc3N1aW5nIHRoZSBzdWJ0YXNrIG1lc3NhZ2UuPEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TWVzc2FnZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jmd0OyA8Qj5nZXRNZXNzYWdlczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI2dldE1lc3NhZ2VzKCkiPmdldE1lc3NhZ2VzPC9BPjwvQ09ERT4gaW4gaW50ZXJmYWNlIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG1lc3NhZ2UgYWNjZXNzIGludGVyZmFjZSB0byB0aGlzIHJlcG9ydGVyLCBvciBudWxsIGlmIG1lc3NhZ2UgYWNjZXNzIGlzIG5vdAotIHN1cHBvcnRlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQ2FuY2VsbGVkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQ2FuY2VsbGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc0NhbmNlbGxlZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNpc0NhbmNlbGxlZCgpIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQotIGNhbGxlZCBieSBJVmFsaWRhdG9ycyBwZXJpb2RpY2FsbHksIGJlY2F1c2Ugbm8gZXZlbnQgaXMgZmlyZWQgdG8gbm90aWZ5IElWYWxpZGF0b3JzIHRoYXQgdGhlCi0gdXNlciBjYW5jZWxlZCB2YWxpZGF0aW9uLiBJZiBhIHZhbGlkYXRvciBkb2VzIG5vdCBjaGVjayB0aGlzIG1ldGhvZCwgYSBjYW5jZWxsYXRpb24gcmVxdWVzdAotIGlzIGlnbm9yZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNpc0NhbmNlbGxlZCgpIj5pc0NhbmNlbGxlZDwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHVzZXIgY2FuY2VsZWQgdmFsaWRhdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXJlbW92ZUFsbE1lc3NhZ2VzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5yZW1vdmVBbGxNZXNzYWdlczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4pPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcikiPklSZXBvcnRlcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+UmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZAotIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiAKLSA8cD4KLSBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IpIj5yZW1vdmVBbGxNZXNzYWdlczwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5vcmlnaW48L0NPREU+IC0gT3JpZ2luYXRvciB2YWxpZGF0b3Igb2YgdGhlIG1lc3NhZ2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVBbGxNZXNzYWdlczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVtb3ZlQWxsTWVzc2FnZXM8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iamVjdCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0KSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5SZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMsIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLAotIHBlcnRhaW5pbmcgdG8gdGhlIE9iamVjdCBwcm92aWRlZC4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yCi0gaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gPGJyPgotIDxicj4KLSBJZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIG51bGwsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJlbW92ZSBhbGwKLSBtZXNzYWdlcyBvd25lZCBieSB0aGUgdmFsaWRhdG9yLiAoaS5lLiwgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHRoZQotIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IpIG1ldGhvZC4pIDxicj4KLSA8YnI+Ci0gPHA+Ci0gVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0KSI+cmVtb3ZlQWxsTWVzc2FnZXM8L0E+PC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+b3JpZ2luPC9DT0RFPiAtIE9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLjxERD48Q09ERT5vYmplY3Q8L0NPREU+IC0gT2JqZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuIE9iamVjdCBpcyB0aGUgdGFyZ2V0IG9iamVjdAotICAgICAgICAgICAgICAgIHRoYXQgd2FzIHNldCBvbiB0aGUgSU1lc3NhZ2Ugd2hlbiBhZGRpbmcgdGhlIG1lc3NhZ2UgYXMgcHJvYmxlbQotICAgICAgICAgICAgICAgIG1hcmtlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotcmVtb3ZlTWVzc2FnZVN1YnNldDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVtb3ZlTWVzc2FnZVN1YnNldDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtncm91cE5hbWUpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5UbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkKLSBhc3NpZ24gZ3JvdXAgbmFtZXMgdG8gSU1lc3NhZ2VzLiBBbiBJTWVzc2FnZSBzdWJzZXQgd2lsbCBiZSBpZGVudGlmaWVkIGJ5Ci0gdGhlIG5hbWUgb2YgaXRzIGdyb3VwLiBUaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSBvbmx5IHRoZSBJTWVzc2FnZSdzIHRoYXQKLSBhcmUgaW4gdGhlIGdyb3VwIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLiAKLSA8cD4KLSBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4KLSA8L3A+Ci0gPHA+Ci0gSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBudWxsLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByZW1vdmUgYWxsCi0gbWVzc2FnZXMgb3duZWQgYnkgdGhlIHZhbGlkYXRvci4gKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUKLSByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKSBtZXRob2QuKQotIDwvcD4KLSA8cD4KLSBJZiBncm91cE5hbWUgaXMgbnVsbCwgdGhhdCdzIHRoZSBzYW1lIGFzIG5vIGdyb3VwIChpLmUuLCB0aGUgc2FtZQotIGJlaGF2aW91ciBhcyB0aGUgPGNvZGU+cmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KTwvY29kZT4KLSBtZXRob2QuKQotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+cmVtb3ZlTWVzc2FnZVN1YnNldDwvQT48L0NPREU+IGluIGludGVyZmFjZSA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWxpZGF0b3I8L0NPREU+IC0gT3JpZ2luYXRvciB2YWxpZGF0b3Igb2YgdGhlIG1lc3NhZ2UuPEREPjxDT0RFPm9iajwvQ09ERT4gLSBPYmplY3QgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYmVsb25ncy48REQ+PENPREU+Z3JvdXBOYW1lPC9DT0RFPiAtIE5hbWUgb2YgdGhlIGdyb3VwIHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJtYWtlTWFya2VycygpIj48IS0tIC0tPjwvQT48SDM+Ci1tYWtlTWFya2VyczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+bWFrZU1hcmtlcnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1JlcG9ydGVySGVscGVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJSZXBvcnRlckhlbHBlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjEyZGY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRpb25FdmVudAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRpb25FdmVudCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvbkV2ZW50Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgVmFsaWRhdGlvbkV2ZW50PC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQ8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBmaW5hbCBjbGFzcyA8Qj5WYWxpZGF0aW9uRXZlbnQ8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1BbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgd2hpY2ggb2JqZWN0IHNob3VsZCBiZSB2YWxpZGF0ZWQgYW5kIHdoYXQgdHJpZ2dlcmVkIGl0cyB2YWxpZGF0aW9uLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCNWYWxpZGF0aW9uRXZlbnQoSVJlc291cmNlLCBpbnQsIElSZXNvdXJjZURlbHRhKSI+VmFsaWRhdGlvbkV2ZW50PC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSZuYnNwO2RlcGVuZHNPbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZSBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgd2hhdCBzaG91bGQgYmUgdmFsaWRhdGVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVJlc291cmNlRGVsdGE8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwjZ2V0RGVwZW5kc09uKCkiPmdldERlcGVuZHNPbjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHRoZSByZXNvdXJjZSBpcyBiZWluZyB2YWxpZGF0ZWQgYmVjYXVzZSBvbmUgb2YgaXQncyBkZXBlbmRlbmNpZXMgaGFzIGNoYW5nZWQsIHRoYXQgY2hhbmdlIGlzIGRlc2NyaWJlZCBoZXJlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwjZ2V0S2luZCgpIj5nZXRLaW5kPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHdheSB0aGUgcmVzb3VyY2UgY2hhbmdlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVJlc291cmNlPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sI2dldFJlc291cmNlKCkiPmdldFJlc291cmNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHRvU3RyaW5nLCB3YWl0LCB3YWl0LCB3YWl0PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlZhbGlkYXRpb25FdmVudChJUmVzb3VyY2UsIGludCwgSVJlc291cmNlRGVsdGEpIj48IS0tIC0tPjwvQT48SDM+Ci1WYWxpZGF0aW9uRXZlbnQ8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5WYWxpZGF0aW9uRXZlbnQ8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSZuYnNwO2RlcGVuZHNPbik8L1BSRT4KLTxETD4KLTxERD5DcmVhdGUgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHdoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZC4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLjxERD48Q09ERT5raW5kPC9DT0RFPiAtIFRoZSB3YXkgdGhlIHJlc291cmNlIGNoYW5nZWQuIEl0IHVzZXMgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZQotICAgICAgICAgICAga2luZCBwYXJhbWV0ZXIgaW4gSVJlc291cmNlRGVsdGEuPEREPjxDT0RFPmRlcGVuZHNPbjwvQ09ERT4gLSBJZiB0aGUgcmVzb3VyY2UgaXMgYmVpbmcgdmFsaWRhdGVkIGJlY2F1c2Ugb25lIG9mIGl0J3MKLSAgICAgICAgICAgIGRlcGVuZGVuY2llcyBoYXMgY2hhbmdlZCwgdGhhdCBjaGFuZ2UgaXMgZGVzY3JpYmVkIGhlcmUuIFRoaXMKLSAgICAgICAgICAgIGNhbiBiZSBudWxsLjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImdldFJlc291cmNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFJlc291cmNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVJlc291cmNlIDxCPmdldFJlc291cmNlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+VGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0S2luZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRLaW5kPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldEtpbmQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5UaGUgd2F5IHRoZSByZXNvdXJjZSBjaGFuZ2VkLiBJdCB1c2VzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUga2luZAotIHBhcmFtZXRlciBpbiBJUmVzb3VyY2VEZWx0YS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RGVwZW5kc09uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERlcGVuZHNPbjwvSDM+Ci08UFJFPgotcHVibGljIElSZXNvdXJjZURlbHRhIDxCPmdldERlcGVuZHNPbjwvQj4oKTwvUFJFPgotPERMPgotPEREPklmIHRoZSByZXNvdXJjZSBpcyBiZWluZyB2YWxpZGF0ZWQgYmVjYXVzZSBvbmUgb2YgaXQncyBkZXBlbmRlbmNpZXMgaGFzIGNoYW5nZWQsIHRoYXQgY2hhbmdlIGlzIGRlc2NyaWJlZCBoZXJlLgotIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgd2hlbiB0aGUgdHJpZ2dlciBpcyBub3QgYmVjYXVzZSBvZiBhIGRlcGVuZGVuY3kgY2hhbmdlLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0aW9uRXZlbnQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25FdmVudC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JjOWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIHN0YXRpYyBjbGFzcyA8Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sI1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcihqYXZhLnV0aWwuU2V0KSI+VmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyPC9BPjwvQj4oamF2YS51dGlsLlNldCZsdDtJUmVzb3VyY2UmZ3Q7Jm5ic3A7c2V0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSBjbGFzcyB0aGF0IGtub3dzIGhvdyB0byBhZGQgcmVzb3VyY2VzIHRvIGEgc2V0LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCN2aXNpdChJUmVzb3VyY2UpIj52aXNpdDwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJWYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIoamF2YS51dGlsLlNldCkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvSDM+Ci08UFJFPgotcHVibGljIDxCPlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcjwvQj4oamF2YS51dGlsLlNldCZsdDtJUmVzb3VyY2UmZ3Q7Jm5ic3A7c2V0KTwvUFJFPgotPERMPgotPEREPkEgY2xhc3MgdGhhdCBrbm93cyBob3cgdG8gYWRkIHJlc291cmNlcyB0byBhIHNldC4KLTxQPgotPERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXQ8L0NPREU+IC0gdGhlIHNldCB3aGVyZSB0aGUgcmVzb3VyY2VzIGFyZSBhZGRlZC48L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2aXNpdChJUmVzb3VyY2UpIj48IS0tIC0tPjwvQT48SDM+Ci12aXNpdDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+dmlzaXQ8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKQotICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+Q29yZUV4Y2VwdGlvbjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWI0MWFlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotVmFsaWRhdGlvbkZyYW1ld29yawotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRpb25GcmFtZXdvcmsiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUNsYXNzIFZhbGlkYXRpb25GcmFtZXdvcms8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBmaW5hbCBjbGFzcyA8Qj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5PYmplY3Q8L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhlIGNlbnRyYWwgY2xhc3Mgb2YgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrLgotIDxwPgotIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MgdGhhdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBnZXREZWZhdWx0KCkgbWV0aG9kLiAKLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09IE5FU1RFRCBDTEFTUyBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk5lc3RlZCBDbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjYWRkVmFsaWRhdGlvbkJ1aWxkZXIoSVByb2plY3QpIj5hZGRWYWxpZGF0aW9uQnVpbGRlcjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FkZCB0aGUgdmFsaWRhdGlvbiBidWlsZGVyIHRvIHRoZSBwcm9qZWN0LCBzbyB0aGF0IHRoZSBwcm9qZWN0IGNhbiBzdXBwb3J0Ci0gYnVpbGQgdGltZSB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNhcHBseUNoYW5nZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVByb2plY3RTZXR0aW5ncywgYm9vbGVhbikiPmFwcGx5Q2hhbmdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPiZuYnNwO3NldHRpbmdzLAotICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtwZXJzaXN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QXBwbHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gYmVlbiB0byB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjYXBwbHlDaGFuZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncywgYm9vbGVhbikiPmFwcGx5Q2hhbmdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT4mbmJzcDtzZXR0aW5ncywKLSAgICAgICAgICAgICBib29sZWFuJm5ic3A7cGVyc2lzdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FwcGx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGJlZW4gdG8gdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2NsZWFyTWVzc2FnZXMoSVJlc291cmNlLCBqYXZhLmxhbmcuU3RyaW5nKSI+Y2xlYXJNZXNzYWdlczwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsaWRhdG9ySWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDbGVhciBhbnkgdmFsaWRhdGlvbiBtYXJrZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgdGhpcyB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2Rpc2FibGVWYWxpZGF0aW9uKElSZXNvdXJjZSkiPmRpc2FibGVWYWxpZGF0aW9uPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtEaXNhYmxlIGFsbCB2YWxpZGF0aW9uIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2VuYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKSI+ZW5hYmxlVmFsaWRhdGlvbjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7RW5hYmxlIHZhbGlkYXRpb24gZm9yIHRoZSBnaXZlbiByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25GcmFtZXdvcms8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXREZWZhdWx0KCkiPmdldERlZmF1bHQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHNpbmdsZXRvbiwgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklEZXBlbmRlbmN5SW5kZXg8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXREZXBlbmRlbmN5SW5kZXgoKSI+Z2V0RGVwZW5kZW5jeUluZGV4PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBkZXBlbmRlbmN5IGluZGV4LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuU2V0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXREaXNhYmxlZFZhbGlkYXRvcnNGb3IoSVJlc291cmNlKSI+Z2V0RGlzYWJsZWRWYWxpZGF0b3JzRm9yPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgc2hvdWxkIG5vdCB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UsIGVpdGhlcgotIGJlY2F1c2UgdGhlaXIgZmlsdGVycyBkb24ndCBzdXBwb3J0IHRoZSByZXNvdXJjZSwgb3IgdGhlIHZhbGlkYXRvciBoYXMKLSBiZWVuIGRpc2FibGVkIGZvciBib3RoIGJ1aWxkIHZhbGlkYXRpb24gYW5kIG1hbnVhbCB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRQZXJmb3JtYW5jZU1vbml0b3IoKSI+Z2V0UGVyZm9ybWFuY2VNb25pdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgcGVyZm9ybWFuY2UgbW9uaXRvciBmb3IgdGhlIHZhbGlkYXRvcnMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lFY2xpcHNlUHJlZmVyZW5jZXM8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFByZWZlcmVuY2VTdG9yZSgpIj5nZXRQcmVmZXJlbmNlU3RvcmU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHByZWZlcmVuY2Ugc3RvcmUgdGhhdCBob2xkcyB0aGUgcGVyc2lzdGVkIGdsb2JhbCB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFByb2plY3RTZXR0aW5ncyhJUHJvamVjdCkiPmdldFByb2plY3RTZXR0aW5nczwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIG9uIHRoZQotIHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0UmVwb3J0ZXIoSVByb2plY3QsIElQcm9ncmVzc01vbml0b3IpIj5nZXRSZXBvcnRlcjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFZhbGlkYXRvcihqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0VmFsaWRhdG9yPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PEI+RGVwcmVjYXRlZC48L0I+Jm5ic3A7PEk+VXNlIGdldFZhbGlkYXRvcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHdpdGggYSBudWxsIHByb2plY3QgaW5zdGVhZC48L0k+PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFZhbGlkYXRvcihqYXZhLmxhbmcuU3RyaW5nLCBJUHJvamVjdCkiPmdldFZhbGlkYXRvcjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICAgICAgICAgICBJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBpZCB0aGF0IGlzIGluIGVmZmVjdCBmb3IgdGhlIGdpdmVuCi0gcHJvamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3JzKCkiPmdldFZhbGlkYXRvcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgY29waWVzIG9mIGFsbCB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdChJUHJvamVjdCkiPmdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdDwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRvcnMgY2FuIHVzZSBwcm9qZWN0IGxldmVsIHNldHRpbmdzIChQcm9qZWN0IG5hdHVyZXMgYW5kIGZhY2V0cykgdG8KLSBkZXRlcm1pbmUgaWYgdGhleSBhcmUgYXBwbGljYWJsZSB0byB0aGUgcHJvamVjdCBvciBub3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UpIj5nZXRWYWxpZGF0b3JzRm9yPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbikiPmdldFZhbGlkYXRvcnNGb3I8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhbGwgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXBwbGljYWJsZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRXb3Jrc3BhY2VTZXR0aW5ncygpIj5nZXRXb3Jrc3BhY2VTZXR0aW5nczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGF0IHRoZSB3b3Jrc3BhY2UgbGV2ZWwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2hhc1ZhbGlkYXRvcnMoSVJlc291cmNlLCBib29sZWFuLCBib29sZWFuKSI+aGFzVmFsaWRhdG9yczwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRydWUgaWYgdGhlIHJlc291cmNlIGhhcyBhbnkgZW5hYmxlZCB2YWxpZGF0b3JzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNpc0xvYWRlZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5pc0xvYWRlZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiBhY3RpdmF0ZWQsIGkuZS4gaGFzIHRoZQotIGJ1bmRsZSB0aGF0IGRlZmluZXMgdGhlIHZhbGlkYXRvciBiZWVuIGxvYWRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjaXNQcm9qZWN0U3VzcGVuZGVkKElQcm9qZWN0KSI+aXNQcm9qZWN0U3VzcGVuZGVkPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgY29kZSB0aGF0IGlzIHByZXBhcmluZyB0byBzdXNwZW5kIHZhbGlkYXRpb24gb24gYQotIHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2lzU3VzcGVuZGVkKCkiPmlzU3VzcGVuZGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJuIHRydWUgaWYgInN1c3BlbmQgYWxsIiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2lzU3VzcGVuZGVkKElQcm9qZWN0KSI+aXNTdXNwZW5kZWQ8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRydWUgaWYgdmFsaWRhdGlvbiB3aWxsIG5vdCBydW4gb24gdGhlIHByb2plY3QgYmVjYXVzZSBpdCdzIGJlZW4gc3VzcGVuZGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNqb2luKElQcm9ncmVzc01vbml0b3IpIj5qb2luPC9BPjwvQj4oSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtXYWl0cyB1bnRpbCBhbGwgdGhlIHZhbGlkYXRpb24gam9icyBhbmQgYWxsIHRoZSBvdGhlciBhdXRvIGJ1aWxkIGpvYnMgYXJlIGZpbmlzaGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNqb2luVmFsaWRhdGlvbk9ubHkoSVByb2dyZXNzTW9uaXRvcikiPmpvaW5WYWxpZGF0aW9uT25seTwvQT48L0I+KElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7V2FpdHMgdW50aWwgYWxsIHRoZSB2YWxpZGF0aW9uIGpvYnMgYXJlIGZpbmlzaGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNzYXZlVmFsaWRhdG9ycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JbXSkiPnNhdmVWYWxpZGF0b3JzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NhdmUgdGhlIHZhbGlkYXRvcnMgc2V0dGluZ3MgaW50byB0aGUgcGVyc2lzdGVudCBzdG9yZSwgdGhlcmUgYnkgbWFraW5nIHRoZWlyIHNldHRpbmdzIHRoZSBhY3RpdmUgc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI3N1c3BlbmRBbGxWYWxpZGF0aW9uKGJvb2xlYW4pIj5zdXNwZW5kQWxsVmFsaWRhdGlvbjwvQT48L0I+KGJvb2xlYW4mbmJzcDtzdXNwZW5kKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U3VzcGVuZHMsIG9yIHVuZG9lcyB0aGUgc3VzcGVuc2lvbiBvZiwgdmFsaWRhdGlvbiBvbiBhbGwgcHJvamVjdHMgaW4gdGhlCi0gd29ya2JlbmNoLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNzdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCwgYm9vbGVhbikiPnN1c3BlbmRWYWxpZGF0aW9uPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTdXNwZW5kcywgb3IgdW5kb2VzIHRoZSBzdXNwZW5zaW9uIG9mLCB2YWxpZGF0aW9uIG9uIHRoZSBjdXJyZW50IHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCN2YWxpZGF0ZShJRmlsZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSUZpbGUmbmJzcDtmaWxlLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSBhIHNwZWNpZmljIGZpbGUgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCN2YWxpZGF0ZShJUHJvamVjdFtdLCBib29sZWFuLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUHJvamVjdFtdJm5ic3A7cHJvamVjdHMsCi0gICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHByb2plY3RzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXREZWZhdWx0KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERlZmF1bHQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25GcmFtZXdvcms8L0E+IDxCPmdldERlZmF1bHQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHNpbmdsZXRvbiwgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhZGRWYWxpZGF0aW9uQnVpbGRlcihJUHJvamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFkZFZhbGlkYXRpb25CdWlsZGVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5hZGRWYWxpZGF0aW9uQnVpbGRlcjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPEREPkFkZCB0aGUgdmFsaWRhdGlvbiBidWlsZGVyIHRvIHRoZSBwcm9qZWN0LCBzbyB0aGF0IHRoZSBwcm9qZWN0IGNhbiBzdXBwb3J0Ci0gYnVpbGQgdGltZSB2YWxpZGF0aW9uLiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QsIGlmIHRoZSBidWlsZGVyIHdhcwotIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhlIHByb2plY3QuIEl0IHdpbGwgbm90IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIFRoZSBwcm9qZWN0IHRoYXQgdGhlIGJ1aWxkZXIgaXMgYWRkZWQgdG8uPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjbGVhck1lc3NhZ2VzKElSZXNvdXJjZSwgamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWNsZWFyTWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmNsZWFyTWVzc2FnZXM8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dmFsaWRhdG9ySWQpCi0gICAgICAgICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5DbGVhciBhbnkgdmFsaWRhdGlvbiBtYXJrZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgdGhpcyB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0aGF0IG1heSBoYXZlIGl0J3MgbWFya2VycyBjbGVhcmVkLjxERD48Q09ERT52YWxpZGF0b3JJZDwvQ09ERT4gLSBUaGUgaWQgb2YgdmFsaWRhdG9yIHRoYXQgY3JlYXRlZCB0aGUgbWFya2VyLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+Q29yZUV4Y2VwdGlvbjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImRpc2FibGVWYWxpZGF0aW9uKElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWRpc2FibGVWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5kaXNhYmxlVmFsaWRhdGlvbjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+RGlzYWJsZSBhbGwgdmFsaWRhdGlvbiBmb3IgdGhlIGdpdmVuIHJlc291cmNlLiBUaGlzIG1ldGhvZCBpbnN0cnVjdHMKLSB0aGUgZnJhbWV3b3JrIHRvIG5vdCBydW4gYW55IHZhbGlkYXRvcnMgb24gdGhlIGdpdmVuIHJlc291cmNlIG9yIGFueSBvZgotIGl0J3MgY2hpbGRyZW4uIFRoaXMgc2V0dGluZyBpcyBwZXJzaXN0ZW50LiBDdXJyZW50bHkgdGhpcyBvbmx5IHdvcmtzIHdpdGggdmVyc2lvbiAyCi0gdmFsaWRhdG9ycy4KLSA8cD4KLSBVc2UgdGhlIGVuYWJsZVZhbGlkYXRpb24gbWV0aG9kIHRvIHJlc3RvcmUgdmFsaWRhdGlvbi4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0aGF0IGlzIGhhdmluZyB2YWxpZGF0aW9uIGRpc2FibGVkLiBJdCBtdXN0IGJlIGFuIElGb2xkZXIgb3IgYW4gSUZpbGUuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2VuYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKSI+PENPREU+ZW5hYmxlVmFsaWRhdGlvbihJUmVzb3VyY2UpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImVuYWJsZVZhbGlkYXRpb24oSVJlc291cmNlKSI+PCEtLSAtLT48L0E+PEgzPgotZW5hYmxlVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+ZW5hYmxlVmFsaWRhdGlvbjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+RW5hYmxlIHZhbGlkYXRpb24gZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4gSWYgdGhlIHJlc291cmNlIHdhcyBub3QKLSBwcmV2aW91c2x5IGRpc2FibGVkIHRoaXMgbWV0aG9kIGNhbGwgaGFzIG5vIGVmZmVjdC4gQ3VycmVudGx5IHRoaXMgb25seQotIHdvcmtzIHdpdGggdmVyc2lvbiAyIHZhbGlkYXRvcnMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0aGF0IGlzIGhhdmluZyB2YWxpZGF0aW9uIHJlLWVuYWJsZWQuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2Rpc2FibGVWYWxpZGF0aW9uKElSZXNvdXJjZSkiPjxDT0RFPmRpc2FibGVWYWxpZGF0aW9uKElSZXNvdXJjZSk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0RGVwZW5kZW5jeUluZGV4KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldERlcGVuZGVuY3lJbmRleDwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SURlcGVuZGVuY3lJbmRleDwvQT4gPEI+Z2V0RGVwZW5kZW5jeUluZGV4PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBkZXBlbmRlbmN5IGluZGV4LiBWYWxpZGF0b3JzIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgd2hpY2ggcmVzb3VyY2VzIGRlcGVuZCBvbiB3aGljaAotIG90aGVyIHJlc291cmNlcy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UGVyZm9ybWFuY2VNb25pdG9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFBlcmZvcm1hbmNlTW9uaXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQT4gPEI+Z2V0UGVyZm9ybWFuY2VNb25pdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGEgcGVyZm9ybWFuY2UgbW9uaXRvciBmb3IgdGhlIHZhbGlkYXRvcnMuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFByZWZlcmVuY2VTdG9yZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQcmVmZXJlbmNlU3RvcmU8L0gzPgotPFBSRT4KLXB1YmxpYyBJRWNsaXBzZVByZWZlcmVuY2VzIDxCPmdldFByZWZlcmVuY2VTdG9yZTwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGhvbGRzIHRoZSBwZXJzaXN0ZWQgZ2xvYmFsIHZhbGlkYXRpb24gc2V0dGluZ3MuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFJlcG9ydGVyKElQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UmVwb3J0ZXI8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4gPEI+Z2V0UmVwb3J0ZXI8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvcnNGb3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W10gPEI+Z2V0VmFsaWRhdG9yc0ZvcjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4gQSB2YWxpZGF0b3IgaXMKLSBzdGlsbCByZXR1cm5lZCBldmVuIGlmIGl0IGhhcyBiZWVuIHR1cm5lZCBvZmYgYnkgdGhlIHVzZXIuCi0gPHA+Ci0gVGhlIGNhbGxlciBtYXkgc3RpbGwgbmVlZCB0byB0ZXN0IGlmIHRoZSB2YWxpZGF0b3IgaGFzIGJlZW4gdHVybmVkIG9mZiBieQotIHRoZSB1c2VyLCBieSB1c2luZyB0aGUgaXNCdWlsZFZhbGlkYXRpb24oKSBhbmQgaXNNYW51YWxWYWxpZGF0aW9uKCkKLSBtZXRob2RzLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWNhYmxlLjxERD48Q09ERT5pc01hbnVhbDwvQ09ERT4gLSBJZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgbWFudWFsIHZhbGlkYXRpb24uCi0gICAgICAgICAgICAgICAgSWYgZmFsc2UgdGhlbiB0aGUgaXNNYW51YWxWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZCB0byBmaWx0ZXIKLSAgICAgICAgICAgICAgICBvdXQgdmFsaWRhdG9ycy48REQ+PENPREU+aXNCdWlsZDwvQ09ERT4gLSBJZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgYnVpbGQgYmFzZWQKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uLiBJZiBmYWxzZSB0aGVuIHRoZSBpc0J1aWxkVmFsaWRhdGlvbiBzZXR0aW5nIGlzbid0IHVzZWQKLSAgICAgICAgICAgICAgICB0byBmaWx0ZXIgb3V0IHZhbGlkYXRvcnMuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaXNCdWlsZFZhbGlkYXRpb24oKSI+PENPREU+VmFsaWRhdG9yLmlzQnVpbGRWYWxpZGF0aW9uKCk8L0NPREU+PC9BPiwgCi08QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc01hbnVhbFZhbGlkYXRpb24oKSI+PENPREU+VmFsaWRhdG9yLmlzTWFudWFsVmFsaWRhdGlvbigpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERpc2FibGVkVmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXREaXNhYmxlZFZhbGlkYXRvcnNGb3I8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLnV0aWwuU2V0Jmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mZ3Q7IDxCPmdldERpc2FibGVkVmFsaWRhdG9yc0ZvcjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IHNob3VsZCBub3QgdmFsaWRhdGUgdGhlIHJlc291cmNlLCBlaXRoZXIKLSBiZWNhdXNlIHRoZWlyIGZpbHRlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgcmVzb3VyY2UsIG9yIHRoZSB2YWxpZGF0b3IgaGFzCi0gYmVlbiBkaXNhYmxlZCBmb3IgYm90aCBidWlsZCB2YWxpZGF0aW9uIGFuZCBtYW51YWwgdmFsaWRhdGlvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRoaXMgaXMgYmVpbmcgdGVzdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9yKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmdldFZhbGlkYXRvcjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkKTwvUFJFPgotPERMPgotPEREPjxCPkRlcHJlY2F0ZWQuPC9CPiZuYnNwOzxJPlVzZSBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB3aXRoIGEgbnVsbCBwcm9qZWN0IGluc3RlYWQuPC9JPgotPFA+Ci08REQ+QW5zd2VyIHRoZSBnbG9iYWwgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGlkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSAKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+bnVsbCBpZiB0aGUgdmFsaWRhdG9yIGlzIG5vdCBmb3VuZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9yKGphdmEubGFuZy5TdHJpbmcsIElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiA8Qj5nZXRWYWxpZGF0b3I8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBpZCB0aGF0IGlzIGluIGVmZmVjdCBmb3IgdGhlIGdpdmVuCi0gcHJvamVjdC4KLSA8cD4KLSBJbmRpdmlkdWFsIHByb2plY3RzIG1heSBvdmVycmlkZSB0aGUgZ2xvYmFsIHZhbGlkYXRpb24gcHJlZmVyZW5jZQotIHNldHRpbmdzLiBJZiB0aGlzIGlzIGFsbG93ZWQgYW5kIGlmIHRoZSBwcm9qZWN0IGhhcyBpdCdzIG93biBzZXR0aW5ncywKLSB0aGVuIHRob3NlIHZhbGlkYXRvcnMgYXJlIHJldHVybmVkIHZpYSB0aGlzIG1ldGhvZC4KLSA8L3A+Ci0gPHA+Ci0gVGhlIGZvbGxvd2luZyBhcHByb2FjaCBpcyB1c2VkLiBGb3IgdmVyc2lvbiAxIHZhbGlkYXRvcnMsIHRoZSB2YWxpZGF0b3IKLSBpcyBvbmx5IHJldHVybmVkIGlmIGl0IGlzIGRlZmluZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIHByb2plY3QgdHlwZS4gVGhpcwotIGlzIHRoZSB3YXkgdGhhdCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrIGRpZCBpdC4gRm9yIHZlcnNpb24KLSAyIHZhbGlkYXRvcnMsIHRoZXkgYXJlIGFsbCByZXR1cm5lZC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmlkPC9DT0RFPiAtIFZhbGlkYXRvciBpZC48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGlzIGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGFsbCB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzIGFyZQotICAgICAgICAgICAgICAgIGNoZWNrZWQuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPm51bGwgaWYgdGhlIHZhbGlkYXRvciBpcyBub3QgZm91bmQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvcnMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yczwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXSA8Qj5nZXRWYWxpZGF0b3JzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGNvcGllcyBvZiBhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycy4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5BbnN3ZXIgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRQcm9qZWN0U2V0dGluZ3MoSVByb2plY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQcm9qZWN0U2V0dGluZ3M8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT4gPEI+Z2V0UHJvamVjdFNldHRpbmdzPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgb24gdGhlCi0gcHJvamVjdC4gVG8gImFjdGl2YXRlIiBhbnkgY2hhbmdlcyB0byB0aGVzZSBzZXR0aW5ncywgdGhlCi0gPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2FwcGx5Q2hhbmdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlUHJvamVjdFNldHRpbmdzLCBib29sZWFuKSI+PENPREU+YXBwbHlDaGFuZ2VzKE11dGFibGVQcm9qZWN0U2V0dGluZ3MsIGJvb2xlYW4pPC9DT0RFPjwvQT4gbWV0aG9kIG5lZWRzIHRvIGJlCi0gY2FsbGVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIFRoZSBwcm9qZWN0IHdobydzIHNldHRpbmdzIHlvdSB3aXNoIHRvIGV4YW1pbmUgb3IgY2hhbmdlLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5WYWxpZGF0aW9uIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhlIGdpdmVuIHByb2plY3QuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRXb3Jrc3BhY2VTZXR0aW5ncygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRXb3Jrc3BhY2VTZXR0aW5nczwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT4gPEI+Z2V0V29ya3NwYWNlU2V0dGluZ3M8L0I+KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGF0IHRoZSB3b3Jrc3BhY2UgbGV2ZWwuCi0gVG8gImFjdGl2YXRlIiBhbnkgY2hhbmdlcyB0byB0aGVzZSBzZXR0aW5ncywgdGhlCi0gPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2FwcGx5Q2hhbmdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MsIGJvb2xlYW4pIj48Q09ERT5hcHBseUNoYW5nZXMoTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLCBib29sZWFuKTwvQ09ERT48L0E+IG1ldGhvZCBuZWVkcyB0byBiZQotIGNhbGxlZC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5WYWxpZGF0aW9uIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhlIGVudGlyZSB3b3Jrc3BhY2UuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5qYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYXBwbHlDaGFuZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVQcm9qZWN0U2V0dGluZ3MsIGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1hcHBseUNoYW5nZXM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmFwcGx5Q2hhbmdlczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+Jm5ic3A7c2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3BlcnNpc3QpPC9QUkU+Ci08REw+Ci08REQ+QXBwbHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gYmVlbiB0byB0aGUgdmFsaWRhdGlvbiBzZXR0aW5ncy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c2V0dGluZ3M8L0NPREU+IC0gVGhlIHByb2plY3Qgc2V0dGluZ3MuPEREPjxDT0RFPnBlcnNpc3Q8L0NPREU+IC0gSWYgdHJ1ZSB0aGVuIHRoZSBjaGFuZ2VzIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIHByb3BlcnR5IGZpbGVzLgotICAgICAgICAgICAgSWYgZmFsc2UgdGhlIGNoYW5nZXMgYXJlIGFwcGxpZWQgdG8gdGhlIHZhbGlkYXRvcnMsIGJ1dCBhcmUKLSAgICAgICAgICAgIG5vdCBwZXJzaXN0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhcHBseUNoYW5nZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLCBib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotYXBwbHlDaGFuZ2VzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5hcHBseUNoYW5nZXM8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT4mbmJzcDtzZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7cGVyc2lzdCk8L1BSRT4KLTxETD4KLTxERD5BcHBseSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBiZWVuIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5zZXR0aW5nczwvQ09ERT4gLSBUaGUgd29ya3NwYWNlIHNldHRpbmdzLjxERD48Q09ERT5wZXJzaXN0PC9DT0RFPiAtIElmIHRydWUgdGhlbiB0aGUgY2hhbmdlcyBhcmUgcGVyc2lzdGVkIHRvIHRoZSBwcm9wZXJ0eSBmaWxlcy4KLSAgICAgICAgICAgIElmIGZhbHNlIHRoZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIHRoZSB2YWxpZGF0b3JzLCBidXQgYXJlCi0gICAgICAgICAgICBub3QgcGVyc2lzdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9yc0NvbmZpZ3VyZWRGb3JQcm9qZWN0KElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yc0NvbmZpZ3VyZWRGb3JQcm9qZWN0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdIDxCPmdldFZhbGlkYXRvcnNDb25maWd1cmVkRm9yUHJvamVjdDwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0VW5hdmFpbGFibGVFcnJvcjwvUFJFPgotPERMPgotPEREPlZhbGlkYXRvcnMgY2FuIHVzZSBwcm9qZWN0IGxldmVsIHNldHRpbmdzIChQcm9qZWN0IG5hdHVyZXMgYW5kIGZhY2V0cykgdG8KLSBkZXRlcm1pbmUgaWYgdGhleSBhcmUgYXBwbGljYWJsZSB0byB0aGUgcHJvamVjdCBvciBub3QuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gVGhlIHByb2plY3QgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+VGhlIGNvcGllcyBvZiB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGlzIHByb2plY3QgYmFzZWQKLSAgICAgICAgIG9uIHRoZSBwcm9qZWN0IGxldmVsIHNldHRpbmdzLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdFVuYXZhaWxhYmxlRXJyb3I8L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3JzRm9yKElSZXNvdXJjZSkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvcnNGb3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W10gPEI+Z2V0VmFsaWRhdG9yc0ZvcjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWNhYmxlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIHRoZSByZXNvdXJjZSB0aGF0IGRldGVybWluZXMgd2hpY2ggdmFsaWRhdG9ycyBhcmUgYXBwbGljYWJsZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9Imhhc1ZhbGlkYXRvcnMoSVJlc291cmNlLCBib29sZWFuLCBib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotaGFzVmFsaWRhdG9yczwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aGFzVmFsaWRhdG9yczwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRydWUgaWYgdGhlIHJlc291cmNlIGhhcyBhbnkgZW5hYmxlZCB2YWxpZGF0b3JzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBBIGZpbGUsIGZvbGRlciBvciBwcm9qZWN0LjxERD48Q09ERT5pc01hbnVhbDwvQ09ERT4gLSBJZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgbWFudWFsIHZhbGlkYXRpb24uCi0gICAgICAgICAgICAgICAgSWYgZmFsc2UgdGhlbiB0aGUgaXNNYW51YWxWYWxpZGF0aW9uIHNldHRpbmcgaXNuJ3QgdXNlZCB0byBmaWx0ZXIKLSAgICAgICAgICAgICAgICBvdXQgdmFsaWRhdG9ycy48REQ+PENPREU+aXNCdWlsZDwvQ09ERT4gLSBJZiB0cnVlIHRoZW4gdGhlIHZhbGlkYXRvciBtdXN0IGJlIHR1cm5lZCBvbiBmb3IgYnVpbGQgYmFzZWQKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uLiBJZiBmYWxzZSB0aGVuIHRoZSBpc0J1aWxkVmFsaWRhdGlvbiBzZXR0aW5nIGlzbid0IHVzZWQKLSAgICAgICAgICAgICAgICB0byBmaWx0ZXIgb3V0IHZhbGlkYXRvcnMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0xvYWRlZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0xvYWRlZDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNMb2FkZWQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3IgaGFzIGJlZW4gYWN0aXZhdGVkLCBpLmUuIGhhcyB0aGUKLSBidW5kbGUgdGhhdCBkZWZpbmVzIHRoZSB2YWxpZGF0b3IgYmVlbiBsb2FkZWQuIFdlIGRvIG5vdCB3YW50IHRvIGNhdXNlCi0gdW5uZWNlc3NhcnkgYnVuZGxlIGxvYWRpbmcsIHNvIHRoaXMgY2hlY2sgY2FuIGJlIHBlcmZvcm1lZCBieSB0aGlyZCBwYXJ0eQotIGNhbGxlcnMsIHRvIHByZXZlbnQgbWFraW5nIG90aGVyIGNhbGxzIHRoYXQgd2lsbCBmb3JjZSB0aGUgdmFsaWRhdG9yIHRvCi0gYmUgbG9hZGVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWxpZGF0b3I8L0NPREU+IC0gVGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHRlc3RlZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iam9pbihJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotam9pbjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+am9pbjwvQj4oSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpCi0gICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5XYWl0cyB1bnRpbCBhbGwgdGhlIHZhbGlkYXRpb24gam9icyBhbmQgYWxsIHRoZSBvdGhlciBhdXRvIGJ1aWxkIGpvYnMgYXJlIGZpbmlzaGVkLiAKLSBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHRoZQotIGNhbGxpbmcgdGhyZWFkIHVudGlsIGFsbCBzdWNoIGpvYnMgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcsIG9yIHVudGlsIHRoaXMKLSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuIElmIHRoZXJlIGFyZSBubyByZWxldmFudCBqb2JzIHRoYXQgYXJlCi0gY3VycmVudGx5IHdhaXRpbmcsIHJ1bm5pbmcsIG9yIHNsZWVwaW5nLCB0aGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LgotIEZlZWRiYWNrIG9uIGhvdyB0aGUgam9pbiBpcyBwcm9ncmVzc2luZyBpcyBwcm92aWRlZCB0byB0aGUgcHJvZ3Jlc3MKLSBtb25pdG9yLgotIDxwPgotIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGlsZSB0aGUgam9iIG1hbmFnZXIgaXMgc3VzcGVuZGVkLCBvbmx5IGpvYnMKLSB0aGF0IGFyZSBjdXJyZW50bHkgcnVubmluZyB3aWxsIGJlIGpvaW5lZC4gT25jZSB0aGVyZSBhcmUgbm8gam9icyBpbiB0aGUKLSBmYW1pbHkgaW4gdGhlIDxDT0RFPkpvYiNSVU5OSU5HPC9DT0RFPiBzdGF0ZSwgdGhpcyBtZXRob2QgcmV0dXJucy4KLSA8L3A+Ci0gPHA+Ci0gTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGVhZGxvY2sgcmlzayB3aGVuIHVzaW5nIGpvaW4uIElmIHRoZSBjYWxsaW5nIHRocmVhZAotIG93bnMgYSBsb2NrIG9yIG9iamVjdCBtb25pdG9yIHRoYXQgdGhlIGpvaW5lZCB0aHJlYWQgaXMgd2FpdGluZyBmb3IsCi0gZGVhZGxvY2sgd2lsbCBvY2N1ci4gVGhpcyBtZXRob2QgY2FuIGFsc28gcmVzdWx0IGluIHN0YXJ2YXRpb24gb2YgdGhlCi0gY3VycmVudCB0aHJlYWQgaWYgYW5vdGhlciB0aHJlYWQgY29udGludWVzIHRvIGFkZCBqb2JzIG9mIHRoZSBnaXZlbgotIGZhbWlseSwgb3IgaWYgYSBqb2IgaW4gdGhlIGdpdmVuIGZhbWlseSByZXNjaGVkdWxlcyBpdHNlbGYgaW4gYW4gaW5maW5pdGUKLSBsb29wLgotIDwvcD4KLSAKLSA8cD5JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb25seSB3YWl0aW5nIGZvciB0aGUgdmFsaWRhdGlvbiBqb2JzLCBzZWUgdGhlCi0gam9pblZhbGlkYXRpb25Pbmx5IG1ldGhvZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBQcm9ncmVzcyBtb25pdG9yIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3Mgb24gaG93IHRoZSB3YWl0IGlzCi0gICAgICAgICAgICAgICAgcHJvZ3Jlc3NpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2dyZXNzIG1vbml0b3JpbmcgaXMKLSAgICAgICAgICAgICAgICByZXF1aXJlZC4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGlzIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nCi08REQ+PENPREU+T3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb248L0NPREU+IC0gaWYgdGhlIHByb2dyZXNzIG1vbml0b3IgaXMgY2FuY2VsZWQgd2hpbGUgd2FpdGluZzxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNqb2luVmFsaWRhdGlvbk9ubHkoSVByb2dyZXNzTW9uaXRvcikiPjxDT0RFPmpvaW5WYWxpZGF0aW9uT25seShJUHJvZ3Jlc3NNb25pdG9yKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJqb2luVmFsaWRhdGlvbk9ubHkoSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLWpvaW5WYWxpZGF0aW9uT25seTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+am9pblZhbGlkYXRpb25Pbmx5PC9CPihJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5XYWl0cyB1bnRpbCBhbGwgdGhlIHZhbGlkYXRpb24gam9icyBhcmUgZmluaXNoZWQuIAotIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdGhlCi0gY2FsbGluZyB0aHJlYWQgdW50aWwgYWxsIHN1Y2ggam9icyBoYXZlIGZpbmlzaGVkIGV4ZWN1dGluZywgb3IgdW50aWwgdGhpcwotIHRocmVhZCBpcyBpbnRlcnJ1cHRlZC4gSWYgdGhlcmUgYXJlIG5vIHJlbGV2YW50IGpvYnMgdGhhdCBhcmUKLSBjdXJyZW50bHkgd2FpdGluZywgcnVubmluZywgb3Igc2xlZXBpbmcsIHRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gRmVlZGJhY2sgb24gaG93IHRoZSBqb2luIGlzIHByb2dyZXNzaW5nIGlzIHByb3ZpZGVkIHRvIHRoZSBwcm9ncmVzcwotIG1vbml0b3IuCi0gPHA+Ci0gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoaWxlIHRoZSBqb2IgbWFuYWdlciBpcyBzdXNwZW5kZWQsIG9ubHkgam9icwotIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIHdpbGwgYmUgam9pbmVkLiBPbmNlIHRoZXJlIGFyZSBubyBqb2JzIGluIHRoZQotIGZhbWlseSBpbiB0aGUgPENPREU+Sm9iI1JVTk5JTkc8L0NPREU+IHN0YXRlLCB0aGlzIG1ldGhvZCByZXR1cm5zLgotIDwvcD4KLSA8cD4KLSBOb3RlIHRoYXQgdGhlcmUgaXMgYSBkZWFkbG9jayByaXNrIHdoZW4gdXNpbmcgam9pbi4gSWYgdGhlIGNhbGxpbmcgdGhyZWFkCi0gb3ducyBhIGxvY2sgb3Igb2JqZWN0IG1vbml0b3IgdGhhdCB0aGUgam9pbmVkIHRocmVhZCBpcyB3YWl0aW5nIGZvciwKLSBkZWFkbG9jayB3aWxsIG9jY3VyLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyByZXN1bHQgaW4gc3RhcnZhdGlvbiBvZiB0aGUKLSBjdXJyZW50IHRocmVhZCBpZiBhbm90aGVyIHRocmVhZCBjb250aW51ZXMgdG8gYWRkIGpvYnMgb2YgdGhlIGdpdmVuCi0gZmFtaWx5LCBvciBpZiBhIGpvYiBpbiB0aGUgZ2l2ZW4gZmFtaWx5IHJlc2NoZWR1bGVzIGl0c2VsZiBpbiBhbiBpbmZpbml0ZQotIGxvb3AuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIFByb2dyZXNzIG1vbml0b3IgZm9yIHJlcG9ydGluZyBwcm9ncmVzcyBvbiBob3cgdGhlIHdhaXQgaXMKLSAgICAgICAgICAgICAgICBwcm9ncmVzc2luZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvZ3Jlc3MgbW9uaXRvcmluZyBpcwotICAgICAgICAgICAgICAgIHJlcXVpcmVkLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoaXMgdGhyZWFkIGlzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKLTxERD48Q09ERT5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyBjYW5jZWxlZCB3aGlsZSB3YWl0aW5nPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCwgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXN1c3BlbmRWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zdXNwZW5kVmFsaWRhdGlvbjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3N1c3BlbmQpPC9QUkU+Ci08REw+Ci08REQ+U3VzcGVuZHMsIG9yIHVuZG9lcyB0aGUgc3VzcGVuc2lvbiBvZiwgdmFsaWRhdGlvbiBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotIElmIDxiPnN1c3BlbmQ8L2I+IGlzIHRydWUgdGhlbiB2YWxpZGF0aW9uIGlzIHN1c3BlbmRlZCBhbmQgaWYgaXQncyBmYWxzZQotIHRoZW4gdmFsaWRhdGlvbiBpcyBub3Qgc3VzcGVuZGVkIG9uIHRoZSBwcm9qZWN0LiBUaGUgdmFsdWUgb2YgdGhpcwotIHZhcmlhYmxlIGlzIG5vdCBwZXJzaXN0ZWQuCi0gPHA+Ci0gQmUgPGI+dmVyeSBjYXJlZnVsPC9iPiB3aGVuIHlvdSB1c2UgdGhpcyBtZXRob2QhIFR1cm4gdmFsaWRhdGlvbiBiYWNrIG9uIGluIGEKLSBmaW5hbGx5IGJsb2NrIGJlY2F1c2UgaWYgdGhlIGNvZGUgd2hpY2ggc3VzcGVuZGVkIHZhbGlkYXRpb24gY3Jhc2hlcywgdGhlCi0gdXNlciBoYXMgbm8gd2F5IHRvIHJlc2V0IHRoZSBzdXNwZW5zaW9uLiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc2h1dCBkb3duCi0gYW5kIHJlc3RhcnQgdGhlIHdvcmtiZW5jaCB0byBnZXQgdmFsaWRhdGlvbiB0byB3b3JrIGFnYWluLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IGlzIHRvIGJlIHN1c3BlbmRlZCBvciB1bnN1c3BlbmRlZC48REQ+PENPREU+c3VzcGVuZDwvQ09ERT4gLSBJZiB0cnVlLCB2YWxpZGF0aW9uIG9uIHRoZSBwcm9qZWN0IHdpbGwgYmUgc3VzcGVuZC4gSWYgZmFsc2UgaXQgd2lsbAotICAgICAgICAgICAgICAgIG5vdCBiZSBzdXNwZW5kZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzYXZlVmFsaWRhdG9ycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JbXSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNhdmVWYWxpZGF0b3JzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zYXZlVmFsaWRhdG9yczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5TYXZlIHRoZSB2YWxpZGF0b3JzIHNldHRpbmdzIGludG8gdGhlIHBlcnNpc3RlbnQgc3RvcmUsIHRoZXJlIGJ5IG1ha2luZyB0aGVpciBzZXR0aW5ncyB0aGUgYWN0aXZlIHNldHRpbmdzLgotIDxwPgotIEEgY29tbW9uIHVzZSBvZiB0aGlzIG1ldGhvZCB3b3VsZCBiZSB0byBjaGFuZ2Ugd2hldGhlciBwYXJ0aWN1bGFyIHZhbGlkYXRvcnMgYXJlIGVuYWJsZWQgb3Igbm90LiBGb3IgZXhhbXBsZQotIGlmIHlvdSBvbmx5IHdhbnRlZCB0aGUgSlNQIHZhbGlkYXRvciBlbmFibGVkLCB5b3UgY291bGQgdXNlIGNvZGUgc2ltaWxhciB0byB0aGlzOgotIDxwcmU+Ci0gVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotIFZhbGlkYXRvcltdIHZhbHMgPSB2Zi5nZXRWYWxpZGF0b3JzKCk7Ci0gZm9yIChWYWxpZGF0b3IgdiA6IHZhbHMpewotICAgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0gICBpZiAodi5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEJhdGNoVmFsaWRhdG9yIikpZW5hYmxlZCA9IHRydWU7Ci0gICAgIHYuc2V0QnVpbGRWYWxpZGF0aW9uKGVuYWJsZWQpOwotICAgICB2LnNldE1hbnVhbFZhbGlkYXRpb24oZW5hYmxlZCk7Ci0gIH0KLSB2Zi5zYXZlVmFsaWRhdG9ycyh2YWxzKTsKLSA8L3ByZT4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcnM8L0NPREU+IC0gVGhlIHZhbGlkYXRvcnMgdGhhdCB5b3UgYXJlIHNhdmluZy4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPmphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzdXNwZW5kQWxsVmFsaWRhdGlvbihib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc3VzcGVuZEFsbFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnN1c3BlbmRBbGxWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7c3VzcGVuZCk8L1BSRT4KLTxETD4KLTxERD5TdXNwZW5kcywgb3IgdW5kb2VzIHRoZSBzdXNwZW5zaW9uIG9mLCB2YWxpZGF0aW9uIG9uIGFsbCBwcm9qZWN0cyBpbiB0aGUKLSB3b3JrYmVuY2guIElmICJzdXNwZW5kIiBpcyB0cnVlIHRoZW4gdmFsaWRhdGlvbiBpcyBzdXNwZW5kZWQgYW5kIGlmIGl0J3MKLSAiZmFsc2UiIHRoZW4gdmFsaWRhdGlvbiBpcyBub3Qgc3VzcGVuZGVkLiBUaGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcwotIG5vdCBwZXJzaXN0ZWQuCi0gPHA+Ci0gQmUgPGI+dmVyeSBjYXJlZnVsPC9iPiB3aGVuIHlvdSB1c2UgdGhpcyBtZXRob2QhIFR1cm4gdmFsaWRhdGlvbiBiYWNrIG9uIGluIGEKLSBmaW5hbGx5IGJsb2NrIGJlY2F1c2UgaWYgdGhlIGNvZGUgd2hpY2ggc3VzcGVuZGVkIHZhbGlkYXRpb24gY3Jhc2hlcywgdGhlCi0gdXNlciBoYXMgbm8gd2F5IHRvIHJlc2V0IHRoZSBzdXNwZW5zaW9uLiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc2h1dCBkb3duCi0gYW5kIHJlc3RhcnQgdGhlIHdvcmtiZW5jaCB0byBnZXQgdmFsaWRhdGlvbiB0byB3b3JrIGFnYWluLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNTdXNwZW5kZWQoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNTdXNwZW5kZWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzU3VzcGVuZGVkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJuIHRydWUgaWYgInN1c3BlbmQgYWxsIiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzU3VzcGVuZGVkKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotaXNTdXNwZW5kZWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmlzU3VzcGVuZGVkPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0cnVlIGlmIHZhbGlkYXRpb24gd2lsbCBub3QgcnVuIG9uIHRoZSBwcm9qZWN0IGJlY2F1c2UgaXQncyBiZWVuIHN1c3BlbmRlZC4gVGhpcwotIG1ldGhvZCBjaGVja3Mgb25seSB0aGUgc3VzcGVuc2lvbiBzdGF0dXM7IGlmIHZhbGlkYXRpb24gY2Fubm90IHJ1biBmb3Igc29tZSBvdGhlciByZWFzb24gKGZvcgotIGV4YW1wbGUsIHRoZXJlIGFyZSBubyBlbmFibGVkIHZhbGlkYXRvcnMpLCB5ZXQgdGhlIElQcm9qZWN0IGlzIG5vdCBzdXNwZW5kZWQsIHRoaXMgbWV0aG9kCi0gd2lsbCByZXR1cm4gdHJ1ZSBldmVuIHRob3VnaCB2YWxpZGF0aW9uIHdpbGwgbm90IHJ1bi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNQcm9qZWN0U3VzcGVuZGVkKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotaXNQcm9qZWN0U3VzcGVuZGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc1Byb2plY3RTdXNwZW5kZWQ8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBjb2RlIHRoYXQgaXMgcHJlcGFyaW5nIHRvIHN1c3BlbmQgdmFsaWRhdGlvbiBvbiBhCi0gcHJvamVjdC4gUmF0aGVyIHRoYW4gY2FsbGluZyBpc1N1c3BlbmRlZChJUHJvamVjdCksIHdoaWNoIHdpbGwgYWxzbyByZXR1cm4gdHJ1ZSBpZiBhbGwgdmFsaWRhdGlvbgotIGhhcyBiZWVuIHN1c3BlbmRlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHRlc3RlZAotPERUPjxCPlJldHVybnM6PC9CPjxERD5ib29sZWFuIHRydWUgaWYgdGhlIHByb2plY3QgaGFzIGJlZW4gc3VzcGVuZGVkPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZShJUHJvamVjdFtdLCBib29sZWFuLCBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPiA8Qj52YWxpZGF0ZTwvQj4oSVByb2plY3RbXSZuYnNwO3Byb2plY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdGUgdGhlIHByb2plY3RzLiBFeGFjdGx5IG9uZSBvZiBpc01hbnVhbCBvciBpc0J1aWxkIG5lZWRzIHRvIGJlIHRydWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3RzPC9DT0RFPiAtIFRoZSBwcm9qZWN0cyB0byBiZSB2YWxpZGF0ZWQuPEREPjxDT0RFPmlzTWFudWFsPC9DT0RFPiAtIElzIHRoaXMgYmVpbmcgZG9uZSBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24/IGkuZS4gZGlkCi0gICAgICAgICAgICB0aGUgdXNlciBzZWxlY3QgdGhlIFZhbGlkYXRlIG1lbnUgaXRlbT88REQ+PENPREU+aXNCdWlsZDwvQ09ERT4gLSBJcyB0aGlzIGJlaW5nIGRvbmUgYXMgcGFydCBvZiBhIGJ1aWxkPzxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIAotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdmFsaWRhdGlvbiByZXN1bHQgd2hpY2ggaXMgdGhlIGNvbWJpbmVkIHJlc3VsdCBmb3IgYWxsIHRoZQotICAgICAgICAgcmVzb3VyY2VzIHRoYXQgd2VyZSB2YWxpZGF0ZWQuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5Db3JlRXhjZXB0aW9uPC9DT0RFPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUoSUZpbGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+IDxCPnZhbGlkYXRlPC9CPihJRmlsZSZuYnNwO2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlIGEgc3BlY2lmaWMgZmlsZSByZXNvdXJjZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZmlsZTwvQ09ERT4gLSBUaGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gUHJvZ3Jlc3MgbW9uaXRvci4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc3VsdCBvZiB2YWxpZGF0aW5nIHRoZSBmaWxlLgotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+Q29yZUV4Y2VwdGlvbjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzhhMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NDMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotVmFsaWRhdGlvblJlc3VsdAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRpb25SZXN1bHQiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9kZXRhaWwiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9GT05UPgotPEJSPgotQ2xhc3MgVmFsaWRhdGlvblJlc3VsdDwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGZpbmFsIGNsYXNzIDxCPlZhbGlkYXRpb25SZXN1bHQ8L0I+PERUPmV4dGVuZHMgamF2YS5sYW5nLk9iamVjdDwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSB2YWxpZGF0ZSBvcGVyYXRpb24uIFZhbGlkYXRvcnMgY3JlYXRlIGFuZCByZXR1cm4gdGhpcyBvYmplY3RzIGFzIHBhcnQgb2YKLSBwZXJmb3JtaW5nIHRoZWlyIHZhbGlkYXRpb24uCi0gPHA+Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNWYWxpZGF0aW9uUmVzdWx0KCkiPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2FkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlKSI+YWRkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYW4gb3B0aW9uYWwgbWV0aG9kLCB0aGF0IGEgdmFsaWRhdG9yIGNhbiB1c2UgdG8gcmV0dXJuIGVycm9yCi0gbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lSZXNvdXJjZVtdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXREZXBlbmRzT24oKSI+Z2V0RGVwZW5kc09uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRNZXNzYWdlcygpIj5nZXRNZXNzYWdlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldE1lc3NhZ2VzQXNDb3B5KCkiPmdldE1lc3NhZ2VzQXNDb3B5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgY29weSBvZiBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcygpIj5nZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgbnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGF0ZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcikiPmdldFJlcG9ydGVyPC9BPjwvQj4oSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYW4gSVJlcG9ydGVyIGZvciBoYW5kaW5nIGVycm9yIG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldFNldmVyaXR5RXJyb3IoKSI+Z2V0U2V2ZXJpdHlFcnJvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldFNldmVyaXR5SW5mbygpIj5nZXRTZXZlcml0eUluZm88L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldFNldmVyaXR5V2FybmluZygpIj5nZXRTZXZlcml0eVdhcm5pbmc8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIG51bWJlciBvZiB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUHJvamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0U3VzcGVuZFZhbGlkYXRpb24oKSI+Z2V0U3VzcGVuZFZhbGlkYXRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHByb2plY3QgdGhhdCB0aGUgdmFsaWRhdG9yIHdvdWxkIGxpa2UgdG8gaGF2ZSBzdXNwZW5kZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lSZXNvdXJjZVtdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNnZXRWYWxpZGF0ZWQoKSI+Z2V0VmFsaWRhdGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbigpIj5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgdGhlIHZhbGlkYXRpb24gZW5kZWQgd2l0aCBhbiBleGNlcHRpb24sIGFuc3dlciBpdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNpbmNyZW1lbnRFcnJvcihpbnQpIj5pbmNyZW1lbnRFcnJvcjwvQT48L0I+KGludCZuYnNwO2Vycm9ycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0luY3JlbWVudCB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2luY3JlbWVudEluZm8oaW50KSI+aW5jcmVtZW50SW5mbzwvQT48L0I+KGludCZuYnNwO2luZm8pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2luY3JlbWVudFdhcm5pbmcoaW50KSI+aW5jcmVtZW50V2FybmluZzwvQT48L0I+KGludCZuYnNwO3dhcm5pbmdzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjaXNDYW5jZWxlZCgpIj5pc0NhbmNlbGVkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7V2FzIHRoZSBvcGVyYXRpb24gY2FuY2VsZWQgYmVmb3JlIGl0IGNvbXBsZXRlZD88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjbWVyZ2VSZXN1bHRzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQpIj5tZXJnZVJlc3VsdHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4mbmJzcDtyZXN1bHQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtNZXJnZSB0aGUgbWVzc2FnZSBjb3VudHMgYW5kIG1lc3NhZ2VzIGZyb20gYW4gaW5kaXZpZHVhbCB2YWxpZGF0b3IgaW50byB0aGlzIHJlc3VsdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjc2V0Q2FuY2VsZWQoYm9vbGVhbikiPnNldENhbmNlbGVkPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2NhbmNlbGVkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW5kaWNhdGUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldERlcGVuZHNPbihJUmVzb3VyY2VbXSkiPnNldERlcGVuZHNPbjwvQT48L0I+KElSZXNvdXJjZVtdJm5ic3A7ZGVwZW5kc09uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VXBkYXRlIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFNldmVyaXR5RXJyb3IoaW50KSI+c2V0U2V2ZXJpdHlFcnJvcjwvQT48L0I+KGludCZuYnNwO3NldmVyaXR5RXJyb3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjc2V0U2V2ZXJpdHlJbmZvKGludCkiPnNldFNldmVyaXR5SW5mbzwvQT48L0I+KGludCZuYnNwO3NldmVyaXR5SW5mbyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB0aGUgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFNldmVyaXR5V2FybmluZyhpbnQpIj5zZXRTZXZlcml0eVdhcm5pbmc8L0E+PC9CPihpbnQmbmJzcDtzZXZlcml0eVdhcm5pbmcpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIG51bWJlciBvZiB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCNzZXRTdXNwZW5kVmFsaWRhdGlvbihJUHJvamVjdCkiPnNldFN1c3BlbmRWYWxpZGF0aW9uPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGluZm9ybSB0aGUgZnJhbWV3b3JrLCB0aGF0IHRoaXMgdmFsaWRhdG9yIGRvZXMgbm90IHdpc2ggdG8gYmUKLSBjYWxsZWQgYWdhaW4gZm9yIGFueSByZXNvdXJjZXMgaW4gdGhpcyBwcm9qZWN0LCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFZhbGlkYXRlZChJUmVzb3VyY2VbXSkiPnNldFZhbGlkYXRlZDwvQT48L0I+KElSZXNvdXJjZVtdJm5ic3A7dmFsaWRhdGVkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SW5kaWNhdGUgdGhhdCBhZGRpdGlvbmFsIHJlc291cmNlcyBoYXZlIGJlZW4gdmFsaWRhdGVkIGFzIHBhcnQgb2YgdGhpcwotIHZhbGlkYXRlIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjc2V0VmFsaWRhdGlvbkV4Y2VwdGlvbihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb24pIj5zZXRWYWxpZGF0aW9uRXhjZXB0aW9uPC9BPjwvQj4ob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uJm5ic3A7dmFsaWRhdGlvbkV4Y2VwdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHRoZSB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoIGFuIGV4Y2VwdGlvbiwgaXQgY2FuIGJlIHJlY29yZGVkIGhlcmUuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJWYWxpZGF0aW9uUmVzdWx0KCkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRpb25SZXN1bHQ8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5WYWxpZGF0aW9uUmVzdWx0PC9CPigpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlKSI+PCEtLSAtLT48L0E+PEgzPgotYWRkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5hZGQ8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9QUkU+Ci08REw+Ci08REQ+VGhpcyBpcyBhbiBvcHRpb25hbCBtZXRob2QsIHRoYXQgYSB2YWxpZGF0b3IgY2FuIHVzZSB0byByZXR1cm4gZXJyb3IKLSBtZXNzYWdlcy4gVGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGNvbnZlcnRzIHRoZXNlIGludG8gSU1hcmtlcnMuCi0gPHA+Ci0gVGhlIHNjZW5hcmlvIHRoYXQgbW90aXZhdGVkIHRoaXMgbWV0aG9kLCBpcyB3aGVuIGEgdmFsaWRhdG9yIGlzIHVzZWQgYm90aAotIGZvciA8Yj5hcyB5b3UgdHlwZTwvYj4gdmFsaWRhdGlvbiBhbmQgPGI+YnVpbGQ8L2I+IHZhbGlkYXRpb24uIFdoZW4KLSBjYWxsZWQgaW4gYXMgeW91IHR5cGUgbW9kZSwgdGhlIHZhbGlkYXRvciBkb2Vzbid0IHdhbnQgdG8gZGlyZWN0bHkgY3JlYXRlIElNYXJrZXJzLAotIGJlY2F1c2UgdGhlIHJlc291cmNlIGhhc24ndCBiZWVuIHNhdmVkIHlldC4gSXQgbmVlZHMgdG8gcmV0dXJuIHNvbWV0aGluZwotIG90aGVyIHRoYW4gYW4gSU1hcmtlci4gQnV0IHdoZW4gY2FsbGVkIGluIGJ1aWxkIG1vZGUsIGl0IGRvZXMgdWx0aW1hdGVseQotIHdhbnQgSU1hcmtlcnMuIEJ5IHJldHVybmluZyBWYWxpZGF0b3JNZXNzYWdlcywgaXQgb25seSBuZWVkcyB0byByZXR1cm4KLSBvbmUgdHlwZSBvZiBtZXNzYWdlLCBhbmQgdGhvc2UgbWVzc2FnZXMgY2FuIGJlIGVpdGhlciBiZSBkaXJlY3RseSB1c2VkIGJ5Ci0gdGhlIGNhbGxlciwgb3IgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgaW50byBJTWFya2VycyBieSB0aGUgdmFsaWRhdGlvbgotIGZyYW1ld29yay4KLSA8L3A+Ci0gPHA+Ci0gVG8gbWFrZSBtYXR0ZXJzIGV2ZW4gbW9yZSBjb21wbGljYXRlZCB0aGVyZSBpcyBhIHRoaXJkIHdheSB0byByZXR1cm4KLSBtZXNzYWdlcy4gVG8gbWFrZSBpdCBlYXNpZXIgZm9yIG9sZCB2YWxpZGF0b3JzIHRvIHBvcnQgdG8gdGhlIG5ldwotIGZyYW1ld29yaywgdGhleSBjYW4gY29udGludWUgdG8gdXNlIGFuIElSZXBvcnRlci4gSWYgYSB2YWxpZGF0b3IgY2FsbHMKLSB0aGUgZ2V0UmVwb3J0ZXIoKSBtZXRob2QgdGhlbiBpdCBpcyBhc3N1bWVkIGJ5IHRoZSBmcmFtZXdvcmsgdGhhdCB0aGF0IGlzCi0gdGhlIGFwcHJvYWNoIHRoYXQgdGhleSBoYXZlIGNob3Nlbi4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gQSB2YWxpZGF0aW9uIG1lc3NhZ2UuPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3IpIj48Q09ERT5nZXRSZXBvcnRlcihJUHJvZ3Jlc3NNb25pdG9yKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRSZXBvcnRlcihJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0UmVwb3J0ZXI8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4gPEI+Z2V0UmVwb3J0ZXI8L0I+KElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPkFuc3dlciBhbiBJUmVwb3J0ZXIgZm9yIGhhbmRpbmcgZXJyb3IgbWVzc2FnZXMuCi0gPHA+Ci0gVGhpcyBpcyBhIHRyYW5zaXRpb24gbWV0aG9kLCB0byBoZWxwIG9sZCB2YWxpZGF0b3JzIHBvcnQgdG8gdGhlIG5ldyB2YWxpZGF0aW9uIGZyYW1ld29yay4gSWYgdGhpcyBtZXRob2QKLSBpcyBjYWxsZWQgaXQgaXMgYXNzdW1lZCBieSB0aGUgZnJhbWV3b3JrLCB0aGF0IHRoaXMgSVJlcG9ydGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgb25seSB3YXkgb2YgcGFzc2luZyBtZXNzYWdlcwotIGJhY2sgdG8gdGhlIGZyYW1ld29yay4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSA8RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjYWRkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UpIj48Q09ERT5hZGQoVmFsaWRhdG9yTWVzc2FnZSk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ibWVyZ2VSZXN1bHRzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQpIj48IS0tIC0tPjwvQT48SDM+Ci1tZXJnZVJlc3VsdHM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPm1lcmdlUmVzdWx0czwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+Jm5ic3A7cmVzdWx0KTwvUFJFPgotPERMPgotPEREPk1lcmdlIHRoZSBtZXNzYWdlIGNvdW50cyBhbmQgbWVzc2FnZXMgZnJvbSBhbiBpbmRpdmlkdWFsIHZhbGlkYXRvciBpbnRvIHRoaXMgcmVzdWx0LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXN1bHQ8L0NPREU+IC0gaXQgY2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldERlcGVuZHNPbigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXREZXBlbmRzT248L0gzPgotPFBSRT4KLXB1YmxpYyBJUmVzb3VyY2VbXSA8Qj5nZXREZXBlbmRzT248L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHJlc291cmNlcyB0aGF0IHRoZSB2YWxpZGF0ZWQgcmVzb3VyY2UgZGVwZW5kcyBvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TWVzc2FnZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT5bXSA8Qj5nZXRNZXNzYWdlczwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRvci4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hbiBhcnJheSBpcyByZXR1cm5lZCBldmVuIGlmIHRoZXJlIGFyZSBubyBtZXNzYWdlcy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE1lc3NhZ2VzQXNDb3B5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldE1lc3NhZ2VzQXNDb3B5PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+W10gPEI+Z2V0TWVzc2FnZXNBc0NvcHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYSBjb3B5IG9mIGFueSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRoYXQgd2VyZSBhZGRlZCBieSB0aGUgdmFsaWRhdG9yLiBUaGUgYXJyYXkgaXMgYSBuZXcKLSBhcnJheSwgYW5kIGVhY2ggbWVzc2FnZSBpcyBhIGNvcHkuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gYXJyYXkgaXMgcmV0dXJuZWQgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXREZXBlbmRzT24oSVJlc291cmNlW10pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXREZXBlbmRzT248L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldERlcGVuZHNPbjwvQj4oSVJlc291cmNlW10mbmJzcDtkZXBlbmRzT24pPC9QUkU+Ci08REw+Ci08REQ+VXBkYXRlIHRoZSByZXNvdXJjZXMgdGhhdCB0aGUgdmFsaWRhdGVkIHJlc291cmNlIGRlcGVuZHMgb24uIFRoaXMgY2FuIGJlCi0gbGVmdCBudWxsLiBGb3IgZXhhbXBsZSwgYSBYTUwgZmlsZSBtYXkgZGVwZW5kIG9uIGEgWFNEIGZpbGUgaW4gb3JkZXIgdG8KLSBrbm93IGlmIGl0IGlzIHZhbGlkIG9yIG5vdC4gSXQgd291bGQgcGFzcyBiYWNrIHRoYXQgWFNEIGZpbGUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmRlcGVuZHNPbjwvQ09ERT4gLSBJZiB0aGlzIGlzIG51bGwgdGhlbiB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpcyBub3QgdXBkYXRlZC4gVG8KLSAgICAgICAgICAgICAgICByZW1vdmUgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24sIGFuIGVtcHR5IGFycmF5IG5lZWRzIHRvIGJlCi0gICAgICAgICAgICAgICAgc3VwcGxpZWQuIEEgbm9uIG51bGwgcGFyYW1ldGVyLCA8Yj5yZXBsYWNlczwvYj4gYWxsIHRoZSBkZXBlbmRlbmN5Ci0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVzb3VyY2UsIGZvciB0aGlzIHZhbGlkYXRvci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRlZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0ZWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBJUmVzb3VyY2VbXSA8Qj5nZXRWYWxpZGF0ZWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+QWxsIHRoZSByZXNvdXJjZXMgdGhhdCB3ZXJlIHZhbGlkYXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mCi0gICAgICAgIHZhbGlkYXRpbmcgdGhlIG1haW4gcmVzb3VyY2UsIG9yIG51bGwgaWYgbm9uZSB3ZXJlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0VmFsaWRhdGVkKElSZXNvdXJjZVtdKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0VmFsaWRhdGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRWYWxpZGF0ZWQ8L0I+KElSZXNvdXJjZVtdJm5ic3A7dmFsaWRhdGVkKTwvUFJFPgotPERMPgotPEREPkluZGljYXRlIHRoYXQgYWRkaXRpb25hbCByZXNvdXJjZXMgaGF2ZSBiZWVuIHZhbGlkYXRlZCBhcyBwYXJ0IG9mIHRoaXMKLSB2YWxpZGF0ZSBvcGVyYXRpb24uIFNvbWV0aW1lcyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgYSB2YWxpZGF0aW9uIG9uCi0gb25lIHJlc291cmNlIGl0IGlzIG5lY2Vzc2FyeSB0byB2YWxpZGF0ZSBvdGhlciByZXNvdXJjZXMgYXMgd2VsbC4gVGhpcwotIG1ldGhvZCBpcyB1c2VkIHRvIGxldCB0aGUgZnJhbWV3b3JrIGtub3cgYWJvdXQgdGhlc2UgYWRkaXRpb25hbCB2YWxpZGF0ZWQKLSByZXNvdXJjZXMsIHRvIHBvc3NpYmx5IHNhdmUgdGhlbSBiZWluZyB2YWxpZGF0ZWQgcmVkdW5kYW50bHkuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRlZDwvQ09ERT4gLSBBbnkgYWRkaXRpb25hbCByZXNvdXJjZXMgdGhhdCB3ZXJlIHZhbGlkYXRlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNldmVyaXR5RXJyb3IoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2V2ZXJpdHlFcnJvcjwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXRTZXZlcml0eUVycm9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNldmVyaXR5RXJyb3IoaW50KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U2V2ZXJpdHlFcnJvcjwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U2V2ZXJpdHlFcnJvcjwvQj4oaW50Jm5ic3A7c2V2ZXJpdHlFcnJvcik8L1BSRT4KLTxETD4KLTxERD5TZXQgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLSA8cD4KLSBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpbmNyZW1lbnRFcnJvcihpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1pbmNyZW1lbnRFcnJvcjwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5pbmNyZW1lbnRFcnJvcjwvQj4oaW50Jm5ic3A7ZXJyb3JzKTwvUFJFPgotPERMPgotPEREPkluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotIDxwPgotIE1lc3NhZ2VzIGFkZGVkIHRocm91Z2ggdGhlIGFkZChWYWxpZGF0aW9uTWVzc2FnZSkgbWV0aG9kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaGVyZSwgYXMgdGhpcwotIGluZm9ybWF0aW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBWYWxpZGF0aW9uTWVzc2FnZS4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGN1cnJlbnQgbnVtYmVyIG9mIGVycm9ycy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNldmVyaXR5V2FybmluZygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTZXZlcml0eVdhcm5pbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0U2V2ZXJpdHlXYXJuaW5nPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0U2V2ZXJpdHlXYXJuaW5nKGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFNldmVyaXR5V2FybmluZzwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U2V2ZXJpdHlXYXJuaW5nPC9CPihpbnQmbmJzcDtzZXZlcml0eVdhcm5pbmcpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLSA8cD4KLSBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpbmNyZW1lbnRXYXJuaW5nKGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLWluY3JlbWVudFdhcm5pbmc8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+aW5jcmVtZW50V2FybmluZzwvQj4oaW50Jm5ic3A7d2FybmluZ3MpPC9QUkU+Ci08REw+Ci08REQ+SW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLSA8cD4KLSBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBjdXJyZW50IG51bWJlciBvZiB3YXJuaW5ncy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFNldmVyaXR5SW5mbygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTZXZlcml0eUluZm88L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0U2V2ZXJpdHlJbmZvPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0U2V2ZXJpdHlJbmZvKGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFNldmVyaXR5SW5mbzwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U2V2ZXJpdHlJbmZvPC9CPihpbnQmbmJzcDtzZXZlcml0eUluZm8pPC9QUkU+Ci08REw+Ci08REQ+U2V0IHRoZSBudW1iZXIgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLSA8cD4KLSBNZXNzYWdlcyBhZGRlZCB0aHJvdWdoIHRoZSBhZGQoVmFsaWRhdGlvbk1lc3NhZ2UpIG1ldGhvZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGhlcmUsIGFzIHRoaXMKLSBpbmZvcm1hdGlvbiB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgVmFsaWRhdGlvbk1lc3NhZ2UuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpbmNyZW1lbnRJbmZvKGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLWluY3JlbWVudEluZm88L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+aW5jcmVtZW50SW5mbzwvQj4oaW50Jm5ic3A7aW5mbyk8L1BSRT4KLTxETD4KLTxERD5JbmNyZW1lbnQgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotIDxwPgotIE1lc3NhZ2VzIGFkZGVkIHRocm91Z2ggdGhlIGFkZChWYWxpZGF0aW9uTWVzc2FnZSkgbWV0aG9kIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaGVyZSwgYXMgdGhpcwotIGluZm9ybWF0aW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBWYWxpZGF0aW9uTWVzc2FnZS4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGN1cnJlbnQgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQ2FuY2VsZWQoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNDYW5jZWxlZDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNDYW5jZWxlZDwvQj4oKTwvUFJFPgotPERMPgotPEREPldhcyB0aGUgb3BlcmF0aW9uIGNhbmNlbGVkIGJlZm9yZSBpdCBjb21wbGV0ZWQ/IEZvciBleGFtcGxlIGlmIHRoZSB2YWxpZGF0aW9uIGlzIGJlaW5nIHJ1biB0aHJvdWdoIHRoZQotIHVzZXIgaW50ZXJmYWNlLCB0aGUgZW5kIHVzZXIgY2FuIGNhbmNlbCB0aGUgb3BlcmF0aW9uIHRocm91Z2ggdGhlIHByb2dyZXNzIG1vbml0b3IuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0Q2FuY2VsZWQoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldENhbmNlbGVkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRDYW5jZWxlZDwvQj4oYm9vbGVhbiZuYnNwO2NhbmNlbGVkKTwvUFJFPgotPERMPgotPEREPkluZGljYXRlIGlmIHRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5jYW5jZWxlZDwvQ09ERT4gLSBTZXQgdG8gdHJ1ZSBpZiBpdCB3YXMgY2FuY2VsZWQgYW5kIGZhbHNlIGlmIGl0IHdhcyBub3QgY2FuY2VsZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlczwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXROdW1iZXJPZlZhbGlkYXRlZFJlc291cmNlczwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGF0ZWQuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRpb25FeGNlcHRpb24oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdGlvbkV4Y2VwdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbiA8Qj5nZXRWYWxpZGF0aW9uRXhjZXB0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SWYgdGhlIHZhbGlkYXRpb24gZW5kZWQgd2l0aCBhbiBleGNlcHRpb24sIGFuc3dlciBpdC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5udWxsIGlmIHRoZSB2YWxpZGF0b3IgZGlkIG5vdCBmaW5pc2ggd2l0aCBhbiBleGNlcHRpb24uPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRWYWxpZGF0aW9uRXhjZXB0aW9uKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFZhbGlkYXRpb25FeGNlcHRpb248L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFZhbGlkYXRpb25FeGNlcHRpb248L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbiZuYnNwO3ZhbGlkYXRpb25FeGNlcHRpb24pPC9QUkU+Ci08REw+Ci08REQ+SWYgdGhlIHZhbGlkYXRpb24gZmFpbGVkIHdpdGggYW4gZXhjZXB0aW9uLCBpdCBjYW4gYmUgcmVjb3JkZWQgaGVyZS4KLSA8cD4KLSBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBmb3Igb2xkIHZhbGlkYXRvcnMgdG8gZWFzZSB0aGVpciB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgZnJhbWV3b3JrLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+dmFsaWRhdGlvbkV4Y2VwdGlvbjwvQ09ERT4gLSA8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFN1c3BlbmRWYWxpZGF0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFN1c3BlbmRWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVByb2plY3QgPEI+Z2V0U3VzcGVuZFZhbGlkYXRpb248L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHByb2plY3QgdGhhdCB0aGUgdmFsaWRhdG9yIHdvdWxkIGxpa2UgdG8gaGF2ZSBzdXNwZW5kZWQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHByb2plY3QgdG8gc3VzcGVuZCBvciBudWxsLiBUaGUgbm9ybWFsIHJlc3VsdCBpcyBudWxsLCB3aGljaCBtZWFucyB0aGF0Ci0gdGhlIHZhbGlkYXRvciB3aXNoZXMgdG8gcmVjZWl2ZSBub3JtYWwgdmFsaWRhdGlvbiByZXF1ZXN0cy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFN1c3BlbmRWYWxpZGF0aW9uKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0U3VzcGVuZFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFN1c3BlbmRWYWxpZGF0aW9uPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+Q2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGluZm9ybSB0aGUgZnJhbWV3b3JrLCB0aGF0IHRoaXMgdmFsaWRhdG9yIGRvZXMgbm90IHdpc2ggdG8gYmUKLSBjYWxsZWQgYWdhaW4gZm9yIGFueSByZXNvdXJjZXMgaW4gdGhpcyBwcm9qZWN0LCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi0gPHA+Ci0gU29tZSB2YWxpZGF0b3JzIG1heSBoYXZlIGEgcmljaCBzZXQgb2YgdHJpZ2dlcnMsIGJ1dCBvbmNlIHRoZXkgaGF2ZSBiZWVuIGludm9rZWQgb25jZSwKLSBkbyBub3QgbmVlZCB0byBiZSBpbnZva2VkIGFnYWluIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIFRoZSBwcm9qZWN0IHRoYXQgdGhpcyB2YWxpZGF0b3Igbm8gbG9uZ2VyIHdhbnRzIHRvIGJlIG5vdGlmaWVkIG9uLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvblJlc3VsdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1NmVlOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRpb25SZXN1bHRzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdGlvblJlc3VsdHMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0aW9uUmVzdWx0czwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdHM8L0I+Ci08L1BSRT4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBmaW5hbCBjbGFzcyA8Qj5WYWxpZGF0aW9uUmVzdWx0czwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoZSBjb21iaW5lZCByZXN1bHRzIG9mIHZhbGlkYXRpbmcgbXVsdGlwbGUgcmVzb3VyY2VzLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sI1ZhbGlkYXRpb25SZXN1bHRzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQpIj5WYWxpZGF0aW9uUmVzdWx0czwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiZuYnNwO3Jlc3VsdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCNnZXRNZXNzYWdlcygpIj5nZXRNZXNzYWdlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCNnZXRTZXZlcml0eUVycm9yKCkiPmdldFNldmVyaXR5RXJyb3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwjZ2V0U2V2ZXJpdHlJbmZvKCkiPmdldFNldmVyaXR5SW5mbzwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgbnVtYmVyIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sI2dldFNldmVyaXR5V2FybmluZygpIj5nZXRTZXZlcml0eVdhcm5pbmc8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIG51bWJlciBvZiB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVmFsaWRhdGlvblJlc3VsdHMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdCkiPjwhLS0gLS0+PC9BPjxIMz4KLVZhbGlkYXRpb25SZXN1bHRzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VmFsaWRhdGlvblJlc3VsdHM8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiZuYnNwO3Jlc3VsdCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0TWVzc2FnZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVzc2FnZXM8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT5bXSA8Qj5nZXRNZXNzYWdlczwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciBhbnkgdmFsaWRhdGlvbiBtZXNzYWdlcyB0aGF0IHdlcmUgYWRkZWQgYnkgdGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIGFycmF5IGlzIHJldHVybmVkIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIG1lc3NhZ2VzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U2V2ZXJpdHlFcnJvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTZXZlcml0eUVycm9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldFNldmVyaXR5RXJyb3I8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhpcyB2YWxpZGF0aW9uIG9wZXJhdGlvbi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0U2V2ZXJpdHlJbmZvKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNldmVyaXR5SW5mbzwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXRTZXZlcml0eUluZm88L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIG51bWJlciBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGlzIHZhbGlkYXRpb24gb3BlcmF0aW9uLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTZXZlcml0eVdhcm5pbmcoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0U2V2ZXJpdHlXYXJuaW5nPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldFNldmVyaXR5V2FybmluZzwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgbnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgdmFsaWRhdGlvbiBvcGVyYXRpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFiNjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRpb25TdGF0ZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRpb25TdGF0ZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdGlvblN0YXRlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25TdGF0ZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDs8QSBIUkVGPSIjZmllbGRfZGV0YWlsIj5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0aW9uU3RhdGU8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTwvQj4KLTwvUFJFPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGZpbmFsIGNsYXNzIDxCPlZhbGlkYXRpb25TdGF0ZTwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLUtlZXAgdHJhY2sgb2YgYXJiaXRyYXJ5IHZhbGlkYXRpb24gZGF0YSwgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSB2YWxpZGF0aW9uLgotIDxwPgotIFRvIGVuYWJsZSBtb3JlIGVmZmljaWVudCBjYWNoaW5nLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIGFsbG93cyBpbmRpdmlkdWFsIHZhbGlkYXRvcnMgdG8gY2FjaGUKLSBhcmJpdHJhcnkgZGF0YSBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcHJvY2Vzcy4gVXNlIG9mIHRoaXMgb2JqZWN0IGlzIGNvbXBsZXRlbHkgb3B0aW9uYWwuCi0gPHA+Ci0gU2luY2Ugc29tZSB2YWxpZGF0b3JzIHdpc2ggdG8gc2hhcmUgZGF0YSB3aXRoIG90aGVyIHZhbGlkYXRvcnMsIGFueSB2YWxpZGF0b3IgY2FuIHNlZSB0aGUgc3RhdGUgZGF0YSBmb3IKLSBhbnkgb3RoZXIgdmFsaWRhdG9yLCBzaW5jZSB0aGUgaWQgaXMgc2ltcGx5IHRoZSB2YWxpZGF0b3IncyBleHRlbnNpb24gaWQuCi0gPHA+Ci0gVGhpcyBvYmplY3QgaXMgZnJlZWQgYXQgdGhlIGVuZCBvZiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sI1RyaWdnZXJSZXNvdXJjZSI+VHJpZ2dlclJlc291cmNlPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxCPkRlcHJlY2F0ZWQuPC9CPiZuYnNwOzxJPlRoaXMgYXBwcm9hY2ggaXMgbm90IHRocmVhZCBzYWZlLCB0aGUgbG9uZ2VyIGZvcm0gb2YgdGhlIEFic3RyYWN0VmFsaWRhdG9yIHZhbGlkYXRlIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLjwvST48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwjVmFsaWRhdGlvblN0YXRlKCkiPlZhbGlkYXRpb25TdGF0ZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLk9iamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCNnZXQoamF2YS5sYW5nLlN0cmluZykiPmdldDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgc3RhdGUgZGF0YSBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCNwdXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPnB1dDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCwKLSAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTYXZlIHNvbWUgc3RhdGUgaW5mb3JtYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuT2JqZWN0Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBqYXZhLmxhbmcuT2JqZWN0PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+ZXF1YWxzLCBnZXRDbGFzcywgaGFzaENvZGUsIG5vdGlmeSwgbm90aWZ5QWxsLCB0b1N0cmluZywgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBGSUVMRCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJUcmlnZ2VyUmVzb3VyY2UiPjwhLS0gLS0+PC9BPjxIMz4KLVRyaWdnZXJSZXNvdXJjZTwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIDxCPlRyaWdnZXJSZXNvdXJjZTwvQj48L1BSRT4KLTxETD4KLTxERD48Qj5EZXByZWNhdGVkLjwvQj4mbmJzcDs8ST5UaGlzIGFwcHJvYWNoIGlzIG5vdCB0aHJlYWQgc2FmZSwgdGhlIGxvbmdlciBmb3JtIG9mIHRoZSBBYnN0cmFjdFZhbGlkYXRvciB2YWxpZGF0ZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC48L0k+PEREPlRoaXMgaXMgYSBzcGVjaWFsIGlkLgotIDxwPgotIElmIGEgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlZCBvbiBieSBvdGhlcnMgaXMgY2hhbmdlZCwgdGhlbiB0aGUKLSBkZXBlbmRlbnQgcmVzb3VyY2VzIGFyZSB2YWxpZGF0ZWQuIFRoZSBkZXBlbmRlZCBvbiByZXNvdXJjZSwgd2hpY2ggaXMgdGhlCi0gcmVzb3VyY2UgdGhhdCBhY3R1YWxseSBjaGFuZ2VkLCBpcyBwbGFjZWQgaW50byB0aGUgVmFsaWRhdGlvblN0YXRlIHVzaW5nCi0gdGhpcyBpZC4KLSA8L3A+Ci08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPkFic3RyYWN0VmFsaWRhdG9yI3ZhbGlkYXRlKFZhbGlkYXRpb25FdmVudCwgVmFsaWRhdGlvblN0YXRlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcik8L0NPREU+PC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3JfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9IlZhbGlkYXRpb25TdGF0ZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1WYWxpZGF0aW9uU3RhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5WYWxpZGF0aW9uU3RhdGU8L0I+KCk8L1BSRT4KLTxETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0icHV0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1wdXQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnB1dDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDt2YWx1ZSk8L1BSRT4KLTxETD4KLTxERD5TYXZlIHNvbWUgc3RhdGUgaW5mb3JtYXRpb24uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmlkPC9DT0RFPiAtIEJ5IGNvbnZlbnRpb24gdGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhbGlkYXRvciBleHRlbnNpb24gaWQuCi0gICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLkhUTUxWYWxpZGF0b3I8REQ+PENPREU+dmFsdWU8L0NPREU+IC0gQW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bC4gVGhlCi0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgb2JqZWN0IGV4Y2VwdAotICAgICAgICAgICAgICAgIHBhc3MgaXQgYWxvbmcgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXQoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5PYmplY3QgPEI+Z2V0PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBzdGF0ZSBkYXRhIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdG9yLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5pZDwvQ09ERT4gLSBCeSBjb252ZW50aW9uIHRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICAgaWQuIEZvciBleGFtcGxlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLkhUTUxWYWxpZGF0b3IKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW55IGFyYml0cmFyeSBkYXRhIHRoYXQgdGhlIHZhbGlkYXRvciBtaWdodCBmaW5kIHVzZWZ1bCwKLSAgICAgICAgaW5jbHVkaW5nIG51bGwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0aW9uU3RhdGUuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNmaWVsZF9zdW1tYXJ5Ij5GSUVMRDwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZDI1OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotVmFsaWRhdG9yLkxldmVsCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdG9yLkxldmVsIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0b3IuTGV2ZWwuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvRk9OVD4KLTxCUj4KLUVudW0gVmFsaWRhdG9yLkxldmVsPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj5qYXZhLmxhbmcuRW51bSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4mZ3Q7Ci0gICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLkxldmVsPC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+amF2YS5pby5TZXJpYWxpemFibGUsIGphdmEubGFuZy5Db21wYXJhYmxlJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPiZndDs8L0REPgotPC9ETD4KLTxETD4KLTxEVD48Qj5FbmNsb3NpbmcgY2xhc3M6PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgc3RhdGljIGVudW0gPEI+VmFsaWRhdG9yLkxldmVsPC9CPjxEVD5leHRlbmRzIGphdmEubGFuZy5FbnVtJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPiZndDs8L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhlIGxldmVsIG9mIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2YWxpZGF0b3IuCi0gPHVsPgotIDxsaT5FeHRlbnNpb24gLSBEZWZpbmVkIGJ5IGFuIGV4dGVuc2lvbiBwb2ludC48L2xpPgotIDxsaT5HbG9iYWwgLSBEZWZpbmVkIGJ5IGEgZ2xvYmFsIHByZWZlcmVuY2UuPC9saT4KLSA8bGk+UHJvamVjdCAtIERlZmluZWQgYnkgYSBwcm9qZWN0IHByb3BlcnR5LjwvbGk+Ci0gPC91bD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEVOVU0gQ09OU1RBTlQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZW51bV9jb25zdGFudF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sI0V4dGVuc2lvbiI+RXh0ZW5zaW9uPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwjR2xvYmFsIj5HbG9iYWw8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCNQcm9qZWN0Ij5Qcm9qZWN0PC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPnZhbHVlT2Y8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCN2YWx1ZXMoKSI+dmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19qYXZhLmxhbmcuRW51bSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLkVudW08L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5jb21wYXJlVG8sIGVxdWFscywgZ2V0RGVjbGFyaW5nQ2xhc3MsIGhhc2hDb2RlLCBuYW1lLCBvcmRpbmFsLCB0b1N0cmluZywgdmFsdWVPZjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5nZXRDbGFzcywgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRU5VTSBDT05TVEFOVCBERVRBSUwgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImVudW1fY29uc3RhbnRfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+RW51bSBDb25zdGFudCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iRXh0ZW5zaW9uIj48IS0tIC0tPjwvQT48SDM+Ci1FeHRlbnNpb248L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+IDxCPkV4dGVuc2lvbjwvQj48L1BSRT4KLTxETD4KLTxETD4KLTwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJHbG9iYWwiPjwhLS0gLS0+PC9BPjxIMz4KLUdsb2JhbDwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyBmaW5hbCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4gPEI+R2xvYmFsPC9CPjwvUFJFPgotPERMPgotPERMPgotPC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlByb2plY3QiPjwhLS0gLS0+PC9BPjxIMz4KLVByb2plY3Q8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+IDxCPlByb2plY3Q8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2YWx1ZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPltdIDxCPnZhbHVlczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLiAgVGhpcyBtZXRob2QgbWF5IGJlIHVzZWQgdG8gaXRlcmF0ZQotb3ZlciB0aGUgY29uc3RhbnRzIGFzIGZvbGxvd3M6Ci08cHJlPgotZm9yIChWYWxpZGF0b3IuTGV2ZWwgYyA6IFZhbGlkYXRvci5MZXZlbC52YWx1ZXMoKSkKLSZuYnNwOyAgIFN5c3RlbS5vdXQucHJpbnRsbihjKTsKLTwvcHJlPgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50cyBvZiB0aGlzIGVudW0gdHlwZSwgaW4KLXRoZSBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZDwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsdWVPZjwvSDM+Ci08UFJFPgotcHVibGljIHN0YXRpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4gPEI+dmFsdWVPZjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi1UaGUgc3RyaW5nIG11c3QgbWF0Y2ggPEk+ZXhhY3RseTwvST4gYW4gaWRlbnRpZmllciB1c2VkIHRvIGRlY2xhcmUgYW4KLWVudW0gY29uc3RhbnQgaW4gdGhpcyB0eXBlLiAgKEV4dHJhbmVvdXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSAKLW5vdCBwZXJtaXR0ZWQuKQotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5uYW1lPC9DT0RFPiAtIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50IHRvIGJlIHJldHVybmVkLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgZW51bSBjb25zdGFudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotPERUPjxCPlRocm93czo8L0I+Ci08REQ+PENPREU+amF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvQ09ERT4gLSBpZiB0aGlzIGVudW0gdHlwZSBoYXMgbm8gY29uc3RhbnQKLXdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi08REQ+PENPREU+amF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uPC9DT0RFPiAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0b3IuTGV2ZWwuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZW51bV9jb25zdGFudF9zdW1tYXJ5Ij5FTlVNIENPTlNUQU5UUzwvQT4mbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNlbnVtX2NvbnN0YW50X2RldGFpbCI+RU5VTSBDT05TVEFOVFM8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhZTk1Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotVmFsaWRhdG9yLlYxLlYxQ29weQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRvci5WMS5WMUNvcHkiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc2VzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0b3IuVjEuVjFDb3B5PC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I8L0E+Ci0gICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxPC9BPgotICAgICAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjEuVjFDb3B5PC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+amF2YS5sYW5nLkNvbXBhcmFibGUmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZndDs8L0REPgotPC9ETD4KLTxETD4KLTxEVD48Qj5FbmNsb3NpbmcgY2xhc3M6PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIDxCPlZhbGlkYXRvci5WMS5WMUNvcHk8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPjwvREw+Ci08L1BSRT4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibmVzdGVkX2NsYXNzZXNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TmVzdGVkIGNsYXNzZXMvaW50ZXJmYWNlcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMS5WMUNvcHk8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPEEgTkFNRT0ibmVzdGVkX2NsYXNzZXNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TmVzdGVkIGNsYXNzZXMvaW50ZXJmYWNlcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCNWYWxpZGF0b3IuVjEuVjFDb3B5KFZhbGlkYXRvck1ldGFEYXRhLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgSVByb2plY3QpIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPjwvQj4oVmFsaWRhdG9yTWV0YURhdGEmbmJzcDt2bWQsCi0gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJm5ic3A7dmMsCi0gICAgICAgICAgICAgICAgICAgIElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwjc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj5zZXRCdWlsZFZhbGlkYXRpb248L0E+PC9CPihib29sZWFuJm5ic3A7Ym9vbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+PC9CPihib29sZWFuJm5ic3A7Ym9vbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYXMgcGFydCBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2FzVjFWYWxpZGF0b3IoKSI+YXNWMVZhbGlkYXRvcjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNnZXRJZCgpIj5nZXRJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2dldFZhbGlkYXRvckNsYXNzbmFtZSgpIj5nZXRWYWxpZGF0b3JDbGFzc25hbWU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNnZXRWbWQoKSI+Z2V0Vm1kPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibWV0aG9kc19pbmhlcml0ZWRfZnJvbV9jbGFzc19vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPmFzVjJWYWxpZGF0b3I8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNidW1wQ2hhbmdlQ291bnRHbG9iYWwoKSI+YnVtcENoYW5nZUNvdW50R2xvYmFsPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYnVtcENoYW5nZUNvdW50TWVzc2FnZXMoKSI+YnVtcENoYW5nZUNvdW50TWVzc2FnZXM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjbGVhbihJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+Y2xlYW48L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjb21wYXJlVG8ob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+Y29tcGFyZVRvPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29weSgpIj5jb3B5PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKElDb25maWd1cmF0aW9uRWxlbWVudCwgSVByb2plY3QpIj5jcmVhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjcmVhdGUoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPmNyZWF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldENoYW5nZUNvdW50R2xvYmFsKCkiPmdldENoYW5nZUNvdW50R2xvYmFsPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0Q2hhbmdlQ291bnRNZXNzYWdlcygpIj5nZXRDaGFuZ2VDb3VudE1lc3NhZ2VzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0RGVsZWdhdGluZ0lkKCkiPmdldERlbGVnYXRpbmdJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1hcmtlcklkKCkiPmdldE1hcmtlcklkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0TWVzc2FnZShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0TWVzc2FnZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2VTZXR0aW5ncygpIj5nZXRNZXNzYWdlU2V0dGluZ3M8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRQcm9qZWN0KCkiPmdldFByb2plY3Q8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRTb3VyY2VJZCgpIj5nZXRTb3VyY2VJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldFZlcnNpb24oKSI+Z2V0VmVyc2lvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2hhc0dsb2JhbENoYW5nZXMoKSI+aGFzR2xvYmFsQ2hhbmdlczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2hhc2hDb2RlRm9yQ29uZmlnKCkiPmhhc2hDb2RlRm9yQ29uZmlnPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaXNCdWlsZFZhbGlkYXRpb24oKSI+aXNCdWlsZFZhbGlkYXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0NoYW5nZWQoKSI+aXNDaGFuZ2VkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaXNNYW51YWxWYWxpZGF0aW9uKCkiPmlzTWFudWFsVmFsaWRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Jlc2V0Q2hhbmdlQ291bnRlcnMoKSI+cmVzZXRDaGFuZ2VDb3VudGVyczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NhbWVDb25maWcob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+c2FtZUNvbmZpZzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldERlbGVnYXRpbmdJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0RGVsZWdhdGluZ0lkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0TWFya2VySWQoamF2YS5sYW5nLlN0cmluZykiPnNldE1hcmtlcklkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0U291cmNlSWQoamF2YS5sYW5nLlN0cmluZykiPnNldFNvdXJjZUlkPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0VmVyc2lvbihpbnQpIj5zZXRWZXJzaW9uPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkQ2xlYXJNYXJrZXJzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPnNob3VsZENsZWFyTWFya2VyczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbikiPnNob3VsZFZhbGlkYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlKSI+c2hvdWxkVmFsaWRhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZVByb2plY3QoSVByb2plY3QsIGJvb2xlYW4sIGJvb2xlYW4pIj5zaG91bGRWYWxpZGF0ZVByb2plY3Q8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZVByb2plY3QoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUpIj5zaG91bGRWYWxpZGF0ZVByb2plY3Q8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN0b1N0cmluZygpIj50b1N0cmluZzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPnZhbGlkYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uU3RhcnRpbmc8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJWYWxpZGF0b3IuVjEuVjFDb3B5KFZhbGlkYXRvck1ldGFEYXRhLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgSVByb2plY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1WYWxpZGF0b3IuVjEuVjFDb3B5PC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQj4oVmFsaWRhdG9yTWV0YURhdGEmbmJzcDt2bWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiZuYnNwO3ZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRNYW51YWxWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zZXRNYW51YWxWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7Ym9vbCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5TZXQgd2hldGhlciB0aGlzIHZhbGlkYXRvciBzaG91bGQgYmUgdHJpZ2dlcmVkIGFzIHBhcnQgb2YgYSBtYW51YWwgdmFsaWRhdGlvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4pIj5zZXRNYW51YWxWYWxpZGF0aW9uPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgc2V0dGluZyBjaGFuZ2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRCdWlsZFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNldEJ1aWxkVmFsaWRhdGlvbjwvQj4oYm9vbGVhbiZuYnNwO2Jvb2wpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gY2xhc3M6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuKSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5TZXQgd2hldGhlciB0aGlzIHZhbGlkYXRvciBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBidWlsZCBwcm9jZXNzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI3NldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuKSI+c2V0QnVpbGRWYWxpZGF0aW9uPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgc2V0dGluZyBjaGFuZ2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDs8QSBIUkVGPSIjbmVzdGVkX2NsYXNzZXNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxIj5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTBlMGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotVmFsaWRhdG9yLlYxCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdG9yLlYxIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0b3IuVjEuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5WMS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0b3IuVjE8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjwvQT4KLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjE8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jmd0OzwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkRpcmVjdCBLbm93biBTdWJjbGFzc2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPjwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBzdGF0aWMgY2xhc3MgPEI+VmFsaWRhdG9yLlYxPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotQSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjEuVjFDb3B5PC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im5lc3RlZF9jbGFzc2VzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk5lc3RlZCBjbGFzc2VzL2ludGVyZmFjZXMgaW5oZXJpdGVkIGZyb20gY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q29uc3RydWN0b3IgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNWYWxpZGF0b3IuVjEoVmFsaWRhdG9yTWV0YURhdGEsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBJUHJvamVjdCkiPlZhbGlkYXRvci5WMTwvQT48L0I+KFZhbGlkYXRvck1ldGFEYXRhJm5ic3A7dm1kLAotICAgICAgICAgICAgIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJm5ic3A7Y29uZmlnLAotICAgICAgICAgICAgIElQcm9qZWN0Jm5ic3A7cHJvamVjdCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZSBhIG5ldyB2ZXJzaW9uIDEgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI2FzVjFWYWxpZGF0b3IoKSI+YXNWMVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHlvdSBhcmUgYSB2ZXJzaW9uIDEgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjY29weShib29sZWFuKSI+Y29weTwvQT48L0I+KGJvb2xlYW4mbmJzcDtpbmNsdWRlQ2hhbmdlQ291bnRzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNnZXROYW1lKCkiPmdldE5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7VmFsaWRhdG9yTWV0YURhdGE8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjZ2V0Vm1kKCkiPmdldFZtZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sI3NldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuKSI+c2V0QnVpbGRWYWxpZGF0aW9uPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2J1aWxkVmFsaWRhdGlvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+c2V0TWFudWFsVmFsaWRhdGlvbjwvQT48L0I+KGJvb2xlYW4mbmJzcDttYW51YWxWYWxpZGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uRmluaXNoaW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMlZhbGlkYXRvcigpIj5hc1YyVmFsaWRhdG9yPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYnVtcENoYW5nZUNvdW50R2xvYmFsKCkiPmJ1bXBDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2J1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzKCkiPmJ1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY2xlYW4oSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPmNsZWFuPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29tcGFyZVRvKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmNvbXBhcmVUbzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoKSI+Y29weTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIElQcm9qZWN0KSI+Y3JlYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKFZhbGlkYXRvck1ldGFEYXRhLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgSVByb2plY3QpIj5jcmVhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRDaGFuZ2VDb3VudEdsb2JhbCgpIj5nZXRDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldENoYW5nZUNvdW50TWVzc2FnZXMoKSI+Z2V0Q2hhbmdlQ291bnRNZXNzYWdlczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldERlbGVnYXRpbmdJZCgpIj5nZXREZWxlZ2F0aW5nSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNYXJrZXJJZCgpIj5nZXRNYXJrZXJJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykiPmdldE1lc3NhZ2U8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlU2V0dGluZ3MoKSI+Z2V0TWVzc2FnZVNldHRpbmdzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0UHJvamVjdCgpIj5nZXRQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0U291cmNlSWQoKSI+Z2V0U291cmNlSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWZXJzaW9uKCkiPmdldFZlcnNpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNHbG9iYWxDaGFuZ2VzKCkiPmhhc0dsb2JhbENoYW5nZXM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNoQ29kZUZvckNvbmZpZygpIj5oYXNoQ29kZUZvckNvbmZpZzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzQnVpbGRWYWxpZGF0aW9uKCkiPmlzQnVpbGRWYWxpZGF0aW9uPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaXNDaGFuZ2VkKCkiPmlzQ2hhbmdlZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj5pc01hbnVhbFZhbGlkYXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNyZXNldENoYW5nZUNvdW50ZXJzKCkiPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzYW1lQ29uZmlnKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPnNhbWVDb25maWc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXREZWxlZ2F0aW5nSWQoamF2YS5sYW5nLlN0cmluZykiPnNldERlbGVnYXRpbmdJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldE1hcmtlcklkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRNYXJrZXJJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldFNvdXJjZUlkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRTb3VyY2VJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldFZlcnNpb24oaW50KSI+c2V0VmVyc2lvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj5zaG91bGRDbGVhck1hcmtlcnM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj5zaG91bGRWYWxpZGF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSkiPnNob3VsZFZhbGlkYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBib29sZWFuLCBib29sZWFuKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdG9TdHJpbmcoKSI+dG9TdHJpbmc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj52YWxpZGF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVmFsaWRhdG9yLlYxKFZhbGlkYXRvck1ldGFEYXRhLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgSVByb2plY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1WYWxpZGF0b3IuVjE8L0gzPgotPFBSRT4KLXB1YmxpYyA8Qj5WYWxpZGF0b3IuVjE8L0I+KFZhbGlkYXRvck1ldGFEYXRhJm5ic3A7dm1kLAotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiZuYnNwO2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPEREPkNyZWF0ZSBhIG5ldyB2ZXJzaW9uIDEgdmFsaWRhdG9yLgotPFA+Ci08REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZtZDwvQ09ERT4gLSA8REQ+PENPREU+Y29uZmlnPC9DT0RFPiAtIHRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIGdsb2JhbCBlbmFibGVtZW50IG9wdGlvbnMuIEluIHNvbWUgY2FzZSB0aGlzIGNhbiBiZSBudWxsLjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRpb25GaW5pc2hpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnZhbGlkYXRpb25GaW5pc2hpbmc8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5UaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIEl0IGFsbG93cyB2YWxpZGF0b3JzIHRvIHBlcmZvcm0gYW55Ci0gY2xlYW51cCB0aGF0IHRoZXkgbWlnaHQgbmVlZCB0byBkby4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uRmluaXNoaW5nPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gdGhlIHByb2plY3QgdGhhdCB3YXMgdmFsaWRhdGVkLiBUaGUgdmVyeSBsYXN0IGNhbGwgaW4gdGhlIHZhbGlkYXRpb24gd2lsbCBzZXQgdGhpcyB0byAKLSBudWxsIHNvIHRoYXQgdGhlIHZhbGlkYXRvciBrbm93cyB0aGF0IGFsbCB0aGUgcHJvamVjdHMgaGF2ZSBub3cgYmVlbiB2YWxpZGF0ZWQuPEREPjxDT0RFPnN0YXRlPC9DT0RFPiAtIGEgd2F5IHRvIHBhc3MgYXJiaXRyYXJ5LCB2YWxpZGF0b3Igc3BlY2lmaWMsIGRhdGEgZnJvbSBvbmUgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0bwotIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gdGhlIG1vbml0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGlmIHRoZSBjbGVhbiB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzSVZhbGlkYXRvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1hc0lWYWxpZGF0b3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiA8Qj5hc0lWYWxpZGF0b3I8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJhc1YxVmFsaWRhdG9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzVjFWYWxpZGF0b3I8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+IDxCPmFzVjFWYWxpZGF0b3I8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMVZhbGlkYXRvcigpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPklmIHlvdSBhcmUgYSB2ZXJzaW9uIDEgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMVZhbGlkYXRvcigpIj5hc1YxVmFsaWRhdG9yPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNvcHkoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLWNvcHk8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmNvcHk8L0I+KGJvb2xlYW4mbmJzcDtpbmNsdWRlQ2hhbmdlQ291bnRzKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjb3B5KGJvb2xlYW4pIj5jb3B5PC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE5hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TmFtZTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXROYW1lKCkiPmdldE5hbWU8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Vm1kKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZtZDwvSDM+Ci08UFJFPgotcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIDxCPmdldFZtZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvckNsYXNzbmFtZTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gY2xhc3M6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldFZhbGlkYXRvckNsYXNzbmFtZSgpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPkFuc3dlciB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPmdldFZhbGlkYXRvckNsYXNzbmFtZTwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRJZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRJZDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0SWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRCdWlsZFZhbGlkYXRpb248L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNldEJ1aWxkVmFsaWRhdGlvbjwvQj4oYm9vbGVhbiZuYnNwO2J1aWxkVmFsaWRhdGlvbik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlNldCB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGJ1aWxkIHByb2Nlc3MuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2xlYW4pIj5zZXRCdWlsZFZhbGlkYXRpb248L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4pIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRNYW51YWxWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zZXRNYW51YWxWYWxpZGF0aW9uPC9CPihib29sZWFuJm5ic3A7bWFudWFsVmFsaWRhdGlvbik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5TZXQgd2hldGhlciB0aGlzIHZhbGlkYXRvciBzaG91bGQgYmUgdHJpZ2dlcmVkIGFzIHBhcnQgb2YgYSBtYW51YWwgdmFsaWRhdGlvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4pIj5zZXRNYW51YWxWYWxpZGF0aW9uPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgc2V0dGluZyBjaGFuZ2VkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+IDxCPnZhbGlkYXRlPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+VmFsaWRhdGUgdGhlIHJlc291cmNlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLjxERD48Q09ERT5raW5kPC9DT0RFPiAtIFRoZSBraW5kIG9mIHJlc291cmNlIGNoYW5nZSwgc2VlIElSZXNvdXJjZURlbHRhIGZvciB2YWx1ZXMuPEREPjxDT0RFPm9wZXJhdGlvbjwvQ09ERT4gLSBUaGUgb3BlcmF0aW9uIHRoYXQgdGhpcyB2YWxpZGF0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuIFRoaXMgY2FuCi0gICAgICAgICAgICBiZSBudWxsLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIEEgd2F5IHRvIHJlcG9ydCBwcm9ncmVzcy4gVGhpcyBjYW4gYmUgbnVsbC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc3VsdCBvZiBkb2luZyB0aGUgdmFsaWRhdGlvbiwgaXQgY2FuIGJlLCBidXQgdXN1YWxseSBpc24ndAotICAgICAgICAgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYxLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOGI3YWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotVmFsaWRhdG9yLlYyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVmFsaWRhdG9yLlYyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0b3IuVjIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc2VzX2luaGVyaXRlZF9mcm9tX2NsYXNzX29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0b3IuVjI8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjwvQT4KLSAgICAgIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjI8L0I+Ci08L1BSRT4KLTxETD4KLTxEVD48Qj5BbGwgSW1wbGVtZW50ZWQgSW50ZXJmYWNlczo8L0I+IDxERD5qYXZhLmxhbmcuQ29tcGFyYWJsZSZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jmd0OzwvREQ+Ci08L0RMPgotPERMPgotPERUPjxCPkVuY2xvc2luZyBjbGFzczo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgPEI+VmFsaWRhdG9yLlYyPC9CPjxEVD5leHRlbmRzIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotQSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7PEEgTkFNRT0ibmVzdGVkX2NsYXNzZXNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TmVzdGVkIGNsYXNzZXMvaW50ZXJmYWNlcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotCi08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2FkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCkiPmFkZDwvQT48L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJm5ic3A7ZmcpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2FzVjJWYWxpZGF0b3IoKSI+YXNWMlZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHlvdSBhcmUgYSB2ZXJzaW9uIDIgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjYnVtcENoYW5nZUNvdW50R3JvdXBzKCkiPmJ1bXBDaGFuZ2VDb3VudEdyb3VwczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TGV0IHRoZSB2YWxpZGF0b3Iga25vdyB0aGF0IGEgY2xlYW4gaXMgYWJvdXQgdG8gaGFwcGVuLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+PC9CPihib29sZWFuJm5ic3A7aW5jbHVkZUNoYW5nZUNvdW50cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKSI+Z2V0QWRhcHRlcjwvQT48L0I+KGphdmEubGFuZy5DbGFzcyZuYnNwO2FkYXB0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldENoYW5nZUNvdW50R3JvdXBzKCkiPmdldENoYW5nZUNvdW50R3JvdXBzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldERlbGVnYXRlZFZhbGlkYXRvcigpIj5nZXREZWxlZ2F0ZWRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGFjdHVhbCB2YWxpZGF0b3IgdGhhdCBpcyBnb2luZyB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cFtdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldEdyb3VwcygpIj5nZXRHcm91cHM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvcidzIGZpbHRlciBncm91cHMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldExldmVsKCkiPmdldExldmVsPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjZ2V0TmFtZSgpIj5nZXROYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldFZhbGlkYXRvcigpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZ1tdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldFZhbGlkYXRvckdyb3VwcygpIj5nZXRWYWxpZGF0b3JHcm91cHM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2hhc2hDb2RlRm9yQ29uZmlnKCkiPmhhc2hDb2RlRm9yQ29uZmlnPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgaGFzaCBjb2RlIGZvciB0aGUgY29uZmlndXJhYmxlIGZpZWxkcyBzbyB0aGF0IHdlIGNhbiBxdWlja2x5IGRldGVybWluZSBpZiB0d28KLSB2YWxpZGF0b3JzIGFyZSB0aGUgc2FtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNpc0NoYW5nZWQoKSI+aXNDaGFuZ2VkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SGFzIHRoZSB2YWxpZGF0b3IgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBjcmVhdGVkIG9yIGNvcGllZD88L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNyZW1vdmUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXApIj5yZW1vdmU8L0E+PC9CPihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCZuYnNwO2dyb3VwKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjcmVwbGFjZUZpbHRlckdyb3VwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCkiPnJlcGxhY2VGaWx0ZXJHcm91cDwvQT48L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJm5ic3A7ZXhpc3RpbmcsCi0gICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXAmbmJzcDttZXJnZWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNyZXNldENoYW5nZUNvdW50ZXJzKCkiPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNzZXREZWxlZ2F0aW5nSWQoamF2YS5sYW5nLlN0cmluZykiPnNldERlbGVnYXRpbmdJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZWxlZ2F0aW5nKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3NldEdyb3VwcyhqYXZhLnV0aWwuTGlzdCkiPnNldEdyb3VwczwvQT48L0I+KGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJmd0OyZuYnNwO2dyb3Vwcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3NldElkKGphdmEubGFuZy5TdHJpbmcpIj5zZXRJZDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3NldExldmVsKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbCkiPnNldExldmVsPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Jm5ic3A7bGV2ZWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpIj5zZXROYW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLSB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSB0aGUgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj52YWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yLAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uU3RhcnRpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGFueSB2YWxpZGF0aW9uIHRha2VzIHBsYWNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9CPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMVZhbGlkYXRvcigpIj5hc1YxVmFsaWRhdG9yPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYnVtcENoYW5nZUNvdW50R2xvYmFsKCkiPmJ1bXBDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2J1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzKCkiPmJ1bXBDaGFuZ2VDb3VudE1lc3NhZ2VzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29tcGFyZVRvKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmNvbXBhcmVUbzwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoKSI+Y29weTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIElQcm9qZWN0KSI+Y3JlYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKFZhbGlkYXRvck1ldGFEYXRhLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiwgSVByb2plY3QpIj5jcmVhdGU8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRDaGFuZ2VDb3VudEdsb2JhbCgpIj5nZXRDaGFuZ2VDb3VudEdsb2JhbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldENoYW5nZUNvdW50TWVzc2FnZXMoKSI+Z2V0Q2hhbmdlQ291bnRNZXNzYWdlczwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldERlbGVnYXRpbmdJZCgpIj5nZXREZWxlZ2F0aW5nSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNYXJrZXJJZCgpIj5nZXRNYXJrZXJJZDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykiPmdldE1lc3NhZ2U8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlU2V0dGluZ3MoKSI+Z2V0TWVzc2FnZVNldHRpbmdzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0UHJvamVjdCgpIj5nZXRQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0U291cmNlSWQoKSI+Z2V0U291cmNlSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWZXJzaW9uKCkiPmdldFZlcnNpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNHbG9iYWxDaGFuZ2VzKCkiPmhhc0dsb2JhbENoYW5nZXM8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0J1aWxkVmFsaWRhdGlvbigpIj5pc0J1aWxkVmFsaWRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj5pc01hbnVhbFZhbGlkYXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzYW1lQ29uZmlnKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPnNhbWVDb25maWc8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPnNldEJ1aWxkVmFsaWRhdGlvbjwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldE1hbnVhbFZhbGlkYXRpb24oYm9vbGVhbikiPnNldE1hbnVhbFZhbGlkYXRpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRNYXJrZXJJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TWFya2VySWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRTb3VyY2VJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0U291cmNlSWQ8L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRWZXJzaW9uKGludCkiPnNldFZlcnNpb248L0E+LCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj5zaG91bGRWYWxpZGF0ZTwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSkiPnNob3VsZFZhbGlkYXRlPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBib29sZWFuLCBib29sZWFuKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlKSI+c2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdG9TdHJpbmcoKSI+dG9TdHJpbmc8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFkZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+YWRkPC9CPihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCZuYnNwO2ZnKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYXNJVmFsaWRhdG9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzSVZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+IDxCPmFzSVZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc0lWYWxpZGF0b3IoKSI+YXNJVmFsaWRhdG9yPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzVjJWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotYXNWMlZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT4gPEI+YXNWMlZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+SWYgeW91IGFyZSBhIHZlcnNpb24gMiB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPmFzVjJWYWxpZGF0b3I8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY2xlYW4oSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLWNsZWFuPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5jbGVhbjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+TGV0IHRoZSB2YWxpZGF0b3Iga25vdyB0aGF0IGEgY2xlYW4gaXMgYWJvdXQgdG8gaGFwcGVuLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgY2xlYW5lZC4gVGhpcyBjYW4gYmUgbnVsbCB3aGljaCBtZWFucyB0aGF0IHRoZSB3b3Jrc3BhY2UKLSBpcyBiZWluZyBjbGVhbmVkIChpbiB3aGljaCBjYXNlIGEgc2VwYXJhdGUgY2FsbCB3aWxsIGJlIG1hZGUgZm9yIGVhY2ggb3BlbiBwcm9qZWN0KS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY29weShib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotY29weTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4gPEI+Y29weTwvQj4oYm9vbGVhbiZuYnNwO2luY2x1ZGVDaGFuZ2VDb3VudHMpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0Q2hhbmdlQ291bnRHcm91cHMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Q2hhbmdlQ291bnRHcm91cHM8L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Z2V0Q2hhbmdlQ291bnRHcm91cHM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImJ1bXBDaGFuZ2VDb3VudEdyb3VwcygpIj48IS0tIC0tPjwvQT48SDM+Ci1idW1wQ2hhbmdlQ291bnRHcm91cHM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPmJ1bXBDaGFuZ2VDb3VudEdyb3VwczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TGV2ZWwoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TGV2ZWw8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5MZXZlbDwvQT4gPEI+Z2V0TGV2ZWw8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldExldmVsKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldExldmVsPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRMZXZlbDwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Jm5ic3A7bGV2ZWwpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXREZWxlZ2F0ZWRWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVsZWdhdGVkVmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT4gPEI+Z2V0RGVsZWdhdGVkVmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBhY3R1YWwgdmFsaWRhdG9yIHRoYXQgaXMgZ29pbmcgdG8gcGVyZm9ybSB0aGUgdmFsaWRhdGlvbi4gSWYgdGhpcyBpcyBhIG5vcm1hbCB2YWxpZGF0b3IgdGhpcwotIG1ldGhvZCB3aWxsIHNpbXBseSBhbnN3ZXIgaXRzZWxmLiBIb3dldmVyIGlmIHRoaXMgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvciwgdGhlbiB0aGlzIHdpbGwgYW5zd2VyIHRoZQotICJyZWFsIiB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRJZCgpIj5nZXRJZDwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRHcm91cHMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0R3JvdXBzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXBbXSA8Qj5nZXRHcm91cHM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdGhlIHZhbGlkYXRvcidzIGZpbHRlciBncm91cHMuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gZW1wdHkgYXJyYXkgaWYgdGhlIHZhbGlkYXRvciBkb2VzIG5vdCBoYXZlIGFueSBmaWx0ZXIgZ3JvdXBzLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXROYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXROYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3IoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT4gPEI+Z2V0VmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRWYWxpZGF0b3JDbGFzc25hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TcGVjaWZpZWQgYnk6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWYWxpZGF0b3JDbGFzc25hbWUoKSI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZhbGlkYXRvckdyb3VwcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRWYWxpZGF0b3JHcm91cHM8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gPEI+Z2V0VmFsaWRhdG9yR3JvdXBzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJoYXNoQ29kZUZvckNvbmZpZygpIj48IS0tIC0tPjwvQT48SDM+Ci1oYXNoQ29kZUZvckNvbmZpZzwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5oYXNoQ29kZUZvckNvbmZpZzwvQj4oKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNoQ29kZUZvckNvbmZpZygpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPkFuc3dlciBhIGhhc2ggY29kZSBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBmaWVsZHMgc28gdGhhdCB3ZSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgaWYgdHdvCi0gdmFsaWRhdG9ycyBhcmUgdGhlIHNhbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjaGFzaENvZGVGb3JDb25maWcoKSI+aGFzaENvZGVGb3JDb25maWc8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNDaGFuZ2VkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQ2hhbmdlZDwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNDaGFuZ2VkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVzY3JpcHRpb24gY29waWVkIGZyb20gY2xhc3M6IDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzQ2hhbmdlZCgpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPkhhcyB0aGUgdmFsaWRhdG9yIGNoYW5nZWQgc2luY2UgaXQgd2FzIGxhc3QgY3JlYXRlZCBvciBjb3BpZWQ/IE9yIHdhcyBpdCBtaWdyYXRlZCBmcm9tIGFuIGVhcmxpZXIgdmVyc2lvbi4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0NoYW5nZWQoKSI+aXNDaGFuZ2VkPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRDbGVhck1hcmtlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNob3VsZENsZWFyTWFya2VyczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5TaG91bGQgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZpcnN0IGNsZWFyIHRoZSBtYXJrZXJzIHRoYXQgdGhpcwotIHZhbGlkYXRvciBoYXMgcGxhY2VkIG9uIHRoaXMgcmVzb3VyY2U/IFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5Ci0gdmFsaWRhdG9yIGltcGxlbWVudG9ycyB0byBwcm92aWRlIGEgdmFsaWRhdG9yIHNwZWNpZmljIGJlaGF2aW9yLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj5zaG91bGRDbGVhck1hcmtlcnM8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZXZlbnQ8L0NPREU+IC0gVGhlIHZhbGlkYXRpb24gZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHZhbGlkYXRpb24uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNob3VsZCBmaXJzdCBjbGVhciBhbGwgdGhlCi0gICAgICAgICBtYXJrZXJzIHRoYXQgdGhpcyB2YWxpZGF0b3IgcHJvZHVjZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgIGJlaGF2aW9yLiBSZXR1cm4gZmFsc2UgdG8gbGVhdmUgdGhlIG1hcmtlcnMgdW5jaGFuZ2VkLiBJdCB0aGVuCi0gICAgICAgICBiZWNvbWVzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdmFsaWRhdG9yIHRvIG1hbmFnZSBpdCdzIG93bgotICAgICAgICAgbWFya2VycyBmb3IgdGhpcyByZXNvdXJjZSwgZm9yIHRoaXMgdmFsaWRhdGlvbiBldmVudC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldERlbGVnYXRpbmdJZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0RGVsZWdhdGluZ0lkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXREZWxlZ2F0aW5nSWQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZWxlZ2F0aW5nKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXREZWxlZ2F0aW5nSWQoamF2YS5sYW5nLlN0cmluZykiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+U2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldERlbGVnYXRpbmdJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0RGVsZWdhdGluZ0lkPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmRlbGVnYXRpbmc8L0NPREU+IC0gdGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IgdGhhdCBpcyBhY3R1YWxseSBnb2luZyB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0R3JvdXBzKGphdmEudXRpbC5MaXN0KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0R3JvdXBzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRHcm91cHM8L0I+KGphdmEudXRpbC5MaXN0Jmx0O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJmd0OyZuYnNwO2dyb3Vwcyk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldElkKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRJZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0SWQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldE5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE5hbWU8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldE5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+IDxCPnZhbGlkYXRlPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPlZhbGlkYXRvcjwvQT48L0NPREU+PC9CPjwvREQ+Ci08REQ+VmFsaWRhdGUgdGhlIHJlc291cmNlLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlNwZWNpZmllZCBieTo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLjxERD48Q09ERT5raW5kPC9DT0RFPiAtIFRoZSBraW5kIG9mIHJlc291cmNlIGNoYW5nZSwgc2VlIElSZXNvdXJjZURlbHRhIGZvciB2YWx1ZXMuPEREPjxDT0RFPm9wZXJhdGlvbjwvQ09ERT4gLSBUaGUgb3BlcmF0aW9uIHRoYXQgdGhpcyB2YWxpZGF0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuIFRoaXMgY2FuCi0gICAgICAgICAgICBiZSBudWxsLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIEEgd2F5IHRvIHJlcG9ydCBwcm9ncmVzcy4gVGhpcyBjYW4gYmUgbnVsbC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHJlc3VsdCBvZiBkb2luZyB0aGUgdmFsaWRhdGlvbiwgaXQgY2FuIGJlLCBidXQgdXN1YWxseSBpc24ndAotICAgICAgICAgbnVsbC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+IDxCPnZhbGlkYXRlPC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0I+PC9ERD4KLTxERD5WYWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC48REQ+PENPREU+a2luZDwvQ09ERT4gLSBUaGUga2luZCBvZiByZXNvdXJjZSBjaGFuZ2UsIHNlZSBJUmVzb3VyY2VEZWx0YSBmb3IgdmFsdWVzLjxERD48Q09ERT5vcGVyYXRpb248L0NPREU+IC0gVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyLiBUaGlzIGNhbgotICAgICAgICAgICAgYmUgbnVsbC48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBBIHdheSB0byByZXBvcnQgcHJvZ3Jlc3MuIFRoaXMgY2FuIGJlIG51bGwuPEREPjxDT0RFPmV2ZW50PC9DT0RFPiAtIEFuIGV2ZW50IHRoYXQgZGVzY3JpYmVzIGluIG1vcmUgZGV0YWlsIHdoYXQgc2hvdWxkIGJlCi0gICAgICAgICAgICB2YWxpZGF0ZWQgYW5kIHdoeSBpdCBzaG91bGQgYmUgdmFsaWRhdGVkLiBUaGlzIGNhbiBiZSBudWxsLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgcmVzdWx0IG9mIGRvaW5nIHRoZSB2YWxpZGF0aW9uLCBpdCBjYW4gYmUsIGJ1dCB1c3VhbGx5IGlzbid0Ci0gICAgICAgICBudWxsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0aW9uU3RhcnRpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnZhbGlkYXRpb25TdGFydGluZzwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48Qj5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBjbGFzczogPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLSBpbml0aWFsaXphdGlvbiB0aGF0IHRoZXkgbWlnaHQgbmVlZC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5PdmVycmlkZXM6PC9CPjxERD48Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25TdGFydGluZzwvQT48L0NPREU+IGluIGNsYXNzIDxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIHRoZSBwcm9qZWN0IHRoYXQgaXMgYmVpbmcgdmFsaWRhdGVkLiBGb3IgdGhlIHZlcnkgZmlyc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbiBwaGFzZSwKLSB0aGlzIHdpbGwgYmUgbnVsbC4gVGhhdCBpcyB0aGUgc2lnbmFsIHRvIHRoZSB2YWxpZGF0b3IgdGhhdCBhIHRvcCBsZXZlbCB2YWxpZGF0aW9uIGlzIHN0YXJ0aW5nLgotIFN1YnNlcXVlbnRseSwgdGhlIHByb2plY3Qgd2lsbCBiZSBzZXQsIGFzIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgcHJvamVjdHMgYXJlIHZhbGlkYXRlZC48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gYSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZSBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvCi0gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGlvbkZpbmlzaGluZzwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPjxCPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGNsYXNzOiA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvQj48L0REPgotPEREPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLSBjbGVhbnVwIHRoYXQgdGhleSBtaWdodCBuZWVkIHRvIGRvLgotPFA+Ci08REQ+PERMPgotPERUPjxCPk92ZXJyaWRlczo8L0I+PEREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9DT0RFPiBpbiBjbGFzcyA8Q09ERT48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgcHJvamVjdCB0aGF0IHdhcyB2YWxpZGF0ZWQuIFRoZSB2ZXJ5IGxhc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbiB3aWxsIHNldCB0aGlzIHRvIAotIG51bGwgc28gdGhhdCB0aGUgdmFsaWRhdG9yIGtub3dzIHRoYXQgYWxsIHRoZSBwcm9qZWN0cyBoYXZlIG5vdyBiZWVuIHZhbGlkYXRlZC48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gYSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZSBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvCi0gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBZGFwdGVyPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLk9iamVjdCA8Qj5nZXRBZGFwdGVyPC9CPihqYXZhLmxhbmcuQ2xhc3MmbmJzcDthZGFwdGVyKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVtb3ZlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwKSI+PCEtLSAtLT48L0E+PEgzPgotcmVtb3ZlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5yZW1vdmU8L0I+KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkZpbHRlckdyb3VwJm5ic3A7Z3JvdXApPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZXNldENoYW5nZUNvdW50ZXJzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLXJlc2V0Q2hhbmdlQ291bnRlcnM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlc2V0Q2hhbmdlQ291bnRlcnM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjcmVzZXRDaGFuZ2VDb3VudGVycygpIj5yZXNldENoYW5nZUNvdW50ZXJzPC9BPjwvQ09ERT4gaW4gY2xhc3MgPENPREU+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlcGxhY2VGaWx0ZXJHcm91cChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXApIj48IS0tIC0tPjwvQT48SDM+Ci1yZXBsYWNlRmlsdGVyR3JvdXA8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnJlcGxhY2VGaWx0ZXJHcm91cDwvQj4ob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXAmbmJzcDtleGlzdGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cCZuYnNwO21lcmdlZCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvci5WMi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDs8QSBIUkVGPSIjbmVzdGVkX2NsYXNzZXNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yIj5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ODhhNmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVZhbGlkYXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRvciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvVmFsaWRhdG9yLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwOzxBIEhSRUY9IiNuZXN0ZWRfY2xhc3Nfc3VtbWFyeSI+TkVTVEVEPC9BPiZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3Jfc3VtbWFyeSI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX2RldGFpbCI+Q09OU1RSPC9BPiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0b3I8L0gyPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QKLSAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjwvQj4KLTwvUFJFPgotPERMPgotPERUPjxCPkFsbCBJbXBsZW1lbnRlZCBJbnRlcmZhY2VzOjwvQj4gPEREPmphdmEubGFuZy5Db21wYXJhYmxlJmx0OzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mZ3Q7PC9ERD4KLTwvREw+Ci08REw+Ci08RFQ+PEI+RGlyZWN0IEtub3duIFN1YmNsYXNzZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGFic3RyYWN0IGNsYXNzIDxCPlZhbGlkYXRvcjwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PERUPmltcGxlbWVudHMgamF2YS5sYW5nLkNvbXBhcmFibGUmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZndDs8L0RMPgotPC9QUkU+Ci0KLTxQPgotUmVwcmVzZW50cyBhIHZhbGlkYXRvci4gVGhpcyBnZXRzIGluc3RhbnRpYXRlZCB0aHJvdWdoIG9uZSBvZiB0aGUgdmFsaWRhdG9yIGV4dGVuc2lvbiBwb2ludHMuCi0gPHA+Ci0gPGI+VGhpcyBjbGFzcyBpcyBub3QgQVBJPC9iPi4KLSA8L3A+Ci08UD4KLQotPFA+Ci08SFI+Ci0KLTxQPgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibmVzdGVkX2NsYXNzX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5OZXN0ZWQgQ2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBsZXZlbCBvZiBjb25maWd1cmF0aW9uIGZvciB0aGUgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAyIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjVmFsaWRhdG9yKElQcm9qZWN0KSI+VmFsaWRhdG9yPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc0lWYWxpZGF0b3IoKSI+YXNJVmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjYXNWMVZhbGlkYXRvcigpIj5hc1YxVmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgeW91IGFyZSBhIHZlcnNpb24gMSB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPmFzVjJWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJZiB5b3UgYXJlIGEgdmVyc2lvbiAyIHZhbGlkYXRvciwgYW5zd2VyIHlvdXJzZWxmIGFzIG9uZSwgb3RoZXJ3aXNlIGFuc3dlciBudWxsLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2J1bXBDaGFuZ2VDb3VudEdsb2JhbCgpIj5idW1wQ2hhbmdlQ291bnRHbG9iYWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNidW1wQ2hhbmdlQ291bnRNZXNzYWdlcygpIj5idW1wQ2hhbmdlQ291bnRNZXNzYWdlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHByb2plY3QgaXMgYmVpbmcgY2xlYW5lZCwgdGhpcyBtZXRob2QgZ2l2ZXMgdGhlIHZhbGlkYXRvciBhIGNoYW5jZSB0byBkbyBhbnkgc3BlY2lhbCBjbGVhbnVwLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29tcGFyZVRvKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmNvbXBhcmVUbzwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDb21wYXJlIHlvdXJzZWxmIGJhc2VkIG9uIFZhbGlkYXRvciBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NvcHkoKSI+Y29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGRlZXAgY29weSBvZiB5b3Vyc2VsZi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+YWJzdHJhY3QgJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjb3B5KGJvb2xlYW4pIj5jb3B5PC9BPjwvQj4oYm9vbGVhbiZuYnNwO2luY2x1ZGVDaGFuZ2VDb3VudHMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNjcmVhdGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBJUHJvamVjdCkiPmNyZWF0ZTwvQT48L0I+KElDb25maWd1cmF0aW9uRWxlbWVudCZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICBJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDcmVhdGUgYSBuZXcgdmFsaWRhdG9yIGJhc2VkIG9uIGEgYWJzdHJhY3QgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShWYWxpZGF0b3JNZXRhRGF0YSwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24sIElQcm9qZWN0KSI+Y3JlYXRlPC9BPjwvQj4oVmFsaWRhdG9yTWV0YURhdGEmbmJzcDt2bWQsCi0gICAgICAgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24mbmJzcDtjb25maWcsCi0gICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRvciBiYXNlZCBvbiB2YWxpZGF0b3IgbWV0YSBkYXRhLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0Q2hhbmdlQ291bnRHbG9iYWwoKSI+Z2V0Q2hhbmdlQ291bnRHbG9iYWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldENoYW5nZUNvdW50TWVzc2FnZXMoKSI+Z2V0Q2hhbmdlQ291bnRNZXNzYWdlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldERlbGVnYXRpbmdJZCgpIj5nZXREZWxlZ2F0aW5nSWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtHZXQgdGhlIGlkIG9mIHRoZSAicmVhbCIgdmFsaWRhdG9yLCB0aGF0IGlzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoaXMgZGVsZWdhdGluZwotIHZhbGlkYXRvciBpcyBhc2tlZCB0byB2YWxpZGF0ZSBzb21ldGhpbmcuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPmFic3RyYWN0ICZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0SWQoKSI+Z2V0SWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNYXJrZXJJZCgpIj5nZXRNYXJrZXJJZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0TWVzc2FnZShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0TWVzc2FnZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Jmd0OzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlU2V0dGluZ3MoKSI+Z2V0TWVzc2FnZVNldHRpbmdzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgbWVzc2FnZSBzZXR0aW5ncyB0aGF0IHRoaXMgdmFsaWRhdG9yIGhhcyBkZWZpbmVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5hYnN0cmFjdCAmbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE5hbWUoKSI+Z2V0TmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUHJvamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRQcm9qZWN0KCkiPmdldFByb2plY3Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHByb2plY3QgdGhhdCB5b3Ugd2VyZSBlbmFibGVkIG9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldFNvdXJjZUlkKCkiPmdldFNvdXJjZUlkPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPmFic3RyYWN0ICZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPmdldFZhbGlkYXRvckNsYXNzbmFtZTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRWZXJzaW9uKCkiPmdldFZlcnNpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNoYXNHbG9iYWxDaGFuZ2VzKCkiPmhhc0dsb2JhbENoYW5nZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2hhc2hDb2RlRm9yQ29uZmlnKCkiPmhhc2hDb2RlRm9yQ29uZmlnPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgaGFzaCBjb2RlIGZvciB0aGUgY29uZmlndXJhYmxlIGZpZWxkcyBzbyB0aGF0IHdlIGNhbiBxdWlja2x5IGRldGVybWluZSBpZiB0d28KLSB2YWxpZGF0b3JzIGFyZSB0aGUgc2FtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNpc0J1aWxkVmFsaWRhdGlvbigpIj5pc0J1aWxkVmFsaWRhdGlvbjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lzIHRoaXMgdmFsaWRhdG9yIGN1cnJlbnRseSBlbmFibGVkIGZvciB2YWxpZGF0aW9ucyB0aGF0IGFyZSB0cmlnZ2VyZWQgYnkgYnVpbGRzPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzQ2hhbmdlZCgpIj5pc0NoYW5nZWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtIYXMgdGhlIHZhbGlkYXRvciBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IGNyZWF0ZWQgb3IgY29waWVkPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2lzTWFudWFsVmFsaWRhdGlvbigpIj5pc01hbnVhbFZhbGlkYXRpb248L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJcyB0aGlzIHZhbGlkYXRvciBjdXJyZW50bHkgZW5hYmxlZCBmb3IgdmFsaWRhdGlvbnMgdGhhdCBhcmUgdHJpZ2dlcmVkIG1hbnVhbGx5PzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Jlc2V0Q2hhbmdlQ291bnRlcnMoKSI+cmVzZXRDaGFuZ2VDb3VudGVyczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NhbWVDb25maWcob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+c2FtZUNvbmZpZzwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdHJ1ZSBpZiB5b3UgaGF2ZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGFzIHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbikiPnNldEJ1aWxkVmFsaWRhdGlvbjwvQT48L0I+KGJvb2xlYW4mbmJzcDtidWlsZFZhbGlkYXRpb24pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgd2hldGhlciB0aGlzIHZhbGlkYXRvciBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBidWlsZCBwcm9jZXNzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3NldERlbGVnYXRpbmdJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0RGVsZWdhdGluZ0lkPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2RlbGVnYXRpbmcpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIGlkIG9mIHRoZSAicmVhbCIgdmFsaWRhdG9yLCB0aGF0IGlzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoaXMgZGVsZWdhdGluZwotIHZhbGlkYXRvciBpcyBhc2tlZCB0byB2YWxpZGF0ZSBzb21ldGhpbmcuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+c2V0TWFudWFsVmFsaWRhdGlvbjwvQT48L0I+KGJvb2xlYW4mbmJzcDttYW51YWxWYWxpZGF0aW9uKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0TWFya2VySWQoamF2YS5sYW5nLlN0cmluZykiPnNldE1hcmtlcklkPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21hcmtlcklkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0U291cmNlSWQoamF2YS5sYW5nLlN0cmluZykiPnNldFNvdXJjZUlkPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3NvdXJjZUlkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2V0VmVyc2lvbihpbnQpIj5zZXRWZXJzaW9uPC9BPjwvQj4oaW50Jm5ic3A7dmVyc2lvbik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj5zaG91bGRDbGVhck1hcmtlcnM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTaG91bGQgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZpcnN0IGNsZWFyIHRoZSBtYXJrZXJzIHRoYXQgdGhpcwotIHZhbGlkYXRvciBoYXMgcGxhY2VkIG9uIHRoaXMgcmVzb3VyY2U/PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlLCBib29sZWFuLCBib29sZWFuKSI+c2hvdWxkVmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc0J1aWxkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlCi0gdGhpcyByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUpIj5zaG91bGRWYWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSZuYnNwO3ZhbFR5cGUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUKLSB0aGlzIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCwgYm9vbGVhbiwgYm9vbGVhbikiPnNob3VsZFZhbGlkYXRlUHJvamVjdDwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUgdGhpcyBwcm9qZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3Nob3VsZFZhbGlkYXRlUHJvamVjdChJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSkiPnNob3VsZFZhbGlkYXRlUHJvamVjdDwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlJm5ic3A7dHlwZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0cnVlIGlmIHRoaXMgdmFsaWRhdG9yLCBiYXNlZCBvbiBpdCdzIGZpbHRlcnMsIHNob3VsZCB2YWxpZGF0ZSB0aGlzIHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdG9TdHJpbmcoKSI+dG9TdHJpbmc8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+YWJzdHJhY3QgJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uRmluaXNoaW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDs8QSBOQU1FPSJtZXRob2RzX2luaGVyaXRlZF9mcm9tX2NsYXNzX2phdmEubGFuZy5PYmplY3QiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGNsYXNzIGphdmEubGFuZy5PYmplY3Q8L0I+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT5lcXVhbHMsIGdldENsYXNzLCBoYXNoQ29kZSwgbm90aWZ5LCBub3RpZnlBbGwsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotCi08QSBOQU1FPSJjb25zdHJ1Y3Rvcl9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5Db25zdHJ1Y3RvciBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVmFsaWRhdG9yKElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotVmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+VmFsaWRhdG9yPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImNyZWF0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQsIElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4gPEI+Y3JlYXRlPC9CPihJQ29uZmlndXJhdGlvbkVsZW1lbnQmbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvUFJFPgotPERMPgotPEREPkNyZWF0ZSBhIG5ldyB2YWxpZGF0b3IgYmFzZWQgb24gYSBhYnN0cmFjdCB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcjwvQ09ERT4gLSBUaGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgd3JhcHBlZC48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSBUaGUgcHJvamVjdCB0aGF0IHlvdSBhcmUgZGVmaW5lZCBpbi4gVGhpcyBjYW4gYmUgbnVsbCB3aGljaAotICAgICAgICAgICAgbWVhbnMgdGhhdCB5b3UgYXJlIGEgZ2xvYmFsIHZhbGlkYXRvci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNyZWF0ZShWYWxpZGF0b3JNZXRhRGF0YSwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24sIElQcm9qZWN0KSI+PCEtLSAtLT48L0E+PEgzPgotY3JlYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgc3RhdGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4gPEI+Y3JlYXRlPC9CPihWYWxpZGF0b3JNZXRhRGF0YSZuYnNwO3ZtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiZuYnNwO2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9QUkU+Ci08REw+Ci08REQ+Q3JlYXRlIGEgbmV3IHZhbGlkYXRvciBiYXNlZCBvbiB2YWxpZGF0b3IgbWV0YSBkYXRhLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIFRoZSBwcm9qZWN0IHRoYXQgeW91IGFyZSBkZWZpbmVkIGluLiBUaGlzIGNhbiBiZSBudWxsIHdoaWNoCi0gICAgICAgICAgICBtZWFucyB0aGF0IHlvdSBhcmUgYSBnbG9iYWwgdmFsaWRhdG9yLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYXNWMVZhbGlkYXRvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1hc1YxVmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPiA8Qj5hc1YxVmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SWYgeW91IGFyZSBhIHZlcnNpb24gMSB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYXNWMlZhbGlkYXRvcigpIj48IS0tIC0tPjwvQT48SDM+Ci1hc1YyVmFsaWRhdG9yPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPiA8Qj5hc1YyVmFsaWRhdG9yPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SWYgeW91IGFyZSBhIHZlcnNpb24gMiB2YWxpZGF0b3IsIGFuc3dlciB5b3Vyc2VsZiBhcyBvbmUsIG90aGVyd2lzZSBhbnN3ZXIgbnVsbC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iY2xlYW4oSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLWNsZWFuPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5jbGVhbjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9QUkU+Ci08REw+Ci08REQ+VGhlIHByb2plY3QgaXMgYmVpbmcgY2xlYW5lZCwgdGhpcyBtZXRob2QgZ2l2ZXMgdGhlIHZhbGlkYXRvciBhIGNoYW5jZSB0byBkbyBhbnkgc3BlY2lhbCBjbGVhbnVwLgotIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gdGhlIHByb2plY3QgYmVpbmcgYnVpbHQuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gdGhlIG1vbml0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGlmIHRoZSBjbGVhbiB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNvbXBhcmVUbyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj48IS0tIC0tPjwvQT48SDM+Ci1jb21wYXJlVG88L0gzPgotPFBSRT4KLXB1YmxpYyBpbnQgPEI+Y29tcGFyZVRvPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yKTwvUFJFPgotPERMPgotPEREPkNvbXBhcmUgeW91cnNlbGYgYmFzZWQgb24gVmFsaWRhdG9yIG5hbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+U3BlY2lmaWVkIGJ5OjwvQj48REQ+PENPREU+Y29tcGFyZVRvPC9DT0RFPiBpbiBpbnRlcmZhY2UgPENPREU+amF2YS5sYW5nLkNvbXBhcmFibGUmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZndDs8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJjb3B5KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWNvcHk8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmNvcHk8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYSBkZWVwIGNvcHkgb2YgeW91cnNlbGYuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImNvcHkoYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLWNvcHk8L0gzPgotPFBSRT4KLXB1YmxpYyBhYnN0cmFjdCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IDxCPmNvcHk8L0I+KGJvb2xlYW4mbmJzcDtpbmNsdWRlQ2hhbmdlQ291bnRzKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2hvdWxkQ2xlYXJNYXJrZXJzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNob3VsZENsZWFyTWFya2VyczwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9QUkU+Ci08REw+Ci08REQ+U2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLSB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPyBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieQotIHZhbGlkYXRvciBpbXBsZW1lbnRvcnMgdG8gcHJvdmlkZSBhIHZhbGlkYXRvciBzcGVjaWZpYyBiZWhhdmlvci4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+ZXZlbnQ8L0NPREU+IC0gVGhlIHZhbGlkYXRpb24gZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHZhbGlkYXRpb24uCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNob3VsZCBmaXJzdCBjbGVhciBhbGwgdGhlCi0gICAgICAgICBtYXJrZXJzIHRoYXQgdGhpcyB2YWxpZGF0b3IgcHJvZHVjZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgIGJlaGF2aW9yLiBSZXR1cm4gZmFsc2UgdG8gbGVhdmUgdGhlIG1hcmtlcnMgdW5jaGFuZ2VkLiBJdCB0aGVuCi0gICAgICAgICBiZWNvbWVzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdmFsaWRhdG9yIHRvIG1hbmFnZSBpdCdzIG93bgotICAgICAgICAgbWFya2VycyBmb3IgdGhpcyByZXNvdXJjZSwgZm9yIHRoaXMgdmFsaWRhdGlvbiBldmVudC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNob3VsZFZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zaG91bGRWYWxpZGF0ZTwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUKLSB0aGlzIHJlc291cmNlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZ2xvYmFsIHZhbGlkYXRpb24gb3IKLSBwcm9qZWN0IHZhbGlkYXRpb24gaGFzIGJlZW4gc3VzcGVuZGVkIG9yIG5vdC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIGNoZWNrZWQuPEREPjxDT0RFPmlzTWFudWFsPC9DT0RFPiAtIElmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgbWFudWFsCi0gICAgICAgICAgICB2YWxpZGF0aW9uLjxERD48Q09ERT5pc0J1aWxkPC9DT0RFPiAtIElmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgYnVpbGRlcgotICAgICAgICAgICAgYmFzZWQgdmFsaWRhdGlvbi4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgcmVzb3VyY2Ugc2hvdWxkIGJlIHZhbGlkYXRlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNob3VsZFZhbGlkYXRlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNob3VsZFZhbGlkYXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zaG91bGRWYWxpZGF0ZTwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlJm5ic3A7dmFsVHlwZSk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgdHJ1ZSBpZiB0aGlzIHZhbGlkYXRvciwgYmFzZWQgb24gaXQncyBmaWx0ZXJzLCBzaG91bGQgdmFsaWRhdGUKLSB0aGlzIHJlc291cmNlLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZ2xvYmFsIHZhbGlkYXRpb24gb3IKLSBwcm9qZWN0IHZhbGlkYXRpb24gaGFzIGJlZW4gc3VzcGVuZGVkIG9yIG5vdC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIGNoZWNrZWQuPEREPjxDT0RFPnZhbFR5cGU8L0NPREU+IC0gVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gcGVyZm9ybWluZyB0aGUgY2hlY2suCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHJlc291cmNlIHNob3VsZCBiZSB2YWxpZGF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzaG91bGRWYWxpZGF0ZVByb2plY3QoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUpIj48IS0tIC0tPjwvQT48SDM+Ci1zaG91bGRWYWxpZGF0ZVByb2plY3Q8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNob3VsZFZhbGlkYXRlUHJvamVjdDwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUmbmJzcDt0eXBlKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0cnVlIGlmIHRoaXMgdmFsaWRhdG9yLCBiYXNlZCBvbiBpdCdzIGZpbHRlcnMsIHNob3VsZCB2YWxpZGF0ZSB0aGlzIHByb2plY3QuIFRoaXMgbWV0aG9kCi0gZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIGdsb2JhbCB2YWxpZGF0aW9uIG9yIHByb2plY3QgdmFsaWRhdGlvbiBoYXMgYmVlbiBzdXNwZW5kZWQgb3Igbm90LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5wcm9qZWN0PC9DT0RFPiAtIHRoZSBwcm9qZWN0IHRvIGJlIGNoZWNrZWQ8REQ+PENPREU+dHlwZTwvQ09ERT4gLSBUaGUgdHlwZSBvZiB2YWxpZGF0aW9uIHJlcXVlc3QKLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgcHJvamVjdCBzaG91bGQgYmUgdmFsaWRhdGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2hvdWxkVmFsaWRhdGVQcm9qZWN0KElQcm9qZWN0LCBib29sZWFuLCBib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2hvdWxkVmFsaWRhdGVQcm9qZWN0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zaG91bGRWYWxpZGF0ZVByb2plY3Q8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRydWUgaWYgdGhpcyB2YWxpZGF0b3IsIGJhc2VkIG9uIGl0J3MgZmlsdGVycywgc2hvdWxkIHZhbGlkYXRlIHRoaXMgcHJvamVjdC4gVGhpcyBtZXRob2QKLSBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZ2xvYmFsIHZhbGlkYXRpb24gb3IgcHJvamVjdCB2YWxpZGF0aW9uIGhhcyBiZWVuIHN1c3BlbmRlZCBvciBub3QuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnByb2plY3Q8L0NPREU+IC0gdGhlIHByb2plY3QgdG8gYmUgY2hlY2tlZDxERD48Q09ERT5pc01hbnVhbDwvQ09ERT4gLSBpZiB0cnVlIHRoZW4gdGhpcyB2YWxpZGF0b3IgbXVzdCBhbHNvIGJlIGVuYWJsZWQgZm9yIG1hbnVhbCB2YWxpZGF0aW9uLjxERD48Q09ERT5pc0J1aWxkPC9DT0RFPiAtIGlmIHRydWUgdGhlbiB0aGlzIHZhbGlkYXRvciBtdXN0IGFsc28gYmUgZW5hYmxlZCBmb3IgYnVpbGRlciBiYXNlZCB2YWxpZGF0aW9uLgotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB2YWxpZGF0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyBhYnN0cmFjdCA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4gPEI+dmFsaWRhdGU8L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiZuYnNwO29wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPlZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVzb3VyY2U8L0NPREU+IC0gVGhlIHJlc291cmNlIHRvIGJlIHZhbGlkYXRlZC48REQ+PENPREU+a2luZDwvQ09ERT4gLSBUaGUga2luZCBvZiByZXNvdXJjZSBjaGFuZ2UsIHNlZSBJUmVzb3VyY2VEZWx0YSBmb3IgdmFsdWVzLjxERD48Q09ERT5vcGVyYXRpb248L0NPREU+IC0gVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdmFsaWRhdGlvbiBpcyBydW5uaW5nIHVuZGVyLiBUaGlzIGNhbgotICAgICAgICAgICAgYmUgbnVsbC48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSBBIHdheSB0byByZXBvcnQgcHJvZ3Jlc3MuIFRoaXMgY2FuIGJlIG51bGwuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSByZXN1bHQgb2YgZG9pbmcgdGhlIHZhbGlkYXRpb24sIGl0IGNhbiBiZSwgYnV0IHVzdWFsbHkgaXNuJ3QKLSAgICAgICAgIG51bGwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj48IS0tIC0tPjwvQT48SDM+Ci12YWxpZGF0ZTwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiA8Qj52YWxpZGF0ZTwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9QUkU+Ci08REw+Ci08REQ+VmFsaWRhdGUgdGhlIHJlc291cmNlLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5yZXNvdXJjZTwvQ09ERT4gLSBUaGUgcmVzb3VyY2UgdG8gYmUgdmFsaWRhdGVkLjxERD48Q09ERT5raW5kPC9DT0RFPiAtIFRoZSBraW5kIG9mIHJlc291cmNlIGNoYW5nZSwgc2VlIElSZXNvdXJjZURlbHRhIGZvciB2YWx1ZXMuPEREPjxDT0RFPm9wZXJhdGlvbjwvQ09ERT4gLSBUaGUgb3BlcmF0aW9uIHRoYXQgdGhpcyB2YWxpZGF0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuIFRoaXMgY2FuCi0gICAgICAgICAgICBiZSBudWxsLjxERD48Q09ERT5tb25pdG9yPC9DT0RFPiAtIEEgd2F5IHRvIHJlcG9ydCBwcm9ncmVzcy4gVGhpcyBjYW4gYmUgbnVsbC48REQ+PENPREU+ZXZlbnQ8L0NPREU+IC0gQW4gZXZlbnQgdGhhdCBkZXNjcmliZXMgaW4gbW9yZSBkZXRhaWwgd2hhdCBzaG91bGQgYmUKLSAgICAgICAgICAgIHZhbGlkYXRlZCBhbmQgd2h5IGl0IHNob3VsZCBiZSB2YWxpZGF0ZWQuIFRoaXMgY2FuIGJlIG51bGwuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSByZXN1bHQgb2YgZG9pbmcgdGhlIHZhbGlkYXRpb24sIGl0IGNhbiBiZSwgYnV0IHVzdWFsbHkgaXNuJ3QKLSAgICAgICAgIG51bGwuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRpb25TdGFydGluZzwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+dmFsaWRhdGlvblN0YXJ0aW5nPC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvUFJFPgotPERMPgotPEREPlRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS4gSXQgYWxsb3dzIHZhbGlkYXRvcnMgdG8gcGVyZm9ybSBhbnkKLSBpbml0aWFsaXphdGlvbiB0aGF0IHRoZXkgbWlnaHQgbmVlZC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgcHJvamVjdCB0aGF0IGlzIGJlaW5nIHZhbGlkYXRlZC4gRm9yIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgaW4gdGhlIHZhbGlkYXRpb24gcGhhc2UsCi0gdGhpcyB3aWxsIGJlIG51bGwuIFRoYXQgaXMgdGhlIHNpZ25hbCB0byB0aGUgdmFsaWRhdG9yIHRoYXQgYSB0b3AgbGV2ZWwgdmFsaWRhdGlvbiBpcyBzdGFydGluZy4KLSBTdWJzZXF1ZW50bHksIHRoZSBwcm9qZWN0IHdpbGwgYmUgc2V0LCBhcyBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsIHByb2plY3RzIGFyZSB2YWxpZGF0ZWQuPEREPjxDT0RFPnN0YXRlPC9DT0RFPiAtIGEgd2F5IHRvIHBhc3MgYXJiaXRyYXJ5LCB2YWxpZGF0b3Igc3BlY2lmaWMsIGRhdGEgZnJvbSBvbmUgaW52b2NhdGlvbiBvZiBhIHZhbGlkYXRvciB0bwotIHRoZSBuZXh0LCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcGhhc2UuPEREPjxDT0RFPm1vbml0b3I8L0NPREU+IC0gdGhlIG1vbml0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGlmIHRoZSBjbGVhbiB0YWtlcyBhIGxvbmcgdGltZS48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRpb25GaW5pc2hpbmc8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnZhbGlkYXRpb25GaW5pc2hpbmc8L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD5UaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIEl0IGFsbG93cyB2YWxpZGF0b3JzIHRvIHBlcmZvcm0gYW55Ci0gY2xlYW51cCB0aGF0IHRoZXkgbWlnaHQgbmVlZCB0byBkby4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cHJvamVjdDwvQ09ERT4gLSB0aGUgcHJvamVjdCB0aGF0IHdhcyB2YWxpZGF0ZWQuIFRoZSB2ZXJ5IGxhc3QgY2FsbCBpbiB0aGUgdmFsaWRhdGlvbiB3aWxsIHNldCB0aGlzIHRvIAotIG51bGwgc28gdGhhdCB0aGUgdmFsaWRhdG9yIGtub3dzIHRoYXQgYWxsIHRoZSBwcm9qZWN0cyBoYXZlIG5vdyBiZWVuIHZhbGlkYXRlZC48REQ+PENPREU+c3RhdGU8L0NPREU+IC0gYSB3YXkgdG8gcGFzcyBhcmJpdHJhcnksIHZhbGlkYXRvciBzcGVjaWZpYywgZGF0YSBmcm9tIG9uZSBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdG9yIHRvCi0gdGhlIG5leHQsIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwaGFzZS48REQ+PENPREU+bW9uaXRvcjwvQ09ERT4gLSB0aGUgbW9uaXRvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgaWYgdGhlIGNsZWFuIHRha2VzIGEgbG9uZyB0aW1lLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYXNJVmFsaWRhdG9yKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWFzSVZhbGlkYXRvcjwvSDM+Ci08UFJFPgotcHVibGljIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+IDxCPmFzSVZhbGlkYXRvcjwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0SWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0SWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldElkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRNZXNzYWdlKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNZXNzYWdlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+IDxCPmdldE1lc3NhZ2U8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE1lc3NhZ2VTZXR0aW5ncygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNZXNzYWdlU2V0dGluZ3M8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Jmd0OyA8Qj5nZXRNZXNzYWdlU2V0dGluZ3M8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5BbnN3ZXIgYWxsIHRoZSBtZXNzYWdlIHNldHRpbmdzIHRoYXQgdGhpcyB2YWxpZGF0b3IgaGFzIGRlZmluZWQuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gZW1wdHkgbWFwIGlmIHRoZSB2YWxpZGF0b3IgZGlkIG5vdCBkZWZpbmUgYW55IG1lc3NhZ2Ugc2V0dGluZ3MuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJoYXNoQ29kZUZvckNvbmZpZygpIj48IS0tIC0tPjwvQT48SDM+Ci1oYXNoQ29kZUZvckNvbmZpZzwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5oYXNoQ29kZUZvckNvbmZpZzwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciBhIGhhc2ggY29kZSBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBmaWVsZHMgc28gdGhhdCB3ZSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgaWYgdHdvCi0gdmFsaWRhdG9ycyBhcmUgdGhlIHNhbWUuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldE5hbWUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TmFtZTwvSDM+Ci08UFJFPgotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0TmFtZTwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UHJvamVjdCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRQcm9qZWN0PC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVByb2plY3QgPEI+Z2V0UHJvamVjdDwvQj4oKTwvUFJFPgotPERMPgotPEREPkFuc3dlciB0aGUgcHJvamVjdCB0aGF0IHlvdSB3ZXJlIGVuYWJsZWQgb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+bnVsbCBpZiB5b3UgYXJlIGEgZ2xvYmFsIChpLmUuIHdvcmtzcGFjZSBsZXZlbCkgdmFsaWRhdG9yLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFZhbGlkYXRvckNsYXNzbmFtZTwvSDM+Ci08UFJFPgotcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VmFsaWRhdG9yQ2xhc3NuYW1lPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iaXNNYW51YWxWYWxpZGF0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzTWFudWFsVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+aXNNYW51YWxWYWxpZGF0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+SXMgdGhpcyB2YWxpZGF0b3IgY3VycmVudGx5IGVuYWJsZWQgZm9yIHZhbGlkYXRpb25zIHRoYXQgYXJlIHRyaWdnZXJlZCBtYW51YWxseT8KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0TWFudWFsVmFsaWRhdGlvbihib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TWFudWFsVmFsaWRhdGlvbjwvSDM+Ci08UFJFPgotcHVibGljIGJvb2xlYW4gPEI+c2V0TWFudWFsVmFsaWRhdGlvbjwvQj4oYm9vbGVhbiZuYnNwO21hbnVhbFZhbGlkYXRpb24pPC9QUkU+Ci08REw+Ci08REQ+U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBhcyBwYXJ0IG9mIGEgbWFudWFsIHZhbGlkYXRpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1hbnVhbFZhbGlkYXRpb248L0NPREU+IC0gCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRydWUgaWYgdGhlIHNldHRpbmcgY2hhbmdlZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImlzQnVpbGRWYWxpZGF0aW9uKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWlzQnVpbGRWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc0J1aWxkVmFsaWRhdGlvbjwvQj4oKTwvUFJFPgotPERMPgotPEREPklzIHRoaXMgdmFsaWRhdG9yIGN1cnJlbnRseSBlbmFibGVkIGZvciB2YWxpZGF0aW9ucyB0aGF0IGFyZSB0cmlnZ2VyZWQgYnkgYnVpbGRzPwotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0NoYW5nZWQoKSI+PCEtLSAtLT48L0E+PEgzPgotaXNDaGFuZ2VkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5pc0NoYW5nZWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5IYXMgdGhlIHZhbGlkYXRvciBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IGNyZWF0ZWQgb3IgY29waWVkPyBPciB3YXMgaXQgbWlncmF0ZWQgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24uCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldEJ1aWxkVmFsaWRhdGlvbihib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0QnVpbGRWYWxpZGF0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5zZXRCdWlsZFZhbGlkYXRpb248L0I+KGJvb2xlYW4mbmJzcDtidWlsZFZhbGlkYXRpb24pPC9QUkU+Ci08REw+Ci08REQ+U2V0IHdoZXRoZXIgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBieSB0aGUgYnVpbGQgcHJvY2Vzcy4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YnVpbGRWYWxpZGF0aW9uPC9DT0RFPiAtIAotPERUPjxCPlJldHVybnM6PC9CPjxERD50cnVlIGlmIHRoZSBzZXR0aW5nIGNoYW5nZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXREZWxlZ2F0aW5nSWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0RGVsZWdhdGluZ0lkPC9IMz4KLTxQUkU+Ci1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyA8Qj5nZXREZWxlZ2F0aW5nSWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5HZXQgdGhlIGlkIG9mIHRoZSAicmVhbCIgdmFsaWRhdG9yLCB0aGF0IGlzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoaXMgZGVsZWdhdGluZwotIHZhbGlkYXRvciBpcyBhc2tlZCB0byB2YWxpZGF0ZSBzb21ldGhpbmcuIElmIHRoaXMgaXNuJ3QgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBhbnN3ZXIgbnVsbC4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0RGVsZWdhdGluZ0lkKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXREZWxlZ2F0aW5nSWQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldERlbGVnYXRpbmdJZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2RlbGVnYXRpbmcpPC9QUkU+Ci08REw+Ci08REQ+U2V0IHRoZSBpZCBvZiB0aGUgInJlYWwiIHZhbGlkYXRvciwgdGhhdCBpcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGRlbGVnYXRpbmcKLSB2YWxpZGF0b3IgaXMgYXNrZWQgdG8gdmFsaWRhdGUgc29tZXRoaW5nLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5kZWxlZ2F0aW5nPC9DT0RFPiAtIHRoZSBpZCBvZiB0aGUgdmFsaWRhdG9yIHRoYXQgaXMgYWN0dWFsbHkgZ29pbmcgdG8gcGVyZm9ybSB0aGUgdmFsaWRhdGlvbi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFZlcnNpb24oKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VmVyc2lvbjwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXRWZXJzaW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRWZXJzaW9uKGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFZlcnNpb248L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldFZlcnNpb248L0I+KGludCZuYnNwO3ZlcnNpb24pPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJ0b1N0cmluZygpIj48IS0tIC0tPjwvQT48SDM+Ci10b1N0cmluZzwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+dG9TdHJpbmc8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+T3ZlcnJpZGVzOjwvQj48REQ+PENPREU+dG9TdHJpbmc8L0NPREU+IGluIGNsYXNzIDxDT0RFPmphdmEubGFuZy5PYmplY3Q8L0NPREU+PC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTb3VyY2VJZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTb3VyY2VJZDwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0U291cmNlSWQ8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldFNvdXJjZUlkKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTb3VyY2VJZDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0U291cmNlSWQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzb3VyY2VJZCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldENoYW5nZUNvdW50R2xvYmFsKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldENoYW5nZUNvdW50R2xvYmFsPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldENoYW5nZUNvdW50R2xvYmFsPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJoYXNHbG9iYWxDaGFuZ2VzKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWhhc0dsb2JhbENoYW5nZXM8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPmhhc0dsb2JhbENoYW5nZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldENoYW5nZUNvdW50TWVzc2FnZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0Q2hhbmdlQ291bnRNZXNzYWdlczwvSDM+Ci08UFJFPgotcHVibGljIGludCA8Qj5nZXRDaGFuZ2VDb3VudE1lc3NhZ2VzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJidW1wQ2hhbmdlQ291bnRNZXNzYWdlcygpIj48IS0tIC0tPjwvQT48SDM+Ci1idW1wQ2hhbmdlQ291bnRNZXNzYWdlczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+YnVtcENoYW5nZUNvdW50TWVzc2FnZXM8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlc2V0Q2hhbmdlQ291bnRlcnMoKSI+PCEtLSAtLT48L0E+PEgzPgotcmVzZXRDaGFuZ2VDb3VudGVyczwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+cmVzZXRDaGFuZ2VDb3VudGVyczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iYnVtcENoYW5nZUNvdW50R2xvYmFsKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWJ1bXBDaGFuZ2VDb3VudEdsb2JhbDwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+YnVtcENoYW5nZUNvdW50R2xvYmFsPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzYW1lQ29uZmlnKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXNhbWVDb25maWc8L0gzPgotPFBSRT4KLXB1YmxpYyBib29sZWFuIDxCPnNhbWVDb25maWc8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIHRydWUgaWYgeW91IGhhdmUgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBhcyB2YWxpZGF0b3IuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcjwvQ09ERT4gLSB0aGlzIGNhbiBiZSBudWxsLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TWFya2VySWQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWFya2VySWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldE1hcmtlcklkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRNYXJrZXJJZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TWFya2VySWQ8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldE1hcmtlcklkPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWFya2VySWQpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9WYWxpZGF0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7PEEgSFJFRj0iI25lc3RlZF9jbGFzc19zdW1tYXJ5Ij5ORVNURUQ8L0E+Jm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNjb25zdHJ1Y3Rvcl9zdW1tYXJ5Ij5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNWQ2Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI2IEVEVCAyMDExIC0tPgotPFRJVExFPgotVmFsaWRhdG9yTWVzc2FnZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlZhbGlkYXRvck1lc3NhZ2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBDTEFTUzwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0ZPTlQ+Ci08QlI+Ci1DbGFzcyBWYWxpZGF0b3JNZXNzYWdlPC9IMj4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0Ci0gIDxJTUcgU1JDPSIuLi8uLi8uLi8uLi9yZXNvdXJjZXMvaW5oZXJpdC5naWYiIEFMVD0iZXh0ZW5kZWQgYnkgIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlPC9CPgotPC9QUkU+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgY2xhc3MgPEI+VmFsaWRhdG9yTWVzc2FnZTwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PC9ETD4KLTwvUFJFPgotCi08UD4KLVRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3YXkgZm9yIGEgdmFsaWRhdG9yIHRvIHJldHVybiBtZXNzYWdlcywgdGhhdCBhcmUgZWFzaWx5Ci0gY29udmVydGVkIGludG8gSU1hcmtlcnMuCi0gPHA+Ci0gVGhpcyBjbGFzcyBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsIGZvciB2YWxpZGF0b3JzLiBBIHZhbGlkYXRvciBjYW4gY2hvb3NlIHRvCi0gZGlyZWN0bHkgbWFuYWdlIElNYXJrZXJzLiBIb3dldmVyLCBzb21lIHZhbGlkYXRvcnMgd2FudCB0byBiZSB1c2VkIGluCi0gbXVsdGlwbGUgY29udGV4dHMsIGZvciBleGFtcGxlIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gYW5kIGJ1aWxkIGJhc2VkCi0gdmFsaWRhdGlvbi4gRm9yIHRoZXNlIHR5cGVzIG9mIHZhbGlkYXRvcnMgaXQgaXMgbm90IHBvc3NpYmxlIGZvciB0aGVtIHRvIHVzZQotIG9ubHkgSU1hcmtlcnMsIGJlY2F1c2Ugb2Z0ZW4gdGhlIFJlc291cmNlIGhhcyBub3QgYmVlbiBzYXZlZCB5ZXQuCi0gPC9wPgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdAotIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUKLSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdAotIGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQKLSB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkKLSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjVmFsaWRhdGlvbklkIj5WYWxpZGF0aW9uSWQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2FzQ29weSgpIj5hc0NvcHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYSBjb3B5IG9mIHlvdXJzZWxmLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UpIj5jcmVhdGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWVzc2FnZSwKLSAgICAgICBJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NyZWF0ZSBhIG5ldyB2YWxpZGF0aW9uIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5PYmplY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKSI+Z2V0QXR0cmlidXRlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pIj5nZXRBdHRyaWJ1dGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICBib29sZWFuJm5ic3A7ZGVmYXVsdFZhbHVlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGludCkiPmdldEF0dHJpYnV0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgIGludCZuYnNwO2RlZmF1bHRWYWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGludGVnZXIgdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPmdldEF0dHJpYnV0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtkZWZhdWx0VmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTWFwPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNnZXRBdHRyaWJ1dGVzKCkiPmdldEF0dHJpYnV0ZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIGEgbWFwIHdpdGggYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgbWFya2VyLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJUmVzb3VyY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI2dldFJlc291cmNlKCkiPmdldFJlc291cmNlPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgcmVzb3VyY2Ugd2l0aCB3aGljaCB0aGlzIG1hcmtlciBpcyBhc3NvY2lhdGVkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNnZXRUeXBlKCkiPmdldFR5cGU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgbWFya2VyLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikiPnNldEF0dHJpYnV0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDt2YWx1ZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIGJvb2xlYW4gdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgaW50KSI+c2V0QXR0cmlidXRlPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgaW50Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBpbnRlZ2VyIHZhbHVlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjc2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj5zZXRBdHRyaWJ1dGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjc2V0QXR0cmlidXRlcyhqYXZhLnV0aWwuTWFwKSI+c2V0QXR0cmlidXRlczwvQT48L0I+KGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuT2JqZWN0Jmd0OyZuYnNwO2F0dHJpYnV0ZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXRzIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIG1hcmtlciB0byBiZSB0aGUgb25lcyBjb250YWluZWQgaW4gdGhlIGdpdmVuCi0gdGFibGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI3NldEF0dHJpYnV0ZXMoamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmxhbmcuT2JqZWN0W10pIj5zZXRBdHRyaWJ1dGVzPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZ1tdJm5ic3A7YXR0cmlidXRlTmFtZXMsCi0gICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3RbXSZuYnNwO3ZhbHVlcyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIGdpdmVuIGF0dHJpYnV0ZSBrZXktdmFsdWUgcGFpcnMgb24gdGhpcyBtYXJrZXIuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sI3NldFR5cGUoamF2YS5sYW5nLlN0cmluZykiPnNldFR5cGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7dHlwZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIG1hcmtlciB0eXBlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgdG9TdHJpbmcsIHdhaXQsIHdhaXQsIHdhaXQ8L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iVmFsaWRhdGlvbklkIj48IS0tIC0tPjwvQT48SDM+Ci1WYWxpZGF0aW9uSWQ8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyA8Qj5WYWxpZGF0aW9uSWQ8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlLlZhbGlkYXRpb25JZCI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImNyZWF0ZShqYXZhLmxhbmcuU3RyaW5nLCBJUmVzb3VyY2UpIj48IS0tIC0tPjwvQT48SDM+Ci1jcmVhdGU8L0gzPgotPFBSRT4KLXB1YmxpYyBzdGF0aWMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+IDxCPmNyZWF0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvUFJFPgotPERMPgotPEREPkNyZWF0ZSBhIG5ldyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gVGhlIGxvY2FsaXplZCBtZXNzYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuPEREPjxDT0RFPnJlc291cmNlPC9DT0RFPiAtIFRoZSByZXNvdXJjZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImFzQ29weSgpIj48IS0tIC0tPjwvQT48SDM+Ci1hc0NvcHk8L0gzPgotPFBSRT4KLXB1YmxpYyA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT4gPEI+YXNDb3B5PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+QW5zd2VyIGEgY29weSBvZiB5b3Vyc2VsZi4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBdHRyaWJ1dGU8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IDxCPmdldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoZSByZXN1bHQgaXMgYW4gaW5zdGFuY2Ugb2YKLSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwKLSBvciA8Y29kZT5Cb29sZWFuPC9jb2RlPi4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIGlzCi0gdW5kZWZpbmVkLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hdHRyaWJ1dGVOYW1lPC9DT0RFPiAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZSBpcyB1bmRlZmluZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgaW50KSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QXR0cmlidXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgaW50IDxCPmdldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQmbmJzcDtkZWZhdWx0VmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuIFJldHVybnMgdGhlCi0gZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHVuZGVmaW5lZCBvciB0aGUgbWFya2VyIGRvZXMgbm90Ci0gZXhpc3Qgb3IgaXMgbm90IGFuIGludGVnZXIgdmFsdWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWU8L0NPREU+IC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS48REQ+PENPREU+ZGVmYXVsdFZhbHVlPC9DT0RFPiAtIFRoZSB2YWx1ZSB0byB1c2UgaWYgbm8gaW50ZWdlciB2YWx1ZSBpcyBmb3VuZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vIGludGVnZXIgdmFsdWUgd2FzIGZvdW5kLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBdHRyaWJ1dGU8L0gzPgotPFBSRT4KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIDxCPmdldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2RlZmF1bHRWYWx1ZSk8L1BSRT4KLTxETD4KLTxERD5SZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWVkIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBSZXR1cm5zIHRoZQotIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyB1bmRlZmluZWQgb3IgdGhlIG1hcmtlciBkb2VzIG5vdAotIGV4aXN0IG9yIGlzIG5vdCBhIHN0cmluZyB2YWx1ZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZTwvQ09ERT4gLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLjxERD48Q09ERT5kZWZhdWx0VmFsdWU8L0NPREU+IC0gVGhlIHZhbHVlIHRvIHVzZSBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vIHZhbHVlIHdhcyBmb3VuZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QXR0cmlidXRlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgYm9vbGVhbiA8Qj5nZXRBdHRyaWJ1dGU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtkZWZhdWx0VmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuIFJldHVybnMgdGhlCi0gZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHVuZGVmaW5lZCBvciB0aGUgbWFya2VyIGRvZXMgbm90Ci0gZXhpc3Qgb3IgaXMgbm90IGEgYm9vbGVhbiB2YWx1ZS4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlTmFtZTwvQ09ERT4gLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLjxERD48Q09ERT5kZWZhdWx0VmFsdWU8L0NPREU+IC0gVGhlIHZhbHVlIHRvIHVzZSBpZiBubyB2YWx1ZSBpcyBmb3VuZC4KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHZhbHVlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIG5vIHZhbHVlIHdhcyBmb3VuZC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldEF0dHJpYnV0ZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0QXR0cmlidXRlczwvSDM+Ci08UFJFPgotcHVibGljIGphdmEudXRpbC5NYXAgPEI+Z2V0QXR0cmlidXRlczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgYSBtYXAgd2l0aCBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBtYXJrZXIuIElmIHRoZSBtYXJrZXIgaGFzCi0gbm8gYXR0cmlidXRlcyB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgbWFwIG9mIGF0dHJpYnV0ZSBrZXlzIGFuZCB2YWx1ZXMgKGtleSB0eXBlIDoKLSAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSB0eXBlIDogPGNvZGU+U3RyaW5nPC9jb2RlPiwKLSAgICAgICAgPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+KSBvciA8Y29kZT5udWxsPC9jb2RlPi48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFJlc291cmNlKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFJlc291cmNlPC9IMz4KLTxQUkU+Ci1wdWJsaWMgSVJlc291cmNlIDxCPmdldFJlc291cmNlPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgcmVzb3VyY2Ugd2l0aCB3aGljaCB0aGlzIG1hcmtlciBpcyBhc3NvY2lhdGVkLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSByZXNvdXJjZSB3aXRoIHdoaWNoIHRoaXMgbWFya2VyIGlzIGFzc29jaWF0ZWQ8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFR5cGUoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VHlwZTwvSDM+Ci08UFJFPgotcHVibGljIGphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VHlwZTwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtYXJrZXIuIFRoZSByZXR1cm5lZCBtYXJrZXIgdHlwZSB3aWxsIG5vdCBiZSAKLSA8Y29kZT5udWxsPC9jb2RlPi4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgdHlwZSBvZiB0aGlzIG1hcmtlcjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0VHlwZShqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0VHlwZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0VHlwZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3R5cGUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgbWFya2VyIHR5cGUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnR5cGU8L0NPREU+IC0gVGhlIG1hcmtlciBpZCB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgbWFya2Vycy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nLCBpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRBdHRyaWJ1dGU8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50Jm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgaW50ZWdlciB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gPHA+Ci0gVGhpcyBtZXRob2QgY2hhbmdlcyByZXNvdXJjZXM7IHRoZXNlIGNoYW5nZXMgd2lsbCBiZSByZXBvcnRlZCBpbiBhCi0gc3Vic2VxdWVudCByZXNvdXJjZSBjaGFuZ2UgZXZlbnQsIGluY2x1ZGluZyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhpcwotIG1hcmtlciBoYXMgYmVlbiBtb2RpZmllZC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWU8L0NPREU+IC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gVGhlIHZhbHVlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRBdHRyaWJ1dGU8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldEF0dHJpYnV0ZTwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgdmFsdWUgbXVzdCBiZQotIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6Ci0gPGNvZGU+U3RyaW5nPC9jb2RlPiwgPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5hdHRyaWJ1dGVOYW1lPC9DT0RFPiAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuPEREPjxDT0RFPnZhbHVlPC9DT0RFPiAtIFRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZSBpcyB0byBiZSB1bmRlZmluZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEF0dHJpYnV0ZTwvSDM+Ci08UFJFPgotcHVibGljIHZvaWQgPEI+c2V0QXR0cmlidXRlPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuJm5ic3A7dmFsdWUpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgYm9vbGVhbiB2YWx1ZWQgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWU8L0NPREU+IC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS48REQ+PENPREU+dmFsdWU8L0NPREU+IC0gVGhlIHZhbHVlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0QXR0cmlidXRlcyhqYXZhLmxhbmcuU3RyaW5nW10sIGphdmEubGFuZy5PYmplY3RbXSkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEF0dHJpYnV0ZXM8L0gzPgotPFBSRT4KLXB1YmxpYyB2b2lkIDxCPnNldEF0dHJpYnV0ZXM8L0I+KGphdmEubGFuZy5TdHJpbmdbXSZuYnNwO2F0dHJpYnV0ZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0W10mbmJzcDt2YWx1ZXMpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgZ2l2ZW4gYXR0cmlidXRlIGtleS12YWx1ZSBwYWlycyBvbiB0aGlzIG1hcmtlci4gVGhlIHZhbHVlcyBtdXN0Ci0gYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKLSA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgb3IgPGNvZGU+Qm9vbGVhbjwvY29kZT4uIElmIGEKLSB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlzIGNvbnNpZGVyZWQKLSB0byBiZSB1bmRlZmluZWQuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWVzPC9DT0RFPiAtIEFuIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcy48REQ+PENPREU+dmFsdWVzPC9DT0RFPiAtIEFuIGFycmF5IG9mIGF0dHJpYnV0ZSB2YWx1ZXMuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRBdHRyaWJ1dGVzKGphdmEudXRpbC5NYXApIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRBdHRyaWJ1dGVzPC9IMz4KLTxQUkU+Ci1wdWJsaWMgdm9pZCA8Qj5zZXRBdHRyaWJ1dGVzPC9CPihqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLk9iamVjdCZndDsmbmJzcDthdHRyaWJ1dGVzKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbWFya2VyIHRvIGJlIHRoZSBvbmVzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4KLSB0YWJsZS4gVGhlIHZhbHVlcyBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6Ci0gPGNvZGU+U3RyaW5nPC9jb2RlPiwgPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotIEF0dHJpYnV0ZXMgcHJldmlvdXNseSBzZXQgb24gdGhlIG1hcmtlciBidXQgbm90IGluY2x1ZGVkIGluIHRoZSBnaXZlbiBtYXAKLSBhcmUgY29uc2lkZXJlZCB0byBiZSByZW1vdmFscy4gVGhpcyBpbmNsdWRlcyB0aGUgdGV4dCBvZiB0aGUgbWVzc2FnZS4KLSBTZXR0aW5nIHRoZSBnaXZlbiBtYXAgdG8gYmUKLSA8Y29kZT5udWxsPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHJlbW92aW5nIGFsbCBtYXJrZXIgYXR0cmlidXRlcy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+YXR0cmlidXRlczwvQ09ERT4gLSBBIG1hcCBvZiBhdHRyaWJ1dGUgbmFtZXMgdG8gYXR0cmlidXRlIHZhbHVlcyAoa2V5IHR5cGUgOgotICAgICAgICAgICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgdHlwZSA6IDxjb2RlPlN0cmluZzwvY29kZT4sCi0gICAgICAgICAgICAgICAgPGNvZGU+SW50ZWdlcjwvY29kZT4sIG9yIDxjb2RlPkJvb2xlYW48L2NvZGU+KSBvciA8Y29kZT5udWxsPC9jb2RlPi48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7TkVYVCBDTEFTUzwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9BYnN0cmFjdFZhbGlkYXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjA4NGU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9BYnN0cmFjdFZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3IKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUFic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5BYnN0cmFjdFZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkFic3RyYWN0VmFsaWRhdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkFic3RyYWN0VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldERlbGVnYXRlZFZhbGlkYXRvcigpIj5nZXREZWxlZ2F0ZWRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGFjdHVhbCB2YWxpZGF0b3IgdGhhdCBpcyBnb2luZyB0byBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkFic3RyYWN0VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2dldFZhbGlkYXRvcigpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUFic3RyYWN0VmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0RlcGVuZGVudFJlc291cmNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmUzMTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0RlcGVuZGVudFJlc291cmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5EZXBlbmRlbnRSZXNvdXJjZQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRGVwZW5kZW50UmVzb3VyY2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJEZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkRlcGVuZGVudFJlc291cmNlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkRlcGVuZGVudFJlc291cmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0RlcGVuZGVudFJlc291cmNlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+RGVwZW5kZW50UmVzb3VyY2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gdHlwZXMgd2l0aCBhcmd1bWVudHMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkRlcGVuZGVudFJlc291cmNlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5EZXBlbmRlbnRSZXNvdXJjZTwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklEZXBlbmRlbmN5SW5kZXguPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCNnZXQoSVJlc291cmNlKSI+Z2V0PC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgb24gdGhpcyByZXNvdXJjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZURlcGVuZGVudFJlc291cmNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRGVwZW5kZW50UmVzb3VyY2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9GcmllbmQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9GcmllbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2MjBmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvRnJpZW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5GcmllbmQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkZyaWVuZCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlRnJpZW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iRnJpZW5kLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uRnJpZW5kPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkZyaWVuZAotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUZyaWVuZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IkZyaWVuZC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lEZXBlbmRlbmN5SW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JRGVwZW5kZW5jeUluZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2Y3MzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lEZXBlbmRlbmN5SW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JRGVwZW5kZW5jeUluZGV4Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSURlcGVuZGVuY3lJbmRleCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSURlcGVuZGVuY3lJbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JRGVwZW5kZW5jeUluZGV4PC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklEZXBlbmRlbmN5SW5kZXg8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JRGVwZW5kZW5jeUluZGV4PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SURlcGVuZGVuY3lJbmRleDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SURlcGVuZGVuY3lJbmRleDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldERlcGVuZGVuY3lJbmRleCgpIj5nZXREZXBlbmRlbmN5SW5kZXg8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGRlcGVuZGVuY3kgaW5kZXguPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJRGVwZW5kZW5jeUluZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSURlcGVuZGVuY3lJbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSU11dGFibGVWYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkZTYzZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSU11dGFibGVWYWxpZGF0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjZ2V0VmFsaWRhdG9ycygpIj5nZXRWYWxpZGF0b3JzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk11dGFibGVQcm9qZWN0U2V0dGluZ3MuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNnZXRWYWxpZGF0b3JzKCkiPmdldFZhbGlkYXRvcnM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNvbnN0cnVjdG9ycyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklNdXRhYmxlVmFsaWRhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCNNdXRhYmxlUHJvamVjdFNldHRpbmdzKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcltdKSI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+W10mbmJzcDt2YWxpZGF0b3JzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCNNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3Mob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSU11dGFibGVWYWxpZGF0b3JbXSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMpIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JTXV0YWJsZVZhbGlkYXRvcjwvQT5bXSZuYnNwO3ZhbGlkYXRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMmbmJzcDt2YWx1ZXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJTXV0YWJsZVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2ViZDc1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVBlcmZvcm1hbmNlTW9uaXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI2dldENvbGxlY3Rpb25MZXZlbCgpIj5nZXRDb2xsZWN0aW9uTGV2ZWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGxldmVsIG9mIHBlcmZvcm1hbmNlIGV2ZW50cyB0aGF0IGFyZSBiZWluZyBjb2xsZWN0ZWQgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPnZhbHVlT2Y8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwjdmFsdWVzKCkiPnZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVBlcmZvcm1hbmNlTW9uaXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI3NldENvbGxlY3Rpb25MZXZlbChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbCkiPnNldENvbGxlY3Rpb25MZXZlbDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4mbmJzcDtsZXZlbCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldCB0aGUgcGVyZm9ybWFuY2UgZXZlbnQgY29sbGVjdGlvbiBsZXZlbC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlSVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2EyM2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVBlcmZvcm1hbmNlTW9uaXRvciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JUGVyZm9ybWFuY2VNb25pdG9yPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JUGVyZm9ybWFuY2VNb25pdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFBlcmZvcm1hbmNlTW9uaXRvcigpIj5nZXRQZXJmb3JtYW5jZU1vbml0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYSBwZXJmb3JtYW5jZSBtb25pdG9yIGZvciB0aGUgdmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUlQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJkOWIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklWYWxpZGF0b3JHcm91cExpc3RlbmVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZUlWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXI8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzM2Q1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNnZXRDdXJyZW50KCkiPmdldEN1cnJlbnQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIGN1cnJlbnQgc2V2ZXJpdHkgZm9yIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwjZ2V0RGVmYXVsdCgpIj5nZXREZWZhdWx0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSBkZWZhdWx0IHNldmVyaXR5IGFzIGRlZmluZWQgYnkgdGhlIHZhbGlkYXRvciBvd25lci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sI3ZhbHVlT2YoamF2YS5sYW5nLlN0cmluZykiPnZhbHVlT2Y8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCN2YWx1ZXMoKSI+dmFsdWVzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb25zdGFudHMgb2YgdGhpcyBlbnVtIHR5cGUsIGluCi10aGUgb3JkZXIgdGhleSBhcmUgZGVjbGFyZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI3NldEN1cnJlbnQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eSkiPnNldEN1cnJlbnQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPiZuYnNwO3NldmVyaXR5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBjdXJyZW50IG1lc3NhZ2Ugc2V2ZXJpdHkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5Db25zdHJ1Y3RvcnMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkpIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2lkLAotICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk8L0E+Jm5ic3A7ZGVmYXVsdFNldmVyaXR5KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBsYWJlbCBhbmQgYSBtZXNzYWdlIHNldmVyaXR5LjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZU1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyN2EwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZyI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZU1lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sI2NvcHkoKSI+Y29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGNvcHkgb2YgdGhpcyBvYmplY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2dldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykiPmdldE1lc3NhZ2U8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNnZXRNZXNzYWdlU2V0dGluZ3MoKSI+Z2V0TWVzc2FnZVNldHRpbmdzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgbWVzc2FnZSBzZXR0aW5ncyB0aGF0IHRoaXMgdmFsaWRhdG9yIGhhcyBkZWZpbmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kIHBhcmFtZXRlcnMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHR5cGUgYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkZyaWVuZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2V0TWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBqYXZhLnV0aWwuTWFwKSI+c2V0TWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPC9BPiZndDsmbmJzcDttYXApPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTc2MWFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlUHJvamVjdFNldHRpbmdzCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlUHJvamVjdFNldHRpbmdzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik11dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0UHJvamVjdFNldHRpbmdzKElQcm9qZWN0KSI+Z2V0UHJvamVjdFNldHRpbmdzPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgb24gdGhlCi0gcHJvamVjdC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVByb2plY3RTZXR0aW5nczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2FwcGx5Q2hhbmdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlUHJvamVjdFNldHRpbmdzLCBib29sZWFuKSI+YXBwbHlDaGFuZ2VzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0E+Jm5ic3A7c2V0dGluZ3MsCi0gICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3BlcnNpc3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBcHBseSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBiZWVuIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VNdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTXV0YWJsZVByb2plY3RTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDhmODE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncwotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0V29ya3NwYWNlU2V0dGluZ3MoKSI+Z2V0V29ya3NwYWNlU2V0dGluZ3M8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBhdCB0aGUgd29ya3NwYWNlIGxldmVsLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2FwcGx5Q2hhbmdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MsIGJvb2xlYW4pIj5hcHBseUNoYW5nZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+Jm5ic3A7c2V0dGluZ3MsCi0gICAgICAgICAgICAgYm9vbGVhbiZuYnNwO3BlcnNpc3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBcHBseSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBiZWVuIHRvIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZU11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ik11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OGJiM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnMiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VQZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlBlcmZvcm1hbmNlQ291bnRlcnM8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIHR5cGVzIHdpdGggYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdCZsdDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT4mZ3Q7PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklQZXJmb3JtYW5jZU1vbml0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lQZXJmb3JtYW5jZU1vbml0b3IuaHRtbCNnZXRQZXJmb3JtYW5jZUNvdW50ZXJzKGJvb2xlYW4pIj5nZXRQZXJmb3JtYW5jZUNvdW50ZXJzPC9BPjwvQj4oYm9vbGVhbiZuYnNwO2FzU3VtbWFyeSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHNvIGZhci48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVBlcmZvcm1hbmNlTW9uaXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sI2FkZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5QZXJmb3JtYW5jZUNvdW50ZXJzKSI+YWRkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlBlcmZvcm1hbmNlQ291bnRlcnM8L0E+Jm5ic3A7Y291bnRlcnMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBZGQgdGhpcyBwZXJmb3JtYW5jZSBjb3VudGVyIHRvIHRoZSBtb25pdG9yLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VQZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUGVyZm9ybWFuY2VDb3VudGVycy5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1JlcG9ydGVySGVscGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvUmVwb3J0ZXJIZWxwZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3OTE2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvUmVwb3J0ZXJIZWxwZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlJlcG9ydGVySGVscGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5SZXBvcnRlckhlbHBlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VSZXBvcnRlckhlbHBlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlJlcG9ydGVySGVscGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uUmVwb3J0ZXJIZWxwZXI8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uUmVwb3J0ZXJIZWxwZXIKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVJlcG9ydGVySGVscGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRXZlbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRXZlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMDY2Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkV2ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50PC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNzaG91bGRDbGVhck1hcmtlcnMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+c2hvdWxkQ2xlYXJNYXJrZXJzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPiZuYnNwO2V2ZW50KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdWxkIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBmaXJzdCBjbGVhciB0aGUgbWFya2VycyB0aGF0IHRoaXMKLSB2YWxpZGF0b3IgaGFzIHBsYWNlZCBvbiB0aGlzIHJlc291cmNlPzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjc2hvdWxkQ2xlYXJNYXJrZXJzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPnNob3VsZENsZWFyTWFya2VyczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3Nob3VsZENsZWFyTWFya2VycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXZlbnQpIj5zaG91bGRDbGVhck1hcmtlcnM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTaG91bGQgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGZpcnN0IGNsZWFyIHRoZSBtYXJrZXJzIHRoYXQgdGhpcwotIHZhbGlkYXRvciBoYXMgcGxhY2VkIG9uIHRoaXMgcmVzb3VyY2U/PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0ZSB0aGUgcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24sIElQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCkiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwZjQwYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlcgotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRpb25GcmFtZXdvcmsuUmVzb3VyY2VBZGRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDMzYmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcmsKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcmsiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25GcmFtZXdvcms8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXREZWZhdWx0KCkiPmdldERlZmF1bHQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHNpbmdsZXRvbiwgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYmY0NjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKElSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgaW50Jm5ic3A7a2luZCwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5hYnN0cmFjdCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICBpbnQmbmJzcDtraW5kLAotICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsT3BlcmF0aW9uJm5ic3A7b3BlcmF0aW9uLAotICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjdmFsaWRhdGUoSVJlc291cmNlLCBpbnQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50KSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxPcGVyYXRpb24mbmJzcDtvcGVyYXRpb24sCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV2ZW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25FdmVudC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25FdmVudDwvQT4mbmJzcDtldmVudCwKLSAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgdGhlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uUmVzdWx0LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjbWVyZ2VSZXN1bHRzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQpIj5tZXJnZVJlc3VsdHM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT4mbmJzcDtyZXN1bHQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtNZXJnZSB0aGUgbWVzc2FnZSBjb3VudHMgYW5kIG1lc3NhZ2VzIGZyb20gYW4gaW5kaXZpZHVhbCB2YWxpZGF0b3IgaW50byB0aGlzIHJlc3VsdC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNvbnN0cnVjdG9ycyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwjVmFsaWRhdGlvblJlc3VsdHMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdCkiPlZhbGlkYXRpb25SZXN1bHRzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+Jm5ic3A7cmVzdWx0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvblJlc3VsdHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uUmVzdWx0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM2ODIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uUmVzdWx0cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdHMKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHRzIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0czwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0czwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdHM8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjdmFsaWRhdGUoSUZpbGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0ZTwvQT48L0I+KElGaWxlJm5ic3A7ZmlsZSwKLSAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VmFsaWRhdGUgYSBzcGVjaWZpYyBmaWxlIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjdmFsaWRhdGUoSVByb2plY3RbXSwgYm9vbGVhbiwgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRlPC9BPjwvQj4oSVByb2plY3RbXSZuYnNwO3Byb2plY3RzLAotICAgICAgICAgYm9vbGVhbiZuYnNwO2lzTWFudWFsLAotICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSBwcm9qZWN0cy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRpb25SZXN1bHRzLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uU3RhdGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uU3RhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwNWEzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvblN0YXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0I+PC9BPjwvVEQ+Ci08VEQ+QW4gZWFybGllciBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI2NsZWFuKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj5jbGVhbjwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSBjYWxsIGJhY2sgbWV0aG9kIHRoYXQgbGV0cyB0aGUgdmFsaWRhdG9yIGtub3cgdGhhdCB0aGUgcHJvamVjdCBpcyBiZWluZwotIGNsZWFuZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uUmVzdWx0PC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5BYnN0cmFjdFZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0b3IuaHRtbCN2YWxpZGF0ZShJUmVzb3VyY2UsIGludCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgIGludCZuYnNwO2tpbmQsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHQ8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXZlbnQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Jm5ic3A7ZXZlbnQsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1ZhbGlkYXRlIHRoZSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgY29tcGxldGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYxLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uRmluaXNoaW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIElQcm9ncmVzc01vbml0b3IpIj52YWxpZGF0aW9uRmluaXNoaW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uU3RhdGU8L0E+Jm5ic3A7c3RhdGUsCi0gICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElQcm9qZWN0Jm5ic3A7cHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCN2YWxpZGF0aW9uRmluaXNoaW5nKElSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlKSI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvciwKLSAgICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7SWYgdGhlIHZhbGlkYXRpb25TdGFydGluZyBtZXRob2Qgd2FzIGNhbGxlZCBvbiB0aGUgcmVzb3VyY2UsIHRoZW4gdGhpcwotIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCB2YWxpZGF0b3IgaGFzIHByb2Nlc3NlZCB0aGUKLSByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhbnkgdmFsaWRhdGlvbiB0YWtlcyBwbGFjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkFic3RyYWN0VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sI3ZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYW55IHZhbGlkYXRpb24gdGFrZXMgcGxhY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JHcm91cExpc3RlbmVyLmh0bWwjdmFsaWRhdGlvblN0YXJ0aW5nKElSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlKSI+dmFsaWRhdGlvblN0YXJ0aW5nPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPiZuYnNwO3N0YXRlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCB2YWxpZGF0b3IgaW4gdGhlIGdyb3VwIHRoYXQgaXMgaW50ZXJlc3RlZAotIGluIHRoZSByZXNvdXJjZSBpcyBjYWxsZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvckV4dGVuZGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0aW9uU3RhdGUuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuTGV2ZWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuTGV2ZWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMTc4Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLkxldmVsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuTGV2ZWwKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuTGV2ZWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuTGV2ZWw8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1Vc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjZ2V0TGV2ZWwoKSI+Z2V0TGV2ZWw8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5MZXZlbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwjdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKSI+dmFsdWVPZjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5MZXZlbC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwjdmFsdWVzKCkiPnZhbHVlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29uc3RhbnRzIG9mIHRoaXMgZW51bSB0eXBlLCBpbgotdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLkxldmVsPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI3NldExldmVsKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5MZXZlbCkiPnNldExldmVsPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+Jm5ic3A7bGV2ZWwpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vXGNsYXNzLXVzZVZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvci5MZXZlbC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjFlMGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5WMUNvcHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMS5WMUNvcHkKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMS5WMUNvcHkiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIENsYXNzPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMS5WMUNvcHk8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxLlYxQ29weQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5WMS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NhOGEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMQotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgQ2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYxIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjE8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5TdWJjbGFzc2VzIG9mIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMS5WMUNvcHk8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCByZXR1cm4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2FzVjFWYWxpZGF0b3IoKSI+YXNWMVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHlvdSBhcmUgYSB2ZXJzaW9uIDEgdmFsaWRhdG9yLCBhbnN3ZXIgeW91cnNlbGYgYXMgb25lLCBvdGhlcndpc2UgYW5zd2VyIG51bGwuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYxLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNhc1YxVmFsaWRhdG9yKCkiPmFzVjFWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjEuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NTgzMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLlYyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IuVjIKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvci5WMiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLlYyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLlYyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYyPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc1YyVmFsaWRhdG9yKCkiPmFzVjJWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJZiB5b3UgYXJlIGEgdmVyc2lvbiAyIHZhbGlkYXRvciwgYW5zd2VyIHlvdXJzZWxmIGFzIG9uZSwgb3RoZXJ3aXNlIGFuc3dlciBudWxsLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjI8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwjYXNWMlZhbGlkYXRvcigpIj5hc1YyVmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+QWJzdHJhY3RWYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjZ2V0UGFyZW50KCkiPmdldFBhcmVudDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0aGUgdmFsaWRhdG9yIHRoYXQgeW91IGJlbG9uZyB0by48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuVjIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuVjIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzZTAwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvciI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+U3ViY2xhc3NlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAxIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Y2xhc3M8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMS5WMUNvcHk8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2NsYXNzPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAyIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29weSgpIj5jb3B5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGEgZGVlcCBjb3B5IG9mIHlvdXJzZWxmLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5hYnN0cmFjdCAmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29weShib29sZWFuKSI+Y29weTwvQT48L0I+KGJvb2xlYW4mbmJzcDtpbmNsdWRlQ2hhbmdlQ291bnRzKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLlYxLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCNjb3B5KGJvb2xlYW4pIj5jb3B5PC9BPjwvQj4oYm9vbGVhbiZuYnNwO2luY2x1ZGVDaGFuZ2VDb3VudHMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2NvcHkoYm9vbGVhbikiPmNvcHk8L0E+PC9CPihib29sZWFuJm5ic3A7aW5jbHVkZUNoYW5nZUNvdW50cyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY3JlYXRlKElDb25maWd1cmF0aW9uRWxlbWVudCwgSVByb2plY3QpIj5jcmVhdGU8L0E+PC9CPihJQ29uZmlndXJhdGlvbkVsZW1lbnQmbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRvciBiYXNlZCBvbiBhIGFic3RyYWN0IHZhbGlkYXRvci48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sI2NyZWF0ZShWYWxpZGF0b3JNZXRhRGF0YSwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24sIElQcm9qZWN0KSI+Y3JlYXRlPC9BPjwvQj4oVmFsaWRhdG9yTWV0YURhdGEmbmJzcDt2bWQsCi0gICAgICAgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24mbmJzcDtjb25maWcsCi0gICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRvciBiYXNlZCBvbiB2YWxpZGF0b3IgbWV0YSBkYXRhLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkRlcGVuZGVudFJlc291cmNlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sI2dldFZhbGlkYXRvcigpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgdGhlIHZhbGlkYXRvciB0aGF0IGFzc2VydGVkIHRoZSBkZXBlbmRlbmN5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykiPmdldFZhbGlkYXRvcjwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtpZCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxCPkRlcHJlY2F0ZWQuPC9CPiZuYnNwOzxJPlVzZSBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB3aXRoIGEgbnVsbCBwcm9qZWN0IGluc3RlYWQuPC9JPjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZywgSVByb2plY3QpIj5nZXRWYWxpZGF0b3I8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7aWQsCi0gICAgICAgICAgICAgSVByb2plY3QmbmJzcDtwcm9qZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIHRoZSB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gaWQgdGhhdCBpcyBpbiBlZmZlY3QgZm9yIHRoZSBnaXZlbgotIHByb2plY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9ycygpIj5nZXRWYWxpZGF0b3JzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGNvcGllcyBvZiBhbGwgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoSVByb2plY3QpIj5nZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3Q8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtWYWxpZGF0b3JzIGNhbiB1c2UgcHJvamVjdCBsZXZlbCBzZXR0aW5ncyAoUHJvamVjdCBuYXR1cmVzIGFuZCBmYWNldHMpIHRvCi0gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGFwcGxpY2FibGUgdG8gdGhlIHByb2plY3Qgb3Igbm90LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFZhbGlkYXRvcnNGb3IoSVJlc291cmNlKSI+Z2V0VmFsaWRhdG9yc0ZvcjwvQT48L0I+KElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFsbCB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBhcHBsaWNhYmxlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwjZ2V0VmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UsIGJvb2xlYW4sIGJvb2xlYW4pIj5nZXRWYWxpZGF0b3JzRm9yPC9BPjwvQj4oSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4mbmJzcDtpc01hbnVhbCwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiZuYnNwO2lzQnVpbGQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYWxsIHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpY2FibGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiB0eXBlcyB3aXRoIGFyZ3VtZW50cyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEudXRpbC5TZXQmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldERpc2FibGVkVmFsaWRhdG9yc0ZvcihJUmVzb3VyY2UpIj5nZXREaXNhYmxlZFZhbGlkYXRvcnNGb3I8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhbGwgdGhlIHZhbGlkYXRvcnMgdGhhdCBzaG91bGQgbm90IHZhbGlkYXRlIHRoZSByZXNvdXJjZSwgZWl0aGVyCi0gYmVjYXVzZSB0aGVpciBmaWx0ZXJzIGRvbid0IHN1cHBvcnQgdGhlIHJlc291cmNlLCBvciB0aGUgdmFsaWRhdG9yIGhhcwotIGJlZW4gZGlzYWJsZWQgZm9yIGJvdGggYnVpbGQgdmFsaWRhdGlvbiBhbmQgbWFudWFsIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjY29tcGFyZVRvKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmNvbXBhcmVUbzwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDb21wYXJlIHlvdXJzZWxmIGJhc2VkIG9uIFZhbGlkYXRvciBuYW1lLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNpc0xvYWRlZChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5pc0xvYWRlZDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiBhY3RpdmF0ZWQsIGkuZS4gaGFzIHRoZQotIGJ1bmRsZSB0aGF0IGRlZmluZXMgdGhlIHZhbGlkYXRvciBiZWVuIGxvYWRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7Ym9vbGVhbjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5GcmllbmQuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sI2lzTG9hZGVkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcikiPmlzTG9hZGVkPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0hhcyB0aGUgdmFsaWRhdG9yJ3MgaW1wbGVtZW50YXRpb24gYmVlbiBsb2FkZWQgeWV0PzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwjc2FtZUNvbmZpZyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IpIj5zYW1lQ29uZmlnPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciB0cnVlIGlmIHlvdSBoYXZlIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXMgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRpb25GcmFtZXdvcmsuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNzYXZlVmFsaWRhdG9ycyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JbXSkiPnNhdmVWYWxpZGF0b3JzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPltdJm5ic3A7dmFsaWRhdG9ycyk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NhdmUgdGhlIHZhbGlkYXRvcnMgc2V0dGluZ3MgaW50byB0aGUgcGVyc2lzdGVudCBzdG9yZSwgdGhlcmUgYnkgbWFraW5nIHRoZWlyIHNldHRpbmdzIHRoZSBhY3RpdmUgc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RnJpZW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNzZXRNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIGphdmEudXRpbC5NYXApIj5zZXRNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Jmd0OyZuYnNwO21hcCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkZyaWVuZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2V0TWlncmF0ZWQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBib29sZWFuKSI+c2V0TWlncmF0ZWQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgYm9vbGVhbiZuYnNwO21pZ3JhdGVkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+RnJpZW5kLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9GcmllbmQuaHRtbCNzaG91bGRWYWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3IsIElSZXNvdXJjZSwgYm9vbGVhbiwgYm9vbGVhbiwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udGVudFR5cGVXcmFwcGVyKSI+c2hvdWxkVmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgSVJlc291cmNlJm5ic3A7cmVzb3VyY2UsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNNYW51YWwsCi0gICAgICAgICAgICAgICBib29sZWFuJm5ic3A7aXNCdWlsZCwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlciZuYnNwO2NvbnRlbnRUeXBlV3JhcHBlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtib29sZWFuPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPkZyaWVuZC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vRnJpZW5kLmh0bWwjc2hvdWxkVmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yLCBJUmVzb3VyY2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGUsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRUeXBlV3JhcHBlcikiPnNob3VsZFZhbGlkYXRlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgIElSZXNvdXJjZSZuYnNwO3Jlc291cmNlLAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsVHlwZSZuYnNwO3ZhbFR5cGUsCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50VHlwZVdyYXBwZXImbmJzcDtjb250ZW50VHlwZVdyYXBwZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPkNvbnN0cnVjdG9ycyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sI0RlcGVuZGVudFJlc291cmNlKElSZXNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yKSI+RGVwZW5kZW50UmVzb3VyY2U8L0E+PC9CPihJUmVzb3VyY2UmbmJzcDtyZXNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1xjbGFzcy11c2VWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3JNZXNzYWdlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yTWVzc2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmU4YzA2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3JNZXNzYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBDbGFzczxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3JNZXNzYWdlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjYXNDb3B5KCkiPmFzQ29weTwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0Fuc3dlciBhIGNvcHkgb2YgeW91cnNlbGYuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3JNZXNzYWdlLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcsIElSZXNvdXJjZSkiPmNyZWF0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttZXNzYWdlLAotICAgICAgIElSZXNvdXJjZSZuYnNwO3Jlc291cmNlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q3JlYXRlIGEgbmV3IHZhbGlkYXRpb24gbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvblJlc3VsdHMuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwjZ2V0TWVzc2FnZXMoKSI+Z2V0TWVzc2FnZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYW55IHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCB3ZXJlIGFkZGVkIGJ5IHRoZSB2YWxpZGF0aW9uIG9wZXJhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvck1lc3NhZ2U8L0E+W108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvblJlc3VsdC48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlc3VsdC5odG1sI2dldE1lc3NhZ2VzKCkiPmdldE1lc3NhZ2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5zd2VyIGFueSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRoYXQgd2VyZSBhZGRlZCBieSB0aGUgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT5bXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uUmVzdWx0LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0TWVzc2FnZXNBc0NvcHkoKSI+Z2V0TWVzc2FnZXNBc0NvcHk8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYSBjb3B5IG9mIGFueSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRoYXQgd2VyZSBhZGRlZCBieSB0aGUgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uUmVzdWx0LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjYWRkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UpIj5hZGQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3JNZXNzYWdlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyBhbiBvcHRpb25hbCBtZXRob2QsIHRoYXQgYSB2YWxpZGF0b3IgY2FuIHVzZSB0byByZXR1cm4gZXJyb3IKLSBtZXNzYWdlcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9cY2xhc3MtdXNlVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IlZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2RvYy1maWxlcy9mYXEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2RvYy1maWxlcy9mYXEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5NmQwYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9kb2MtZmlsZXMvZmFxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlZhbGlkYXRpb24gRnJhbWV3b3JrIC0gRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+VmFsaWRhdGlvbiBGcmFtZXdvcmsgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvaDE+Ci08aDM+SG93IGRvIEkgY3JlYXRlIFByb2JsZW0gTWFya2Vycz88L2gzPgotPHA+VGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCB3YXlzIHRvIGNyZWF0ZSBwcm9ibGVtIG1hcmtlcnMuPC9wPgotPG9sPgotCTxsaT5Vc2UgdGhlIG5hdGl2ZSBzdXBwb3J0IGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L2xpPgotCTxsaT5NYW5hZ2UgeW91ciBvd24gbWFya2Vycy48L2xpPgotCTxsaT5Vc2UgdGhlIHN1cHBvcnQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvbGk+Ci08L29sPgotPHA+VGhlIGZpcnN0IGFwcHJvYWNoLCBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2guPC9wPgotCi08aDQ+MS4gVXNlIHRoZSBuYXRpdmUgc3VwcG9ydCBpbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcms8L2g0PgotPHA+QWZ0ZXIgeW91IGhhdmUgZmluaXNoZWQgcGVyZm9ybWluZyB5b3VyIHZhbGlkYXRpb24sIGFuZCBhcmUgcmV0dXJuaW5nIGNvbnRyb2wgYmFjayB0bwotdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBhZGQgeW91ciBtZXNzYWdlcyBpbnRvIHRoZSAKLTxhIGhyZWY9Ii4uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+VmFsaWRhdGlvblJlc3VsdDwvYT4gYnkgdXNpbmcKLXRoZSA8YSBocmVmPSIuLi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjYWRkKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2UpIj5hZGQoVmFsaWRhdG9yTWVzc2FnZSBtZXNzYWdlKTwvYT4gbWV0aG9kLgotCi08aDQ+Mi4gTWFuYWdlIHlvdXIgb3duIG1hcmtlcnM8L2g0PgotCi08cD5DcmVhdGUgYW5kIHJlbW92ZSB5b3VyIG93biBtYXJrZXJzLiBTbyB0aGF0IHN1bW1hcnkgaW5mb3JtYXRpb24gY2FuIHN0aWxsIGJlIGRpc3BsYXllZCwgc2V0IHRoZSBjb3VudHMgb2YgYW55IG5ld2x5Ci1jcmVhdGVkIG1hcmtlcnMgaW4gdGhlIDxhIGhyZWY9Ii4uL1ZhbGlkYXRpb25SZXN1bHQuaHRtbCI+VmFsaWRhdGlvblJlc3VsdDwvYT4gYnkgdXNpbmcgdGhlIHNldFNldmVyaXR5WFhYKCkgbWV0aG9kcy4KLUZvciBleGFtcGxlLCBpZiB0aGlzIHZhbGlkYXRpb24gcGFzcyBnZW5lcmF0ZWQgdHdvIGVycm9yIG1hcmtlcnMsIHlvdSB3b3VsZCBjYWxsIAotPGEgaHJlZj0iLi4vVmFsaWRhdGlvblJlc3VsdC5odG1sI3NldFNldmVyaXR5RXJyb3IoaW50KSI+c2V0U2V2ZXJpdHlFcnJvcigyKTwvYT4uIAotPC9wPgotCi08aDQ+My4gVXNlIHRoZSBzdXBwb3J0IGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yazwvaDQ+Ci0KLTxwPklmIHlvdSBhcmUgcG9ydGluZyBhIHZhbGlkYXRvciB0aGF0IHVzZWQgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBhbmQgeW91IHdpc2ggdG8gY29udGludWUgdG8gdXNlIGFuCi08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIj5JUmVwb3J0ZXI8L2E+IHRvCi1yZXBvcnQgeW91ciBtYXJrZXJzLCB5b3UgY2FuIGNvbnRpbnVlIHRvIGRvIHNvLjwvcD4KLTxwPkZvciB0aGlzIGFwcHJvYWNoLCB1c2UgdGhlCi08YSBocmVmPSIuLi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcikiPmdldFJlcG9ydGVyKElQcm9ncmVzc01vbml0b3ImbmJzcDttb25pdG9yKTwvYT4gbWV0aG9kLAotYW5kIHJldHVybiB5b3VyIG1lc3NhZ2VzIHRocm91Z2ggdGhlIElSZXBvcnRlci4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGl0IGlzIGFzc3VtZWQgYnkgdGhlIGZyYW1ld29yaywgCi10aGF0IHRoaXMgSVJlcG9ydGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgb25seSB3YXkgb2YgcGFzc2luZyBtZXNzYWdlcyBiYWNrIHRvIHRoZSBmcmFtZXdvcmsuIAotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2MjZhNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNiBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUlNZXNzYWdlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSU1lc3NhZ2UiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lNZXNzYWdlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIENMQVNTJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJTWVzc2FnZTwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklNZXNzYWdlPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci08cD4KLSBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgbG9jYWxlLWluZGVwZW5kZW50IHZhbGlkYXRpb24gbWVzc2FnZS4KLSA8L3A+Ci0gPHA+Ci0gR2l2ZW4gdGhlc2UgdGhyZWUgdmFsdWVzIGFzIGlucHV0LCB0aGlzIGludGVyZmFjZSBjYW4gYmUgcXVlcmllZCBmb3IgdGhlIGZpbmFsIG1lc3NhZ2Ugc3RyaW5nLgotIChpLmUuLCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIGFscmVhZHkgc3Vic3RpdHV0ZWQgaW4uKSBFaXRoZXIgdGhlIGRlZmF1bHQgTG9jYWxlIGNhbiBiZQotIHVzZWQsIG9yIHRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgYSBMb2NhbGUuCi0gPC9wPgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkZpZWxkIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0FMTF9NRVNTQUdFUyI+QUxMX01FU1NBR0VTPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NwZWNpZnkgYWxsIHR5cGVzIG9mIG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT5zdGF0aWMmbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0VSUk9SX0FORF9XQVJOSU5HIj5FUlJPUl9BTkRfV0FSTklORzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTcGVjaWZ5IGhpZ2ggKGVycm9yKSBhbmQgbm9ybWFsICh3YXJuaW5nKSBtZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNISUdIX1NFVkVSSVRZIj5ISUdIX1NFVkVSSVRZPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1R5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgZXJyb3IgbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjTElORU5PX1VOU0VUIj5MSU5FTk9fVU5TRVQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjTE9XX1NFVkVSSVRZIj5MT1dfU0VWRVJJVFk8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VHlwaWNhbGx5IHVzZWQgdG8gc3BlY2lmeSBpbmZvcm1hdGlvbiBtZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNOT1JNQUxfU0VWRVJJVFkiPk5PUk1BTF9TRVZFUklUWTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUeXBpY2FsbHkgdXNlZCB0byBzcGVjaWZ5IHdhcm5pbmcgbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2ludDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjT0ZGU0VUX1VOU0VUIj5PRkZTRVRfVU5TRVQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPnN0YXRpYyZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI1RhcmdldFJlc291cmNlIj5UYXJnZXRSZXNvdXJjZTwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUYXJnZXRSZXNvdXJjZSAtIFRoZSBrZXkgdG8gdXNlIHdoZW4gYXNzb2NpYXRpbmcgYSByZXNvdXJjZSB3aXRoIGEgbWVzc2FnZSB2aWEgYW4KLSBhdHRyaWJ1dGUuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykiPmdldEF0dHJpYnV0ZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJvdmlkZXMgYSB3YXkgdG8gc3RvcmUgc29tZSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdGhhdCBhIG1lc3NhZ2Ugd291bGQgbGlrZSB0byBzdG9yZQotIHRoYXQgY2FuIHVzZWQgYnkgc29tZSBvdGhlciBwYXJ0aWVzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhvc2UgYXR0cmlidXRlIHZhbHVlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkhhc2hNYXA8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldEF0dHJpYnV0ZXMoKSI+Z2V0QXR0cmlidXRlczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybiBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgYSBNZXNzYWdlIG9iamVjdC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0QnVuZGxlTmFtZSgpIj5nZXRCdW5kbGVOYW1lPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmc8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldEdyb3VwTmFtZSgpIj5nZXRHcm91cE5hbWU8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkgYXNzaWduIGdyb3VwIG5hbWVzCi0gdG8gSU1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRJZCgpIj5nZXRJZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGlkIG9mIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldExlbmd0aCgpIj5nZXRMZW5ndGg8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRMaW5lTnVtYmVyKCkiPmdldExpbmVOdW1iZXI8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJZiB0aGVyZSBpcyBhIHRhcmdldCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU1lc3NhZ2UsIGFuZCB0aGF0IHRhcmdldCBvYmplY3QgaXMgYSBmaWxlLAotIHRoZW4gYW4gb3B0aW9uYWwgbGluZSBudW1iZXIgbWF5IGJlIHNldC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0TWFya2VySWQoKSI+Z2V0TWFya2VySWQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm4gdGhlIG1hcmtlciBpZCBpZiBvbmUgaXMgc2V0IG9uIHRoaXMgb2JqZWN0IHdoZW4gY3JlYXRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7aW50PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRPZmZzZXQoKSI+Z2V0T2Zmc2V0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nW108L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldFBhcmFtcygpIj5nZXRQYXJhbXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldFNldmVyaXR5KCkiPmdldFNldmVyaXR5PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gUmV0dXJucyB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5PYmplY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldFRhcmdldE9iamVjdCgpIj5nZXRUYXJnZXRPYmplY3Q8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXR1cm4gdGhlIG9iamVjdCB0aGF0IHRoaXMgSU1lc3NhZ2UgaXMgcmVwb3J0aW5nIHRoZSBwcm9ibGVtIGFnYWluc3QsIGlmIGFueS4gbnVsbCB3aWxsIGJlCi0gcmV0dXJuZWQgaWYgdGhpcyBpcyBhIGdlbmVyYWwgbWVzc2FnZSB3aGljaCBkb2VzIG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgb2JqZWN0OyBmb3IKLSBleGFtcGxlLCAiaW50ZXJuYWwgZXJyb3IiLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuU3RyaW5nPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRUZXh0KCkiPmdldFRleHQ8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0VGV4dChqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpIj5nZXRUZXh0PC9BPjwvQj4oamF2YS5sYW5nLkNsYXNzTG9hZGVyJm5ic3A7Y2xhc3NMb2FkZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0VGV4dChqYXZhLnV0aWwuTG9jYWxlKSI+Z2V0VGV4dDwvQT48L0I+KGphdmEudXRpbC5Mb2NhbGUmbmJzcDtsb2NhbGUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLlN0cmluZzwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjZ2V0VGV4dChqYXZhLnV0aWwuTG9jYWxlLCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpIj5nZXRUZXh0PC9BPjwvQj4oamF2YS51dGlsLkxvY2FsZSZuYnNwO2xvY2FsZSwKLSAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyJm5ic3A7Y2xhc3NMb2FkZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjc2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpIj5zZXRBdHRyaWJ1dGU8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7YXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7dmFsdWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIGF0dHJpYnV0ZU5hbWUgYW5kIHZhbHVlIGFzIGtleSB2YWx1ZSBwYWlyLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRCdW5kbGVOYW1lKGphdmEubGFuZy5TdHJpbmcpIj5zZXRCdW5kbGVOYW1lPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO2J1bmRsZU5hbWUpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRHcm91cE5hbWUoamF2YS5sYW5nLlN0cmluZykiPnNldEdyb3VwTmFtZTwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtuYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5IGFzc2lnbiBncm91cCBuYW1lcwotIHRvIElNZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjc2V0SWQoamF2YS5sYW5nLlN0cmluZykiPnNldElkPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25ld0lkKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0IHRoZSBpZCBvZiB0aGUgbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjc2V0TGVuZ3RoKGludCkiPnNldExlbmd0aDwvQT48L0I+KGludCZuYnNwO2xlbmd0aCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSwgc3RhcnRpbmcgZnJvbSB0aGUgb2Zmc2V0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRMaW5lTm8oaW50KSI+c2V0TGluZU5vPC9BPjwvQj4oaW50Jm5ic3A7bGluZU51bWJlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0lmIHRoZXJlIGlzIGEgdGFyZ2V0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTWVzc2FnZSwgYW5kIHRoYXQgdGFyZ2V0IG9iamVjdCBpcyBhIGZpbGUsCi0gdGhlbiBhbiBvcHRpb25hbCBsaW5lIG51bWJlciBtYXkgYmUgc2V0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRNYXJrZXJJZChqYXZhLmxhbmcuU3RyaW5nKSI+c2V0TWFya2VySWQ8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bWFya2VySWQpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXQgdGhlIG1hcmtlciBpZCBvbiBhIE1lc3NhZ2Ugb2JqZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRPZmZzZXQoaW50KSI+c2V0T2Zmc2V0PC9BPjwvQj4oaW50Jm5ic3A7b2Zmc2V0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRQYXJhbXMoamF2YS5sYW5nLlN0cmluZ1tdKSI+c2V0UGFyYW1zPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZ1tdJm5ic3A7bmV3UGFyYW1zKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2V0cyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjc2V0U2V2ZXJpdHkoaW50KSI+c2V0U2V2ZXJpdHk8L0E+PC9CPihpbnQmbmJzcDtuZXdTZXZlcml0eSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NldHMgdGhlIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNzZXRUYXJnZXRPYmplY3QoamF2YS5sYW5nLk9iamVjdCkiPnNldFRhcmdldE9iamVjdDwvQT48L0I+KGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmopPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBc3NvY2lhdGUgdGhpcyBJTWVzc2FnZSB3aXRoIHRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHByb2JsZW0uPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJmaWVsZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iT0ZGU0VUX1VOU0VUIj48IS0tIC0tPjwvQT48SDM+Ci1PRkZTRVRfVU5TRVQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+T0ZGU0VUX1VOU0VUPC9CPjwvUFJFPgotPERMPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5PRkZTRVRfVU5TRVQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iTElORU5PX1VOU0VUIj48IS0tIC0tPjwvQT48SDM+Ci1MSU5FTk9fVU5TRVQ8L0gzPgotPFBSRT4KLXN0YXRpYyBmaW5hbCBpbnQgPEI+TElORU5PX1VOU0VUPC9CPjwvUFJFPgotPERMPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5MSU5FTk9fVU5TRVQiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iSElHSF9TRVZFUklUWSI+PCEtLSAtLT48L0E+PEgzPgotSElHSF9TRVZFUklUWTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5ISUdIX1NFVkVSSVRZPC9CPjwvUFJFPgotPERMPgotPEREPlR5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgZXJyb3IgbWVzc2FnZXMuCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuSElHSF9TRVZFUklUWSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJOT1JNQUxfU0VWRVJJVFkiPjwhLS0gLS0+PC9BPjxIMz4KLU5PUk1BTF9TRVZFUklUWTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5OT1JNQUxfU0VWRVJJVFk8L0I+PC9QUkU+Ci08REw+Ci08REQ+VHlwaWNhbGx5IHVzZWQgdG8gc3BlY2lmeSB3YXJuaW5nIG1lc3NhZ2VzLgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSI+Q29uc3RhbnQgRmllbGQgVmFsdWVzPC9BPjwvREw+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJMT1dfU0VWRVJJVFkiPjwhLS0gLS0+PC9BPjxIMz4KLUxPV19TRVZFUklUWTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGludCA8Qj5MT1dfU0VWRVJJVFk8L0I+PC9QUkU+Ci08REw+Ci08REQ+VHlwaWNhbGx5IHVzZWQgdG8gc3BlY2lmeSBpbmZvcm1hdGlvbiBtZXNzYWdlcy4KLTxQPgotPERMPgotPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vY29uc3RhbnQtdmFsdWVzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZS5MT1dfU0VWRVJJVFkiPkNvbnN0YW50IEZpZWxkIFZhbHVlczwvQT48L0RMPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iRVJST1JfQU5EX1dBUk5JTkciPjwhLS0gLS0+PC9BPjxIMz4KLUVSUk9SX0FORF9XQVJOSU5HPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPkVSUk9SX0FORF9XQVJOSU5HPC9CPjwvUFJFPgotPERMPgotPEREPlNwZWNpZnkgaGlnaCAoZXJyb3IpIGFuZCBub3JtYWwgKHdhcm5pbmcpIG1lc3NhZ2VzLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGEgTWVzc2FnZUZpbHRlciwgdG8KLSBmaWx0ZXIgb3V0IGluZm9ybWF0aW9uIG1lc3NhZ2VzLgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IkFMTF9NRVNTQUdFUyI+PCEtLSAtLT48L0E+PEgzPgotQUxMX01FU1NBR0VTPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgaW50IDxCPkFMTF9NRVNTQUdFUzwvQj48L1BSRT4KLTxETD4KLTxERD5TcGVjaWZ5IGFsbCB0eXBlcyBvZiBtZXNzYWdlcy4gVHlwaWNhbGx5IHVzZWQgd2l0aCBhIE1lc3NhZ2VGaWx0ZXIuCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbnN0YW50LXZhbHVlcy5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UuQUxMX01FU1NBR0VTIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9IlRhcmdldFJlc291cmNlIj48IS0tIC0tPjwvQT48SDM+Ci1UYXJnZXRSZXNvdXJjZTwvSDM+Ci08UFJFPgotc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgPEI+VGFyZ2V0UmVzb3VyY2U8L0I+PC9QUkU+Ci08REw+Ci08REQ+VGFyZ2V0UmVzb3VyY2UgLSBUaGUga2V5IHRvIHVzZSB3aGVuIGFzc29jaWF0aW5nIGEgcmVzb3VyY2Ugd2l0aCBhIG1lc3NhZ2UgdmlhIGFuCi0gYXR0cmlidXRlLiAKLSA8cD4KLSBOb3JtYWxseSwgdGhlIHRhcmdldCBpcyBzdG9yZWQgdXNpbmcgdGhlIHNldFRhcmdldE9iamVjdCgpIG1ldGhvZCwgYnV0Ci0gc29tZSBvZiB0aGUgbGVnYWN5IHZhbGlkYXRvcnMgdXNlZCB0aGlzIGZpZWxkIGZvciBvYmplY3RzIHRoYXQgd2hlcmUgbm90IElSZXNvdXJjZXMuCi0gSW4gb3JkZXIgdG8gYXNzb2NpYXRlIHRoZSBtZXNzYWdlIHdpdGggdGhlIHByb3BlciBJUmVzb3VyY2UgdGhlIHZhbGlkYXRvciBjYW4gc3RvcmUKLSB0aGUgSVJlc291cmNlIGFzIGFuIGF0dHJpYnV0ZSBhbmQgdXNlIHRoaXMgc3RyaW5nIGFzIHRoZSBrZXkuCi0gPC9wPgotPFA+Ci08REw+Ci08RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9jb25zdGFudC12YWx1ZXMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlLlRhcmdldFJlc291cmNlIj5Db25zdGFudCBGaWVsZCBWYWx1ZXM8L0E+PC9ETD4KLTwvREw+Ci0KLTwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPEEgTkFNRT0iZ2V0QnVuZGxlTmFtZSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRCdW5kbGVOYW1lPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldEJ1bmRsZU5hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0R3JvdXBOYW1lKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEdyb3VwTmFtZTwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRHcm91cE5hbWU8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5UbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkgYXNzaWduIGdyb3VwIG5hbWVzCi0gdG8gSU1lc3NhZ2VzLiBBbiBJTWVzc2FnZSBzdWJzZXQgd2lsbCBiZSBpZGVudGlmaWVkIGJ5IHRoZSBuYW1lIG9mIGl0cyBncm91cC4gRGVmYXVsdCAobnVsbCkKLSBtZWFucyBubyBncm91cC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgbmFtZSBvZiB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYmVsb25ncy48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldElkKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldElkPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldElkPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UuIE1lc3NhZ2UgaWRzIGFyZSB1c2VkIGFzIHRoZSBjb25zdGFudHMgaW4gcHJvcGVydHkgYnVuZGxlcwotIHdoaWNoIGxvY2FsaXplIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudCBmYXNoaW9uLiBUaGUgaWQgaXMgdGhlCi0ga2V5LCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aGljaCBpZGVudGlmaWVzIHRoZSBzdHJpbmcgdG8gYmUgbG9hZGVkLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsCi0gb3IgdGhlIGVtcHR5IHN0cmluZy4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD50aGUgaWQgb2YgdGhlIG1lc3NhZ2U8L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldExlbmd0aCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRMZW5ndGg8L0gzPgotPFBSRT4KLWludCA8Qj5nZXRMZW5ndGg8L0I+KCk8L1BSRT4KLTxETD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSBhcmVhLCBzdGFydGluZyBmcm9tIHRoZSBvZmZzZXQuIElmIHVuc2V0LCB2YWx1ZSA9Ci0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VULjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNnZXRPZmZzZXQoKSI+PENPREU+Z2V0T2Zmc2V0KCk8L0NPREU+PC9BPjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TGluZU51bWJlcigpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRMaW5lTnVtYmVyPC9IMz4KLTxQUkU+Ci1pbnQgPEI+Z2V0TGluZU51bWJlcjwvQj4oKTwvUFJFPgotPERMPgotPEREPklmIHRoZXJlIGlzIGEgdGFyZ2V0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTWVzc2FnZSwgYW5kIHRoYXQgdGFyZ2V0IG9iamVjdCBpcyBhIGZpbGUsCi0gdGhlbiBhbiBvcHRpb25hbCBsaW5lIG51bWJlciBtYXkgYmUgc2V0LiBUaGUgbGluZSBudW1iZXIgaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlCi0gcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoaXMgbWVzc2FnZS4gSWYgbm8gbGluZSBudW1iZXIgaGFzIGJlZW4gc2V0LCAjTElORU5PX1VOU0VUIHdpbGwgYmUKLSByZXR1cm5lZC4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5saW5lIG51bWJlciBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHByb2JsZW0uPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRPZmZzZXQoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0T2Zmc2V0PC9IMz4KLTxQUkU+Ci1pbnQgPEI+Z2V0T2Zmc2V0PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBtZXNzYWdlLiBJZiB1bnNldCwgdmFsdWUgPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQuIEZvciBleGFtcGxlLCBpZgotIHRoZSBqYXZhIGNvbXBpbGVyIHdlcmUgYSB2YWxpZGF0b3IsIGFuZCBpdCByZXBvcnRlZCB0aGF0IGEgdmFyaWFibGUgbmFtZSB3YXMgdW5rbm93biwgb2Zmc2V0Ci0gd291bGQgaWRlbnRpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVua25vd24gdmFyaWFibGUuIFRoZSBwb3NpdGlvbiBpcwotIGlkZW50aWZpZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPm9mZnNldCBvZiB0aGUgbWVzc2FnZTwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0UGFyYW1zKCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFBhcmFtczwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZ1tdIDxCPmdldFBhcmFtczwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybnMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2UuIE1lc3NhZ2UgcGFyYW1ldGVycyBhcmUgdGhlIHZhbHVlcyB3aGljaCBhcmUKLSBzdWJzdGl0dXRlZCBpbnRvIHBhcmFtZXRlciBzbG90cyBpbiBsb2NhbGl6ZWQgbWVzc2FnZSB0ZXh0IGRlc2NyaXB0aW9ucy4KLTxQPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5wYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTZXZlcml0eSgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRTZXZlcml0eTwvSDM+Ci08UFJFPgotaW50IDxCPmdldFNldmVyaXR5PC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PHA+Ci0gUmV0dXJucyB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuIE9uZSBvZiBTZXZlcml0eUVudW0gY29uc3RhbnRzLgotPFA+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNISUdIX1NFVkVSSVRZIj48Q09ERT5ISUdIX1NFVkVSSVRZPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI05PUk1BTF9TRVZFUklUWSI+PENPREU+Tk9STUFMX1NFVkVSSVRZPC9DT0RFPjwvQT4sIAotPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI0xPV19TRVZFUklUWSI+PENPREU+PC9wPjwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUYXJnZXRPYmplY3QoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VGFyZ2V0T2JqZWN0PC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0IDxCPmdldFRhcmdldE9iamVjdDwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybiB0aGUgb2JqZWN0IHRoYXQgdGhpcyBJTWVzc2FnZSBpcyByZXBvcnRpbmcgdGhlIHByb2JsZW0gYWdhaW5zdCwgaWYgYW55LiBudWxsIHdpbGwgYmUKLSByZXR1cm5lZCBpZiB0aGlzIGlzIGEgZ2VuZXJhbCBtZXNzYWdlIHdoaWNoIGRvZXMgbm90IGFwcGx5IHRvIGEgcGFydGljdWxhciBvYmplY3Q7IGZvcgotIGV4YW1wbGUsICJpbnRlcm5hbCBlcnJvciIuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dGhlIHRhcmdldCBvYmplY3QgZm9yIHRoZSBtZXNzYWdlPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUZXh0KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFRleHQ8L0gzPgotPFBSRT4KLWphdmEubGFuZy5TdHJpbmcgPEI+Z2V0VGV4dDwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdCBMb2NhbGUsIHdpdGggdGhlCi0gYnVuZGxlIGxvYWRlZCBieSB0aGUgZGVmYXVsdCBDbGFzc0xvYWRlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9ImdldFRleHQoamF2YS5sYW5nLkNsYXNzTG9hZGVyKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0VGV4dDwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRUZXh0PC9CPihqYXZhLmxhbmcuQ2xhc3NMb2FkZXImbmJzcDtjbGFzc0xvYWRlcik8L1BSRT4KLTxETD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmNsYXNzTG9hZGVyPC9DT0RFPiAtIFRoZSBDbGFzc0xvYWRlciB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUgUmVzb3VyY2VCdW5kbGUuCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0dGVkIGluIHRoZSBkZWZhdWx0IGxvY2FsZSwgd2l0aCB0aGUKLSBidW5kbGUgbG9hZGVkIGJ5IHRoZSBzcGVjaWZpZWQgQ2xhc3NMb2FkZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRUZXh0KGphdmEudXRpbC5Mb2NhbGUpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRUZXh0PC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldFRleHQ8L0I+KGphdmEudXRpbC5Mb2NhbGUmbmJzcDtsb2NhbGUpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5sb2NhbGU8L0NPREU+IC0gVGhlIGxvY2FsZSB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2UgdGV4dCBpbnRvLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdHRlZCBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZSwgd2l0aCB0aGUKLSBidW5kbGUgbG9hZGVkIGJ5IHRoZSBkZWZhdWx0IENsYXNzTG9hZGVyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VGV4dChqYXZhLnV0aWwuTG9jYWxlLCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRUZXh0PC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nIDxCPmdldFRleHQ8L0I+KGphdmEudXRpbC5Mb2NhbGUmbmJzcDtsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzTG9hZGVyJm5ic3A7Y2xhc3NMb2FkZXIpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5sb2NhbGU8L0NPREU+IC0gVGhlIGxvY2FsZSB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2UgdGV4dCBpbnRvLjxERD48Q09ERT5jbGFzc0xvYWRlcjwvQ09ERT4gLSBUaGUgQ2xhc3NMb2FkZXIgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIFJlc291cmNlQnVuZGxlLgotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdHRlZCBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZSwgd2l0aCB0aGUKLSBidW5kbGUgbG9hZGVkIGJ5IHRoZSBzcGVjaWZpZWQgQ2xhc3NMb2FkZXIuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KLWdldEF0dHJpYnV0ZTwvSDM+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdCA8Qj5nZXRBdHRyaWJ1dGU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lKTwvUFJFPgotPERMPgotPEREPlByb3ZpZGVzIGEgd2F5IHRvIHN0b3JlIHNvbWUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRoYXQgYSBtZXNzYWdlIHdvdWxkIGxpa2UgdG8gc3RvcmUKLSB0aGF0IGNhbiB1c2VkIGJ5IHNvbWUgb3RoZXIgcGFydGllcyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRob3NlIGF0dHJpYnV0ZSB2YWx1ZXMuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWU8L0NPREU+IC0gCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPmFuIE9iamVjdCBiYXNpY2FsbHkgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IG5hbWUuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldEF0dHJpYnV0ZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRBdHRyaWJ1dGU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDthdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO3ZhbHVlKTwvUFJFPgotPERMPgotPEREPlNldCB0aGUgYXR0cmlidXRlTmFtZSBhbmQgdmFsdWUgYXMga2V5IHZhbHVlIHBhaXIuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmF0dHJpYnV0ZU5hbWU8L0NPREU+IC0gPERUPjxCPlNlZSBBbHNvOjwvQj48REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKSI+PENPREU+Z2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRCdW5kbGVOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRCdW5kbGVOYW1lPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldEJ1bmRsZU5hbWU8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtidW5kbGVOYW1lKTwvUFJFPgotPERMPgotPEREPlNldCB0aGUgbmFtZSBvZiB0aGUgYnVuZGxlIHdoaWNoIHRoaXMgbWVzc2FnZSBpcyBjb250YWluZWQgaW4uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmJ1bmRsZU5hbWU8L0NPREU+IC0gTmFtZSBvZiB0aGUgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0R3JvdXBOYW1lKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRHcm91cE5hbWU8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0R3JvdXBOYW1lPC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7bmFtZSk8L1BSRT4KLTxETD4KLTxERD5UbyBzdXBwb3J0IHJlbW92YWwgb2YgYSBzdWJzZXQgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcywgYW4gSVZhbGlkYXRvciBtYXkgYXNzaWduIGdyb3VwIG5hbWVzCi0gdG8gSU1lc3NhZ2VzLiBBbiBJTWVzc2FnZSBzdWJzZXQgd2lsbCBiZSBpZGVudGlmaWVkIGJ5IHRoZSBuYW1lIG9mIGl0cyBncm91cC4gRGVmYXVsdCAobnVsbCkKLSBtZWFucyBubyBncm91cC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmFtZTwvQ09ERT4gLSBOYW1lIG9mIHRoZSBncm91cC48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldElkKGphdmEubGFuZy5TdHJpbmcpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRJZDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRJZDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO25ld0lkKTwvUFJFPgotPERMPgotPEREPlNldCB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UuIE1lc3NhZ2UgaWRzIGFyZSB1c2VkIGFzIHRoZSBjb25zdGFudHMgaW4gcHJvcGVydHkgYnVuZGxlcyB3aGljaAotIGxvY2FsaXplIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudCBmYXNoaW9uLiBUaGUgaWQgaXMgdGhlIGtleSwKLSBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aGljaCBpZGVudGlmaWVzIHRoZSBzdHJpbmcgdG8gYmUgbG9hZGVkLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsIG9yCi0gdGhlIGVtcHR5IHN0cmluZy4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bmV3SWQ8L0NPREU+IC0gSWQgb2YgdGhlIG1lc3NhZ2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRMZW5ndGgoaW50KSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TGVuZ3RoPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldExlbmd0aDwvQj4oaW50Jm5ic3A7bGVuZ3RoKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSwgc3RhcnRpbmcgZnJvbSB0aGUgb2Zmc2V0LiBJZiB1bnNldCwgdmFsdWUgPQotIElNZXNzYWdlLk9GRlNFVF9VTlNFVC4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+bGVuZ3RoPC9DT0RFPiAtIFNldHMgdGhlIGxlbmd0aC48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjc2V0T2Zmc2V0KGludCkiPjxDT0RFPnNldE9mZnNldChpbnQpPC9DT0RFPjwvQT48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InNldExpbmVObyhpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRMaW5lTm88L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0TGluZU5vPC9CPihpbnQmbmJzcDtsaW5lTnVtYmVyKTwvUFJFPgotPERMPgotPEREPklmIHRoZXJlIGlzIGEgdGFyZ2V0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTWVzc2FnZSwgYW5kIHRoYXQgdGFyZ2V0IG9iamVjdCBpcyBhIGZpbGUsCi0gdGhlbiBhbiBvcHRpb25hbCBsaW5lIG51bWJlciBtYXkgYmUgc2V0LiBUaGUgbGluZSBudW1iZXIgaWRlbnRpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlCi0gcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoaXMgbWVzc2FnZS4gVG8gaW5kaWNhdGUgbm8gbGluZSBudW1iZXIsIHVzZSAjTElORU5PX1VOU0VULgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5saW5lTnVtYmVyPC9DT0RFPiAtIFNldHMgdGhlIGxpbmUgbnVtYmVyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0ic2V0T2Zmc2V0KGludCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldE9mZnNldDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRPZmZzZXQ8L0I+KGludCZuYnNwO29mZnNldCk8L1BSRT4KLTxETD4KLTxERD5TZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuIElmIHVuc2V0LCB2YWx1ZSA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVC4gRm9yIGV4YW1wbGUsIGlmIHRoZQotIGphdmEgY29tcGlsZXIgd2VyZSBhIHZhbGlkYXRvciwgYW5kIGl0IHJlcG9ydGVkIHRoYXQgYSB2YXJpYWJsZSBuYW1lIHdhcyB1bmtub3duLCBvZmZzZXQKLSB3b3VsZCBpZGVudGlmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdW5rbm93biB2YXJpYWJsZS4gVGhlIHBvc2l0aW9uIGlzCi0gaWRlbnRpZmllZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9mZnNldDwvQ09ERT4gLSBTZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRQYXJhbXMoamF2YS5sYW5nLlN0cmluZ1tdKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0UGFyYW1zPC9IMz4KLTxQUkU+Ci12b2lkIDxCPnNldFBhcmFtczwvQj4oamF2YS5sYW5nLlN0cmluZ1tdJm5ic3A7bmV3UGFyYW1zKTwvUFJFPgotPERMPgotPEREPlNldHMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2UuIE1lc3NhZ2UgcGFyYW1ldGVycyBhcmUgdGhlIHZhbHVlcyB3aGljaCBhcmUgc3Vic3RpdHV0ZWQKLSBpbnRvIHBhcmFtZXRlciBzbG90cyBpbiBsb2NhbGl6ZWQgbWVzc2FnZSB0ZXh0IGRlc2NyaXB0aW9ucy4KLSA8cD4KLSBGb3IgZXhhbXBsZSwgaWYgZ2V0SWQoKSByZXR1cm5zICJNWV9JRCIsIHRoZW4gdGhlIFJlc291cmNlQnVuZGxlIGlkZW50aWZpZWQgYnkKLSBnZXRCdW5kbGVOYW1lKCkgaXMgc2VhcmNoZWQgZm9yIHRoZSBtZXNzYWdlIG5hbWVkICJNWV9JRCIsIGFuZCBpZiBmb3VuZCwKLSBoYXMgaXQncyBwYXJhbWV0ZXJzIHNldC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm5ld1BhcmFtczwvQ09ERT4gLSBQYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlLjxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxDT0RFPmlzIGludm9rZWQgb24gdGhlIG1lc3NhZ2UsIHdpdGgKLSAgICAgIDxjb2RlPm5ld1BhcmFtczwvY29kZT4gcGFzc2VkIGluIGFzIHRoZSBPYmplY3RbXS48L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRTZXZlcml0eShpbnQpIj48IS0tIC0tPjwvQT48SDM+Ci1zZXRTZXZlcml0eTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRTZXZlcml0eTwvQj4oaW50Jm5ic3A7bmV3U2V2ZXJpdHkpPC9QUkU+Ci08REw+Ci08REQ+U2V0cyB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuIE9uZSBvZiBTZXZlcml0eUVudW0gY29uc3RhbnRzLgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5uZXdTZXZlcml0eTwvQ09ERT4gLSBTZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZS48RFQ+PEI+U2VlIEFsc286PC9CPjxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwjSElHSF9TRVZFUklUWSI+PENPREU+SElHSF9TRVZFUklUWTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNOT1JNQUxfU0VWRVJJVFkiPjxDT0RFPk5PUk1BTF9TRVZFUklUWTwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCNMT1dfU0VWRVJJVFkiPjxDT0RFPkxPV19TRVZFUklUWTwvQ09ERT48L0E+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRUYXJnZXRPYmplY3QoamF2YS5sYW5nLk9iamVjdCkiPjwhLS0gLS0+PC9BPjxIMz4KLXNldFRhcmdldE9iamVjdDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5zZXRUYXJnZXRPYmplY3Q8L0I+KGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmopPC9QUkU+Ci08REw+Ci08REQ+QXNzb2NpYXRlIHRoaXMgSU1lc3NhZ2Ugd2l0aCB0aGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBwcm9ibGVtLiBBIG51bGwgdmFsdWUgaXMgcGVybWl0dGVkLiBJZiBhCi0gbWVzc2FnZSBpcyBhcHBsaWNhYmxlIHRvIG9uZSBvYmplY3QsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgYmUgc2V0LiBPdGhlcndpc2UsIHRoZSBkZWZhdWx0Ci0gdmFsdWUgKG51bGwpIHNob3VsZCBiZSBrZXB0LiBHaXZlbiB0aGlzIHRhcmdldCBvYmplY3QsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlCi0gZXhhY3QgbG9jYXRpb24gb2YgdGhlIHByb2JsZW0uCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9iajwvQ09ERT4gLSBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBwcm9ibGVtLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0QXR0cmlidXRlcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRBdHRyaWJ1dGVzPC9IMz4KLTxQUkU+Ci1qYXZhLnV0aWwuSGFzaE1hcCA8Qj5nZXRBdHRyaWJ1dGVzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+UmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBhIE1lc3NhZ2Ugb2JqZWN0LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRNYXJrZXJJZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRNYXJrZXJJZDwvSDM+Ci08UFJFPgotamF2YS5sYW5nLlN0cmluZyA8Qj5nZXRNYXJrZXJJZDwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybiB0aGUgbWFya2VyIGlkIGlmIG9uZSBpcyBzZXQgb24gdGhpcyBvYmplY3Qgd2hlbiBjcmVhdGVkLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJzZXRNYXJrZXJJZChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotc2V0TWFya2VySWQ8L0gzPgotPFBSRT4KLXZvaWQgPEI+c2V0TWFya2VySWQ8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDttYXJrZXJJZCk8L1BSRT4KLTxETD4KLTxERD5TZXQgdGhlIG1hcmtlciBpZCBvbiBhIE1lc3NhZ2Ugb2JqZWN0LgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JTWVzc2FnZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViBDTEFTUyZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSU1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX3N1bW1hcnkiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwOzxBIEhSRUY9IiNmaWVsZF9kZXRhaWwiPkZJRUxEPC9BPiZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA2MGI0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1JTWV0YU1vZGVsQ29udGV4dAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklNZXRhTW9kZWxDb250ZXh0IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJTWV0YU1vZGVsQ29udGV4dDwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIFN1cGVyaW50ZXJmYWNlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SU1ldGFNb2RlbENvbnRleHQ8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLTxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS5sYW5nLk9iamVjdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwjZ2V0TW9kZWwoamF2YS5sYW5nLlN0cmluZykiPmdldE1vZGVsPC9BPjwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO1VSSSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjZ2V0VVJJcygpIj5nZXRVUklzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCNsb2FkTW9kZWwoamF2YS5sYW5nLlN0cmluZykiPmxvYWRNb2RlbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPmxvYWRNb2RlbDwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRNb2RlbChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TW9kZWw8L0gzPgotPFBSRT4KLWphdmEubGFuZy5PYmplY3QgPEI+Z2V0TW9kZWw8L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtVUkkpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZmMjIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUlQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ8L0gyPgotPERMPgotPERUPjxCPkFsbCBTdXBlcmludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9ETD4KLTwvUFJFPgotCi08UD4KLUlQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gYQotIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBvbiB3aGljaCBhIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLgotIDxwPgotIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVByb2plY3Q8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwjZ2V0UHJvamVjdCgpIj5nZXRQcm9qZWN0PC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHJvdmlkZXMgdGhlIHByb2plY3Qgb24gd2hpY2ggdGhlIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0Ij48Qj5NZXRob2RzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjZ2V0VVJJcygpIj5nZXRVUklzPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCNsb2FkTW9kZWwoamF2YS5sYW5nLlN0cmluZykiPmxvYWRNb2RlbDwvQT4sIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPmxvYWRNb2RlbDwvQT48L0NPREU+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJnZXRQcm9qZWN0KCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFByb2plY3Q8L0gzPgotPFBSRT4KLUlQcm9qZWN0IDxCPmdldFByb2plY3Q8L0I+KCk8L1BSRT4KLTxETD4KLTxERD5Qcm92aWRlcyB0aGUgcHJvamVjdCBvbiB3aGljaCB0aGUgdmFsaWRhdG9yIGlzIGJlaW5nIGludm9rZWQuCi08UD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+YW4gSVByb2plY3QgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IG9uIHdoaWNoIHRoZSB2YWxpZGF0b3IgaXMKLSAgICAgICAgIGJlaW5nIGludm9rZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIENMQVNTIERBVEEgPT09PT09PT09IC0tPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDY1ZjRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotSVJlcG9ydGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVJlcG9ydGVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JUmVwb3J0ZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUmVwb3J0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KLTxIMj4KLTxGT05UIFNJWkU9Ii0xIj4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0ZPTlQ+Ci08QlI+Ci1JbnRlcmZhY2UgSVJlcG9ydGVyPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgS25vd24gSW1wbGVtZW50aW5nIENsYXNzZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5SZXBvcnRlckhlbHBlcjwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVJlcG9ydGVyPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGUgaW50ZXJmYWNlIHVzZWQgYnkgSVZhbGlkYXRvcidzIHRvIHJlcG9ydCBtZXNzYWdlcy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJUmVwb3J0ZXIgY291bGQKLSBzaW1wbHkgbG9nIHRoZSBtZXNzYWdlcyB0byBzdGRvdXQsIGEgZmlsZSwgb3IgcmV0YWluIHRoZW0gaW4gYSBidWZmZXIgZm9yIGxhdGVyIGFjY2VzcyBieSBhIHVzZXIKLSBpbnRlcmZhY2UuCi0gPHA+Ci0gUmVwb3J0ZXIgaW1wbGVtZW50YXRpb25zIHNob3VsZCBrZWVwIG5vbi1sb2NhbGl6ZWQgdmVyc2lvbnMgb2YgdGhlaXIgbWVzc2FnZXMuCi0gPC9wPgotIDxwPgotIEFueSBtZXNzYWdlcyB3aGljaCBuZWVkIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcmUgZG9uZSB0aHJvdWdoIHRoaXMgY2xhc3MsIGFuZCBpZiB0aGUgdXNlcgotIGNhbmNlbHMgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHRoaXMgY2xhc3MgaXMgdGhlIG9uZSB3aGljaCByZWdpc3RlcnMgdGhlIGNhbmNlbGxhdGlvbi4KLSA8L3A+Ci0gPHA+Ci0gVGhlIElSZXBvcnRlciBpbnN0YW5jZSBpcyBjcmVhdGVkIGF0IHRoZSB0aW1lIHZhbGlkYXRpb24gYmVnaW5zIGFuZCBlbmRzIHdoZW4gdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4KLSBUaGVyZSBpcyBvbmx5IG9uZSBJUmVwb3J0ZXIgaW5zdGFuY2UgY3JlYXRlZCBmb3IgYWxsIHZhbGlkYXRvcnMgdGhhdCBhcmUgcnVuIG9uIGEgSVJlc291cmNlLiBUaGUgSVJlc291cmNlCi0gcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IG1lc3NhZ2VzIHB1dCBvdXQgZWFjaCB2YWxpZGF0b3IgYW5kIGFkZCBhbmQgZGVsZXRlIG1lc3NhZ2VzIGZvciBvbmUgdmFsaWRhdG9yCi0gYXQgYSB0aW1lLiAKLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmFkZE1lc3NhZ2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBBZGQgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjZGlzcGxheVN1YnRhc2sob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+ZGlzcGxheVN1YnRhc2s8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT4mbmJzcDttZXNzYWdlKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7U2hvdyBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlLCBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQKLSBMb2NhbGUsIHRvIHRoZSB1c2VyIGltbWVkaWF0ZWx5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLnV0aWwuTGlzdDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI2dldE1lc3NhZ2VzKCkiPmdldE1lc3NhZ2VzPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2Jvb2xlYW48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNpc0NhbmNlbGxlZCgpIj5pc0NhbmNlbGxlZDwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1JldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IpIj5yZW1vdmVBbGxNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0KSI+cmVtb3ZlQWxsTWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMsIGVudGVyZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLAotIHBlcnRhaW5pbmcgdG8gdGhlIE9iamVjdCBwcm92aWRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+cmVtb3ZlTWVzc2FnZVN1YnNldDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7b2JqLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7Z3JvdXBOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5Ci0gYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImFkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+PCEtLSAtLT48L0E+PEgzPgotYWRkTWVzc2FnZTwvSDM+Ci08UFJFPgotdm9pZCA8Qj5hZGRNZXNzYWdlPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L1BSRT4KLTxETD4KLTxERD48cD4KLSBBZGQgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLiBJdCB3aWxsIGJlIGRpc3BsYXllZCBsYXRlciwgd2l0aCBhbGwgb2YgdGhlCi0gb3RoZXIgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSA8L3A+Ci0gPHA+Ci0gVGhlIElWYWxpZGF0b3IgcGFzc2VkIGluIGlzIG5lZWRlZCBmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiAod2hlbiBhIG1lc3NhZ2UgbmVlZHMgdG8gYmUKLSByZW1vdmVkLCBvbmUgdmFsaWRhdG9yIHNob3VsZCBub3QgcmVtb3ZlIG1lc3NhZ2VzIGVudGVyZWQgYnkgYW5vdGhlciB2YWxpZGF0b3IuKSBUaGUKLSB2YWxpZGF0b3IgaXMgYWxzbyBxdWVyaWVkIGZvciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgcmVzb3VyY2UgYnVuZGxlLCB0byBlbmFibGUgc3VwcG9ydCBmb3IKLSBsb2NhbGl6YXRpb24gb2YgbWVzc2FnZXMgaW4gYSBjbGllbnQtc2VydmVyIGVudmlyb25tZW50LgotIDwvcD4KLSA8cD4KLSBCb3RoIHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbC4KLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPm9yaWdpbjwvQ09ERT4gLSBUaGUgdmFsaWRhdG9yIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIG1lc3NhZ2UuPEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gQSBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZGlzcGxheVN1YnRhc2sob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+PCEtLSAtLT48L0E+PEgzPgotZGlzcGxheVN1YnRhc2s8L0gzPgotPFBSRT4KLXZvaWQgPEI+ZGlzcGxheVN1YnRhc2s8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L1BSRT4KLTxETD4KLTxERD5TaG93IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UsIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdAotIExvY2FsZSwgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuIFRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgd2hpY2ggc3VidGFzayBpcwotIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBtZXNzYWdlIGlzIG5vdCBzdG9yZWQuIFRoZSBzdWJ0YXNrIG1lc3NhZ2UKLSBpbiB0aGlzIGNvbnRleHQgaXMgdGhlIHN1YnRhc2sgaW4gYSBJUHJvZ3Jlc3NNb250aW9yCi0gPHA+Ci0gQm90aCBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT52YWxpZGF0b3I8L0NPREU+IC0gVGhlIHZhbGlkYXRvciBpc3N1aW5nIHRoZSBzdWJ0YXNrIG1lc3NhZ2UuPEREPjxDT0RFPm1lc3NhZ2U8L0NPREU+IC0gVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0TWVzc2FnZXMoKSI+PCEtLSAtLT48L0E+PEgzPgotZ2V0TWVzc2FnZXM8L0gzPgotPFBSRT4KLWphdmEudXRpbC5MaXN0IDxCPmdldE1lc3NhZ2VzPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PERMPgotCi08RFQ+PEI+UmV0dXJuczo8L0I+PEREPnRoZSBtZXNzYWdlIGFjY2VzcyBpbnRlcmZhY2UgdG8gdGhpcyByZXBvcnRlciwgb3IgbnVsbCBpZiBtZXNzYWdlIGFjY2VzcyBpcyBub3QKLSBzdXBwb3J0ZWQuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJpc0NhbmNlbGxlZCgpIj48IS0tIC0tPjwvQT48SDM+Ci1pc0NhbmNlbGxlZDwvSDM+Ci08UFJFPgotYm9vbGVhbiA8Qj5pc0NhbmNlbGxlZDwvQj4oKTwvUFJFPgotPERMPgotPEREPlJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbmNlbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQotIGNhbGxlZCBieSBJVmFsaWRhdG9ycyBwZXJpb2RpY2FsbHksIGJlY2F1c2Ugbm8gZXZlbnQgaXMgZmlyZWQgdG8gbm90aWZ5IElWYWxpZGF0b3JzIHRoYXQgdGhlCi0gdXNlciBjYW5jZWxlZCB2YWxpZGF0aW9uLiBJZiBhIHZhbGlkYXRvciBkb2VzIG5vdCBjaGVjayB0aGlzIG1ldGhvZCwgYSBjYW5jZWxsYXRpb24gcmVxdWVzdAotIGlzIGlnbm9yZWQuCi08UD4KLTxERD48REw+Ci0KLTxEVD48Qj5SZXR1cm5zOjwvQj48REQ+dHJ1ZSBpZiB0aGUgdXNlciBjYW5jZWxlZCB2YWxpZGF0aW9uLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0icmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yKSI+PCEtLSAtLT48L0E+PEgzPgotcmVtb3ZlQWxsTWVzc2FnZXM8L0gzPgotPFBSRT4KLXZvaWQgPEI+cmVtb3ZlQWxsTWVzc2FnZXM8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luKTwvUFJFPgotPERMPgotPEREPlJlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcyBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvci4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQKLSBmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gCi0gPHA+Ci0gVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotPFA+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5vcmlnaW48L0NPREU+IC0gT3JpZ2luYXRvciB2YWxpZGF0b3Igb2YgdGhlIG1lc3NhZ2UuPC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIGphdmEubGFuZy5PYmplY3QpIj48IS0tIC0tPjwvQT48SDM+Ci1yZW1vdmVBbGxNZXNzYWdlczwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZW1vdmVBbGxNZXNzYWdlczwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9QUkU+Ci08REw+Ci08REQ+UmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvciwKLSBwZXJ0YWluaW5nIHRvIHRoZSBPYmplY3QgcHJvdmlkZWQuIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGZvcgotIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIDxicj4KLSA8YnI+Ci0gSWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBudWxsLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCByZW1vdmUgYWxsCi0gbWVzc2FnZXMgb3duZWQgYnkgdGhlIHZhbGlkYXRvci4gKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUKLSByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKSBtZXRob2QuKSA8YnI+Ci0gPGJyPgotIDxwPgotIFRoZSBJVmFsaWRhdG9yIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+b3JpZ2luPC9DT0RFPiAtIE9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLjxERD48Q09ERT5vYmplY3Q8L0NPREU+IC0gT2JqZWN0IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuIE9iamVjdCBpcyB0aGUgdGFyZ2V0IG9iamVjdAotICAgICAgICAgICAgICAgIHRoYXQgd2FzIHNldCBvbiB0aGUgSU1lc3NhZ2Ugd2hlbiBhZGRpbmcgdGhlIG1lc3NhZ2UgYXMgcHJvYmxlbQotICAgICAgICAgICAgICAgIG1hcmtlci48L0RMPgotPC9ERD4KLTwvREw+Ci08SFI+Ci0KLTxBIE5BTUU9InJlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotcmVtb3ZlTWVzc2FnZVN1YnNldDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5yZW1vdmVNZXNzYWdlU3Vic2V0PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7b2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcmbmJzcDtncm91cE5hbWUpPC9QUkU+Ci08REw+Ci08REQ+VG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5Ci0gYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieQotIHRoZSBuYW1lIG9mIGl0cyBncm91cC4gVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgb25seSB0aGUgSU1lc3NhZ2UncyB0aGF0Ci0gYXJlIGluIHRoZSBncm91cCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZS4gCi0gPHA+Ci0gVGhlIElWYWxpZGF0b3IgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuCi0gPC9wPgotIDxwPgotIElmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgbnVsbCwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgcmVtb3ZlIGFsbAotIG1lc3NhZ2VzIG93bmVkIGJ5IHRoZSB2YWxpZGF0b3IuIChpLmUuLCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgdGhlCi0gcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikgbWV0aG9kLikKLSA8L3A+Ci0gPHA+Ci0gSWYgZ3JvdXBOYW1lIGlzIG51bGwsIHRoYXQncyB0aGUgc2FtZSBhcyBubyBncm91cCAoaS5lLiwgdGhlIHNhbWUKLSBiZWhhdmlvdXIgYXMgdGhlIDxjb2RlPnJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCk8L2NvZGU+Ci0gbWV0aG9kLikKLSA8L3A+Ci08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnZhbGlkYXRvcjwvQ09ERT4gLSBPcmlnaW5hdG9yIHZhbGlkYXRvciBvZiB0aGUgbWVzc2FnZS48REQ+PENPREU+b2JqPC9DT0RFPiAtIE9iamVjdCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLjxERD48Q09ERT5ncm91cE5hbWU8L0NPREU+IC0gTmFtZSBvZiB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYmVsb25ncy48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lSZXBvcnRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklSZXBvcnRlci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwYTAwNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUlWYWxpZGF0aW9uQ29udGV4dAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IklWYWxpZGF0aW9uQ29udGV4dCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElWYWxpZGF0aW9uQ29udGV4dDwvSDI+Ci08REw+Ci08RFQ+PEI+QWxsIEtub3duIFN1YmludGVyZmFjZXM6PC9CPiA8REQ+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXRhTW9kZWxDb250ZXh0PC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDwvQT48L0REPgotPC9ETD4KLTxIUj4KLTxETD4KLTxEVD48UFJFPnB1YmxpYyBpbnRlcmZhY2UgPEI+SVZhbGlkYXRpb25Db250ZXh0PC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGNsYXNzIGlzIHVzZWQgdG8gdG8gc2VwYXJhdGUgdGhlIElWYWxpZGF0b3IgZnJvbSB0aGUgbW9kZWwgbG9hZGluZy4gQSBtb2RlbCAKLSBpcyBhIGdyb3VwIG9mIG9iamVjdChzKSB0aGF0IG11c3QgZm9sbG93IHNvbWUgcnVsZXMuCi0gPHA+Ci0gVGhlIG1vZGVsIGlzIGxvYWRlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdmFsaWRhdG9yIGlzIHJ1bm5pbmcgaW4gCi0gYXMteW91LXR5cGUgb3IgYnVpbGRlciBiYXNlZCBjb250ZXh0LiBJZiB0aGUgPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBtZXRob2Qgd2FzIGEgbWV0aG9kIG9uIHRoZSBJVmFsaWRhdG9yLCAKLSB0aGVuIHRoZXJlIHdvdWxkIG5lZWQgdG8gYmUgdHdvIHZlcnNpb25zIG9mIHZhbGlkYXRvcnMsIG9uZSBmb3IgYXMteW91LXR5cGUgYW5kIG9uZSBmb3IgCi0gYnVpbGRlciBiYXNlZC4gQmVjYXVzZSA8Y29kZT5sb2FkTW9kZWw8L2NvZGU+IGlzIHNlcGFyYXRlIGZyb20gdGhlIElWYWxpZGF0b3IsIHdlIHByb3ZpZGUgCi0gdHdvIGRpZmZlcmVudCBJSGVscGVycyBpbnN0ZWFkLCBhbmQgc2hpcCB0aGUgb25lIHNwZWNpZmljIHRvIHRoZSBlbnZpcm9ubWVudC4KLSA8L3A+Ci0gPHA+Ci0gRWFjaCBJVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb24gbG9hZHMgYSBzcGVjaWZpYyBtb2RlbCBhcyBpZGVudGlmaWVkIGJ5IGEgU3RyaW5nCi0gPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPi4gVGhlIHN5bWJvbGljTmFtZSBjYW4gYmUgYW55IHZhbHVlIGV4Y2VwdCBudWxsIG9yIHRoZSAKLSBlbXB0eSBzdHJpbmcuIEVhY2ggdmFsaWRhdG9yIGlkZW50aWZpZXMgdGhlIHN5bWJvbGljIG5hbWVzIHdoaWNoIGl0IG5lZWRzLCBhbmQgdGhlCi0gdHlwZSBvZiBtb2RlbCB3aGljaCBuZWVkcyB0byBiZSByZXR1cm5lZCB3aGVuIHRoYXQgc3ltYm9saWMgbmFtZSBpcyBsb2FkZWQgdmlhIGEgCi0gPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBtZXRob2QuIEFuIElWYWxpZGF0aW9uQ29udGV4dCBjYW4gc3VwcG9ydCBtb3JlIHRoYW4gb25lIElWYWxpZGF0b3I7IAotIHRoZSBoZWxwZXIgbmVlZHMgdG8gc3VwcG9ydCBldmVyeSBtb2RlbCB0aGF0IGVhY2ggdmFsaWRhdG9yIG5lZWRzLgotIDwvcD4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2phdmEubGFuZy5TdHJpbmdbXTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sI2dldFVSSXMoKSI+Z2V0VVJJczwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcpIj5sb2FkTW9kZWw8L0E+PC9CPihqYXZhLmxhbmcuU3RyaW5nJm5ic3A7c3ltYm9saWNOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gTG9hZCB0aGUgbW9kZWwgaWRlbnRpZmllZCBieSA8Y29kZT5zeW1ib2xpY05hbWU8L2NvZGU+LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtqYXZhLmxhbmcuT2JqZWN0PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwjbG9hZE1vZGVsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkiPmxvYWRNb2RlbDwvQT48L0I+KGphdmEubGFuZy5TdHJpbmcmbmJzcDtzeW1ib2xpY05hbWUsCi0gICAgICAgICAgamF2YS5sYW5nLk9iamVjdFtdJm5ic3A7cGFybXMpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBMb2FkIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gYW5kIDxjb2RlPnBhcm1zPC9jb2RlPi48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9ImxvYWRNb2RlbChqYXZhLmxhbmcuU3RyaW5nKSI+PCEtLSAtLT48L0E+PEgzPgotbG9hZE1vZGVsPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0IDxCPmxvYWRNb2RlbDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3N5bWJvbGljTmFtZSk8L1BSRT4KLTxETD4KLTxERD48cD4KLSBMb2FkIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4uIDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gCi0gbXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWxpZGF0b3IgbmVlZHMgdG8gYmUgcnVuIGluIGJvdGggCi0gYXMteW91LXR5cGUgYW5kIGJ1aWxkZXIgYmFzZWQgdmFsaWRhdGlvbi4KLSA8L3A+Ci0gPHA+Ci0gVGhlIHN5bWJvbGljTmFtZSBpcyBhIHN0cmluZyBuYW1lIHRoYXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gSVZhbGlkYXRvckNvbnRleHQuIEZvciBhbiBleGFtcGxlIG91ciBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbG9hZE1vZGVsIHVzZQotIG1ldGhvZCBuYW1lcyBmb3Igc3ltYm9saWNOYW1lcyB0byBsb2FkIHRoZSBtb2RlbCBvYmplY3QgdG8gYmUgdmFsaWRhdGVkLiBVc2VycyBjYW4KLSB1c2UgdGhlaXIgb3duIG1vZGVsIGxvYWQgbWVjaGFuaXNtLgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxjb2RlPldvcmtiZW5jaENvbnRleHQ8L2NvZGU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJsb2FkTW9kZWwoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKSI+PCEtLSAtLT48L0E+PEgzPgotbG9hZE1vZGVsPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuT2JqZWN0IDxCPmxvYWRNb2RlbDwvQj4oamF2YS5sYW5nLlN0cmluZyZuYnNwO3N5bWJvbGljTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3RbXSZuYnNwO3Bhcm1zKTwvUFJFPgotPERMPgotPEREPjxwPgotIExvYWQgdGhlIG1vZGVsIGlkZW50aWZpZWQgYnkgPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPiBhbmQgPGNvZGU+cGFybXM8L2NvZGU+LgotIDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gbXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWxpZGF0b3IgCi0gbmVlZHMgdG8gYmUgcnVuIGluIGJvdGggYXMteW91LXR5cGUgYW5kIGJ1aWxkZXIgYmFzZWQgdmFsaWRhdGlvbi4gCi0gSWYgPGNvZGU+cGFybXM8L2NvZGU+IGlzIG51bGwgdGhlbiB0aGlzCi0gbWV0aG9kIGJlaGF2ZXMgdGhlIHNhbWUgYXMKLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+c3ltYm9saWNOYW1lPC9DT0RFPiAtIFN0cmluZyBpZGVudGlmaWVyIGZvciBtb2RlbC48REQ+PENPREU+cGFybXM8L0NPREU+IC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhlIG1vZGVsIHRha2VzIGZvciBpbnZvY2F0aW9uLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0iZ2V0VVJJcygpIj48IS0tIC0tPjwvQT48SDM+Ci1nZXRVUklzPC9IMz4KLTxQUkU+Ci1qYXZhLmxhbmcuU3RyaW5nW10gPEI+Z2V0VVJJczwvQj4oKTwvUFJFPgotPERMPgotPEREPjxETD4KLQotPERUPjxCPlJldHVybnM6PC9CPjxERD5hIHN0cmluZyBhcnJheSB3aXRoIHRoZSBsaXN0IG9mIFVSSSdzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQgaW4gdGhlCi0gY2FzZSBvZiBJbmNyZW1lbnRhbCBidWlsZC48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM2Y2Q4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLUlWYWxpZGF0b3IKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJJVmFsaWRhdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVmFsaWRhdG9yLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvci5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9zdW1tYXJ5Ij5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotREVUQUlMOiZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJVmFsaWRhdG9yPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgS25vd24gU3ViaW50ZXJmYWNlczo8L0I+IDxERD48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9ySm9iPC9BPjwvREQ+Ci08L0RMPgotPEhSPgotPERMPgotPERUPjxQUkU+cHVibGljIGludGVyZmFjZSA8Qj5JVmFsaWRhdG9yPC9CPjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIFZhbGlkYXRvcnMuIEEgVmFsaWRhdG9yIGlzIGEgY2xhc3Mgd2hpY2ggdmVyaWZpZXMgdGhhdCBvYmplY3RzCi0gZm9sbG93IHNvbWUgcnVsZXMuIEZvciBleGFtcGxlLCBpbiBhIE1PRiBtb2RlbCB3aGljaCByZXByZXNlbnRzIGFuIEVKQiBqYXIsIHRoZSBFSkIgc3BlY2lmaWNhdGlvbgotIGRldGVybWluZXMgdGhlIHJ1bGVzLiAKLSA8cD4KLSBBIHZhbGlkYXRvciBjYW4gcGVyZm9ybSBmdWxsIHZhbGlkYXRpb24gb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gQWxsIHZhbGlkYXRvcnMgbXVzdCBpbXBsZW1lbnQKLSBmdWxsIHZhbGlkYXRpb24gYnV0IGluY3JlbWVudGFsIHZhbGlkYXRpb24gaXMgb3B0aW9uYWwuCi0gPC9wPgotIDxwPgotIEVhY2ggdmFsaWRhdG9yIG11c3Qgbm90IGJlIHRpZWQgdG8gYW55IHBhcnRpY3VsYXIgd29ya2JlbmNoIGltcGxlbWVudGF0aW9uLgotIDwvcD4KLSA8cD4KLSBBIHZhbGlkYXRvcidzIHZlcmlmaWNhdGlvbiBzdGFydHMgd2hlbiB0aGUgVmFsaWRhdG9yTGF1bmNoZXIgc2luZ2xldG9uIGNhbGxzCi0gPGNvZGU+dmFsaWRhdGU8L2NvZGU+LgotIDwvcD4KLSA8cD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotIDwvcD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwjY2xlYW51cChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPmNsZWFudXA8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1BlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAgb25jZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPnZhbGlkYXRlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyLAotICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+Jm5ic3A7cmVwb3J0ZXIpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIG9iamVjdHMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+PCEtLSAtLT48L0E+PEgzPgotY2xlYW51cDwvSDM+Ci08UFJFPgotdm9pZCA8Qj5jbGVhbnVwPC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcik8L1BSRT4KLTxETD4KLTxERD5QZXJmb3JtIGFueSByZXNvdXJjZSBjbGVhbnVwIG9uY2UgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4gSWYgY2xlYW51cCB3aWxsIHRha2Ugc29tZSB0aW1lLCB0aGUKLSBJVmFsaWRhdG9yIHNob3VsZCByZXBvcnQgc3VidGFzayBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciB0aHJvdWdoIHRoZSBJUmVwb3J0ZXIgcGFyYW1ldGVyLiBUaGUKLSBJUmVwb3J0ZXIgcGFyYW1ldGVyIHdpbGwgbm90IGJlIG51bGwuCi08UD4KLTxERD48REw+Ci08RFQ+PEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPnJlcG9ydGVyPC9DT0RFPiAtIFVzZWQgZm9yIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1c2VyLjwvREw+Ci08L0REPgotPC9ETD4KLTxIUj4KLQotPEEgTkFNRT0idmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+PCEtLSAtLT48L0E+PEgzPgotdmFsaWRhdGU8L0gzPgotPFBSRT4KLXZvaWQgPEI+dmFsaWRhdGU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPiZuYnNwO2hlbHBlciwKLSAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+Jm5ic3A7cmVwb3J0ZXIpCi0gICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5UaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIG9iamVjdHMuCi0gPHA+Ci0gPGNvZGU+aGVscGVyPC9jb2RlPiBhbmQgPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IG1heSBub3QgYmUgbnVsbC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPgotIG1heSBiZSBudWxsLCBpZiBhIGZ1bGwgYnVpbGQgaXMgZGVzaXJlZC4gPGJyPgotIDwvcD4KLTxQPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+aGVscGVyPC9DT0RFPiAtIExvYWRzIGFuIG9iamVjdC48REQ+PENPREU+cmVwb3J0ZXI8L0NPREU+IC0gSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4KLTxEVD48Qj5UaHJvd3M6PC9CPgotPEREPjxDT0RFPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjwvQ09ERT48L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0b3IuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPk5FWFQgQ0xBU1M8L0I+PC9BPjwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODc2ZTM4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotSVZhbGlkYXRvckV4dGVuZGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVZhbGlkYXRvckV4dGVuZGVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5DbGFzczwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImNsYXNzLXVzZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPlBSRVYgQ0xBU1M8L0I+PC9BPiZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+TkVYVCBDTEFTUzwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTxUUj4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci0gIFNVTU1BUlk6Jm5ic3A7TkVTVEVEJm5ic3A7fCZuYnNwO0ZJRUxEJm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2RfZGV0YWlsIj5NRVRIT0Q8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08IS0tID09PT09PT09IFNUQVJUIE9GIENMQVNTIERBVEEgPT09PT09PT0gLS0+Ci08SDI+Ci08Rk9OVCBTSVpFPSItMSI+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9GT05UPgotPEJSPgotSW50ZXJmYWNlIElWYWxpZGF0b3JFeHRlbmRlcjwvSDI+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklWYWxpZGF0b3JFeHRlbmRlcjwvQj48L0RMPgotPC9QUkU+Ci0KLTxQPgotPEhSPgotCi08UD4KLQotPCEtLSA9PT09PT09PT09IE1FVEhPRCBTVU1NQVJZID09PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2Rfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPk1ldGhvZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sI3ZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPnZhbGlkYXRpb25GaW5pc2hpbmc8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9kZXRhaWwiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIxIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9InZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZSwgSVByb2dyZXNzTW9uaXRvcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRpb25GaW5pc2hpbmc8L0gzPgotPFBSRT4KLXZvaWQgPEI+dmFsaWRhdGlvbkZpbmlzaGluZzwvQj4oSVByb2plY3QmbmJzcDtwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0ZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25TdGF0ZTwvQT4mbmJzcDtzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L1BSRT4KLTxETD4KLTxERD48REw+Ci08L0RMPgotPC9ERD4KLTwvREw+Ci08IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPkNsYXNzPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iY2xhc3MtdXNlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+UFJFViBDTEFTUzwvQj48L0E+Jm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7Q09OU1RSJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNtZXRob2Rfc3VtbWFyeSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDtDT05TVFImbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZF9kZXRhaWwiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4MGU2My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1JVmFsaWRhdG9ySm9iCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iSVZhbGlkYXRvckpvYiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRvckpvYi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUludGVyZmFjZSBJVmFsaWRhdG9ySm9iPC9IMj4KLTxETD4KLTxEVD48Qj5BbGwgU3VwZXJpbnRlcmZhY2VzOjwvQj4gPEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9ERD4KLTwvREw+Ci08SFI+Ci08REw+Ci08RFQ+PFBSRT5wdWJsaWMgaW50ZXJmYWNlIDxCPklWYWxpZGF0b3JKb2I8L0I+PERUPmV4dGVuZHMgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0RMPgotPC9QUkU+Ci0KLTxQPgotVGhpcyBpcyB0aGUgSm9iIGludGVyZmFjZSBmb3IgdGhlIHZhbGlkYXRvci4gVmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgYXJlIGV4ZWN1dGVkIGFzCi0gYmFja2dyb3VuZCBqb2JzLiAKLSBGb2xsb3dpbmcgaXMgYSBzZXF1ZW5jZSBvZiAgY2FsbHM6Ci0gPHVsPgotIDxsaT52YWxpZGF0b3IuZ2V0U2NoZWR1bGluZ1J1bGUoaGVscGVyKQotIDxsaT52YWxpZGF0b3IudmFsaWRhdGUocmVwb3J0ZXIpCi0gPC91bD4KLTxQPgotCi08UD4KLTxIUj4KLQotPFA+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImZpZWxkX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5GaWVsZCBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+c3RhdGljJm5ic3A7SVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCNPS19TVEFUVVMiPk9LX1NUQVRVUzwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci08Qj5NZXRob2QgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO0lTY2hlZHVsaW5nUnVsZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCNnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkiPmdldFNjaGVkdWxpbmdSdWxlPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7R2V0IHRoZSBzY2hlZHVsaW5nIHJ1bGUsIHdoaWNoIHRoZSBmcmFtZXdvcmsgYXBwbGllcyB0byB0aGUgVmFsaWRhdG9yIGpvYi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPnZhbGlkYXRlSW5Kb2I8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3Nfb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCI+PEI+TWV0aG9kcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sI2NsZWFudXAob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpIj5jbGVhbnVwPC9BPiwgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+dmFsaWRhdGU8L0E+PC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTwhLS0gPT09PT09PT09PT09IEZJRUxEIERFVEFJTCA9PT09PT09PT09PSAtLT4KLQotPEEgTkFNRT0iZmllbGRfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+RmllbGQgRGV0YWlsPC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxBIE5BTUU9Ik9LX1NUQVRVUyI+PCEtLSAtLT48L0E+PEgzPgotT0tfU1RBVFVTPC9IMz4KLTxQUkU+Ci1zdGF0aWMgZmluYWwgSVN0YXR1cyA8Qj5PS19TVEFUVVM8L0I+PC9QUkU+Ci08REw+Ci08REw+Ci08L0RMPgotPC9ETD4KLQotPCEtLSA9PT09PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PT09IC0tPgotCi08QSBOQU1FPSJtZXRob2RfZGV0YWlsIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMSI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJ2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPjwhLS0gLS0+PC9BPjxIMz4KLXZhbGlkYXRlSW5Kb2I8L0gzPgotPFBSRT4KLUlTdGF0dXMgPEI+dmFsaWRhdGVJbkpvYjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+Jm5ic3A7aGVscGVyLAotICAgICAgICAgICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb248L1BSRT4KLTxETD4KLTxERD5UaGlzIGlzIHRoZSBtZXRob2Qgd2hpY2ggcGVyZm9ybXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIG9iamVjdHMuCi0gPHA+Ci0gPGNvZGU+cmVwb3J0ZXI8L2NvZGU+IG1heSBub3QgYmUgbnVsbC4gPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPgotIG1heSBiZSBudWxsLCBpZiBhIGZ1bGwgYnVpbGQgaXMgZGVzaXJlZC4gPGJyPgotIDwvcD4KLTxQPgotPEREPjxETD4KLTwvREw+Ci08L0REPgotPEREPjxETD4KLTxEVD48Qj5QYXJhbWV0ZXJzOjwvQj48REQ+PENPREU+cmVwb3J0ZXI8L0NPREU+IC0gSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IgaW50ZXJhY3Rpb24gd2l0aCB0aGUKLSAgICAgICAgICAgIHVzZXIuPEREPjxDT0RFPmhlbHBlcjwvQ09ERT4gLSBXaWxsIG5vdCBiZSBudWxsLCBsb2FkcyBhbiBvYmplY3QuCi08RFQ+PEI+VGhyb3dzOjwvQj4KLTxERD48Q09ERT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb248L0NPREU+PC9ETD4KLTwvREQ+Ci08L0RMPgotPEhSPgotCi08QSBOQU1FPSJnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkiPjwhLS0gLS0+PC9BPjxIMz4KLWdldFNjaGVkdWxpbmdSdWxlPC9IMz4KLTxQUkU+Ci1JU2NoZWR1bGluZ1J1bGUgPEI+Z2V0U2NoZWR1bGluZ1J1bGU8L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPiZuYnNwO2hlbHBlcik8L1BSRT4KLTxETD4KLTxERD5HZXQgdGhlIHNjaGVkdWxpbmcgcnVsZSwgd2hpY2ggdGhlIGZyYW1ld29yayBhcHBsaWVzIHRvIHRoZSBWYWxpZGF0b3Igam9iLgotPFA+Ci08REQ+PERMPgotPC9ETD4KLTwvREQ+Ci08REQ+PERMPgotPERUPjxCPlBhcmFtZXRlcnM6PC9CPjxERD48Q09ERT5oZWxwZXI8L0NPREU+IC0gV2lsbCBub3QgYmUgbnVsbCwgbG9hZHMgYW4gb2JqZWN0LjwvREw+Ci08L0REPgotPC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvSVZhbGlkYXRvckpvYi5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5ORVhUIENMQVNTPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgVkFMSUdOPSJ0b3AiIENMQVNTPSJOYXZCYXJDZWxsMyI+PEZPTlQgU0laRT0iLTIiPgotICBTVU1NQVJZOiZuYnNwO05FU1RFRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjZmllbGRfc3VtbWFyeSI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX3N1bW1hcnkiPk1FVEhPRDwvQT48L0ZPTlQ+PC9URD4KLTxURCBWQUxJR049InRvcCIgQ0xBU1M9Ik5hdkJhckNlbGwzIj48Rk9OVCBTSVpFPSItMiI+Ci1ERVRBSUw6Jm5ic3A7PEEgSFJFRj0iI2ZpZWxkX2RldGFpbCI+RklFTEQ8L0E+Jm5ic3A7fCZuYnNwO0NPTlNUUiZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjbWV0aG9kX2RldGFpbCI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlN2Q2OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLU1lc3NhZ2VMaW1pdEV4Y2VwdGlvbgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwO01FVEhPRDwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotPEgyPgotPEZPTlQgU0laRT0iLTEiPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvRk9OVD4KLTxCUj4KLUNsYXNzIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjwvSDI+Ci08UFJFPgotamF2YS5sYW5nLk9iamVjdAotICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLlRocm93YWJsZQotICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPmphdmEubGFuZy5FeGNlcHRpb24KLSAgICAgICAgICA8SU1HIFNSQz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vcmVzb3VyY2VzL2luaGVyaXQuZ2lmIiBBTFQ9ImV4dGVuZGVkIGJ5ICI+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KLSAgICAgICAgICAgICAgPElNRyBTUkM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3Jlc291cmNlcy9pbmhlcml0LmdpZiIgQUxUPSJleHRlbmRlZCBieSAiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9CPgotPC9QUkU+Ci08REw+Ci08RFQ+PEI+QWxsIEltcGxlbWVudGVkIEludGVyZmFjZXM6PC9CPiA8REQ+amF2YS5pby5TZXJpYWxpemFibGU8L0REPgotPC9ETD4KLTxIUj4KLTxCPkRlcHJlY2F0ZWQuPC9CPiZuYnNwOzxJPlRoaXMgY2xhc3MgaXMgbm90IGxvbmdlciB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsuIFRoZSBmcmFtZXdvcmsgaXMKLSAgbm90IGdvaW5nIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgZGlzcGxheWVkIGJ5IGEgdmFsaWRhdG9yLjwvST4KLTxQPgotPERMPgotPERUPjxQUkU+cHVibGljIGNsYXNzIDxCPk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjwvQj48RFQ+ZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjwvREw+Ci08L1BSRT4KLQotPFA+Ci1UaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkKLTxQPgotCi08UD4KLTxETD4KLTxEVD48Qj5TZWUgQWxzbzo8L0I+PEREPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwjYWRkTWVzc2FnZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj48Q09ERT5tZXRob2QgaWYgbm8gbW9yZSBtZXNzYWdlcyBjYW4gYmUgcmVwb3J0ZWQKLSAgICAgIGJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGhhcyBiZWVuIHJlcG9ydGVkLjwvQ09ERT48L0E+LCAKLTxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3NlcmlhbGl6ZWQtZm9ybS5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uIj5TZXJpYWxpemVkIEZvcm08L0E+PC9ETD4KLTxIUj4KLQotPFA+Ci0KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLQotPEEgTkFNRT0iY29uc3RydWN0b3Jfc3VtbWFyeSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCNNZXNzYWdlTGltaXRFeGNlcHRpb24oKSI+TWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PEI+RGVwcmVjYXRlZC48L0I+Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLlRocm93YWJsZTwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmZpbGxJblN0YWNrVHJhY2UsIGdldENhdXNlLCBnZXRMb2NhbGl6ZWRNZXNzYWdlLCBnZXRNZXNzYWdlLCBnZXRTdGFja1RyYWNlLCBpbml0Q2F1c2UsIHByaW50U3RhY2tUcmFjZSwgcHJpbnRTdGFja1RyYWNlLCBwcmludFN0YWNrVHJhY2UsIHNldFN0YWNrVHJhY2UsIHRvU3RyaW5nPC9DT0RFPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOzxBIE5BTUU9Im1ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLk9iamVjdCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiPjxCPk1ldGhvZHMgaW5oZXJpdGVkIGZyb20gY2xhc3MgamF2YS5sYW5nLk9iamVjdDwvQj48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxDT0RFPmVxdWFscywgZ2V0Q2xhc3MsIGhhc2hDb2RlLCBub3RpZnksIG5vdGlmeUFsbCwgd2FpdCwgd2FpdCwgd2FpdDwvQ09ERT48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+Ci0KLTxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08QSBOQU1FPSJNZXNzYWdlTGltaXRFeGNlcHRpb24oKSI+PCEtLSAtLT48L0E+PEgzPgotTWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9IMz4KLTxQUkU+Ci1wdWJsaWMgPEI+TWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9CPigpPC9QUkU+Ci08REw+Ci08REQ+PEI+RGVwcmVjYXRlZC48L0I+Jm5ic3A7PC9ETD4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+Q2xhc3M8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJjbGFzcy11c2UvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5QUkVWIENMQVNTPC9CPjwvQT4mbmJzcDsKLSZuYnNwO05FWFQgQ0xBU1M8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPFRSPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLSAgU1VNTUFSWTombmJzcDtORVNURUQmbmJzcDt8Jm5ic3A7RklFTEQmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbnN0cnVjdG9yX3N1bW1hcnkiPkNPTlNUUjwvQT4mbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI21ldGhvZHNfaW5oZXJpdGVkX2Zyb21fY2xhc3NfamF2YS5sYW5nLlRocm93YWJsZSI+TUVUSE9EPC9BPjwvRk9OVD48L1REPgotPFREIFZBTElHTj0idG9wIiBDTEFTUz0iTmF2QmFyQ2VsbDMiPjxGT05UIFNJWkU9Ii0yIj4KLURFVEFJTDombmJzcDtGSUVMRCZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uc3RydWN0b3JfZGV0YWlsIj5DT05TVFI8L0E+Jm5ic3A7fCZuYnNwO01FVEhPRDwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JTWVzc2FnZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1lc3NhZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlOGY1MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JTWVzc2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXNzYWdlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U8L0I+PC9IMj4KLTwvQ0VOVEVSPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVBhY2thZ2VzIHRoYXQgdXNlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0E+PC9URD4KLTxURD5BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHRoYXQgcmV0dXJuIHR5cGVzIHdpdGggYXJndW1lbnRzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7amF2YS51dGlsLkxpc3QmbHQ7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZndDs8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+UmVwb3J0ZXJIZWxwZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjZ2V0TWVzc2FnZXMoKSI+Z2V0TWVzc2FnZXM8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2FkZE1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKSI+YWRkTWVzc2FnZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luLAotICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlJlcG9ydGVySGVscGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sI2Rpc3BsYXlTdWJ0YXNrKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmRpc3BsYXlTdWJ0YXNrPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDt2YWxpZGF0b3IsCi0gICAgICAgICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+Jm5ic3A7bWVzc2FnZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+TWV0aG9kcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1lc3NhZ2U8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklSZXBvcnRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmFkZE1lc3NhZ2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBBZGQgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklSZXBvcnRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5kaXNwbGF5U3VidGFzazwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTaG93IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UsIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdAotIExvY2FsZSwgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlSU1lc3NhZ2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTWVzc2FnZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1ldGFNb2RlbENvbnRleHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDUzMjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1ldGFNb2RlbENvbnRleHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXRhTW9kZWxDb250ZXh0Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWV0YU1vZGVsQ29udGV4dCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXRhTW9kZWxDb250ZXh0PC9CPjwvSDI+Ci08L0NFTlRFUj4KLU5vIHVzYWdlIG9mIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1ldGFNb2RlbENvbnRleHQKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJTWV0YU1vZGVsQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTA3NDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dAotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Ci08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVJlcG9ydGVyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUmVwb3J0ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjOTFmYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JUmVwb3J0ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlSVJlcG9ydGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVJlcG9ydGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0E+PC9URD4KLTxURD5BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdGhhdCBpbXBsZW1lbnQgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtjbGFzczwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9SZXBvcnRlckhlbHBlci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlJlcG9ydGVySGVscGVyPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0aW9uUmVzdWx0LjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjZ2V0UmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvcikiPmdldFJlcG9ydGVyPC9BPjwvQj4oSVByb2dyZXNzTW9uaXRvciZuYnNwO21vbml0b3IpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBbnN3ZXIgYW4gSVJlcG9ydGVyIGZvciBoYW5kaW5nIGVycm9yIG1lc3NhZ2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdGlvbkZyYW1ld29yay48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI2dldFJlcG9ydGVyKElQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yKSI+Z2V0UmVwb3J0ZXI8L0E+PC9CPihJUHJvamVjdCZuYnNwO3Byb2plY3QsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yJm5ic3A7bW9uaXRvcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+Y2xlYW51cDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVmFsaWRhdG9ySm9iLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPnZhbGlkYXRlSW5Kb2I8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJUmVwb3J0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJUmVwb3J0ZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMmQ4MTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIEludGVyZmFjZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZUlWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9IklWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0I+PC9BPjwvVEQ+Ci08VEQ+QW4gZWFybGllciBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+IGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlU3ViSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+U3ViaW50ZXJmYWNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludGVyZmFjZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SU1ldGFNb2RlbENvbnRleHQ8L0E+PC9CPjwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtpbnRlcmZhY2U8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDwvQT48L0I+PC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgSVZhbGlkYXRpb25Db250ZXh0IHRvIHByb3ZpZGUgYWNjZXNzIHRvIGEKLSByZWZlcmVuY2UgdG8gdGhlIHByb2plY3Qgb24gd2hpY2ggYSB2YWxpZGF0b3IgaXMgYmVpbmcgaW52b2tlZC48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT4gd2l0aCBwYXJhbWV0ZXJzIG9mIHR5cGUgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdGlvbkNvbnRleHQ8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDtJU2NoZWR1bGluZ1J1bGU8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvckpvYi48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmh0bWwjZ2V0U2NoZWR1bGluZ1J1bGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQpIj5nZXRTY2hlZHVsaW5nUnVsZTwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRpb25Db250ZXh0PC9BPiZuYnNwO2hlbHBlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0dldCB0aGUgc2NoZWR1bGluZyBydWxlLCB3aGljaCB0aGUgZnJhbWV3b3JrIGFwcGxpZXMgdG8gdGhlIFZhbGlkYXRvciBqb2IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVZhbGlkYXRvci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKSI+dmFsaWRhdGU8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklSZXBvcnRlcjwvQT4mbmJzcDtyZXBvcnRlcik8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7SVN0YXR1czwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5JVmFsaWRhdG9ySm9iLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikiPnZhbGlkYXRlSW5Kb2I8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT4mbmJzcDtoZWxwZXIsCi0gICAgICAgICAgICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVJlcG9ydGVyPC9BPiZuYnNwO3JlcG9ydGVyKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBvYmplY3RzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhNzEyMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZUlWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgSW50ZXJmYWNlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjwvQj48L0gyPgotPC9DRU5URVI+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotUGFja2FnZXMgdGhhdCB1c2UgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvQT48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48QSBIUkVGPSIjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQj48L0E+PC9URD4KLTxURD5BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLVVzZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB0aGF0IHJldHVybiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT48L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+VmFsaWRhdG9yLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuaHRtbCNhc0lWYWxpZGF0b3IoKSI+YXNJVmFsaWRhdG9yPC9BPjwvQj4oKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPlZhbGlkYXRvci5WMS48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLlYxLmh0bWwjYXNJVmFsaWRhdG9yKCkiPmFzSVZhbGlkYXRvcjwvQT48L0I+KCk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDs8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5WYWxpZGF0b3IuVjIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sI2FzSVZhbGlkYXRvcigpIj5hc0lWYWxpZGF0b3I8L0E+PC9CPigpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPk1ldGhvZHMgaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPiB3aXRoIHBhcmFtZXRlcnMgb2YgdHlwZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5SZXBvcnRlckhlbHBlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmFkZE1lc3NhZ2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5SZXBvcnRlckhlbHBlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5kaXNwbGF5U3VidGFzazwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5SZXBvcnRlckhlbHBlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IpIj5yZW1vdmVBbGxNZXNzYWdlczwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7b3JpZ2luKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+UmVwb3J0ZXJIZWxwZXIuPC9CPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwjcmVtb3ZlQWxsTWVzc2FnZXMob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0KSI+cmVtb3ZlQWxsTWVzc2FnZXM8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QmbmJzcDtvYmplY3QpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+PEZPTlQgU0laRT0iLTEiPgotPENPREU+Jm5ic3A7dm9pZDwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj5SZXBvcnRlckhlbHBlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vUmVwb3J0ZXJIZWxwZXIuaHRtbCNyZW1vdmVNZXNzYWdlU3Vic2V0KG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykiPnJlbW92ZU1lc3NhZ2VTdWJzZXQ8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO3ZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCZuYnNwO29iaiwKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyZuYnNwO2dyb3VwTmFtZSk8L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotVXNlcyBvZiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPlN1YmludGVyZmFjZXMgb2YgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4gaW4gPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO2ludGVyZmFjZTwvQ09ERT48L0ZPTlQ+PC9URD4KLTxURD48Q09ERT48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9ySm9iPC9BPjwvQj48L0NPREU+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIEpvYiBpbnRlcmZhY2UgZm9yIHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj5NZXRob2RzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+IHdpdGggcGFyYW1ldGVycyBvZiB0eXBlIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklSZXBvcnRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZSkiPmFkZE1lc3NhZ2U8L0E+PC9CPig8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yPC9BPiZuYnNwO29yaWdpbiwKLSAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBBZGQgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSI+Ci08Q09ERT4mbmJzcDt2b2lkPC9DT0RFPjwvRk9OVD48L1REPgotPFREPjxDT0RFPjxCPklSZXBvcnRlci48L0I+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCNkaXNwbGF5U3VidGFzayhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpIj5kaXNwbGF5U3VidGFzazwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklNZXNzYWdlPC9BPiZuYnNwO21lc3NhZ2UpPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTaG93IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UsIGZvcm1hdHRlZCBpbiB0aGUgZGVmYXVsdAotIExvY2FsZSwgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVJlcG9ydGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcikiPnJlbW92ZUFsbE1lc3NhZ2VzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4pPC9DT0RFPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMgZW50ZXJlZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVJlcG9ydGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwgamF2YS5sYW5nLk9iamVjdCkiPnJlbW92ZUFsbE1lc3NhZ2VzPC9BPjwvQj4oPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+SVZhbGlkYXRvcjwvQT4mbmJzcDtvcmlnaW4sCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7b2JqZWN0KTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvciwKLSBwZXJ0YWluaW5nIHRvIHRoZSBPYmplY3QgcHJvdmlkZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiPjxGT05UIFNJWkU9Ii0xIj4KLTxDT0RFPiZuYnNwO3ZvaWQ8L0NPREU+PC9GT05UPjwvVEQ+Ci08VEQ+PENPREU+PEI+SVJlcG9ydGVyLjwvQj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5odG1sI3JlbW92ZU1lc3NhZ2VTdWJzZXQob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKSI+cmVtb3ZlTWVzc2FnZVN1YnNldDwvQT48L0I+KDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+Jm5ic3A7dmFsaWRhdG9yLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Jm5ic3A7b2JqLAotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nJm5ic3A7Z3JvdXBOYW1lKTwvQ09ERT4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5Ci0gYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5DbGFzczwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvXGNsYXNzLXVzZUlWYWxpZGF0b3IuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQzYjNlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckV4dGVuZGVyCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBJbnRlcmZhY2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yRXh0ZW5kZXIiOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JFeHRlbmRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJJVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBJbnRlcmZhY2U8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yRXh0ZW5kZXI8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yRXh0ZW5kZXIKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdG9ySm9iLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdG9ySm9iLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTg4ZWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSVZhbGlkYXRvckpvYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLVVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYgotPC9USVRMRT4KLQotPE1FVEEgTkFNRT0iZGF0ZSIgQ09OVEVOVD0iMjAxMS0wNi0yNCI+Ci0KLTxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KLQotPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gd2luZG93VGl0bGUoKQotewotICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2lzLWV4dGVybmFsPXRydWUnKSA9PSAtMSkgewotICAgICAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9IlVzZXMgb2YgSW50ZXJmYWNlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDI+Ci08Qj5Vc2VzIG9mIEludGVyZmFjZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I8L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iCi08UD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VJVmFsaWRhdG9ySm9iLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjZmFkMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIENsYXNzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuTWVzc2FnZUxpbWl0RXhjZXB0aW9uCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iVXNlcyBvZiBDbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkNsYXNzPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9cY2xhc3MtdXNlTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0iTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgQ2xhc3M8YnI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb248L0I+PC9IMj4KLTwvQ0VOVEVSPgotTm8gdXNhZ2Ugb2Ygb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5NZXNzYWdlTGltaXRFeGNlcHRpb24KLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+Q2xhc3M8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL1xjbGFzcy11c2VNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1mcmFtZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLWZyYW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzY1YjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+Ci08QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+Ci1JbnRlcmZhY2VzPC9GT05UPiZuYnNwOwotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgotPEJSPgotPEEgSFJFRj0iSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklNZXNzYWdlPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklNZXRhTW9kZWxDb250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JTWV0YU1vZGVsQ29udGV4dDwvST48L0E+Ci08QlI+Ci08QSBIUkVGPSJJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Lmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklSZXBvcnRlci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVJlcG9ydGVyPC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVZhbGlkYXRpb25Db250ZXh0PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklWYWxpZGF0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVZhbGlkYXRvckV4dGVuZGVyLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9yRXh0ZW5kZXI8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVZhbGlkYXRvckpvYi5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SVZhbGlkYXRvckpvYjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUV4Y2VwdGlvbnM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJNZXNzYWdlTGltaXRFeGNlcHRpb24uaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiIHRhcmdldD0iY2xhc3NGcmFtZSI+TWVzc2FnZUxpbWl0RXhjZXB0aW9uPC9BPjwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDZlZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPlBSRVYgUEFDS0FHRTwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIFBBQ0tBR0U8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08SDI+Ci1QYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUKLTwvSDI+Ci1BbiBlYXJsaWVyIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLgotPFA+Ci08Qj5TZWU6PC9CPgotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PEEgSFJFRj0iI3BhY2thZ2VfZGVzY3JpcHRpb24iPjxCPkRlc2NyaXB0aW9uPC9CPjwvQT4KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkludGVyZmFjZSBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWVzc2FnZTwvQT48L0I+PC9URD4KLTxURD4KLSBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgbG9jYWxlLWluZGVwZW5kZW50IHZhbGlkYXRpb24gbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JTWV0YU1vZGVsQ29udGV4dDwvQT48L0I+PC9URD4KLTxURD4KLSA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0PC9BPjwvQj48L1REPgotPFREPklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gYQotIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBvbiB3aGljaCBhIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JUmVwb3J0ZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhlIGludGVyZmFjZSB1c2VkIGJ5IElWYWxpZGF0b3IncyB0byByZXBvcnQgbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0aW9uQ29udGV4dDwvQT48L0I+PC9URD4KLTxURD5UaGlzIGNsYXNzIGlzIHVzZWQgdG8gdG8gc2VwYXJhdGUgdGhlIElWYWxpZGF0b3IgZnJvbSB0aGUgbW9kZWwgbG9hZGluZy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPklWYWxpZGF0b3I8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBWYWxpZGF0b3JzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yRXh0ZW5kZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9yRXh0ZW5kZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5JVmFsaWRhdG9ySm9iPC9BPjwvQj48L1REPgotPFREPlRoaXMgaXMgdGhlIEpvYiBpbnRlcmZhY2UgZm9yIHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkV4Y2VwdGlvbiBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5NZXNzYWdlTGltaXRFeGNlcHRpb248L0E+PC9CPjwvVEQ+Ci08VEQ+PEI+RGVwcmVjYXRlZC48L0I+Jm5ic3A7PEk+VGhpcyBjbGFzcyBpcyBub3QgbG9uZ2VyIHVzZWQgYnkgdGhlIGZyYW1ld29yay48L0k+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotPEEgTkFNRT0icGFja2FnZV9kZXNjcmlwdGlvbiI+PCEtLSAtLT48L0E+PEgyPgotUGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIERlc2NyaXB0aW9uCi08L0gyPgotCi08UD4KLTxwPkFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuPC9wPgotPHA+VGhpcyBmcmFtZXdvcmsgaXMgYmVpbmcgcmVwbGFjZWQgYnkgdGhlIDxjb2RlPm5ld2VyIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9jb2RlPiBmcmFtZXdvcmsuPC9wPgotPFA+Ci0KLTxQPgotPERMPgotPC9ETD4KLTxIUj4KLQotCi08IS0tID09PT09PT0gU1RBUlQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl9ib3R0b20iIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlBhY2thZ2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXVzZS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlVzZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPlBSRVYgUEFDS0FHRTwvQj48L0E+Jm5ic3A7Ci0mbmJzcDtORVhUIFBBQ0tBR0U8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS11c2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS11c2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0OGFjOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2UtdXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotVXNlcyBvZiBQYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUKLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI7Ci0gICAgfQotfQotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci08L05PU0NSSVBUPgotCi08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KLTxIUj4KLQotCi08IS0tID09PT09PT09PSBTVEFSVCBPRiBUT1AgTkFWQkFSID09PT09PT0gLS0+Ci08QSBOQU1FPSJuYXZiYXJfdG9wIj48IS0tIC0tPjwvQT4KLTxBIEhSRUY9IiNza2lwLW5hdmJhcl90b3AiIHRpdGxlPSJTa2lwIG5hdmlnYXRpb24gbGlua3MiPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMSIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFI+Ci08VEQgQ09MU1BBTj0yIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+Ci08QSBOQU1FPSJuYXZiYXJfdG9wX2ZpcnN0cm93Ij48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjAiIENFTExQQURESU5HPSIwIiBDRUxMU1BBQ0lORz0iMyIgU1VNTUFSWT0iIj4KLSAgPFRSIEFMSUdOPSJjZW50ZXIiIFZBTElHTj0idG9wIj4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5PdmVydmlldzwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5QYWNrYWdlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+VXNlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXVzZS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPENFTlRFUj4KLTxIMj4KLTxCPlVzZXMgb2YgUGFja2FnZTxicj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPjwvRk9OVD48L1RIPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0I+PC9BPjwvVEQ+Ci08VEQ+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxBIEhSRUY9IiNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9CPjwvQT48L1REPgotPFREPkFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuJm5ic3A7PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci08UD4KLTxBIE5BTUU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JTWVzc2FnZS5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5JTWVzc2FnZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgbG9jYWxlLWluZGVwZW5kZW50IHZhbGlkYXRpb24gbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lSZXBvcnRlci5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5JUmVwb3J0ZXI8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGludGVyZmFjZSB1c2VkIGJ5IElWYWxpZGF0b3IncyB0byByZXBvcnQgbWVzc2FnZXMuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL2NsYXNzLXVzZS9JVmFsaWRhdG9yLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPklWYWxpZGF0b3I8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBWYWxpZGF0b3JzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPiB1c2VkIGJ5IDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9jbGFzcy11c2UvSU1lc3NhZ2UuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5JTWVzc2FnZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgbG9jYWxlLWluZGVwZW5kZW50IHZhbGlkYXRpb24gbWVzc2FnZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lSZXBvcnRlci5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPklSZXBvcnRlcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGUgaW50ZXJmYWNlIHVzZWQgYnkgSVZhbGlkYXRvcidzIHRvIHJlcG9ydCBtZXNzYWdlcy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0aW9uQ29udGV4dC5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPklWYWxpZGF0aW9uQ29udGV4dDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIGlzIHVzZWQgdG8gdG8gc2VwYXJhdGUgdGhlIElWYWxpZGF0b3IgZnJvbSB0aGUgbW9kZWwgbG9hZGluZy48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvY2xhc3MtdXNlL0lWYWxpZGF0b3IuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48Qj5JVmFsaWRhdG9yPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoaXMgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhbGwgVmFsaWRhdG9ycy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPlBhY2thZ2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5Vc2U8L0I+PC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXByZWNhdGVkLWxpc3QuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5EZXByZWNhdGVkPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2hlbHAtZG9jLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+SGVscDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDwvVFI+Ci08L1RBQkxFPgotPC9URD4KLTxURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBST1dTUEFOPTM+PEVNPgotPC9FTT4KLTwvVEQ+Ci08L1RSPgotCi08VFI+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotJm5ic3A7UFJFViZuYnNwOwotJm5ic3A7TkVYVDwvRk9OVD48L1REPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbD9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtZnJhbWUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtZnJhbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NDQwYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lVGl0bGVGb250Ij4KLTxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvRk9OVD4KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotSW50ZXJmYWNlczwvRk9OVD4mbmJzcDsKLTxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KLTxCUj4KLTxBIEhSRUY9IklEZXBlbmRlbmN5SW5kZXguaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JRGVwZW5kZW5jeUluZGV4PC9JPjwvQT4KLTxCUj4KLTxBIEhSRUY9IklNdXRhYmxlVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+PEk+SU11dGFibGVWYWxpZGF0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVBlcmZvcm1hbmNlTW9uaXRvci5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPklQZXJmb3JtYW5jZU1vbml0b3I8L0k+PC9BPgotPEJSPgotPEEgSFJFRj0iSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcjwvST48L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KLUNsYXNzZXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJBYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+QWJzdHJhY3RWYWxpZGF0b3I8L0E+Ci08QlI+Ci08QSBIUkVGPSJEZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+RGVwZW5kZW50UmVzb3VyY2U8L0E+Ci08QlI+Ci08QSBIUkVGPSJGcmllbmQuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkZyaWVuZDwvQT4KLTxCUj4KLTxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+Ci08QlI+Ci08QSBIUkVGPSJNdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPgotPEJSPgotPEEgSFJFRj0iTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M8L0E+Ci08QlI+Ci08QSBIUkVGPSJQZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5QZXJmb3JtYW5jZUNvdW50ZXJzPC9BPgotPEJSPgotPEEgSFJFRj0iUmVwb3J0ZXJIZWxwZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlJlcG9ydGVySGVscGVyPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRXZlbnQ8L0E+Ci08QlI+Ci08QSBIUkVGPSJWYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvbkZyYW1ld29yay5SZXNvdXJjZUFkZGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0E+Ci08QlI+Ci08QSBIUkVGPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uUmVzdWx0PC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvblJlc3VsdHMuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRpb25SZXN1bHRzPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0aW9uU3RhdGU8L0E+Ci08QlI+Ci08QSBIUkVGPSJWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlZhbGlkYXRvcjwvQT4KLTxCUj4KLTxBIEhSRUY9IlZhbGlkYXRvci5WMS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYxPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdG9yLlYxLlYxQ29weS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQT4KLTxCUj4KLTxBIEhSRUY9IlZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yLlYyPC9BPgotPEJSPgotPEEgSFJFRj0iVmFsaWRhdG9yTWVzc2FnZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+VmFsaWRhdG9yTWVzc2FnZTwvQT48L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotRW51bXM8L0ZPTlQ+Jm5ic3A7Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Ci08QlI+Ci08QSBIUkVGPSJJUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbDwvQT4KLTxCUj4KLTxBIEhSRUY9Ik1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCIgdGl0bGU9ImVudW0gaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHRhcmdldD0iY2xhc3NGcmFtZSI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQT4KLTxCUj4KLTxBIEhSRUY9IlZhbGlkYXRvci5MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWE1MTEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uLy4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5QYWNrYWdlPC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5Vc2U8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9oZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYgUEFDS0FHRSZuYnNwOwotJm5ic3A7PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PEI+TkVYVCBQQUNLQUdFPC9CPjwvQT48L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2luZGV4Lmh0bWw/b3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl90b3AiPjwvQT4KLTwhLS0gPT09PT09PT09IEVORCBPRiBUT1AgTkFWQkFSID09PT09PT09PSAtLT4KLQotPEhSPgotPEgyPgotUGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbgotPC9IMj4KLUEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuCi08UD4KLTxCPlNlZTo8L0I+Ci08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8QSBIUkVGPSIjcGFja2FnZV9kZXNjcmlwdGlvbiI+PEI+RGVzY3JpcHRpb248L0I+PC9BPgotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+SW50ZXJmYWNlIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmRleC5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5JRGVwZW5kZW5jeUluZGV4PC9BPjwvQj48L1REPgotPFREPlRoaXMgc2VydmljZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlc291cmNlcyB0aGF0IGEgcGFydGljdWxhciByZXNvdXJjZSBkZXBlbmRzIG9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSU11dGFibGVWYWxpZGF0b3IuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SU11dGFibGVWYWxpZGF0b3I8L0E+PC9CPjwvVEQ+Ci08VEQ+QSB2YWxpZGF0b3IgdGhhdCBoYXMgZmllbGRzIHRoYXQgY2FuIGJlIHVwZGF0ZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwiIHRpdGxlPSJpbnRlcmZhY2UgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPklQZXJmb3JtYW5jZU1vbml0b3I8L0E+PC9CPjwvVEQ+Ci08VEQ+QSBzZXJ2aWNlIHRoYXQgY29sbGVjdHMgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gb24gdmFsaWRhdGlvbiBvcGVyYXRpb25zLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVZhbGlkYXRvckdyb3VwTGlzdGVuZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+VmFsaWRhdG9ycyBtYXkgd2lzaCB0byBqb2luIHZhbGlkYXRvciBncm91cHMgZm9yIHBlcmZvcm1hbmNlIG9yIG90aGVyCi0gcmVhc29ucy48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLQotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+Q2xhc3MgU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9BYnN0cmFjdFZhbGlkYXRvci5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkFic3RyYWN0VmFsaWRhdG9yPC9BPjwvQj48L1REPgotPFREPlRoZSBjbGFzcyB0aGF0IGFsbCBWYWxpZGF0b3JzIHRoYXQgd2lzaCB0byB1c2UgdmVyc2lvbiB0d28gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG11c3Qgc3ViY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9EZXBlbmRlbnRSZXNvdXJjZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkRlcGVuZGVudFJlc291cmNlPC9BPjwvQj48L1REPgotPFREPkEgcmVzb3VyY2UgdGhhdCBpcyBkZXBlbmRlbnQgb24gYW5vdGhlciByZXNvdXJjZS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL0ZyaWVuZC5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPkZyaWVuZDwvQT48L0I+PC9URD4KLTxURD5UaGlzIGNsYXNzIGlzIG9ubHkgdG8gYmUgY2FsbGVkIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBhbmQgaXQncyB0ZXN0IGNhc2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTWVzc2FnZVNldmVyaXR5U2V0dGluZy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPk1lc3NhZ2VTZXZlcml0eVNldHRpbmc8L0E+PC9CPjwvVEQ+Ci08VEQ+QXNzb2NpYXRlIGEgbWVzc2FnZSBzZXZlcml0eSB3aXRoIGEgbWVzc2FnZSBjYXRlZ29yeS48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL011dGFibGVQcm9qZWN0U2V0dGluZ3MuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NdXRhYmxlUHJvamVjdFNldHRpbmdzPC9BPjwvQj48L1REPgotPFREPlRoaXMgY2xhc3MgaG9sZHMgdGhlIG92ZXJhbGwgcHJvamVjdCB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+TXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzPC9BPjwvQj48L1REPgotPFREPlRoaXMgY2xhc3MgaG9sZHMgdGhlIG92ZXJhbGwgd29ya3NwYWNlIHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9QZXJmb3JtYW5jZUNvdW50ZXJzLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UGVyZm9ybWFuY2VDb3VudGVyczwvQT48L0I+PC9URD4KLTxURD5Tb21lIHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uIGZvciBhIHZhbGlkYXRpb24gaW52b2NhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1JlcG9ydGVySGVscGVyLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+UmVwb3J0ZXJIZWxwZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhpcyBpcyBhIHRlbXBvcmFyeSBjbGFzcyB0byBlYXNlIHRoZSB0cmFuc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvbkV2ZW50Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkV2ZW50PC9BPjwvQj48L1REPgotPFREPkFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB3aGljaCBvYmplY3Qgc2hvdWxkIGJlIHZhbGlkYXRlZCBhbmQgd2hhdCB0cmlnZ2VyZWQgaXRzIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvbkZyYW1ld29yazwvQT48L0I+PC9URD4KLTxURD5UaGUgY2VudHJhbCBjbGFzcyBvZiB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXIuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0aW9uRnJhbWV3b3JrLlJlc291cmNlQWRkZXI8L0E+PC9CPjwvVEQ+Ci08VEQ+Jm5ic3A7PC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblJlc3VsdDwvQT48L0I+PC9URD4KLTxURD5UaGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSB2YWxpZGF0ZSBvcGVyYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzdWx0cy5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRpb25SZXN1bHRzPC9BPjwvQj48L1REPgotPFREPlRoZSBjb21iaW5lZCByZXN1bHRzIG9mIHZhbGlkYXRpbmcgbXVsdGlwbGUgcmVzb3VyY2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdGlvblN0YXRlLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdGlvblN0YXRlPC9BPjwvQj48L1REPgotPFREPktlZXAgdHJhY2sgb2YgYXJiaXRyYXJ5IHZhbGlkYXRpb24gZGF0YSwgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yPC9BPjwvQj48L1REPgotPFREPlJlcHJlc2VudHMgYSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuVjE8L0E+PC9CPjwvVEQ+Ci08VEQ+QSB2YWxpZGF0b3IgdGhhdCB1c2VzIHZlcnNpb24gMSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuVjEuVjFDb3B5Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+VmFsaWRhdG9yLlYxLlYxQ29weTwvQT48L0I+PC9URD4KLTxURD4mbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5WMi5odG1sIiB0aXRsZT0iY2xhc3MgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPlZhbGlkYXRvci5WMjwvQT48L0I+PC9URD4KLTxURD5BIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAyIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREIFdJRFRIPSIxNSUiPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCIgdGl0bGU9ImNsYXNzIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3JNZXNzYWdlPC9BPjwvQj48L1REPgotPFREPlRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3YXkgZm9yIGEgdmFsaWRhdG9yIHRvIHJldHVybiBtZXNzYWdlcywgdGhhdCBhcmUgZWFzaWx5Ci0gY29udmVydGVkIGludG8gSU1hcmtlcnMuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotCi08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkVudW0gU3VtbWFyeTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9JUGVyZm9ybWFuY2VNb25pdG9yLkNvbGxlY3Rpb25MZXZlbC5odG1sIiB0aXRsZT0iZW51bSBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+SVBlcmZvcm1hbmNlTW9uaXRvci5Db2xsZWN0aW9uTGV2ZWw8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhlIGxldmVsIG9mIGluZm9ybWF0aW9uIHRvIGNvbGxlY3QuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5Lmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5NZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5PC9BPjwvQj48L1REPgotPFREPiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vVmFsaWRhdG9yLkxldmVsLmh0bWwiIHRpdGxlPSJlbnVtIGluIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj5WYWxpZGF0b3IuTGV2ZWw8L0E+PC9CPjwvVEQ+Ci08VEQ+VGhlIGxldmVsIG9mIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotJm5ic3A7Ci0KLTxQPgotPEEgTkFNRT0icGFja2FnZV9kZXNjcmlwdGlvbiI+PCEtLSAtLT48L0E+PEgyPgotUGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiBEZXNjcmlwdGlvbgotPC9IMj4KLQotPFA+Ci08cD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLjwvcD4KLTxwPkFsc28gc2VlIDxhIGhyZWY9ImRvYy1maWxlcy9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+PC9wPgotPHA+Ci1UaGVyZSBhcmUgdHdvIG1haW4gdHlwZXMgb2YgdmFsaWRhdGlvbiwgPGI+YnVpbGQgYmFzZWQ8L2I+IGFuZCAKLTxiPmFzIHlvdSB0eXBlPC9iPi4gVGhpcyBmcmFtZXdvcmsgc3VwcG9ydHMgYnVpbGQgYmFzZWQKLXZhbGlkYXRpb24uIElmIGF1dG8gYnVpbGQgaXMgdHVybmVkIG9uIHRoZW4gdGhlIHZhbGlkYXRvcnMgYXJlIGNhbGxlZAotd2hlbiB0aGUgdXNlciBzYXZlcyB0aGVpciBmaWxlLiBJZiBhdXRvIGJ1aWxkIGlzIG5vdCB0dXJuZWQgb24gdGhlbgotdGhlIHZhbGlkYXRvcnMgYXJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHN0YXJ0cyBhIGJ1aWxkLjwvcD4KLTxwPlRoaXMgZnJhbWV3b3JrIHdhcyBhZGRlZCB0byBXVFAgaW4gdmVyc2lvbiAzLjAuPC9wPgotPGgzPkRlcGVuZGVuY3kgU3VwcG9ydDwvaDM+Ci08cD5Tb21ldGltZXMgcmVzb3VyY2VzIGRlcGVuZCBvbiBvdGhlciByZXNvdXJjZXMsIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXkgYXJlIAotdmFsaWQgb3Igbm90LiBBbiBleGFtcGxlIHdvdWxkIGJlIHRoYXQgYW4gWE1MIHJlc291cmNlIGNvdWxkIGRlcGVuZCBvbiBhIERURC4gSWYgYXQgc29tZSAKLXBvaW50IGluIHRoZSBmdXR1cmUgdGhlIERURCBjaGFuZ2VzLCB0aGVuIHRoZSBkZXBlbmRlbnQgWE1MIHJlc291cmNlIHNob3VsZCBiZSAKLXJldmFsaWRhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IHN0aWxsIG1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIGNoYW5nZWQgRFREIAotZmlsZS4gSW4gb3JkZXIgdG8gZG8gdGhpcyBlZmZpY2llbnRseSwgdGhlcmUgbmVlZHMgdG8gYmUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiAKLXRoZSBEVEQgYW5kIGFsbCB0aGUgcmVzb3VyY2VzIHRoYXQgZGVwZW5kIG9uIGl0LjxwPlRvIGJlIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFsbG93cyAKLXRoaXMgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB0byBiZSByZXR1cm5lZCBhcyBwYXJ0IG9mIGEKLTxhIGhyZWY9IkFic3RyYWN0VmFsaWRhdG9yLmh0bWwjdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlLCBpbnQsIFZhbGlkYXRpb25TdGF0ZSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIj4KLXZhbGlkYXRlIG9wZXJhdGlvbjwvYT4uIFNpbmNlIHRoZSB2YWxpZGF0b3IgbmVlZGVkIHRvIGZpZ3VyZSB0aGlzIG91dCBhbnl3YXlzLCAKLXdoeSBub3QgcGFzcyB0aGlzIGluZm9ybWF0aW9uIGJhY2sgdG8gdGhlIGZyYW1ld29yaywgc28gdGhhdCBpdCBjYW4gYmUgc2F2ZWQuIAotVGhpcyBzYXZlcyB0aGUgY29zdCBvZiBoYXZpbmcgdG8gcGFyc2UgdGhlIGZpbGUgYXQgc29tZSBsYXRlciBwb2ludCBpbiB0aW1lIAotKHdoZW4gdGhlIGZpbGUgaXMgcHJvYmFibHkgc2l0dGluZyBjb2xkIG9uIGRpc2spLiBUaGUgZmV3ZXIgdGltZXMgdGhhdCB3ZSBuZWVkIAotdG8gb3BlbiwgcmVhZCBhbmQvb3IgcGFyc2UgdGhlIHNhbWUgZmlsZSwgd2lsbCBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgCi1wcm9kdWN0LgotPHA+SW4gcGFydGljdWxhciB3aGVuIHRoZSB2YWxpZGF0ZSBtZXRob2QgcmV0dXJucywgYQotPGEgaHJlZj0iVmFsaWRhdGlvblJlc3VsdC5odG1sIj5WYWxpZGF0aW9uUmVzdWx0PC9hPiBtdXN0IGJlIHJldHVybmVkLCBpbnNpZGUgb2YgCi10aGlzIHJlc3VsdCwgYWxsIHlvdXIgZGVwZW5kZW5jaWVzIG5lZWQgdG8gYmUgc3BlY2lmaWVkIHdpdGggdGhlCi08YSBocmVmPSJWYWxpZGF0aW9uUmVzdWx0Lmh0bWwjc2V0RGVwZW5kc09uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVtdKSI+Ci1zZXREZXBlbmRzT248L2E+IG1ldGhvZC48cD5JbiBhZGRpdGlvbiB0byBrZWVwaW5nIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIAotdXAtdG8tZGF0ZSB0aHJvdWdoIHRoZSBub3JtYWwgY291cnNlIG9mIHZhbGlkYXRpb24sIGRpcmVjdCBhY2Nlc3MgaXMgYWxzbyAKLXByb3ZpZGVkIHRvIHRoZSBkZXBlbmRlbmN5IHN1cHBvcnQgdGhyb3VnaCB0aGUKLTxhIGhyZWY9IlZhbGlkYXRpb25GcmFtZXdvcmsuaHRtbCNnZXREZXBlbmRlbmN5SW5kZXgoKSI+Z2V0RGVwZW5kZW5jeUluZGV4PC9hPiAKLW1ldGhvZC4gVGhlIDxhIGhyZWY9IklEZXBlbmRlbmN5SW5kZXguaHRtbCI+SURlcGVuZGVuY3lJbmRleDwvYT4gYWxsb3dzIHlvdSB0byAKLWRpcmVjdGx5IG1hbmlwdWxhdGUgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZm9yIGEgdmFsaWRhdG9yLgotPGgzPkVudHJ5IFBvaW50cyBpbnRvIHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yazwvaDM+Ci08cD5IZXJlIGFyZSBzb21lIG9mIHRoZSBwb2ludHMgd2hlcmUgdGhlIHBsYXRmb3JtIGNhbGxzIGludG8gdGhlIGZyYW1ld29yazo8L3A+Ci08dWw+Ci08bGk+PGI+QnVpbGRlcjwvYj4gLSBWYWxpZGF0aW9uQnVpbGRlcjwvbGk+Ci08bGk+PGI+SUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI8L2I+IC0gVmFsTWFuYWdlcjwvbGk+Ci08bGk+PGI+SUpvYkNoYW5nZUxpc3RlbmVyPC9iPiAtIFZhbGlkYXRpb25PcGVyYXRpb24sIFZhbGlkYXRpb25PcGVyYXRpb24uVmFsaWRhdGlvbkxhdW5jaGVySm9iPC9saT4KLTxsaT48Yj5JUHJvamVjdENoYW5nZUxpc3RlbmVyPC9iPiAtIFZhbE1hbmFnZXI8L2xpPgotPGxpPjxiPklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9iPiAtIFZhbGlkYXRpb25Db25maWd1cmF0aW9uLCBEaXNhYmxlZFJlc291cmNlTWFuYWdlcjwvbGk+Ci08bGk+PGI+SVJlc291cmNlQ2hhbmdlTGlzdGVuZXI8L2I+IC0gRXZlbnRNYW5nZXI8L2xpPgotPGxpPjxiPklWYWxDaGFuZ2VkTGlzdGVuZXI8L2I+IC0gVmFsTWFuYWdlciwgRGlzYWJsZWRWYWxpZGF0b3JNYW5hZ2VyPC9saT4KLTwvdWw+Ci08UD4KLQotPFA+Ci08REw+Ci08L0RMPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNGRkZGRkYiIENMQVNTPSJOYXZCYXJDZWxsMVJldiI+ICZuYnNwOzxGT05UIENMQVNTPSJOYXZCYXJGb250MVJldiI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+Q2xhc3M8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9InBhY2thZ2UtdXNlLmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+VXNlPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWIFBBQ0tBR0UmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxCPk5FWFQgUEFDS0FHRTwvQj48L0E+PC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9Ii4uLy4uLy4uLy4uL2FsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfYm90dG9tIj48L0E+Ci08IS0tID09PT09PT09IEVORCBPRiBCT1RUT00gTkFWQkFSID09PT09PT0gLS0+Ci0KLTxIUj4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS11c2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtdXNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTExNWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS11c2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1Vc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24KLTwvVElUTEU+Ci0KLTxNRVRBIE5BTUU9ImRhdGUiIENPTlRFTlQ9IjIwMTEtMDYtMjQiPgotCi08TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iLi4vLi4vLi4vLi4vc3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Ci0KLTxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLWZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkKLXsKLSAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsKLSAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSJVc2VzIG9mIFBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgyPgotPEI+VXNlcyBvZiBQYWNrYWdlPGJyPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9CPjwvSDI+Ci08L0NFTlRFUj4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1QYWNrYWdlcyB0aGF0IHVzZSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQj48L0E+PC9URD4KLTxURD5BIGZyYW1ld29yayBmb3IgY2FsbGluZyB2YWxpZGF0b3JzIHRoYXQgYXJlIGJ1aWxkIGJhc2VkLiZuYnNwOzwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEEgSFJFRj0iI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUiPjxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0I+PC9BPjwvVEQ+Ci08VEQ+QW4gZWFybGllciBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4mbmJzcDs8L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0mbmJzcDsKLTxQPgotPEEgTkFNRT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Ci1DbGFzc2VzIGluIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvQT4gdXNlZCBieSA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0Fic3RyYWN0VmFsaWRhdG9yLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPkFic3RyYWN0VmFsaWRhdG9yPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBjbGFzcyB0aGF0IGFsbCBWYWxpZGF0b3JzIHRoYXQgd2lzaCB0byB1c2UgdmVyc2lvbiB0d28gb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG11c3Qgc3ViY2xhc3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvRGVwZW5kZW50UmVzb3VyY2UuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+RGVwZW5kZW50UmVzb3VyY2U8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSByZXNvdXJjZSB0aGF0IGlzIGRlcGVuZGVudCBvbiBhbm90aGVyIHJlc291cmNlLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lEZXBlbmRlbmN5SW5kZXguaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+SURlcGVuZGVuY3lJbmRleDwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIHNlcnZpY2UgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSByZXNvdXJjZXMgdGhhdCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgZGVwZW5kcyBvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JTXV0YWJsZVZhbGlkYXRvci5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5JTXV0YWJsZVZhbGlkYXRvcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHZhbGlkYXRvciB0aGF0IGhhcyBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRlZC48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9JUGVyZm9ybWFuY2VNb25pdG9yLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPklQZXJmb3JtYW5jZU1vbml0b3I8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7QSBzZXJ2aWNlIHRoYXQgY29sbGVjdHMgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gb24gdmFsaWRhdGlvbiBvcGVyYXRpb25zLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL0lQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPklQZXJmb3JtYW5jZU1vbml0b3IuQ29sbGVjdGlvbkxldmVsPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBsZXZlbCBvZiBpbmZvcm1hdGlvbiB0byBjb2xsZWN0LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZzwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBc3NvY2lhdGUgYSBtZXNzYWdlIHNldmVyaXR5IHdpdGggYSBtZXNzYWdlIGNhdGVnb3J5LjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL01lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHkuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+TWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9NdXRhYmxlUHJvamVjdFNldHRpbmdzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk11dGFibGVQcm9qZWN0U2V0dGluZ3M8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhpcyBjbGFzcyBob2xkcyB0aGUgb3ZlcmFsbCBwcm9qZWN0IHZhbGlkYXRpb24gc2V0dGluZ3MuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIGhvbGRzIHRoZSBvdmVyYWxsIHdvcmtzcGFjZSB2YWxpZGF0aW9uIHNldHRpbmdzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1BlcmZvcm1hbmNlQ291bnRlcnMuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+UGVyZm9ybWFuY2VDb3VudGVyczwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTb21lIHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uIGZvciBhIHZhbGlkYXRpb24gaW52b2NhdGlvbi48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uRXZlbnQuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+VmFsaWRhdGlvbkV2ZW50PC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0FuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB3aGljaCBvYmplY3Qgc2hvdWxkIGJlIHZhbGlkYXRlZCBhbmQgd2hhdCB0cmlnZ2VyZWQgaXRzIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvbkZyYW1ld29yay5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5WYWxpZGF0aW9uRnJhbWV3b3JrPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBjZW50cmFsIGNsYXNzIG9mIHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0aW9uUmVzdWx0Lmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlZhbGlkYXRpb25SZXN1bHQ8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIHJlc3VsdCBvZiBydW5uaW5nIGEgdmFsaWRhdGUgb3BlcmF0aW9uLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25SZXN1bHRzLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlZhbGlkYXRpb25SZXN1bHRzPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1RoZSBjb21iaW5lZCByZXN1bHRzIG9mIHZhbGlkYXRpbmcgbXVsdGlwbGUgcmVzb3VyY2VzLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRpb25TdGF0ZS5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5WYWxpZGF0aW9uU3RhdGU8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7S2VlcCB0cmFjayBvZiBhcmJpdHJhcnkgdmFsaWRhdGlvbiBkYXRhLCBkdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHZhbGlkYXRpb24uPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlZhbGlkYXRvcjwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSZXByZXNlbnRzIGEgdmFsaWRhdG9yLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvci5MZXZlbC5odG1sI29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj48Qj5WYWxpZGF0b3IuTGV2ZWw8L0I+PC9BPjwvQj4KLQotPEJSPgotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGxldmVsIG9mIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2YWxpZGF0b3IuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdG9yLlYxLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iPjxCPlZhbGlkYXRvci5WMTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBIHZhbGlkYXRvciB0aGF0IHVzZXMgdmVyc2lvbiAxIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay48L1REPgotPC9UUj4KLTxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgotPFREPjxCPjxBIEhSRUY9Ii4uLy4uLy4uLy4uL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2NsYXNzLXVzZS9WYWxpZGF0b3IuVjIuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+VmFsaWRhdG9yLlYyPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0EgdmFsaWRhdG9yIHRoYXQgdXNlcyB2ZXJzaW9uIDIgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvVEQ+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQ+PEI+PEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vY2xhc3MtdXNlL1ZhbGlkYXRvck1lc3NhZ2UuaHRtbCNvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PEI+VmFsaWRhdG9yTWVzc2FnZTwvQj48L0E+PC9CPgotCi08QlI+Ci0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd2F5IGZvciBhIHZhbGlkYXRvciB0byByZXR1cm4gbWVzc2FnZXMsIHRoYXQgYXJlIGVhc2lseQotIGNvbnZlcnRlZCBpbnRvIElNYXJrZXJzLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj48IS0tIC0tPjwvQT4KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotQ2xhc3NlcyBpbiA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+IHVzZWQgYnkgPEEgSFJFRj0iLi4vLi4vLi4vLi4vb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURD48Qj48QSBIUkVGPSIuLi8uLi8uLi8uLi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9jbGFzcy11c2UvVmFsaWRhdGlvblN0YXRlLmh0bWwjb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZSI+PEI+VmFsaWRhdGlvblN0YXRlPC9CPjwvQT48L0I+Ci0KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0tlZXAgdHJhY2sgb2YgYXJiaXRyYXJ5IHZhbGlkYXRpb24gZGF0YSwgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSB2YWxpZGF0aW9uLjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLSZuYnNwOwotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+UGFja2FnZTwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPlVzZTwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9Ii4uLy4uLy4uLy4uL2RlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSIuLi8uLi8uLi8uLi9pbmRleC5odG1sP29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3BhY2thZ2UtdXNlLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0icGFja2FnZS11c2UuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSIuLi8uLi8uLi8uLi9hbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iLi4vLi4vLi4vLi4vYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX2JvdHRvbSI+PC9BPgotPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPgotCi08SFI+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL292ZXJ2aWV3LWZyYW1lLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1mcmFtZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjhmYTAwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL292ZXJ2aWV3LWZyYW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS1OZXdQYWdlLS0+Ci08SFRNTD4KLTxIRUFEPgotPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgMS42LjBfMjUpIG9uIEZyaSBKdW4gMjQgMTQ6NTc6MjcgRURUIDIwMTEgLS0+Ci08VElUTEU+Ci1PdmVydmlldyBMaXN0Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiPgotCi08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KLTxUUj4KLTxUSCBBTElHTj0ibGVmdCIgTk9XUkFQPjxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVUaXRsZUZvbnQiPgotPEI+PC9CPjwvRk9OVD48L1RIPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIE5PV1JBUD48Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+QWxsIENsYXNzZXM8L0E+PC9GT05UPgotPFA+Ci08Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgotUGFja2FnZXM8L0ZPTlQ+Ci08QlI+Ci08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb248L0E+PC9GT05UPgotPEJSPgotPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPjxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvcGFja2FnZS1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTwvQT48L0ZPTlQ+Ci08QlI+Ci08L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotJm5ic3A7Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzdhNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvb3ZlcnZpZXctc3VtbWFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLU5ld1BhZ2UtLT4KLTxIVE1MPgotPEhFQUQ+Ci08IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjYuMF8yNSkgb24gRnJpIEp1biAyNCAxNDo1NzoyNyBFRFQgMjAxMSAtLT4KLTxUSVRMRT4KLU92ZXJ2aWV3Ci08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iT3ZlcnZpZXciOwotICAgIH0KLX0KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotPC9OT1NDUklQVD4KLQotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX3RvcCI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfdG9wIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX3RvcF9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRkZGRkZGIiBDTEFTUz0iTmF2QmFyQ2VsbDFSZXYiPiAmbmJzcDs8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDFSZXYiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/b3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5OTyBGUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIDwhLS0KLSAgaWYod2luZG93PT10b3ApIHsKLSAgICBkb2N1bWVudC53cml0ZWxuKCc8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPicpOwotICB9Ci0gIC8vLS0+Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLSAgPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4KLTwvTk9TQ1JJUFQ+Ci0KLQotPC9GT05UPjwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTxBIE5BTUU9InNraXAtbmF2YmFyX3RvcCI+PC9BPgotPCEtLSA9PT09PT09PT0gRU5EIE9GIFRPUCBOQVZCQVIgPT09PT09PT09IC0tPgotCi08SFI+Ci08Q0VOVEVSPgotPEgxPgotV2ViIFRvb2xzIFBsYXRmb3JtOiBWYWxpZGF0aW9uIEZyYW1ld29yawotPC9IMT4KLTwvQ0VOVEVSPgotQSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC4KLTxQPgotPEI+U2VlOjwvQj4KLTxCUj4KLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxBIEhSRUY9IiNvdmVydmlld19kZXNjcmlwdGlvbiI+PEI+RGVzY3JpcHRpb248L0I+PC9BPgotPFA+Ci0KLTxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Ci08VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KLTxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgotPEI+UGFja2FnZXM8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Ci08VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uPC9BPjwvQj48L1REPgotPFREPkEgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuPC9URD4KLTwvVFI+Ci08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KLTxURCBXSURUSD0iMjAlIj48Qj48QSBIUkVGPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL3BhY2thZ2Utc3VtbWFyeS5odG1sIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlPC9BPjwvQj48L1REPgotPFREPkFuIGVhcmxpZXIgZnJhbWV3b3JrIGZvciBjYWxsaW5nIHZhbGlkYXRvcnMgdGhhdCBhcmUgYnVpbGQgYmFzZWQuPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLSZuYnNwOzxBIE5BTUU9Im92ZXJ2aWV3X2Rlc2NyaXB0aW9uIj48IS0tIC0tPjwvQT4KLTxQPgotPHA+QSBmcmFtZXdvcmsgZm9yIGNhbGxpbmcgdmFsaWRhdG9ycyB0aGF0IGFyZSBidWlsZCBiYXNlZC48L3A+Ci08aDI+QXBwcm9hY2g8L2gyPgotPHA+SW4gV1RQIDMuMCBhIG5ldyB2YWxpZGF0aW9uIGZyYW1ld29yayBoYXMgYmVlbiBhZGRlZC4gVGhpcyB3YXMgZGV2ZWxvcGVkIGF0IAotdGhlIHJlcXVlc3Qgb2YgdmFsaWRhdG9yIG93bmVycyBhbmQgZW5kIHVzZXJzLiBUbyBlYXNlIHRoZSB0cmFuc2l0aW9uIHRvIHRoaXMgCi1uZXcgZnJhbWV3b3JrLCB0aGF0IGFwcHJvYWNoIHRoYXQgaGFzIGJlZW4gdGFrZW4gaXMgdG8gc3VwcG9ydCBib3RoIHRoZSBvbGQgYW5kIAotdGhlIG5ldyBmcmFtZXdvcmtzIGZvciBhIHdoaWxlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9sZCB2YWxpZGF0b3JzIHdvcmsgZXhhY3RseSAKLWxpa2UgdGhleSB1c2VkIHRvLiBUaGV5IGNhbiBzdGlsbCBwbHVnIGludG8gdGhlIG9sZCBmcmFtZXdvcmsgYW5kIHdpbGwgY29udGludWUgCi10byBiZSBydW4gYnkgdGhlIG9sZCBmcmFtZXdvcmsuIFRoaXMgYWxsb3dzIHZhbGlkYXRvciBvd25lcnMgdG8gbWlncmF0ZSBhdCB0aGVpciAKLW93biBwYWNlLjwvcD4KLTxwPkZvciB2YWxpZGF0b3Igb3duZXJzIHRoYXQgd2lzaCB0byBleHBsb2l0IHRoZSBuZXcgZnJhbWV3b3JrLCBpdCBoYXMgYmVlbiAKLWRlc2lnbmVkIG4gc3VjaCBhIHdheSB0byBtaW5pbWl6ZSB0aGUgdHJhbnNpdGlvbiBmcm9tIHRoZSBvbGQgZnJhbWV3b3JrIHRvIHRoZSAKLW5ldyBmcmFtZXdvcmsuIFRoZXJlIGlzIGEgbmV3IGV4dGVuc2lvbiBwb2ludCB0aGF0IG5lZWRzIHRvIGJlIHNwZWNpZmllZCwgYW5kIGEgCi1uZXcgYWJzdHJhY3QgY2xhc3MgdGhhdCBuZWVkcyB0byBiZSBleHRlbmRlZC48L3A+Ci08aDM+QmVuZWZpdHM8L2gzPgotPHA+V2hhdCBiZW5lZml0cyBkb2VzIHRoZSBuZXcgZnJhbWV3b3JrIGhhdmUgdG8gb2ZmZXI/IE9yIGFza2VkIGFub3RoZXIgd2F5LCBhcyAKLWEgdmFsaWRhdG9yIG93bmVyLCB3aHkgd291bGQgSSB3YW50IHRvIHN3aXRjaD88L3A+Ci08aDQ+UGVyZm9ybWFuY2U8L2g0PgotPGg1PlR1bmluZzwvaDU+Ci08cD5UaGUgbWFpbiByZWFzb24gZm9yIGNyZWF0aW5nIGEgbmV3IGZyYW1ld29yayB3YXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gQXMgCi1tb3JlIGFuZCBtb3JlIHZhbGlkYXRvcnMgYXJlIGFkZGVkLCB2YWxpZGF0aW9uIGlzIGNvbnN1bWluZyBhIGJpZ2dlciBzbGljZSBvZiAKLXRoZSByZXNvdXJjZXMgdGhhdCBpdCB0YWtlcyB0byBwZXJmb3JtIGEgYnVpbGQuPC9wPgotPHA+VGhlIGJlc3QgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaXMgZWxpbWluYXRpbmcgdW5uZWNlc3Nhcnkgd29yay4gV2UgCi1lbGltaW5hdGUgd29yaywgYnkgcHJvdmlkaW5nIHNpZ25pZmljYW50bHkgbW9yZSB0dW5pbmcgb3B0aW9ucy4gVmFsaWRhdGlvbiAKLW93bmVycyBjYW4gdHVuZSB3aGljaCByZXNvdXJjZXMgdGhleSBhcmUgY2FsbGVkIG9uLiBUaGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgdXNlIAotb2YgZmlsdGVyIHJ1bGVzLiBUaGVzZSBmaWx0ZXIgcnVsZXMgYXJlIGdyb3VwZWQgaW50byBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiAKLWdyb3Vwcy4gSWYgeW91IGhhdmUgbXVsdGlwbGUgaW5jbHVzaW9uIGdyb3VwcyB0aGV5IGFyZSAmcXVvdDthbmRlZCZxdW90OyB0b2dldGhlciwgbWVhbmluZyAKLXRoYXQgZWFjaCBvZiB0aGUgaW5jbHVzaW9uIGdyb3VwcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN1Y2Nlc3NmdWwgZmlsdGVyIHJ1bGUuIAotRXhjbHVzaW9uIGdyb3VwcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoYXQgZG9lc24ndCBnZXQgdmFsaWRhdGVkLiBFeGNsdXNpb24gCi1ncm91cHMgaGF2ZSBhIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gaW5jbHVzaW9uIGdyb3Vwcy4gSWYgYW4gZXhjbHVzaW9uIGdyb3VwIAotZXhjbHVkZXMgYSByZXNvdXJjZSB0aGFuIGl0IGlzIGV4Y2x1ZGVkIG5vIG1hdHRlciB3aGF0IHRoZSBpbmNsdXNpb24gZ3JvdXBzIG1heSAKLXNheS48L3A+Ci08cD5UaGV5IGFyZSBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyBvZiBmaWx0ZXIgcnVsZXM6PC9wPgotPHVsPgotICAgICAgICA8bGk+PHN0cm9uZz5GaWxlIGV4dGVuc2lvbjwvc3Ryb25nPiAtIFJ1bGVzIGJhc2VkIG9uIHRoZSBmaWxlIGV4dGVuc2lvbi4gRm9yIAotICAgICAgICBleGFtcGxlLCBpbmNsdWRlIGFsbCB0aGUgZmlsZXMgd2l0aCBleHRlbnNpb24gKi54bWwuPC9saT4KLSAgICAgICAgPGxpPjxzdHJvbmc+Rm9sZGVyIG9yIEZpbGUgbmFtZTwvc3Ryb25nPiAtIFJ1bGVzIGJhc2VkIG9uIHRoZSBmb2xkZXIgb3IgZmlsZSAKLSAgICAgICAgbmFtZS4gRm9yIGV4YW1wbGUgZXhjbHVkZSBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgYnVpbGQgZm9sZGVyLiBGaWxlIG5hbWVzIAotICAgICAgICBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkLCBwcm9qZWN0IHJlbGF0aXZlIG5hbWVzLCBlLmcuIDxzdHJvbmc+V2ViQ29udGVudC9XRUItSU5GL3dlYi54bWw8L3N0cm9uZz4sIAotICAgICAgICBvciBzaW1wbGUgbmFtZXMsIDxzdHJvbmc+d2ViLnhtbDwvc3Ryb25nPi48L2xpPgotICAgICAgICA8bGk+PHN0cm9uZz5Qcm9qZWN0IG5hdHVyZTwvc3Ryb25nPiAtIFByb2plY3RzIHdpdGggY2VydGFpbiBuYXR1cmVzIGNhbiBiZSAKLSAgICAgICAgZWl0aGVyIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLjwvbGk+Ci0gICAgICAgIDxsaT48c3Ryb25nPkZhY2V0PC9zdHJvbmc+IC0gUHJvamVjdHMgd2l0aCBjZXJ0YWluIGZhY2V0cyBjYW4gYmUgZWl0aGVyIAotICAgICAgICBpbmNsdWRlZCBvciBleGNsdWRlZC48L2xpPgotICAgICAgICA8bGk+PHN0cm9uZz5Db250ZW50IFR5cGUgPC9zdHJvbmc+LSBSZXNvdXJjZXMgb2YgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSAKLSAgICAgICAgY2FuIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLjwvbGk+Ci08L3VsPgotPHA+VGhlIGZpbHRlciBydWxlcyBhbmQgZ3JvdXBzIGZvcm0gdGhlIGJ1aWxkaW5nIGJsb2NrcyBvZiB3aGF0IGdldHMgdmFsaWRhdGVkLgotPC9wPgotPHA+SW4gdGVybXMgb2YgdHVuaW5nIGhvd2V2ZXIsIHRoZSBlbmQgdXNlciBoYXMgdGhlIGZpbmFsIHNheS4gVGhlIHZhbGlkYXRvciAKLW93bmVycyBzcGVjaWZ5IHRoZSBkZWZhdWx0IGZpbHRlciBydWxlcyBhbmQgZ3JvdXBzIGZvciB0aGVpciB2YWxpZGF0b3IsIGJ1dCB0aGUgCi1lbmQgdXNlciB0aHJvdWdoIHRoZSB1c2Ugb2YgcHJlZmVyZW5jZXMgY2FuIG92ZXJyaWRlIHRoZXNlIHNldHRpbmdzLiA8L3A+Ci08aDU+Q2FjaGluZzwvaDU+Ci08cD5Bbm90aGVyIHdheSB0aGF0IHBlcmZvcm1hbmNlIGlzIGltcHJvdmVkIGlzIHRocm91Z2ggbW9yZSBlZmZlY3RpdmUgY2FjaGluZy4gCi1XaXRoIHRoZSBwcmV2aW91cyBmcmFtZXdvcmsgd2Ugd2VyZSBub3RpY2luZyB0aGF0IGRpZmZlcmVudCB2YWxpZGF0b3JzIHdvdWxkIGJlIAotb3BlbmluZyBhbmQgcHJvY2Vzc2luZyB0aGUgc2FtZSBmaWxlLCBidXQgdGhhdCB0aGlzIHdvdWxkIGhhcHBlbiBmYXIgZW5vdWdoIAotYXBhcnQsIHRoYXQgY2FjaGVzIHdlcmVuJ3QgZWZmZWN0aXZlLiBFdmVuIGlmIGZpbGVzIHdlcmUgYmVpbmcgY2FjaGVkLCB0aGUgCi1zZWNvbmQgKG9yIHRoaXJkLCBvciBmb3J0aCwgLi4uKSBvcGVuIHdvdWxkIGhhcHBlbiBmYXIgZW5vdWdoIGEgbWVhbnMgdGhhdCB3YXkgCi10aGF0IHRoZSBmaWxlIHdvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUuIEluIHRoZSBuZXcgCi1mcmFtZXdvcmssIHRoZSBwcm9jZXNzaW5nIG9yZGVyIGlzIG1vcmUgdGlnaHRseSBjb250cm9sbGVkLiBUaGUgZnJhbWV3b3JrIGNhbGxzIAotdGhlIHZhbGlkYXRvciBhbmQgdGVsbHMgaXQgd2hhdCB0byB2YWxpZGF0ZS4gVGhpcyB3YXkgZmlsZXMgYXJlIHByb2Nlc3NlZCBpbiAKLW9yZGVyLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjaGFuY2Ugb2YgdGhlbSBiZWluZyBhIGNhY2hlIGlzIG11Y2ggaGlnaGVyLiBFdmVyeSAKLXZhbGlkYXRvciB0aGF0IGlzIGludGVyZXN0ZWQgaW4gZmlsZSBBIHByb2Nlc3NlcyBpdCwgYW5kIHRoZW4gd2UgbW92ZSBvbiBhbmQgCi1ldmVyeSB2YWxpZGF0b3IgdGhhdCBpcyBpbnRlcmVzdGVkIGluIGZpbGUgQiBwcm9jZXNzZXMgaXQsIGV0Yy48L3A+Ci08cD5BbHNvIGJlY2F1c2Ugc3RhdGUgaW5mb3JtYXRpb24gaXMga2VwdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWxpZGF0aW9uIAotb3BlcmF0aW9uLCB2YWxpZGF0b3JzIGNhbiBjYWNoZSBleHBlbnNpdmUgb3BlcmF0aW9ucywgbGlrZSBtb2RlbCBjcmVhdGlvbiwgdGhhdCAKLW1pZ2h0IGJlIG5lZWRlZCBhcyBwYXJ0IG9mIHZhbGlkYXRpbmcgc2V2ZXJhbCBmaWxlcy4gPC9wPgotPGg1PkpvYiBDb250cm9sPC9oNT4KLTxwPldpdGggdGhlIGVhcmxpZXIgZnJhbWV3b3JrLCB0aGVyZSB3ZXJlIHRvbyBtYW55IGpvYnMvdGhyZWFkcyBydW5uaW5nIAotY29uY3VycmVudGx5LiBUaGlzIGlzIG5vdyBtb3JlIHRpZ2h0bHkgY29udHJvbGxlZC48L3A+Ci08aDQ+RGVwZW5kZW5jeSBTdXBwb3J0PC9oND4KLTxwPkFub3RoZXIgbmV3IGZlYXR1cmUgaXMgZGVwZW5kZW5jeSBzdXBwb3J0LiBBIHZhbGlkYXRvciBjYW4gbm93IGFzc2VydCB0aGF0IGEgCi1yZXNvdXJjZSBpcyBkZXBlbmRhbnQgb24gc29tZSBvdGhlciByZXNvdXJjZXMuIEZvciBleGFtcGxlIHRoYXQgYSBYTUwgZmlsZSBpcyAKLWRlcGVuZGFudCBvbiBhIFhTRCBmaWxlLiBOb3cgaWYgdGhlIFhTRCBmaWxlIGNoYW5nZXMgdGhlIFhNTCBjYW4gYmUgcmV2YWxpZGF0ZWQuIAotQXMgdGhlIHVzZXIgY29tZXMgdG8gdHJ1c3QgdGhpcyBkZXBlbmRlbmN5IHN1cHBvcnQsIHRoZXkgd29udCBwZXJmb3JtIGFzIG1hbnkgCi1jbGVhbiBidWlsZHMuPC9wPgotPGg0PlByaW1hcnkgRnJhbWV3b3JrPC9oND4KLTxwPlRoaXMgaXMgdGhlIHByaW1hcnkgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIEF0IHNvbWUgcG9pbnQsIHRoZSBlYXJsaWVyIAotZnJhbWV3b3JrIHdpbGwgYmUgZGVwcmVjYXRlZCBhbmQgdGhlbiByZW1vdmVkLiBBbGwgdGhlIG5ldyBpbnZlc3RtZW50IHdpbGwgCi1oYXBwZW4gaW4gdGhpcyBmcmFtZXdvcmsuIDwvcD4KLTxwPlRoZSBmcmFtZXdvcmsgY29sbGF0ZXJhbCB3aWxsIGNvbnRpbnVlIHRvIGJlIGVuaGFuY2VkIChqdW5pdCB0ZXN0Y2FzZXMsIAotZG9jdW1lbnRhdGlvbiwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCAuLi4pPC9wPgotPFA+Ci0KLTxQPgotPEhSPgotCi0KLTwhLS0gPT09PT09PSBTVEFSVCBPRiBCT1RUT00gTkFWQkFSID09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b20iPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX2JvdHRvbSIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl9ib3R0b21fZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0ZGRkZGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxUmV2Ij4gJm5ic3A7PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxUmV2Ij48Qj5PdmVydmlldzwvQj48L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP292ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Qj5GUkFNRVM8L0I+PC9BPiAgJm5ic3A7Ci0mbmJzcDs8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9wYWNrYWdlLWxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9wYWNrYWdlLWxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlY2IyNGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcGFja2FnZS1saXN0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbgotb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcmVzb3VyY2VzL2luaGVyaXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvcmVzb3VyY2VzL2luaGVyaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODE0ODY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3Jlc291cmNlcy9pbmhlcml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3NlcmlhbGl6ZWQtZm9ybS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjZmM2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9hcGkvc2VyaWFsaXplZC1mb3JtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tTmV3UGFnZS0tPgotPEhUTUw+Ci08SEVBRD4KLTwhLS0gR2VuZXJhdGVkIGJ5IGphdmFkb2MgKGJ1aWxkIDEuNi4wXzI1KSBvbiBGcmkgSnVuIDI0IDE0OjU3OjI3IEVEVCAyMDExIC0tPgotPFRJVExFPgotU2VyaWFsaXplZCBGb3JtCi08L1RJVExFPgotCi08TUVUQSBOQU1FPSJkYXRlIiBDT05URU5UPSIyMDExLTA2LTI0Ij4KLQotPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgotCi08U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci1mdW5jdGlvbiB3aW5kb3dUaXRsZSgpCi17Ci0gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignaXMtZXh0ZXJuYWw9dHJ1ZScpID09IC0xKSB7Ci0gICAgICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iU2VyaWFsaXplZCBGb3JtIjsKLSAgICB9Ci19Ci08L1NDUklQVD4KLTxOT1NDUklQVD4KLTwvTk9TQ1JJUFQ+Ci0KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgotPEhSPgotCi0KLTwhLS0gPT09PT09PT09IFNUQVJUIE9GIFRPUCBOQVZCQVIgPT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwhLS0gLS0+PC9BPgotPEEgSFJFRj0iI3NraXAtbmF2YmFyX3RvcCIgdGl0bGU9IlNraXAgbmF2aWdhdGlvbiBsaW5rcyI+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIxIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUj4KLTxURCBDT0xTUEFOPTIgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4KLTxBIE5BTUU9Im5hdmJhcl90b3BfZmlyc3Ryb3ciPjwhLS0gLS0+PC9BPgotPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIzIiBTVU1NQVJZPSIiPgotICA8VFIgQUxJR049ImNlbnRlciIgVkFMSUdOPSJ0b3AiPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPk92ZXJ2aWV3PC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+UGFja2FnZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5DbGFzczwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5Vc2U8L0ZPTlQ+Jm5ic3A7PC9URD4KLSAgPFREIEJHQ09MT1I9IiNFRUVFRkYiIENMQVNTPSJOYXZCYXJDZWxsMSI+ICAgIDxBIEhSRUY9ImRlcHJlY2F0ZWQtbGlzdC5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkRlcHJlY2F0ZWQ8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iaGVscC1kb2MuaHRtbCI+PEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj48Qj5IZWxwPC9CPjwvRk9OVD48L0E+Jm5ic3A7PC9URD4KLSAgPC9UUj4KLTwvVEFCTEU+Ci08L1REPgotPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFJPV1NQQU49Mz48RU0+Ci08L0VNPgotPC9URD4KLTwvVFI+Ci0KLTxUUj4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0mbmJzcDtQUkVWJm5ic3A7Ci0mbmJzcDtORVhUPC9GT05UPjwvVEQ+Ci08VEQgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJOYXZCYXJDZWxsMiI+PEZPTlQgU0laRT0iLTIiPgotICA8QSBIUkVGPSJpbmRleC5odG1sP3NlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPkZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxBIEhSRUY9InNlcmlhbGl6ZWQtZm9ybS5odG1sIiB0YXJnZXQ9Il90b3AiPjxCPk5PIEZSQU1FUzwvQj48L0E+ICAmbmJzcDsKLSZuYnNwOzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgPCEtLQotICBpZih3aW5kb3c9PXRvcCkgewotICAgIGRvY3VtZW50LndyaXRlbG4oJzxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Jyk7Ci0gIH0KLSAgLy8tLT4KLTwvU0NSSVBUPgotPE5PU0NSSVBUPgotICA8QSBIUkVGPSJhbGxjbGFzc2VzLW5vZnJhbWUuaHRtbCI+PEI+QWxsIENsYXNzZXM8L0I+PC9BPgotPC9OT1NDUklQVD4KLQotCi08L0ZPTlQ+PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotPEEgTkFNRT0ic2tpcC1uYXZiYXJfdG9wIj48L0E+Ci08IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Ci0KLTxIUj4KLTxDRU5URVI+Ci08SDE+Ci1TZXJpYWxpemVkIEZvcm08L0gxPgotPC9DRU5URVI+Ci08SFIgU0laRT0iNCIgTk9TSEFERT4KLQotPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KLTxUUiBCR0NPTE9SPSIjQ0NDQ0ZGIiBDTEFTUz0iVGFibGVTdWJIZWFkaW5nQ29sb3IiPgotPFRIIEFMSUdOPSJjZW50ZXIiPjxGT05UIFNJWkU9IisyIj4KLTxCPlBhY2thZ2U8L0I+IDxCPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU8L0I+PC9GT05UPjwvVEg+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08QSBOQU1FPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZVN1YkhlYWRpbmdDb2xvciI+Ci08VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KLTxCPkNsYXNzIDxBIEhSRUY9Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvTWVzc2FnZUxpbWl0RXhjZXB0aW9uLmh0bWwiIHRpdGxlPSJjbGFzcyBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlIj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjwvQT4gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZTwvQj48L0ZPTlQ+PC9USD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxCPnNlcmlhbFZlcnNpb25VSUQ6Jm5ic3A7PC9CPi03MDM0ODk3MTkwNzQ1NzY2OTQwTAotCi08UD4KLQotPFA+Ci08SFI+Ci0KLQotPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbSI+PCEtLSAtLT48L0E+Ci08QSBIUkVGPSIjc2tpcC1uYXZiYXJfYm90dG9tIiB0aXRsZT0iU2tpcCBuYXZpZ2F0aW9uIGxpbmtzIj48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjEiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgotPFRSPgotPFREIENPTFNQQU49MiBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPgotPEEgTkFNRT0ibmF2YmFyX2JvdHRvbV9maXJzdHJvdyI+PCEtLSAtLT48L0E+Ci08VEFCTEUgQk9SREVSPSIwIiBDRUxMUEFERElORz0iMCIgQ0VMTFNQQUNJTkc9IjMiIFNVTU1BUlk9IiI+Ci0gIDxUUiBBTElHTj0iY2VudGVyIiBWQUxJR049InRvcCI+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+T3ZlcnZpZXc8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEZPTlQgQ0xBU1M9Ik5hdkJhckZvbnQxIj5QYWNrYWdlPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPkNsYXNzPC9GT05UPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPlVzZTwvRk9OVD4mbmJzcDs8L1REPgotICA8VEQgQkdDT0xPUj0iI0VFRUVGRiIgQ0xBU1M9Ik5hdkJhckNlbGwxIj4gICAgPEEgSFJFRj0iZGVwcmVjYXRlZC1saXN0Lmh0bWwiPjxGT05UIENMQVNTPSJOYXZCYXJGb250MSI+PEI+RGVwcmVjYXRlZDwvQj48L0ZPTlQ+PC9BPiZuYnNwOzwvVEQ+Ci0gIDxURCBCR0NPTE9SPSIjRUVFRUZGIiBDTEFTUz0iTmF2QmFyQ2VsbDEiPiAgICA8QSBIUkVGPSJoZWxwLWRvYy5odG1sIj48Rk9OVCBDTEFTUz0iTmF2QmFyRm9udDEiPjxCPkhlbHA8L0I+PC9GT05UPjwvQT4mbmJzcDs8L1REPgotICA8L1RSPgotPC9UQUJMRT4KLTwvVEQ+Ci08VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgUk9XU1BBTj0zPjxFTT4KLTwvRU0+Ci08L1REPgotPC9UUj4KLQotPFRSPgotPFREIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iTmF2QmFyQ2VsbDIiPjxGT05UIFNJWkU9Ii0yIj4KLSZuYnNwO1BSRVYmbmJzcDsKLSZuYnNwO05FWFQ8L0ZPTlQ+PC9URD4KLTxURCBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9Ik5hdkJhckNlbGwyIj48Rk9OVCBTSVpFPSItMiI+Ci0gIDxBIEhSRUY9ImluZGV4Lmh0bWw/c2VyaWFsaXplZC1mb3JtLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+RlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PEEgSFJFRj0ic2VyaWFsaXplZC1mb3JtLmh0bWwiIHRhcmdldD0iX3RvcCI+PEI+Tk8gRlJBTUVTPC9CPjwvQT4gICZuYnNwOwotJm5ic3A7PFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICA8IS0tCi0gIGlmKHdpbmRvdz09dG9wKSB7Ci0gICAgZG9jdW1lbnQud3JpdGVsbignPEEgSFJFRj0iYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiPjxCPkFsbCBDbGFzc2VzPC9CPjwvQT4nKTsKLSAgfQotICAvLy0tPgotPC9TQ1JJUFQ+Ci08Tk9TQ1JJUFQ+Ci0gIDxBIEhSRUY9ImFsbGNsYXNzZXMtbm9mcmFtZS5odG1sIj48Qj5BbGwgQ2xhc3NlczwvQj48L0E+Ci08L05PU0NSSVBUPgotCi0KLTwvRk9OVD48L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08QSBOQU1FPSJza2lwLW5hdmJhcl9ib3R0b20iPjwvQT4KLTwhLS0gPT09PT09PT0gRU5EIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09PSAtLT4KLQotPEhSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2FwaS9zdHlsZXNoZWV0LmNzcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3N0eWxlc2hlZXQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWE5ZTUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvYXBpL3N0eWxlc2hlZXQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogSmF2YWRvYyBzdHlsZSBzaGVldCAqLwotCi0vKiBEZWZpbmUgY29sb3JzLCBmb250cyBhbmQgb3RoZXIgc3R5bGUgYXR0cmlidXRlcyBoZXJlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyAqLwotCi0vKiBQYWdlIGJhY2tncm91bmQgY29sb3IgKi8KLWJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyBjb2xvcjojMDAwMDAwIH0KLQotLyogSGVhZGluZ3MgKi8KLWgxIHsgZm9udC1zaXplOiAxNDUlIH0KLQotLyogVGFibGUgY29sb3JzICovCi0uVGFibGVIZWFkaW5nQ29sb3IgICAgIHsgYmFja2dyb3VuZDogI0NDQ0NGRjsgY29sb3I6IzAwMDAwMCB9IC8qIERhcmsgbWF1dmUgKi8KLS5UYWJsZVN1YkhlYWRpbmdDb2xvciAgeyBiYWNrZ3JvdW5kOiAjRUVFRUZGOyBjb2xvcjojMDAwMDAwIH0gLyogTGlnaHQgbWF1dmUgKi8KLS5UYWJsZVJvd0NvbG9yICAgICAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBjb2xvcjojMDAwMDAwIH0gLyogV2hpdGUgKi8KLQotLyogRm9udCB1c2VkIGluIGxlZnQtaGFuZCBmcmFtZSBsaXN0cyAqLwotLkZyYW1lVGl0bGVGb250ICAgeyBmb250LXNpemU6IDEwMCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBjb2xvcjojMDAwMDAwIH0KLS5GcmFtZUhlYWRpbmdGb250IHsgZm9udC1zaXplOiAgOTAlOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgY29sb3I6IzAwMDAwMCB9Ci0uRnJhbWVJdGVtRm9udCAgICB7IGZvbnQtc2l6ZTogIDkwJTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGNvbG9yOiMwMDAwMDAgfQotCi0vKiBOYXZpZ2F0aW9uIGJhciBmb250cyBhbmQgY29sb3JzICovCi0uTmF2QmFyQ2VsbDEgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiNFRUVFRkY7IGNvbG9yOiMwMDAwMDB9IC8qIExpZ2h0IG1hdXZlICovCi0uTmF2QmFyQ2VsbDFSZXYgeyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwOEI7IGNvbG9yOiNGRkZGRkZ9IC8qIERhcmsgQmx1ZSAqLwotLk5hdkJhckZvbnQxICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiMwMDAwMDA7Y29sb3I6IzAwMDAwMDt9Ci0uTmF2QmFyRm9udDFSZXYgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgY29sb3I6I0ZGRkZGRjtjb2xvcjojRkZGRkZGO30KLQotLk5hdkJhckNlbGwyICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsgY29sb3I6IzAwMDAwMH0KLS5OYXZCYXJDZWxsMyAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7IGNvbG9yOiMwMDAwMDB9Ci0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy9pbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDRlMTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotICAgIAk8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRSQU5TSVRJT05BTC8vRU4iPgotCQk8aHRtbCB4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0JCTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBPcmFjbGUgQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA4LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0KLSAgIAkJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICAJCTx0aXRsZT5WYWxpZGF0aW9uIEZyYW1ld29yayBFeHRlbnNpb24gUG9pbnRzPC90aXRsZT4KLQkJPExJTksgUkVMPSJTVFlMRVNIRUVUIiBIUkVGPSIuLi8uLi9ib29rLmNzcyIgQ0hBUlNFVD0iSVNPLTg4NTktMSIgVFlQRT0idGV4dC9jc3MiPgotCQk8L2hlYWQ+Ci08Ym9keSBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzgwMDA4MCI+Ci08Y2VudGVyPgotPGgxPlZhbGlkYXRpb24gRnJhbWV3b3JrIEV4dGVuc2lvbiBQb2ludHMgPC9oMT4KLTwvY2VudGVyPlRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIHBvaW50cyBjYW4gYmUgdXNlZCB0byBhZGQgbmV3IHZhbGlkYXRvcnM6IDxoMz4KLTxhIG5hbWU9InZmIj48L2E+VmFsaWRhdGlvbiBGcmFtZXdvcms8L2gzPgotPHVsPgotPGxpPgotPGEgaHJlZj0idmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yR3JvdXAuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yR3JvdXA8L2E+Ci08L2xpPgotPGxpPgotPGEgaHJlZj0idmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yVjIuaHRtbCI+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjI8L2E+Ci08L2xpPgotPC91bD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl9leGNsdWRlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fZXhjbHVkZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTI3MWY4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl9leGNsdWRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+VmFsaWRhdG9yIEV4Y2x1c2lvbjwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+VmFsaWRhdG9yIEV4Y2x1c2lvbjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmV4Y2x1ZGU8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj5XZWJUb29scyAzLjAKLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+QSB3YXkgdG8gYWRkIGFkZGl0aW9uYWwgZXhjbHVzaW9uIGZpbHRlcnMgdG8gYSBWMiB2YWxpZGF0b3IuPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS52YWxpZGF0b3IiPnZhbGlkYXRvcjwvYT4rKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIEEgc2hvcnQgaWQgdGhhdCBpcyB1bmlxdWUgd2l0aGluIHRoZSBwbHVnLWluLCBzbyB0aGF0IHRoaXMgc2V0IG9mIGV4dHJhIGV4Y2x1c2lvbiBmaWx0ZXJzIGNhbiBiZSBpZGVudGlmaWVkLjwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBUaGUgc2hvcnQgdXNlciBmcmllbmRseSBuYW1lIGZvciB0aGUgZXhjbHVzaW9uLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUudmFsaWRhdG9yIj52YWxpZGF0b3I8L2E+ICg8YSBocmVmPSIjZS5leGNsdWRlIj5leGNsdWRlPC9hPikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgdmFsaWRhdG9yPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDtJRFJFRiAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLUlkZW50aWZpZXMgdGhlIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIGV4dGVuZGVkLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFRoZSBmdWxseSBxdWFsaWZlZCB2YWxpZGF0b3IgaWQgdGhhdCBpcyBiZWluZyBleHRlbmRlZC48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4Y2x1ZGUiPmV4Y2x1ZGU8L2E+ICg8YSBocmVmPSIjZS5ydWxlcyI+cnVsZXM8L2E+KSZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBjb250YWlucyBhIHNldCBvZiBleGNsdXNpb24gcnVsZXMsIHVzZWQgaW4gZmlsdGVyaW5nIHdoaWNoIHJlc291cmNlcyBnZXQgdmFsaWRhdGVkLiBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgYXJlIG1hdGNoZWQsIHRoZW4gdGhlIHZhbGlkYXRvciBpcyBub3QgY2FsbGVkIG9uIHRoaXMgcmVzb3VyY2UuPC9wPgotPGJyPjxicj4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZmlsZWV4dCI+ZmlsZWV4dDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZmlsZWV4dDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmV4dCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNhc2VTZW5zaXRpdmUmbmJzcDsodHJ1ZSB8IGZhbHNlKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLUEgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlIGh0bWwuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+ZXh0PC9iPiAtIFRoZSBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUgaHRtbC48L2xpPgotPGxpPjxiPmNhc2VTZW5zaXRpdmU8L2I+IC0gSWYgdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIGNhc2Ugc2Vuc2l0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5wcm9qZWN0TmF0dXJlIj5wcm9qZWN0TmF0dXJlPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBwcm9qZWN0TmF0dXJlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVVzZWQgdG8gZmlsdGVyIG9uIHByb2plY3QgbmF0dXJlcy48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBUaGUgZnVsbHkgcXVhbGlmaWVkIHByb2plY3QgbmF0dXJlIGlkLCBmb3IgZXhhbXBsZSAib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5maWxlIj5maWxlPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBmaWxlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNhc2VTZW5zaXRpdmUmbmJzcDsodHJ1ZSB8IGZhbHNlKSA8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij50eXBlJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KGZvbGRlcnxmaWxlfGZ1bGwpICZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBmaWxlIG9yIGZvbGRlciBuYW1lLiBUaGUgZmlsZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQsIHRoYXQgaXMgaXQgc3RhcnRzIHdpdGggYSBsZWFkaW5nIHNsYXNoICgiLyIpLCBvciBpdCBjYW4gYmUgYSByZWxhdGl2ZSBuYW1lLiBGb2xkZXIgbmFtZXMgYXJlIHNlcGFyYXRlZCB3aXRoIHRoZSBmb3J3YXJkIHNsYXNoICgiLyIpIGNoYXJhY3Rlci48L2xpPgotPGxpPjxiPmNhc2VTZW5zaXRpdmU8L2I+IC0gSWYgdGhlIGZpbGUgbmFtZSBpcyBub3QgY2FzZSBzZW5zdGl0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIGZhbHNlLjwvbGk+Ci08bGk+PGI+dHlwZTwvYj4gLSBUeXBlIG9mIG5hbWUsIHRoZXJlIGFyZSB0aHJlZSBjaG9pY2VzLiA8dWw+PGxpPmZvbGRlciAtIHNwZWNpZmllcyBhIHByb2plY3QgcmVsYXRpdmUgZm9sZGVyIG5hbWUuPC9saT48bGk+ZmlsZSAtIGEgc2ltcGxlIGZpbGUgbmFtZSAoaS5lLiBubyBwYXRoIGluZm9ybWF0aW9uKS48L2xpPjxsaT5mdWxsIC0gYSBmdWxseSBxdWFsaWZpZWQgKHByb2plY3QgcmVsYXRpdmUpIGZpbGUgbmFtZS48L2xpPjwvdWw+PC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5ydWxlcyI+cnVsZXM8L2E+ICg8YSBocmVmPSIjZS5maWxlZXh0Ij5maWxlZXh0PC9hPiogLCA8YSBocmVmPSIjZS5maWxlIj5maWxlPC9hPiogLCA8YSBocmVmPSIjZS5wcm9qZWN0TmF0dXJlIj5wcm9qZWN0TmF0dXJlPC9hPiogLCA8YSBocmVmPSIjZS5mYWNldCI+ZmFjZXQ8L2E+KiAsIDxhIGhyZWY9IiNlLmNvbnRlbnRUeXBlIj5jb250ZW50VHlwZTwvYT4qICwgPGEgaHJlZj0iI2UucGF0dGVybiI+cGF0dGVybjwvYT4qKSZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotQSBzZXQgb2YgcnVsZXMgZm9yIGRldGVybWluaW5nIGlmIGEgcmVzb3VyY2UgaXMgcGFzc2VkIHRvIHRoaXMgdmFsaWRhdG9yIG9yIG5vdC4gVGhlIHJ1bGVzIGFyZSBPUidlZCB0b2dldGhlci48L3A+Ci08YnI+PGJyPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5mYWNldCI+ZmFjZXQ8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGZhY2V0PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gVGhlIGZhY2V0IGlkLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuY29udGVudFR5cGUiPmNvbnRlbnRUeXBlPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBjb250ZW50VHlwZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+ZXhhY3RNYXRjaCZuYnNwOyh0cnVlIHwgZmFsc2UpICZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVXNlZCB0byBmaWx0ZXIgYmFzZWQgb24gY29udGVudCB0eXBlcy48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBUaGUgY29udGVudCB0eXBlIGlkLjwvbGk+Ci08bGk+PGI+ZXhhY3RNYXRjaDwvYj4gLSBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29udGVudCB0eXBlIG5lZWRzIHRvIG1hdGNoIGV4YWN0bHkuIFNldCB0byBmYWxzZSBpZiBzdWIgdHlwZXMgYXJlIGNvbnNpZGVyZWQgbWF0Y2hlcyBhcyB3ZWxsLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucGF0dGVybiI+cGF0dGVybjwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcGF0dGVybjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnJlZ2V4Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2FzZVNlbnNpdGl2ZSZuYnNwOyh0cnVlIHwgZmFsc2UpICZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotSG9sZHMgYSByZWd1YWxyIGV4cHJlc3Npb24sIHRoYXQgbWF0Y2hlcyB0aGUgcmVzb3VyY2UncyBwcm9qZWN0IHJlbGF0aXZlIG5hbWUuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+cmVnZXg8L2I+IC0gSG9sZHMgYSBKYXZhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gU2VlIHRoZSBjbGFzcyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkIGFnYWluc3QgYSByZXNvdXJjZSdzIHByb2plY3QgcmVsYXRpdmUgcGF0aCwgYWZ0ZXIgdGhhdCBwYXRoIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgcG9ydGFibGUgcGF0aC4KLTxwPlRoZSBwYXRoIHdpbGwgYWx3YXlzIHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoICgvKSBzbyB0aGF0IGZvbGRlciBuYW1lcyBjYW4gYmUgbW9yZSBlYXNpbHkgbWF0Y2hlZC48L2xpPgotPGxpPjxiPmNhc2VTZW5zaXRpdmU8L2I+IC0gSWYgdGhlIGZpbGUgbmFtZSBpcyBub3QgY2FzZSBzZW5zdGl0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIGZhbHNlLjwvbGk+Ci08L3VsPgotPGJyPjxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkV4YW1wbGVzOiA8L2g2PjwhLS0gQSBwbHVnLWluIGlzIHR1cm5pbmcgb2ZmIHRoZSBUMUEgdmFsaWRhdG9yIGZvciBwcm9qZWN0cyB0aGF0IGhhdmUgdGhlIE1vZHVsZUNvcmVOYXR1cmUgLS0+Ci0gPGV4dGVuc2lvbgotICAgICAgIGlkPSJleGNsdWRlMSIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhjbHVkZSI+Ci0gICAgPHZhbGlkYXRvcgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uVDFBIj4KLSAgICAgICA8ZXhjbHVkZT4KLSAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgPHByb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICAgICAgPC9wcm9qZWN0TmF0dXJlPgotICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgPC9leGNsdWRlPgotICAgIDwvdmFsaWRhdG9yPgotIDwvZXh0ZW5zaW9uPgotPHA+PC9wPgotCi08YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmEzOTUwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl9yZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlJlZmVyZW5jaWFsIEZpbGUgVmFsaWRhdG9yPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5SZWZlcmVuY2lhbCBGaWxlIFZhbGlkYXRvcjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PjxiPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPC9iPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIGZvciByZWZlcmVudGlhbCBmaWxlIHZhbGlkYXRpb24uIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHNob3VsZCBiZSBleHRlbmRlZCBpZiB5b3UgaGF2ZSBmaWxlcyB0aGF0IHJlZmVyZW5jZSBvdGhlciBmaWxlcyBhbmQgd291bGQgbGlrZSB0aGUgdmFsaWRhdGlvbiBvbiByZWZlcmVuY2VkIGZpbGVzIHRvIHJ1biB3aGVuIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSByZWZlcmVuY2luZyBmaWxlIGlzIHJ1bi4gVGhlIFBvc3QgVmFsaWRhdG9yIG9wZXJhdGlvbiB0aGF0IGlzIHVzZWQgYnkgdGhpcyBleHRlbnNpb24gcG9pbnQgZXhwZWN0cyBhIGZsYXQgbGlzdCBvZiBmaWxlcyB0byBydW4gdmFsaWRhdGlvbiBvbiByZWZlcmVuY2VkIGZpbGVzLjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UucmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIj5yZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3I8L2E+KSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+cG9pbnQ8L2I+IC0gYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludDwvbGk+Ci08bGk+PGI+aWQ8L2I+IC0gYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTxsaT48Yj5uYW1lPC9iPiAtIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIj5yZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3I8L2E+ICg8YSBocmVmPSIjZS5ydW4iPnJ1bjwvYT4pJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIDwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucnVuIj5ydW48L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHJ1bjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmNsYXNzPC9iPiAtIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IuPC9saT4KLTwvdWw+Ci08YnI+PGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRpb25IZWxwZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0aW9uSGVscGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmZkOTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRpb25IZWxwZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlZhbGlkYXRpb24gSGVscGVyPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5WYWxpZGF0aW9uIEhlbHBlcjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25IZWxwZXI8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj48Yj5UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLjwvYj4KLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+PHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9oNj4KLTxwPjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS52YWxpZGF0aW9uSGVscGVyIj52YWxpZGF0aW9uSGVscGVyPC9hPikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnBvaW50PC9iPiAtIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQ8L2xpPgotPGxpPjxiPmlkPC9iPiAtIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnZhbGlkYXRpb25IZWxwZXIiPnZhbGlkYXRpb25IZWxwZXI8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHZhbGlkYXRpb25IZWxwZXI8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5oZWxwZXJDbGFzcyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmhlbHBlckNsYXNzPC9iPiAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JUHJvamVjdFZhbGlkYXRpb25IZWxwZXIuPC9saT4KLTxsaT48Yj5pZDwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48YnI+Ci08cCBjbGFzcz0ibm90ZSBTY2hlbWFDb3B5cmlnaHQiPgotQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvcmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGJlYzk5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+VmFsaWRhdGlvbiBTZWxlY3Rpb24gSGFuZGxlcjwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9ib29rLmNzcyIpOzwvc3R5bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBpbXBvcnQgdXJsKCIuLi8uLi9zY2hlbWEuY3NzIik7PC9zdHlsZT4KLTwvSEVBRD4KLTxCT0RZPgotPEgxIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+VmFsaWRhdGlvbiBTZWxlY3Rpb24gSGFuZGxlcjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+U2luY2U6IDwvaDY+PGI+VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy48L2I+Ci08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UudmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIiPnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyPC9hPispJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnBvaW50Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5wb2ludDwvYj4gLSBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50PC9saT4KLTxsaT48Yj5pZDwvYj4gLSBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS52YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciI+dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5oYW5kbGVyQ2xhc3MmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5zZWxlY3Rpb25UeXBlJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIDwvbGk+Ci08bGk+PGI+aGFuZGxlckNsYXNzPC9iPiAtIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIGludGVyZmFjZS48L2xpPgotPGxpPjxiPnNlbGVjdGlvblR5cGU8L2I+IC0gPC9saT4KLTwvdWw+Ci08YnI+PGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDEzYzFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5WYWxpZGF0b3I8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPlZhbGlkYXRvcjwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvcjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPlNpbmNlOiA8L2g2PjxiPlRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPC9iPgotPHA+PC9wPgotCi08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5EZXNjcmlwdGlvbjogPC9oNj5UaGlzIGV4dGVuc2lvbiBwb2ludCBnaXZlIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBhIG5ldyB2YWxpZGF0b3IgdGhhdCBjYW4gdmFsaWRhdGUgcmVzb3VyY2VzIGluIGEgSmF2YSBQcm9qZWN0LiBUaGUgdmFsaWRhdG9yIG5lZWRzIHRvIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gbmF0dXJlIG9mIHRoZSBwcm9qZWN0IGZvciBpdCB0byBydW4gb24gdGhhdCBwcm9qZWN0LiBUaGUgdXNlciBjYW4gc3BlY2lmaXkgZmlsZSBmaWx0ZXJzIHRvIGZpbHRlciBvdXQgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkYXRlZC4gVGhlIG5ldyB2YWxpZGF0b3IgcmVnaXN0ZXJlZCBieSB0aGUgcHJvamVjdCBuYXR1cmUgb24gdGhlIHByb2plY3QgY2FuIGJlIHJ1biBtYW51YWxseSBvciBpbmNyZW1lbnRhbGx5IGlmICBBdXRvIEJ1aWxkIGlzIHR1cm5lZCBvbiwgZHVyaW5nIGluY3JlbWVudGFsIGJ1aWxkcyB0aGUgY2hhbmdlZCBkZWx0YSBvZiBmaWxlcyBhcmUgb25seSB2YWxpZGF0ZWQgaWYgdGhvc2UgZmlsZXMgYXJlIHBhcnQgb2YgdGhlIHZhbGlkYXRpb24gZmlsdGVycyBzcGVjaWZpZWQuPHA+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2g2PgotPHA+PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLnZhbGlkYXRvciI+dmFsaWRhdG9yPC9hPikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+cG9pbnQ8L2I+IC0gQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludDwvbGk+Ci08bGk+PGI+aWQ8L2I+IC0gQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTxsaT48Yj5uYW1lPC9iPiAtIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUudmFsaWRhdG9yIj52YWxpZGF0b3I8L2E+ICg8YSBocmVmPSIjZS5wcm9qZWN0TmF0dXJlIj5wcm9qZWN0TmF0dXJlPC9hPiogLCA8YSBocmVmPSIjZS5maWx0ZXIiPmZpbHRlcjwvYT4qICwgPGEgaHJlZj0iI2UuZW5hYmxlbWVudCI+ZW5hYmxlbWVudDwvYT4qICwgPGEgaHJlZj0iI2UuaGVscGVyIj5oZWxwZXI8L2E+ICwgPGEgaHJlZj0iI2UuZGVwZW5kZW50VmFsaWRhdG9yIj5kZXBlbmRlbnRWYWxpZGF0b3I8L2E+PyAsIDxhIGhyZWY9IiNlLnJ1biI+cnVuPC9hPiAsIDxhIGhyZWY9IiNlLm1hcmtlcklkIj5tYXJrZXJJZDwvYT4/ICwgPGEgaHJlZj0iI2UuZmFjZXQiPmZhY2V0PC9hPiogLCA8YSBocmVmPSIjZS5jb250ZW50VHlwZUJpbmRpbmciPmNvbnRlbnRUeXBlQmluZGluZzwvYT4qKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCB2YWxpZGF0b3I8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij50byZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+ZnJvbSZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnRvPC9iPiAtIE9wdGlvbmFsIG1pZ3JhdGlvbiB0YWc8L2xpPgotPGxpPjxiPmZyb208L2I+IC0gT3B0aW9uYWwgbWlncmF0aW9uIHRhZzwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucHJvamVjdE5hdHVyZSI+cHJvamVjdE5hdHVyZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcHJvamVjdE5hdHVyZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aW5jbHVkZSZuYnNwOyh0cnVlIHwgZmFsc2UpICZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSA8L2xpPgotPGxpPjxiPmluY2x1ZGU8L2I+IC0gPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5jb250ZW50VHlwZUJpbmRpbmciPmNvbnRlbnRUeXBlQmluZGluZzwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgY29udGVudFR5cGVCaW5kaW5nPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y29udGVudFR5cGVJZCZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotQXNzb2NpYXRlcyBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlIHdpdGggdGhlIGN1cnJlbnQgdmFsaWRhdG9yLCBhbmQgZW5hYmxlcyB0aGUgdmFsaWRhdG9yIHRvIGJlIHJ1biBvbiByZXNvdXJjZXMgb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+Y29udGVudFR5cGVJZDwvYj4gLSBUaGUgY29udGVudCB0eXBlIGlkZW50aWZpZXIuIFRoaXMgaXMgYW4gSUQgZGVmaW5lZCBieSB0aGUgJ29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMnIGV4dGVuc2lvbiBwb2ludC48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmZpbHRlciI+ZmlsdGVyPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBmaWx0ZXI8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5vYmplY3RDbGFzcyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWVGaWx0ZXImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jYXNlU2Vuc2l0aXZlJm5ic3A7KHRydWUgfCBmYWxzZSkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+YWN0aW9uJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+b2JqZWN0Q2xhc3M8L2I+IC0gPC9saT4KLTxsaT48Yj5uYW1lRmlsdGVyPC9iPiAtIDwvbGk+Ci08bGk+PGI+Y2FzZVNlbnNpdGl2ZTwvYj4gLSA8L2xpPgotPGxpPjxiPmFjdGlvbjwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmhlbHBlciI+aGVscGVyPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBoZWxwZXI8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jbGFzcyZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5jbGFzczwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmRlcGVuZGVudFZhbGlkYXRvciI+ZGVwZW5kZW50VmFsaWRhdG9yPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBkZXBlbmRlbnRWYWxpZGF0b3I8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5kZXBWYWxWYWx1ZSZuYnNwOyh0cnVlIHwgZmFsc2UpICZndDs8L3A+Ci08cD48L3A+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5kZXBWYWxWYWx1ZTwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnJ1biI+cnVuPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBydW48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jbGFzcyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmluY3JlbWVudGFsJm5ic3A7KHRydWUgfCBmYWxzZSkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+ZW5hYmxlZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyh0cnVlIHwgZmFsc2UpIDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmZ1bGxCdWlsZCZuYnNwOyZuYnNwOyZuYnNwOyh0cnVlIHwgZmFsc2UpIDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmFzeW5jJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmNsYXNzPC9iPiAtIDwvbGk+Ci08bGk+PGI+aW5jcmVtZW50YWw8L2I+IC0gPC9saT4KLTxsaT48Yj5lbmFibGVkPC9iPiAtIDwvbGk+Ci08bGk+PGI+ZnVsbEJ1aWxkPC9iPiAtIDwvbGk+Ci08bGk+PGI+YXN5bmM8L2I+IC0gPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5tYXJrZXJJZCI+bWFya2VySWQ8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIG1hcmtlcklkPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bWFya2VySWRWYWx1ZSZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGUgbWFya2VySWQgZWxlbWVudCBpcyBpcyB1c2VkIHRvIGdldCBhIGN1c3RvbSBwcm9ibGVtIG1hcmtlciBmb3IgdGhlIGN1c3RvbSB2YWxpZGF0b3IgaW1wbGVtZW50ZWQgdXNpbmcgdGhpcyBleHRlbnNpb24gcG9pbnQKLQotVGhpcyBtYXJrZXJJZCBlbGVtZW50IGFsc28gbmVlZHMgYSBjb3JyZXNwb25kaW5nIHByb2JsZW1NYXJrZXIgZXh0ZW5zaW9uIHRvIGJlIGRlZmluZWQgYnl0aGlzIHZhbGlkYXRvciB3aXRoIHRoZSBzYW1lIElkIGFzIHRoZSBtYWtlcklkVmFsdWUgZm9yIHRoZSB2YWxpZGF0b3IgdG8gaGF2ZSBpdHMgb3duIG1hcmtlciB0eXBlLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGEgcHJvYmxlbU1hcmtlciBleHRlbnNpb24gZGVmaW5lZCBmb3IgYSBtYXJrZXJJZFZhbHVlICJGb29NYXJrZXIiCi0KLSA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iRm9vTWFya2VyIgotICAgICAgICAgbmFtZT0iJUVKQl9WQUxJREFUSU9OX1BST0JMRU1NQVJLRVJfTkFNRSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im93bmVyIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmFsaWRhdGlvblNldmVyaXR5Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idGFyZ2V0T2JqZWN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iZ3JvdXBOYW1lIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWVzc2FnZUlkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIFdpdGhvdXQgYSBwcm9ibGVtTWFya2VyIGV4dGVuc2lvbiBkZWZpbmVkLCB0aGUgY3VzdG9tZXIgdmFsaWRhdG9yIHdpbGwgdXNlIHRoZSBiYXNlIFZhbGlkYXRpb24gTWVzc2FnZSBwcm9ibGVtTWFya2VyIHR5cGUuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+bWFya2VySWRWYWx1ZTwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48ZGl2IHN0eWxlPSJjb2xvcjogcmVkOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5UaGUgPGI+ZmFjZXQ8L2I+IGVsZW1lbnQgaXMgZGVwcmVjYXRlZDwvZGl2PiA8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmZhY2V0Ij5mYWNldDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZmFjZXQ8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5mYWNldElkJm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBpcyBkZXByZWNhdGVkIGFuZCBlbmFibGVtZW50IGlzIHRoZSBuZXcgcmVjb21tZW5kZWQgYXBwcm9hY2ggdG8gZmlsdGVyIHZhbGlkYXRvcnMgYmFzZWQgb24gZmFjZXRzLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmZhY2V0SWQ8L2I+IC0gPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5lbmFibGVtZW50Ij5lbmFibGVtZW50PC9hPiAoPGEgaHJlZj0iI2Uubm90Ij5ub3Q8L2E+ICwgPGEgaHJlZj0iI2UuYW5kIj5hbmQ8L2E+ICwgPGEgaHJlZj0iI2Uub3IiPm9yPC9hPiAsIDxhIGhyZWY9IiNlLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2E+ICwgPGEgaHJlZj0iI2UudGVzdCI+dGVzdDwvYT4gLCA8YSBocmVmPSIjZS5zeXN0ZW1UZXN0Ij5zeXN0ZW1UZXN0PC9hPiAsIDxhIGhyZWY9IiNlLmVxdWFscyI+ZXF1YWxzPC9hPiAsIDxhIGhyZWY9IiNlLmNvdW50Ij5jb3VudDwvYT4gLCA8YSBocmVmPSIjZS53aXRoIj53aXRoPC9hPiAsIDxhIGhyZWY9IiNlLnJlc29sdmUiPnJlc29sdmU8L2E+ICwgPGEgaHJlZj0iI2UuYWRhcHQiPmFkYXB0PC9hPiAsIDxhIGhyZWY9IiNlLml0ZXJhdGUiPml0ZXJhdGU8L2E+ICwgPGEgaHJlZj0iI2UucmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+KSomZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLUEgZ2VuZXJpYyByb290IGVsZW1lbnQuIFRoZSBlbGVtZW50IGNhbiBiZSB1c2VkIGluc2lkZSBhbiBleHRlbnNpb24gcG9pbnQgdG8gZGVmaW5lIGl0cyBlbmFibGVtZW50IGV4cHJlc3Npb24uCi0gICAgICAgICAgICBUaGUgY2hpbGRyZW4gb2YgYW4gZW5hYmxlbWVudCBleHByZXNzaW9uIGFyZSBjb21iaW5lZCB1c2luZyB0aGUgYW5kIG9wZXJhdG9yLjwvcD4KLTxicj48YnI+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLm5vdCI+bm90PC9hPiAoPGEgaHJlZj0iI2Uubm90Ij5ub3Q8L2E+IHwgPGEgaHJlZj0iI2UuYW5kIj5hbmQ8L2E+IHwgPGEgaHJlZj0iI2Uub3IiPm9yPC9hPiB8IDxhIGhyZWY9IiNlLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2E+IHwgPGEgaHJlZj0iI2UudGVzdCI+dGVzdDwvYT4gfCA8YSBocmVmPSIjZS5zeXN0ZW1UZXN0Ij5zeXN0ZW1UZXN0PC9hPiB8IDxhIGhyZWY9IiNlLmVxdWFscyI+ZXF1YWxzPC9hPiB8IDxhIGhyZWY9IiNlLmNvdW50Ij5jb3VudDwvYT4gfCA8YSBocmVmPSIjZS53aXRoIj53aXRoPC9hPiB8IDxhIGhyZWY9IiNlLnJlc29sdmUiPnJlc29sdmU8L2E+IHwgPGEgaHJlZj0iI2UuYWRhcHQiPmFkYXB0PC9hPiB8IDxhIGhyZWY9IiNlLml0ZXJhdGUiPml0ZXJhdGU8L2E+IHwgPGEgaHJlZj0iI2UucmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+KSZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IHJlcHJlc2VudCBhIE5PVCBvcGVyYXRpb24gb24gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIGl0J3Mgc3ViLWVsZW1lbnQgZXhwcmVzc2lvbi48L3A+Ci08YnI+PGJyPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5hbmQiPmFuZDwvYT4gKDxhIGhyZWY9IiNlLm5vdCI+bm90PC9hPiAsIDxhIGhyZWY9IiNlLmFuZCI+YW5kPC9hPiAsIDxhIGhyZWY9IiNlLm9yIj5vcjwvYT4gLCA8YSBocmVmPSIjZS5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPiAsIDxhIGhyZWY9IiNlLnRlc3QiPnRlc3Q8L2E+ICwgPGEgaHJlZj0iI2Uuc3lzdGVtVGVzdCI+c3lzdGVtVGVzdDwvYT4gLCA8YSBocmVmPSIjZS5lcXVhbHMiPmVxdWFsczwvYT4gLCA8YSBocmVmPSIjZS5jb3VudCI+Y291bnQ8L2E+ICwgPGEgaHJlZj0iI2Uud2l0aCI+d2l0aDwvYT4gLCA8YSBocmVmPSIjZS5yZXNvbHZlIj5yZXNvbHZlPC9hPiAsIDxhIGhyZWY9IiNlLmFkYXB0Ij5hZGFwdDwvYT4gLCA8YSBocmVmPSIjZS5pdGVyYXRlIj5pdGVyYXRlPC9hPiAsIDxhIGhyZWY9IiNlLnJlZmVyZW5jZSI+cmVmZXJlbmNlPC9hPikqJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgcmVwcmVzZW50IGFuIEFORCBvcGVyYXRpb24gb24gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIGFsbCBpdCdzIHN1Yi1lbGVtZW50cyBleHByZXNzaW9ucy48L3A+Ci08YnI+PGJyPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5vciI+b3I8L2E+ICg8YSBocmVmPSIjZS5ub3QiPm5vdDwvYT4gLCA8YSBocmVmPSIjZS5hbmQiPmFuZDwvYT4gLCA8YSBocmVmPSIjZS5vciI+b3I8L2E+ICwgPGEgaHJlZj0iI2UuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT4gLCA8YSBocmVmPSIjZS50ZXN0Ij50ZXN0PC9hPiAsIDxhIGhyZWY9IiNlLnN5c3RlbVRlc3QiPnN5c3RlbVRlc3Q8L2E+ICwgPGEgaHJlZj0iI2UuZXF1YWxzIj5lcXVhbHM8L2E+ICwgPGEgaHJlZj0iI2UuY291bnQiPmNvdW50PC9hPiAsIDxhIGhyZWY9IiNlLndpdGgiPndpdGg8L2E+ICwgPGEgaHJlZj0iI2UucmVzb2x2ZSI+cmVzb2x2ZTwvYT4gLCA8YSBocmVmPSIjZS5hZGFwdCI+YWRhcHQ8L2E+ICwgPGEgaHJlZj0iI2UuaXRlcmF0ZSI+aXRlcmF0ZTwvYT4gLCA8YSBocmVmPSIjZS5yZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT4pKiZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IHJlcHJlc2VudCBhbiAgT1Igb3BlcmF0aW9uIG9uIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyBhbGwgaXQncyBzdWItZWxlbWVudCBleHByZXNzaW9ucy48L3A+Ci08YnI+PGJyPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBpbnN0YW5jZW9mPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dmFsdWUmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIHBlcmZvcm0gYW4gaW5zdGFuY2VvZiBjaGVjayBvZiB0aGUgb2JqZWN0IGluIGZvY3VzLiBUaGUgZXhwcmVzc2lvbiByZXR1cm5zCi0gICAgICAgICAgICBFdmFsdWF0aW9uUmVzdWx0LlRSVUUgaWYgdGhlIG9iamVjdCdzIHR5cGUgaXMgYSBzdWIgdHlwZSBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICAgIE90aGVyd2lzZSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFIGlzIHJldHVybmVkLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnZhbHVlPC9iPiAtIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBvciBpbnRlcmZhY2UuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS50ZXN0Ij50ZXN0PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCB0ZXN0PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cHJvcGVydHkmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5hcmdzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52YWx1ZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Zm9yY2VQbHVnaW5BY3RpdmF0aW9uJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBldmFsdWF0ZSB0aGUgcHJvcGVydHkgc3RhdGUgb2YgdGhlIG9iamVjdCBpbiBmb2N1cy4gVGhlIHNldCBvZgotICAgICAgICAgICAgdGVzdGFibGUgcHJvcGVydGllcyBjYW4gYmUgZXh0ZW5kZWQgdXNpbmcgdGhlIHByb3BlcnkgdGVzdGVyIGV4dGVuc2lvbiBwb2ludC4gVGhlIHRlc3QKLSAgICAgICAgICAgIGV4cHJlc3Npb24gcmV0dXJucyBFdmFsdWF0aW9uUmVzdWx0Lk5PVF9MT0FERUQgaWYgdGhlIHByb3BlcnR5IHRlc3RlciBkb2luZyB0aGUgYWN0dWFsCi0gICAgICAgICAgICB0ZXN0aW5nIGlzbid0IGxvYWRlZCB5ZXQgYW5kIHRoZSBhdHRyaWJ1dGUgZm9yY2VQbHVnaW5BY3RpdmF0aW9uIGlzIHNldCB0byBmYWxzZS4gCi0gICAgICAgICAgICBJZiBmb3JjZVBsdWdpbkFjdGl2YXRpb24gaXMgc2V0IHRvIHRydWUgYW5kIHRoZSBldmFsdWF0aW9uIGNvbnRleHQgdXNlZCB0byBldmFsdWF0ZQotICAgICAgICAgICAgdGhpcyBleHByZXNzaW9uIHN1cHBvcnQgcGx1Zy1pbiBhY3RpdmF0aW9uIHRoZW4gZXZhbHVhdGluZyB0aGUgcHJvcGVydHkgd2lsbCByZXN1bHQgaW4gCi0gICAgICAgICAgICBhY3RpdmF0aW5nIHRoZSBwbHVnLWluIGRlZmluaW5nIHRoZSB0ZXN0ZXIuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+cHJvcGVydHk8L2I+IC0gdGhlIG5hbWUgb2YgYW4gb2JqZWN0J3MgcHJvcGVydHkgdG8gdGVzdC48L2xpPgotPGxpPjxiPmFyZ3M8L2I+IC0gYWRkaXRpb25hbCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBwcm9wZXJ0eSB0ZXN0ZXIuIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgc2VwZXJhdGVkCi0gICAgICAgICAgICAgICAgICBieSBjb21tYXMuIEVhY2ggaW5kaXZpZHVhbCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgaW50byBhIEphdmEgYmFzZSB0eXBlIHVzaW5nIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICBydWxlcyBhcyBkZWZpbmVkIGZvciB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoZSB0ZXN0IGV4cHJlc3Npb24uPC9saT4KLTxsaT48Yj52YWx1ZTwvYj4gLSB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LiBDYW4gYmUgb21pdHRlZCBpZiB0aGUgcHJvcGVydHkgCi0gICAgICAgICAgICAgICAgICBpcyBhIGJvb2xlYW4gcHJvcGVydHkuIFRoZSB0ZXN0IGV4cHJlc3Npb24gaXMgc3VwcG9zZWQgdG8gcmV0dXJuIAotRXZhbHVhdGlvblJlc3VsdC5UUlVFIGlmIHRoZSBwcm9wZXJ0eSBtYXRjaGVzIHRoZSB2YWx1ZSBhbmQgRXZhbHVhdGlvblJlc3VsdC5GQUxTRQotb3RoZXJ3aXNlLiBUaGUgdmFsdWUgYXR0cmlidXRlIGlzIGNvbnZlcnRlZCBpbnRvIGEgSmF2YSBiYXNlIHR5cGUgdXNpbmcgdGhlIGZvbGxvd2luZwotcnVsZXM6Ci08dWw+Ci0gPGxpPnRoZSBzdHJpbmcgJnF1b3Q7dHJ1ZSZxdW90OyBpcyBjb252ZXJ0ZWQgaW50byBCb29sZWFuLlRSVUU8L2xpPgotIDxsaT50aGUgc3RyaW5nICZxdW90O2ZhbHNlJnF1b3Q7IGlzIGNvbnZlcnRlZCBpbnRvIEJvb2xlYW4uRkFMU0U8L2xpPgotIDxsaT5pZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgZG90IHRoZW4gdGhlIGludGVycHJldGVyIHRyaWVzIHRvIGNvbnZlcnQKLSB0aGUgdmFsdWUgaW50byBhIEZsb2F0IG9iamVjdC4gSWYgdGhpcyBmYWlscyB0aGUgc3RyaW5nIGlzIHRyZWF0ZWQgYXMgYQotIGphdmEubGFuZy5TdHJpbmc8L2xpPgotIDxsaT5pZiB0aGUgc3RyaW5nIG9ubHkgY29uc2lzdHMgb2YgbnVtYmVycyB0aGVuIHRoZSBpbnRlcnByZXRlcgotIGNvbnZlcnRzIHRoZSB2YWx1ZSBpbiBhbiBJbnRlZ2VyIG9iamVjdC48L2xpPgotIDxsaT5pbiBhbGwgb3RoZXIgY2FzZXMgdGhlIHN0cmluZyBpcyB0cmVhdGVkIGFzIGEgamF2YS5sYW5nLlN0cmluZzwvbGk+Ci0gPGxpPnRoZSBjb252ZXJzaW9uIG9mIHRoZSBzdHJpbmcgaW50byBhIEJvb2xlYW4sIEZsb2F0LCBvciBJbnRlZ2VyIGNhbgotIGJlIHN1cHByZXNzZWQgYnkgc3Vycm91bmRpbmcgdGhlIHN0cmluZyB3aXRoIHNpbmdsZSBxdW90ZXMuIEZvcgotIGV4YW1wbGUsIHRoZSBhdHRyaWJ1dGUgdmFsdWU9JnF1b3Q7J3RydWUnJnF1b3Q7IGlzIGNvbnZlcnRlZCBpbnRvIHRoZQotIHN0cmluZyAmcXVvdDt0cnVlJnF1b3Q7PC9saT4KLTwvdWw+PC9saT4KLTxsaT48Yj5mb3JjZVBsdWdpbkFjdGl2YXRpb248L2I+IC0gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGx1Zy1pbiBjb250cmlidXRpbmcgdGhlIHByb3BlcnR5IHRlc3RlcgotICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGxvYWRlZCBpZiBuZWNlc3NhcnkuIEFzIHN1Y2gsIHRoaXMgZmxhZyBzaG91bGQgYmUgdXNlZCBqdWRpY2lvdXNseSwgCi0gICAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBhdm9pZCB1bm5lY2Vzc2FyeSBwbHVnLWluIGFjdGl2YXRpb25zLiBNb3N0IGNsaWVudHMgc2hvdWxkIGF2b2lkCi0gICAgICAgICAgICAgICAgICBzZXR0aW5nIHRoaXMgZmxhZyB0byB0cnVlLiBUaGlzIGZsYWcgaXMgb25seSBob25vcmVkIGlmIHRoZSBldmFsdWF0aW9uIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgIHVzZWQgdG8gZXZhbHVhdGUgdGhpcyBleHByZXNzaW9uIGFsbG93cyBwbHVnLWluIGFjdGl2YXRpb24uIE90aGVyd2lzZSB0aGUgZmxhZwotICAgICAgICAgICAgICAgICAgaXMgaWdub3JlZCBhbmQgbm8gcGx1Zy1pbiBsb2FkaW5nIHRha2VzIHBsYWNlLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuc3lzdGVtVGVzdCI+c3lzdGVtVGVzdDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1Qgc3lzdGVtVGVzdDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnByb3BlcnR5Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dmFsdWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRlc3RzIGEgc3lzdGVtIHByb3BlcnR5IGJ5IGNhbGxpbmcgdGhlIFN5c3RlbS5nZXRQcm9wZXJ0eSBtZXRob2QgYW5kIGNvbXBhcmVzIHRoZSByZXN1bHQKLSAgICAgICAgICAgIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCB0aHJvdWdoIHRoZSB2YWx1ZSBhdHRyaWJ1dGUuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+cHJvcGVydHk8L2I+IC0gdGhlIG5hbWUgb2YgYW4gc3lzdGVtIHByb3BlcnR5IHRvIHRlc3QuPC9saT4KLTxsaT48Yj52YWx1ZTwvYj4gLSB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LiBUaGUgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcgdmFsdWUuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5lcXVhbHMiPmVxdWFsczwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXF1YWxzPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dmFsdWUmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIHBlcmZvcm0gYW4gZXF1YWxzIGNoZWNrIG9mIHRoZSBvYmplY3QgaW4gZm9jdXMuIFRoZSBleHByZXNzaW9uIHJldHVybnMKLSAgICAgICAgICAgIEV2YWx1YXRpb25SZXN1bHQuVFJVRSBpZiB0aGUgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXR0cmlidXRlIHZhbHVlLiBPdGhlcndpc2UKLSAgICAgICAgICAgIEV2YWx1YXRpb25SZXN1bHQuRkFMU0UgaXMgcmV0dXJuZWQuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+dmFsdWU8L2I+IC0gdGhlIGV4cGVjdGVkIHZhbHVlLiBUaGUgdmFsdWUgcHJvdmlkZWQgYXMgYSBzdHJpbmcgaXMgY29udmVydGVkIGludG8KLSAgICAgICAgICAgICAgICAgIGEgSmF2YSBiYXNlIHR5cGUgdXNpbmcgdGhlIHNhbWUgcnVsZXMgYXMgZm9yIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgZXhwcmVzc2lvbi48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmNvdW50Ij5jb3VudDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgY291bnQ8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij52YWx1ZSZuYnNwO0NEQVRBICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gdGVzdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgY29sbGVjdGlvbi48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj52YWx1ZTwvYj4gLSBhbiBleHByZXNzaW9uIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGxpc3QuIEZvbGxvd2luZyB3aWxkY2FyZAotICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBjYW4gYmUgdXNlZDoKLSAgICAgICAgICAgICAgICAgIDxkbD4KLSAgICAgICAgICAgICAgICAgICAgPGR0Pio8L2R0PiA8ZGQ+YW55IG51bWJlciBvZiBlbGVtZW50czwvZGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkdD4/PC9kdD4gPGRkPm5vIGVsZW1lbnRzIG9yIG9uZSBlbGVtZW50PC9kZD4KLSAgICAgICAgICAgICAgICAgICAgPGR0Pis8L2R0PiA8ZGQ+b25lIG9yIG1vcmUgZWxlbWVudHM8L2RkPgotICAgICAgICAgICAgICAgICAgICA8ZHQ+ITwvZHQ+IDxkZD5ubyBlbGVtZW50czwvZGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkdD5pbnRlZ2VyIHZhbHVlPC9kdD4gPGRkPnRoZSBsaXN0IG11c3QgY29udGFpbiB0aGUgZXhhY3QgbnVtYmVyIG9mIGVsZW1lbnRzPC9kZD4KLSAgICAgICAgICAgICAgICAgIDwvZGw+PC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS53aXRoIj53aXRoPC9hPiAoPGEgaHJlZj0iI2Uubm90Ij5ub3Q8L2E+ICwgPGEgaHJlZj0iI2UuYW5kIj5hbmQ8L2E+ICwgPGEgaHJlZj0iI2Uub3IiPm9yPC9hPiAsIDxhIGhyZWY9IiNlLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2E+ICwgPGEgaHJlZj0iI2UudGVzdCI+dGVzdDwvYT4gLCA8YSBocmVmPSIjZS5zeXN0ZW1UZXN0Ij5zeXN0ZW1UZXN0PC9hPiAsIDxhIGhyZWY9IiNlLmVxdWFscyI+ZXF1YWxzPC9hPiAsIDxhIGhyZWY9IiNlLmNvdW50Ij5jb3VudDwvYT4gLCA8YSBocmVmPSIjZS53aXRoIj53aXRoPC9hPiAsIDxhIGhyZWY9IiNlLnJlc29sdmUiPnJlc29sdmU8L2E+ICwgPGEgaHJlZj0iI2UuYWRhcHQiPmFkYXB0PC9hPiAsIDxhIGhyZWY9IiNlLml0ZXJhdGUiPml0ZXJhdGU8L2E+ICwgPGEgaHJlZj0iI2UucmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+KSomZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1Qgd2l0aDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnZhcmlhYmxlJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1UaGlzIGVsZW1lbnQgY2hhbmdlcyB0aGUgb2JqZWN0IHRvIGJlIGluc3BlY3RlZCBmb3IgYWxsIGl0cyBjaGlsZCBlbGVtZW50IHRvIHRoZSBvYmplY3QKLSAgICAgICAgICAgIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIHZhcmlhYmxlLiBJZiB0aGUgdmFyaWFibGUgY2FuIG5vdCBiZSByZXNvbHZlZCB0aGVuIHRoZSBleHByZXNzaW9uCi0gICAgICAgICAgICB3aWxsIHRocm93IGEgRXhwcmVzc2lvbkV4Y2VwdGlvbiB3aGVuIGV2YWx1YXRpbmcgaXQuIFRoZSBjaGlsZHJlbiBvZiBhIHdpdGggZXhwcmVzc2lvbiAKLSAgICAgICAgICAgIGFyZSBjb21iaW5lZCB1c2luZyB0aGUgYW5kIG9wZXJhdG9yLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnZhcmlhYmxlPC9iPiAtIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSB1c2VkIGZvciBmdXJ0aGVyIGluc3BlY3Rpb24uIEl0IGlzIHVwIHRvIHRoZSBldmFsdWF0b3IKLSAgICAgICAgICAgICAgICAgIG9mIGFuIGV4dGVuc2lvbiBwb2ludCB0byBwcm92aWRlIHRoZSB2YXJpYWJsZSBpbiB0aGUgdmFyaWFibGUgcG9vbC48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnJlc29sdmUiPnJlc29sdmU8L2E+ICg8YSBocmVmPSIjZS5ub3QiPm5vdDwvYT4gLCA8YSBocmVmPSIjZS5hbmQiPmFuZDwvYT4gLCA8YSBocmVmPSIjZS5vciI+b3I8L2E+ICwgPGEgaHJlZj0iI2UuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT4gLCA8YSBocmVmPSIjZS50ZXN0Ij50ZXN0PC9hPiAsIDxhIGhyZWY9IiNlLnN5c3RlbVRlc3QiPnN5c3RlbVRlc3Q8L2E+ICwgPGEgaHJlZj0iI2UuZXF1YWxzIj5lcXVhbHM8L2E+ICwgPGEgaHJlZj0iI2UuY291bnQiPmNvdW50PC9hPiAsIDxhIGhyZWY9IiNlLndpdGgiPndpdGg8L2E+ICwgPGEgaHJlZj0iI2UucmVzb2x2ZSI+cmVzb2x2ZTwvYT4gLCA8YSBocmVmPSIjZS5hZGFwdCI+YWRhcHQ8L2E+ICwgPGEgaHJlZj0iI2UuaXRlcmF0ZSI+aXRlcmF0ZTwvYT4gLCA8YSBocmVmPSIjZS5yZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT4pKiZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCByZXNvbHZlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dmFyaWFibGUmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5hcmdzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBjaGFuZ2VzIHRoZSBvYmplY3QgdG8gYmUgaW5zcGVjdGVkIGZvciBhbGwgaXRzIGNoaWxkIGVsZW1lbnQgdG8gdGhlIG9iamVjdAotICAgICAgICAgICAgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gdmFyaWFibGUuIElmIHRoZSB2YXJpYWJsZSBjYW4gbm90IGJlIHJlc29sdmVkIHRoZW4gdGhlIGV4cHJlc3Npb24KLSAgICAgICAgICAgIHdpbGwgdGhyb3cgYSBFeHByZXNzaW9uRXhjZXB0aW9uIHdoZW4gZXZhbHVhdGluZyBpdC4gVGhlIGNoaWxkcmVuIG9mIGEgd2l0aCBleHByZXNzaW9uIAotICAgICAgICAgICAgYXJlIGNvbWJpbmVkIHVzaW5nIHRoZSBhbmQgb3BlcmF0b3IuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+dmFyaWFibGU8L2I+IC0gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHJlc29sdmVkLiBUaGlzIHZhcmlhYmxlIGlzIHRoZW4gdXNlZCBhcyB0aGUgb2JqZWN0IGluIGZvY3VzCi0gICAgICAgICAgICAgICAgICBmb3IgY2hpbGQgZWxlbWVudCBldmFsdWF0aW9uLiBJdCBpcyB1cCB0byB0aGUgZXZhbHVhdG9yIG9mIGFuIGV4dGVuc2lvbiBwb2ludCB0byBwcm92aWRlIGEgCi0gICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIHJlc29sdmVyIChzZWUgSVZhcmlhYmxlUmVzb2x2ZXIpIHRocm91Z2ggdGhlIGV2YWx1YXRpb24gY29udGV4dCBwYXNzZWQKLSAgICAgICAgICAgICAgICAgIHRvIHRoZSByb290IGV4cHJlc3Npb24gZWxlbWVudCB3aGVuIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24uPC9saT4KLTxsaT48Yj5hcmdzPC9iPiAtIGFkZGl0aW9uYWwgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgdmFyaWFibGUgcmVzb2x2ZXIuIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgc2VwZXJhdGVkCi0gICAgICAgICAgICAgICAgICBieSBjb21tYXMuIEVhY2ggaW5kaXZpZHVhbCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgaW50byBhIEphdmEgYmFzZSB0eXBlIHVzaW5nIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICBydWxlcyBhcyBkZWZpbmVkIGZvciB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoZSB0ZXN0IGV4cHJlc3Npb24uPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5hZGFwdCI+YWRhcHQ8L2E+ICg8YSBocmVmPSIjZS5ub3QiPm5vdDwvYT4gLCA8YSBocmVmPSIjZS5hbmQiPmFuZDwvYT4gLCA8YSBocmVmPSIjZS5vciI+b3I8L2E+ICwgPGEgaHJlZj0iI2UuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT4gLCA8YSBocmVmPSIjZS50ZXN0Ij50ZXN0PC9hPiAsIDxhIGhyZWY9IiNlLnN5c3RlbVRlc3QiPnN5c3RlbVRlc3Q8L2E+ICwgPGEgaHJlZj0iI2UuZXF1YWxzIj5lcXVhbHM8L2E+ICwgPGEgaHJlZj0iI2UuY291bnQiPmNvdW50PC9hPiAsIDxhIGhyZWY9IiNlLndpdGgiPndpdGg8L2E+ICwgPGEgaHJlZj0iI2UucmVzb2x2ZSI+cmVzb2x2ZTwvYT4gLCA8YSBocmVmPSIjZS5hZGFwdCI+YWRhcHQ8L2E+ICwgPGEgaHJlZj0iI2UuaXRlcmF0ZSI+aXRlcmF0ZTwvYT4gLCA8YSBocmVmPSIjZS5yZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT4pKiZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBhZGFwdDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnR5cGUmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGFkYXB0IHRoZSBvYmplY3QgaW4gZm9jdXMgdG8gdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgIHR5cGUuIFRoZSBleHByZXNzaW9uIHJldHVybnMgbm90IGxvYWRlZCBpZiBlaXRoZXIgdGhlIGFkYXB0ZXIgb3IgdGhlIHR5cGUgcmVmZXJlbmNlZCBpc24ndAotICAgICAgICAgICAgbG9hZGVkIHlldC4gSXQgdGhyb3dzIGEgRXhwcmVzc2lvbkV4Y2VwdGlvbiBkdXJpbmcgZXZhbHVhdGlvbiBpZiB0aGUgdHlwZSBuYW1lIGRvZXNuJ3QgZXhpc3QgCi0gICAgICAgICAgICBhdCBhbGwuIFRoZSBjaGlsZHJlbiBvZiBhbiBhZGFwdCBleHByZXNzaW9uIGFyZSBjb21iaW5lZCB1c2luZyB0aGUgYW5kIG9wZXJhdG9yLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPnR5cGU8L2I+IC0gdGhlIHR5cGUgdG8gd2hpY2ggdGhlIG9iamVjdCBpbiBmb2N1cyBpcyB0byBiZSBhZGFwdGVkLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuaXRlcmF0ZSI+aXRlcmF0ZTwvYT4gKDxhIGhyZWY9IiNlLm5vdCI+bm90PC9hPiAsIDxhIGhyZWY9IiNlLmFuZCI+YW5kPC9hPiAsIDxhIGhyZWY9IiNlLm9yIj5vcjwvYT4gLCA8YSBocmVmPSIjZS5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPiAsIDxhIGhyZWY9IiNlLnRlc3QiPnRlc3Q8L2E+ICwgPGEgaHJlZj0iI2Uuc3lzdGVtVGVzdCI+c3lzdGVtVGVzdDwvYT4gLCA8YSBocmVmPSIjZS5lcXVhbHMiPmVxdWFsczwvYT4gLCA8YSBocmVmPSIjZS5jb3VudCI+Y291bnQ8L2E+ICwgPGEgaHJlZj0iI2Uud2l0aCI+d2l0aDwvYT4gLCA8YSBocmVmPSIjZS5yZXNvbHZlIj5yZXNvbHZlPC9hPiAsIDxhIGhyZWY9IiNlLmFkYXB0Ij5hZGFwdDwvYT4gLCA8YSBocmVmPSIjZS5pdGVyYXRlIj5pdGVyYXRlPC9hPiAsIDxhIGhyZWY9IiNlLnJlZmVyZW5jZSI+cmVmZXJlbmNlPC9hPikqJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGl0ZXJhdGU8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5vcGVyYXRvciZuYnNwOyhvcnxhbmQpIDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlmRW1wdHkmbmJzcDsmbmJzcDsodHJ1ZSB8IGZhbHNlKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgZWxlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBhIHZhcmlhYmxlIHRoYXQgaXMgb2YgdHlwZSBqYXZhLnV0aWwuQ29sbGVjdGlvbi4gSWYKLSAgICAgICAgICAgIHRoZSBvYmplY3QgaW4gZm9jdXMgaXMgbm90IG9mIHR5cGUgamF2YS51dGlsLkNvbGxlY3Rpb24gdGhlbiBhbiBFeHByZXNzaW9uRXhjZXB0aW9uIHdpbGwKLSAgICAgICAgICAgIGJlIHRocm93biB3aGlsZSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPm9wZXJhdG9yPC9iPiAtIGVpdGhlciAiYW5kIiBvciAib3IiLiBUaGUgb3BlcmF0b3IgZGVmaW5lcyBob3cgdGhlIGNoaWxkCi0gICAgICAgICAgICAgICAgICBlbGVtZW50cyB3aWxsIGJlIGNvbWJpbmVkLiBJZiBub3Qgc3BlY2lmaWVkLCAiYW5kIiB3aWxsIGJlIHVzZWQuPC9saT4KLTxsaT48Yj5pZkVtcHR5PC9iPiAtIHRoZSB2YWx1ZSByZXR1cm4gZnJvbSB0aGUgaXRlcmF0ZSBleHByZXNzaW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LiBJZgotICAgICAgICAgICAgICAgICBub3Qgc3BlY2lmaWVkIHRoZW4gdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIHRoZSBvcGVyYXRvciBlcXVhbHMgImFuZCIgCi0gICAgICAgICAgICAgICAgIGFuZCBmYWxzZSBpcyByZXR1cm4gaWYgdGhlIG9wZXJhdG9yIGVxdWFscyAib3IiLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIHJlZmVyZW5jZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmRlZmluaXRpb25JZCZuYnNwO0lEUkVGICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gcmVmZXJlbmNlIGFuIGV4cHJlc3Npb24gZnJvbSB0aGUgPGI+b3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9uczwvYj4gZXh0ZW5zaW9uIHBvaW50LiAgVGhlIGV4cHJlc3Npb24gZGVmaW5pdGlvbiB3aWxsIGJlIGV2YWx1YXRlZCB3aXRoaW4gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBlbGVtZW50IHVzaW5nIHRoZSBjdXJyZW50IGV2YWx1YXRpb24gY29udGV4dC48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5kZWZpbml0aW9uSWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiBhbiBleHByZXNzaW9uIGZyb20gPGI+b3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9uczwvYj4uPC9saT4KLTwvdWw+Ci08YnI+PGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy48YnI+Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4KLQotPC9wPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvckRlbGVnYXRlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvckRlbGVnYXRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBmNGZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JEZWxlZ2F0ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPlZhbGlkYXRvciBEZWxlZ2F0ZXM8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPlZhbGlkYXRvciBEZWxlZ2F0ZXM8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JEZWxlZ2F0ZXM8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj48Yj5UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLjwvYj4KLTxwPjwvcD4KLQotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RGVzY3JpcHRpb246IDwvaDY+VGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHZhbGlkYXRvciBwcm92aWRlcnMgdG8gY29udHJpYnV0ZSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zIGZvciBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLjxwPjwvcD4KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaDY+Ci08cD48L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UuZGVsZWdhdGUiPmRlbGVnYXRlPC9hPikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmRlbGVnYXRlIj5kZWxlZ2F0ZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZGVsZWdhdGU8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jbGFzcyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnRhcmdldCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLURlZmluZXMgYSB2YWxpZGF0b3IgZGVsZWdhdGUuIERlbGVnYXRpbmcgdmFsaWRhdG9ycyBjYW4gaGF2ZSBvbmUgb3IgbW9yZSBkZWxlZ2F0ZXMgcmVnaXN0ZXJlZCwgb25seSBvbmUgb2Ygd2hpY2ggY2FuIGJlIGFjdGl2ZSAoc2VsZWN0ZWQpIGF0IG9uY2UuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gU3BlY2lmaWVzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3IuIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBJVmFsaWRhdG9ySm9iLjwvbGk+Ci08bGk+PGI+dGFyZ2V0PC9iPiAtIFNwZWNpZmllcyB0aGUgaWQgb2YgdGhlIHZhbGlkYXRvciBleHRlbnNpb24gZm9yIHdoaWNoIHRoaXMgZGVsZWdhdGUgaXMgYmVpbmcgcmVnaXN0ZXJlZC48L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gPC9saT4KLTwvdWw+Ci08YnI+PGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+RXhhbXBsZXM6IDwvaDY+PGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yRGVsZWdhdGVzIj4KLSAgICA8ZGVsZWdhdGUKLSAgICAgICAgICBjbGFzcz0iY29tLmFjbWUuZmFzdC5TdXBlckZhc3RWYWxpZGF0b3IiCi0gICAgICAgICAgbmFtZT0iU3VwZXIgZmFzdCB2YWxpZGF0b3IiCi0gICAgICAgICAgdGFyZ2V0PSJvcmcuYWNtZS5jb3JlLkFDTUVEZWxlZ2F0aW5nVmFsaWRhdG9yIi8+Ci0gPC9leHRlbnNpb24+Ci08cD48L3A+Ci0KLTxicj4KLTxwIGNsYXNzPSJub3RlIFNjaGVtYUNvcHlyaWdodCI+Ci1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuPGJyPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Ci0KLTwvcD4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JHcm91cC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvckdyb3VwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNDBlMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvckdyb3VwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5WYWxpZGF0b3IgR3JvdXA8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vYm9vay5jc3MiKTs8L3N0eWxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj5AaW1wb3J0IHVybCgiLi4vLi4vc2NoZW1hLmNzcyIpOzwvc3R5bGU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxIMSBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPlZhbGlkYXRvciBHcm91cDwvSDE+Ci08cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5JZGVudGlmaWVyOiA8L2g2Pm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckdyb3VwPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+U2luY2U6IDwvaDY+V2ViVG9vbHMgMy4wCi08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PkRlZmluZXMgYSBncm91cGluZyBmb3IgdmFsaWRhdG9ycyB3aXRoIGxpc3RlbmVycyBub3RpZmllZCBvZiBncm91cCBtZW1iZXJzJyBhY3Rpdml0ZXMuICBVc2VmdWwgZm9yIHByZS1jYWNoaW5nIGNvbW1vbiBpbmZvcm1hdGlvbiB1c2VkIGJ5IG11bHRpcGxlIHZhbGlkYXRvcnMgYW5kIGRpc3Bvc2luZyBvZiB0aGF0IGluZm9ybWF0aW9uIHdoZW4gdGhleSdyZSBhbGwgZG9uZS48cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2g2PgotPHA+PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLmdyb3VwIj5ncm91cDwvYT4rKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBleHRlbnNpb248L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5wb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5uYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb248L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gQSBuYW1lIGZvciB0aGlzIGV4dGVuc2lvbjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUubGlzdGVuZXIiPmxpc3RlbmVyPC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBsaXN0ZW5lcjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmNsYXNzJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1BIGxpc3RlbmVyIGZvciBhY3Rpdml0aWVzIGluIHRoaXMgZ3JvdXAuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gVGhlIGxpc3RlbmVyJ3MgY2xhc3MuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5ncm91cCI+Z3JvdXA8L2E+ICg8YSBocmVmPSIjZS5saXN0ZW5lciI+bGlzdGVuZXI8L2E+KykmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZ3JvdXA8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwO0lEUkVGICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotRGVjbGFyZXMgYSB2YWxpZGF0b3IgZ3JvdXAuICBBIGdyb3VwIG1heSBoYXZlIG11bHRpcGxlIGxpc3RlbmVycy48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSA8L2xpPgotPC91bD4KLTxicj48aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5FeGFtcGxlczogPC9oNj5EZWZpbmUgYSBsaXN0ZW5lciB0aGF0IHNpbXBseSBwcmludHMgdGhhdCBpdCBoYXMgYmVlbiBjYWxsZWQuCi08cHJlIGNsYXNzPSJFeGFtcGxlIj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPgotJmx0O2V4dGVuc2lvbiBwb2ludD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yR3JvdXAmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAmbHQ7Z3JvdXAgaWQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O3ZhbGlkYXRvckdyb3VwJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICAmbHQ7bGlzdGVuZXIgY2xhc3M9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmV4YW1wbGUuVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPi8mZ3Q7Ci0gICAmbHQ7L2dyb3VwJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0KLXB1YmxpYyBjbGFzcyBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5leGFtcGxlLlZhbGlkYXRvckdyb3VwTGlzdGVuZXIgaW1wbGVtZW50cyBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciB7Ci0KLSAgcHVibGljIFZhbGlkYXRvckdyb3VwTGlzdGVuZXIoKSB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2YWxpZGF0aW9uRmluaXNoaW5nKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxUeXBlIHZhbFR5cGUsIFZhbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoaW5nOiIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25TdGFydGluZyhJUmVzb3VyY2UgcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsVHlwZSB2YWxUeXBlLCBWYWxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nOiIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgfQotfQotIAotJmx0O2V4dGVuc2lvbiBpZD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7aWQmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4gbmFtZT08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7bmFtZSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiBwb2ludD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICZsdDt2YWxpZGF0b3IgY2xhc3M9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmV4YW1wbGUuVmFsaWRhdG9yJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Jmd0OwotICAgICZsdDtncm91cCBpZD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhhbXBsZS52YWxpZGF0b3JHcm91cCZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPi8mZ3Q7Ci0gICZsdDsvdmFsaWRhdG9yJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci08L3NwYW4+PC9wcmU+Ci08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkFQSSBJbmZvcm1hdGlvbjogPC9oNj5Qcm92aXNpb25hbCBBUEkuCi08cD48L3A+Ci0KLTxicj4KLTxwIGNsYXNzPSJub3RlIFNjaGVtYUNvcHlyaWdodCI+Ci1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuPGJyPgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+Ci0KLTwvcD4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi9yZWZlcmVuY2UvZXh0ZW5zaW9uLXBvaW50cy92Zi9vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JWMi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvclYyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWQ4MTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3JlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL3ZmL29yZ19lY2xpcHNlX3dzdF92YWxpZGF0aW9uX3ZhbGlkYXRvclYyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+VmFsaWRhdG9yIFYyPC90aXRsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL2Jvb2suY3NzIik7PC9zdHlsZT4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGltcG9ydCB1cmwoIi4uLy4uL3NjaGVtYS5jc3MiKTs8L3N0eWxlPgotPC9IRUFEPgotPEJPRFk+Ci08SDEgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj5WYWxpZGF0b3IgVjI8L0gxPgotPHA+PC9wPgotPGg2IGNsYXNzPSJDYXB0aW9uRmlnQ29sdW1uIFNjaGVtYUhlYWRlciI+SWRlbnRpZmllcjogPC9oNj5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3ItdjI8cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5TaW5jZTogPC9oNj5XZWJUb29scyAzLjAuCi08cD48L3A+Ci0KLTxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkRlc2NyaXB0aW9uOiA8L2g2PlRoaXMgaXMgdXNlZCB0byByZWdpc3RlciBhIHZhbGlkYXRvciB0byB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgKHZlcnNpb24gMikuIEluIGFkZGl0aW9uIHRvIHNwZWNpZnlpbmcgdGhlIHZhbGlkYXRvciB0byBpbnZva2UsIGl0IHJlZ2lzdGVycyBhIHNldCBvZiBkZWZhdWx0IGZpbHRlciBydWxlcywgdG8gY29udHJvbCB3aGljaCByZXNvdXJjZXMgYXJlIHBhc3NzZWQgdG8gdGhlIHZhbGlkYXRvci48cD48L3A+Ci08aDYgY2xhc3M9IkNhcHRpb25GaWdDb2x1bW4gU2NoZW1hSGVhZGVyIj5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2g2PgotPHA+PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLnZhbGlkYXRvciI+dmFsaWRhdG9yPC9hPikmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gQSBzaG9ydCBpZCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHBsdWctaW4sIHNvIHRoYXQgdGhpcyB2YWxpZGF0b3IgY2FuIGJlIGlkZW50aWZpZWQuPC9saT4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBzaG9ydCB1c2VyIGZyaWVuZGx5IG5hbWUgb2YgdGhlIHZhbGlkYXRvci48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLnZhbGlkYXRvciI+dmFsaWRhdG9yPC9hPiAoPGEgaHJlZj0iI2UuaW5jbHVkZSI+aW5jbHVkZTwvYT4qICwgPGEgaHJlZj0iI2UuZXhjbHVkZSI+ZXhjbHVkZTwvYT4/ICwgPGEgaHJlZj0iI2UubWVzc2FnZUNhdGVnb3J5Ij5tZXNzYWdlQ2F0ZWdvcnk8L2E+KiAsIDxhIGhyZWY9IiNlLmdyb3VwIj5ncm91cDwvYT4qKSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCB2YWxpZGF0b3I8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jbGFzcyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmJ1aWxkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+bWFudWFsJm5ic3A7Jm5ic3A7Jm5ic3A7KHRydWUgfCBmYWxzZSkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dmVyc2lvbiZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+c291cmNlaWQmbmJzcDtDREFUQSAjSU1QTElFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm1hcmtlcklkJm5ic3A7Q0RBVEEgI0lNUExJRUQmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLURlZmluZXMgYSB2YWxpZGF0b3IgdG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmNsYXNzPC9iPiAtIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHZhbGlkYXRvci48L2xpPgotPGxpPjxiPmJ1aWxkPC9iPiAtIElzIHRoaXMgdmFsaWRhdG9yIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbnM/IFRoZSBkZWZhdWx0IGlzIHRydWUuPC9saT4KLTxsaT48Yj5tYW51YWw8L2I+IC0gSXMgdGhpcyB2YWxpZGF0b3IgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBtYW51YWwgYmFzZWQgdmFsaWRhdGlvbnM/IFRoZSBkZWZhdWx0IGlzIHRydWUuPC9saT4KLTxsaT48Yj52ZXJzaW9uPC9iPiAtIFRoZSB2ZXJzaW9uIG9mIHRoZSBkZWZpbml0aW9uLiBJdCBpcyBhIHNpbXBsZSBpbnRlZ2VyLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSB2ZXJzaW9uIGlzIGFzc3VtZWQgdG8gYmUgMS48L2xpPgotPGxpPjxiPnNvdXJjZWlkPC9iPiAtIElmIHRoaXMgdmFsaWRhdG9yIGFsc28gc2VydmVzIGFzIGFuIGFzLXlvdS10eXBlIHZhbGlkYXRvciAoYWxzbyBrbm93IGFzIGFuIElTb3VyY2VWYWxpZGF0b3IpIHRoZW4gaXQncyBzb3VyY2UgaWQgaXMgc3BlY2lmaWVkIGhlcmUsIHNvIHRoYXQgdGhlIHR3byB2YWxpZGF0b3JzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggb25lIGFub3RoZXIuCi1CeSBzb3VyY2UgaWQsIHdlIG1lYW4gdGhlIGlkIHRoYXQgaXMgdXNlZCBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2VWYWxpZGF0aW9uIGV4dGVuc2lvbiBwb2ludDwvbGk+Ci08bGk+PGI+bWFya2VySWQ8L2I+IC0gSWYgeW91ciB2YWxpZGF0b3Igd2lzaGVzIHRvIHVzZSBpdCdzIG93biBtYXJrZXIsIGl0IGNhbiBkbyBzbyBieSBzdXBwbHlpbmcgdGhhdCBtYXJrZXIgaWQgaGVyZS48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmluY2x1ZGUiPmluY2x1ZGU8L2E+ICg8YSBocmVmPSIjZS5ydWxlcyI+cnVsZXM8L2E+KSZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotVGhpcyBjb250YWlucyBhIHNldCBvZiBpbmNsdXNpb24gcnVsZXMsIHdoaWNoIGFyZSB1c2VkIGluIGZpbHRlcmluZyB3aGljaCByZXNvdXJjZXMgZ2V0IHZhbGlkYXRlZC4gQXQgbGVhc3Qgb25lIG9mIHRoZXNlIHJ1bGVzIG11c3QgYmUgc2F0aXNmaWVkIGluIG9yZGVyIGZvciB0aGUgdmFsaWRhdG9yIHRvIGJlIGNhbGxlZCBvbiB0aGUgcGFydGljdWxhciByZXNvdXJjZS48L3A+Ci08YnI+PGJyPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leGNsdWRlIj5leGNsdWRlPC9hPiAoPGEgaHJlZj0iI2UucnVsZXMiPnJ1bGVzPC9hPikmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVRoaXMgY29udGFpbnMgYSBzZXQgb2YgZXhjbHVzaW9uIHJ1bGVzLCB1c2VkIGluIGZpbHRlcmluZyB3aGljaCByZXNvdXJjZXMgZ2V0IHZhbGlkYXRlZC4gSWYgYW55IG9mIHRoZXNlIHJ1bGVzIGFyZSBtYXRjaGVkLCB0aGVuIHRoZSB2YWxpZGF0b3IgaXMgbm90IGNhbGxlZCBvbiB0aGlzIHJlc291cmNlLjwvcD4KLTxicj48YnI+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmZpbGVleHQiPmZpbGVleHQ8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGZpbGVleHQ8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5leHQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jYXNlU2Vuc2l0aXZlJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1BIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSBodG1sLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmV4dDwvYj4gLSBUaGUgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlIGh0bWwuPC9saT4KLTxsaT48Yj5jYXNlU2Vuc2l0aXZlPC9iPiAtIElmIHRoZSBmaWxlIGV4dGVuc2lvbiBpcyBjYXNlIHNlbnNpdGl2ZSwgdGhlbiB0aGlzIG5lZWRzIHRvIGJlIHNldCB0byB0cnVlLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucHJvamVjdE5hdHVyZSI+cHJvamVjdE5hdHVyZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcHJvamVjdE5hdHVyZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Q0RBVEEgI1JFUVVJUkVEJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1Vc2VkIHRvIGZpbHRlciBvbiBwcm9qZWN0IG5hdHVyZXMuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+aWQ8L2I+IC0gVGhlIGZ1bGx5IHF1YWxpZmllZCBwcm9qZWN0IG5hdHVyZSBpZCwgZm9yIGV4YW1wbGUgIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiLjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZmlsZSI+ZmlsZTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZmlsZTwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPm5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5jYXNlU2Vuc2l0aXZlJm5ic3A7KHRydWUgfCBmYWxzZSkgPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dHlwZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyhmb2xkZXJ8ZmlsZXxmdWxsKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+bmFtZTwvYj4gLSBUaGUgZmlsZSBvciBmb2xkZXIgbmFtZS4gVGhlIGZpbGUgbmFtZSBjYW4gYmUgZnVsbHkgcXVhbGlmaWVkLCB0aGF0IGlzIGl0IHN0YXJ0cyB3aXRoIGEgbGVhZGluZyBzbGFzaCAoIi8iKSwgb3IgaXQgY2FuIGJlIGEgcmVsYXRpdmUgbmFtZS4gRm9sZGVyIG5hbWVzIGFyZSBzZXBhcmF0ZWQgd2l0aCB0aGUgZm9yd2FyZCBzbGFzaCAoIi8iKSBjaGFyYWN0ZXIuPC9saT4KLTxsaT48Yj5jYXNlU2Vuc2l0aXZlPC9iPiAtIElmIHRoZSBmaWxlIG5hbWUgaXMgbm90IGNhc2Ugc2Vuc3RpdGl2ZSwgdGhlbiB0aGlzIG5lZWRzIHRvIGJlIHNldCB0byBmYWxzZS48L2xpPgotPGxpPjxiPnR5cGU8L2I+IC0gVHlwZSBvZiBuYW1lLCB0aGVyZSBhcmUgdGhyZWUgY2hvaWNlcy4gPHVsPjxsaT5mb2xkZXIgLSBzcGVjaWZpZXMgYSBwcm9qZWN0IHJlbGF0aXZlIGZvbGRlciBuYW1lLjwvbGk+PGxpPmZpbGUgLSBhIHNpbXBsZSBmaWxlIG5hbWUgKGkuZS4gbm8gcGF0aCBpbmZvcm1hdGlvbikuPC9saT48bGk+ZnVsbCAtIGEgZnVsbHkgcXVhbGlmaWVkIChwcm9qZWN0IHJlbGF0aXZlKSBmaWxlIG5hbWUuPC9saT48L3VsPjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucnVsZXMiPnJ1bGVzPC9hPiAoPGEgaHJlZj0iI2UuZmlsZWV4dCI+ZmlsZWV4dDwvYT4qICwgPGEgaHJlZj0iI2UuZmlsZSI+ZmlsZTwvYT4qICwgPGEgaHJlZj0iI2UucHJvamVjdE5hdHVyZSI+cHJvamVjdE5hdHVyZTwvYT4qICwgPGEgaHJlZj0iI2UuZmFjZXQiPmZhY2V0PC9hPiogLCA8YSBocmVmPSIjZS5jb250ZW50VHlwZSI+Y29udGVudFR5cGU8L2E+KiAsIDxhIGhyZWY9IiNlLnBhdHRlcm4iPnBhdHRlcm48L2E+KikmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLUEgc2V0IG9mIHJ1bGVzIGZvciBkZXRlcm1pbmluZyBpZiBhIHJlc291cmNlIGlzIHBhc3NlZCB0byB0aGlzIHZhbGlkYXRvciBvciBub3QuIFRoZSBydWxlcyBhcmUgT1InZWQgdG9nZXRoZXIuPC9wPgotPGJyPjxicj4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZmFjZXQiPmZhY2V0PC9hPiBFTVBUWSZndDs8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshQVRUTElTVCBmYWNldDwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPmlkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+dmVyc2lvbiZuYnNwO0NEQVRBICNJTVBMSUVEJmd0OzwvcD4KLTxwPjwvcD4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFRoZSBmYWNldCBpZC48L2xpPgotPGxpPjxiPnZlcnNpb248L2I+IC0gQSB2ZXJzaW9uIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmdXRoZXIgcXVhbGlmeSB0aGUgbWF0Y2guIElmIG5vdCBzcGVjaWZlZCwgdGhlbiB2ZXJzaW9ucyBhcmUgbm90IHVzZWQgYXMgYSBjcml0ZXJpYSBmb3Igc2VsZWN0aW5nIHRoZSBmYWNldC4gVGhlIHN5bnRheCBvZiB0aGlzIGV4cHJlc3Npb24sIGlzIHRoZSBzYW1lIHN5bnRheCB0aGF0IGlzIHVzZWQgYnkgdGhlIGZhY2V0IGZyYW1ld29yay48L2xpPgotPC91bD4KLTxicj48cCBjbGFzcz0iY29kZSBTY2hlbWFEdGQiPiZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmdyb3VwIj5ncm91cDwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgZ3JvdXA8L3A+Ci08cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5pZCZuYnNwO0lEUkVGICNSRVFVSVJFRCZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotRGVjbGFyZXMgdGhhdCB0aGlzIHZhbGlkYXRvciBiZWxvbmdzIHRvIHRoaXMgdmFsaWRhdGlvbiBncm91cC48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBUaGUgZnVsbHkgcXVhbGlmaWVkIElEIG9mIHRoZSB2YWxpZGF0aW9uIGdyb3VwIHRvIHdoaWNoIHRoaXMgdmFsaWRhdG9yIGJlbG9uZ3MuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5jb250ZW50VHlwZSI+Y29udGVudFR5cGU8L2E+IEVNUFRZJmd0OzwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFBVFRMSVNUIGNvbnRlbnRUeXBlPC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5leGFjdE1hdGNoJm5ic3A7KHRydWUgfCBmYWxzZSkgJmd0OzwvcD4KLTxwPjwvcD4KLTxwIGNsYXNzPSJDb25maWdNYXJrdXBFbGVtZW50RGVzYyI+Ci1Vc2VkIHRvIGZpbHRlciBiYXNlZCBvbiBjb250ZW50IHR5cGVzLjwvcD4KLTxicj4KLTx1bCBjbGFzcz0iQ29uZmlnTWFya3VwQXR0bGlzdERlc2MiPgotPGxpPjxiPmlkPC9iPiAtIFRoZSBjb250ZW50IHR5cGUgaWQuPC9saT4KLTxsaT48Yj5leGFjdE1hdGNoPC9iPiAtIFNldCB0byB0cnVlIGlmIHRoZSBjb250ZW50IHR5cGUgbmVlZHMgdG8gbWF0Y2ggZXhhY3RseS4gU2V0IHRvIGZhbHNlIGlmIHN1YiB0eXBlcyBhcmUgY29uc2lkZXJlZCBtYXRjaGVzIGFzIHdlbGwuPC9saT4KLTwvdWw+Ci08YnI+PHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5tZXNzYWdlQ2F0ZWdvcnkiPm1lc3NhZ2VDYXRlZ29yeTwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgbWVzc2FnZUNhdGVnb3J5PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8cCBjbGFzcz0iY29kZSBTY2hlbWFEdGRBdHRsaXN0Ij5sYWJlbCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnNldmVyaXR5Jm5ic3A7KGVycm9yfHdhcm5pbmd8aWdub3JlKSAmZ3Q7PC9wPgotPHA+PC9wPgotPHAgY2xhc3M9IkNvbmZpZ01hcmt1cEVsZW1lbnREZXNjIj4KLVVzZWQgdG8gZ3JvdXAgdG9nZXRoZXIgYSBzZXQgb2YgbWVzc2FnZXMsIHdoZXJlIHRoZSB1c2VyIGNhbiBjaGFuZ2UgdGhlIG1lc3NhZ2Ugc2V2ZXJpdHkgb2YgYWxsIHRoZSBtZXNzYWdlcyBpbiB0aGUgZ3JvdXAuIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgc3VwcG9ydCBpbiB0aGUgSkRULCB3aGVyZSBmb3IgZXhhbXBsZSBhIHVzZXIgY2FuIHNwZWNpZnkgd2hldGhlciB1c2VkIG1ldGhvZHMgc2hvdWxkIGJlIGVycm9ycywgd2FybmluZ3Mgb3IgaWdub3JlZC48L3A+Ci08YnI+Ci08dWwgY2xhc3M9IkNvbmZpZ01hcmt1cEF0dGxpc3REZXNjIj4KLTxsaT48Yj5pZDwvYj4gLSBBIHNpbXBsZSBpZCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoaXMgdmFsaWRhdG9yLjwvbGk+Ci08bGk+PGI+bGFiZWw8L2I+IC0gQSBzaG9ydCwgb25lIGxpbmUgbGFiZWwgdGhhdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyLCB0aGF0IGRlc2NyaWJlcyB0aGUgbWVzc2FnZSBjYXRlZ29yeS48L2xpPgotPGxpPjxiPnNldmVyaXR5PC9iPiAtIFRoZSBkZWZhdWx0IHNldmVyaXR5IGZvciB0aGlzIGNhdGVnb3J5LjwvbGk+Ci08L3VsPgotPGJyPjxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZCI+Jmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUucGF0dGVybiI+cGF0dGVybjwvYT4gRU1QVFkmZ3Q7PC9wPgotPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkIj4mbHQ7IUFUVExJU1QgcGF0dGVybjwvcD4KLTxwIGNsYXNzPSJjb2RlIFNjaGVtYUR0ZEF0dGxpc3QiPnJlZ2V4Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPHAgY2xhc3M9ImNvZGUgU2NoZW1hRHRkQXR0bGlzdCI+Y2FzZVNlbnNpdGl2ZSZuYnNwOyh0cnVlIHwgZmFsc2UpICZndDs8L3A+Ci08cD48L3A+Ci08cCBjbGFzcz0iQ29uZmlnTWFya3VwRWxlbWVudERlc2MiPgotSG9sZHMgYSByZWd1YWxyIGV4cHJlc3Npb24sIHRoYXQgbWF0Y2hlcyB0aGUgcmVzb3VyY2UncyBwcm9qZWN0IHJlbGF0aXZlIG5hbWUuPC9wPgotPGJyPgotPHVsIGNsYXNzPSJDb25maWdNYXJrdXBBdHRsaXN0RGVzYyI+Ci08bGk+PGI+cmVnZXg8L2I+IC0gSG9sZHMgYSBKYXZhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gU2VlIHRoZSBjbGFzcyBqYXZhLnV0aWwucmVnZXguUGF0dGVybiBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkIGFnYWluc3QgYSByZXNvdXJjZSdzIHByb2plY3QgcmVsYXRpdmUgcGF0aCwgYWZ0ZXIgdGhhdCBwYXRoIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgcG9ydGFibGUgcGF0aC4KLTxwPlRoZSBwYXRoIHdpbGwgYWx3YXlzIHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoICgvKSBzbyB0aGF0IGZvbGRlciBuYW1lcyBjYW4gYmUgbW9yZSBlYXNpbHkgbWF0Y2hlZC48L2xpPgotPGxpPjxiPmNhc2VTZW5zaXRpdmU8L2I+IC0gSWYgdGhlIGZpbGUgbmFtZSBpcyBub3QgY2FzZSBzZW5zdGl0aXZlLCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgc2V0IHRvIGZhbHNlLjwvbGk+Ci08L3VsPgotPGJyPjxoNiBjbGFzcz0iQ2FwdGlvbkZpZ0NvbHVtbiBTY2hlbWFIZWFkZXIiPkV4YW1wbGVzOiA8L2g2PkFuIGV4YW1wbGUgb2YgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiByZXNvdXJjZXMgdGhhdCBoYXZlIGh0bWwgb3IgaHRtIGZpbGUgZXh0ZW5zaW9ucy4KLTxwcmUgY2xhc3M9IkV4YW1wbGUiPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yJnF1b3Q7PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYVRhZyI+Ci0gICAgICAgICBpZD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7VGVzdCZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPiBuYW1lPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDslVmFsaWRhdG9yLk5hbWUmcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAmbHQ7dmFsaWRhdG9yIGNsYXNzPTwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFDc3RyaW5nIj4mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0LlRlc3RWYWxpZGF0b3ImcXVvdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hVGFnIj4mZ3Q7Ci0gICAgICAgICAmbHQ7aW5jbHVkZSZndDsKLSAgICAgICAgICAgICZsdDtydWxlcyZndDsKLSAgICAgICAgICAgICAgICZsdDtmaWxlZXh0IGV4dD08L3NwYW4+PHNwYW4gY2xhc3M9ImNvZGUgU2NoZW1hQ3N0cmluZyI+JnF1b3Q7aHRtbCZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPi8mZ3Q7Ci0gICAgICAgICAgICAgICAmbHQ7ZmlsZWV4dCBleHQ9PC9zcGFuPjxzcGFuIGNsYXNzPSJjb2RlIFNjaGVtYUNzdHJpbmciPiZxdW90O2h0bSZxdW90Ozwvc3Bhbj48c3BhbiBjbGFzcz0iY29kZSBTY2hlbWFUYWciPi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3J1bGVzJmd0OwotICAgICAgICAgJmx0Oy9pbmNsdWRlJmd0OwotICAgICAgJmx0Oy92YWxpZGF0b3ImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLTwvc3Bhbj48L3ByZT4KLTxwPjwvcD4KLQotPGJyPgotPHAgY2xhc3M9Im5vdGUgU2NoZW1hQ29weXJpZ2h0Ij4KLUNvcHlyaWdodCAoYykgMjAwNywyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLjxicj4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPgotCi08L3A+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2YzOWViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlZhbGlkYXRpb24gRnJhbWV3b3JrIEphdmFkb2MiIAotCWxpbmtfdG89Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9yZWZlcmVuY2VfdG9jLnhtbCNqYXZhZG9jX2NvbW1vbiI+Ci0JPHRvcGljIGxhYmVsPSJWYWxpZGF0aW9uIEZyYW1ld29yayBBUEkgUmVmZXJlbmNlIiAgaHJlZj0icmVmZXJlbmNlL2FwaS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaHJlZj0icmVmZXJlbmNlL2FwaS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9wYWNrYWdlLXN1bW1hcnkuaHRtbCIvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iVmFsaWRhdGlvbiBGcmFtZXdvcmsgRXh0ZW5zaW9uIFBvaW50cyBSZWZlcmVuY2UiIGhyZWY9InJlZmVyZW5jZS9leHRlbnNpb24tcG9pbnRzL2luZGV4Lmh0bWwiPgotCTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi90b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZG9jLmlzdi90b3BpY3NfRXh0UG9pbnRfUmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNWVjYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvdG9waWNzX0V4dFBvaW50X1JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCSAJPHRvYyBsYWJlbD0iRXh0ZW5zaW9uIFBvaW50cyBSZWZlcmVuY2UiPgotPHRvcGljIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JHcm91cCIgaHJlZj0icmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yR3JvdXAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiIgaHJlZj0icmVmZXJlbmNlL2V4dGVuc2lvbi1wb2ludHMvdmYvb3JnX2VjbGlwc2Vfd3N0X3ZhbGlkYXRpb25fdmFsaWRhdG9yVjIuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5kb2MuaXN2L3ZmZXh0ZG9jcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvdmZleHRkb2NzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0NmFmNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YvdmZleHRkb2NzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTxmaWxlcyBjb21wb25lbnQ9InZmIj48ZmlsZT5vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JWMi5odG1sPC9maWxlPi9uL248ZmlsZT5vcmdfZWNsaXBzZV93c3RfdmFsaWRhdGlvbl92YWxpZGF0b3JHcm91cC5odG1sPC9maWxlPjwvZmlsZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY1YjRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZmU1MjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQbHVnaW4ucHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvVmFsaWRhdGlvblByZWZzX0hlbHBDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZDcyMWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL1ZhbGlkYXRpb25QcmVmc19IZWxwQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPGNvbnRleHRzPgotCTwhLS0gRWNsaXBzZSBWYWxpZGF0aW9uIHByZWZlcmVuY2VzIC0tPgotPGNvbnRleHQgaWQ9Imp2Z3AwMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBwYWdlIGFsbG93cyB5b3UgdG8gdmlldyBvciBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgYWxsIHdvcmtiZW5jaCBwcm9qZWN0cy4gQSB2YWxpZGF0b3IgaXMgYSB0b29sIHRoYXQgY2hlY2tzIHRoYXQgcmVzb3VyY2VzIGNvbmZvcm0gdG8gYSBzcGVjaWZpY2F0aW9uLCBEVEQsIG9yIHNvbWUgb3RoZXIgc2V0IG9mIHJ1bGVzLgotCi1FYWNoIHZhbGlkYXRvciBjYW4gYXBwbHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgY2VydGFpbiBwcm9qZWN0IG5hdHVyZXMsIGFuZCBjZXJ0YWluIHByb2plY3QgZmFjZXRzLiBXaGVuIGEgdmFsaWRhdG9yIGFwcGxpZXMgdG8gYSBwcm9qZWN0IGZhY2V0IG9yIG5hdHVyZSwgdGhlIHdvcmtiZW5jaCB1c2VzIHRoYXQgdmFsaWRhdG9yIG9ubHkgb24gcHJvamVjdHMgdGhhdCBoYXZlIHRoYXQgZmFjZXQgb3IgbmF0dXJlLiBMaWtld2lzZSwgbW9zdCB2YWxpZGF0b3JzIGFwcGx5IG9ubHkgdG8gY2VydGFpbiB0eXBlcyBvZiBmaWxlcywgc28gdGhlIHdvcmtiZW5jaCB1c2VzIHRob3NlIHZhbGlkYXRvcnMgb25seSBvbiB0aG9zZSB0eXBlcyBvZiBmaWxlcy4KLQotU2VsZWN0IHRoZSA8Yj5BbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBwcmVmZXJlbmNlIHNldHRpbmdzPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gYWxsb3cgaW5kaXZpZHVhbCBwcm9qZWN0cyB0byBzZXQgdGhlaXIgb3duIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMuIFRvIGNvbmZpZ3VyZSBuZXcgdmFsaWRhdGlvbiBzZXR0aW5ncyBmb3IgYW4gaW5kaXZpZHVhbCBwcm9qZWN0LCBzZWxlY3QgdGhlIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayBhbmQgc2VsZWN0IDxiPlByb3BlcnRpZXM8L2I+ICZndDsgPGI+VmFsaWRhdGlvbjwvYj4uCi0KLVNlbGVjdCB0aGUgPGI+U3VzcGVuZCBhbGwgdmFsaWRhdG9yczwvYj4gY2hlY2sgYm94IHRvIHByZXZlbnQgdmFsaWRhdGlvbiBhdCB0aGUgZ2xvYmFsIGxldmVsLgotCi1TZWxlY3QgdGhlIDxiPlNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmc8L2I+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0byBzYXZlIGFueSByZXNvdXJjZXMgeW91IGhhdmUgbW9kaWZpZWQgYmVmb3JlIHRoZSB2YWxpZGF0aW9uIGJlZ2lucy4KLQotSW4gdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycywgc2VsZWN0IHRoZSBjaGVjayBib3hlcyBuZXh0IHRvIGVhY2ggdmFsaWRhdG9yIHlvdSB3YW50IHRvIHVzZSBhdCB0aGUgZ2xvYmFsIGxldmVsLiBFYWNoIHZhbGlkYXRvciBoYXMgYSBjaGVjayBib3ggdG8gc3BlY2lmeSB3aGV0aGVyIGl0IGlzIHVzZWQgb24gbWFudWFsIHZhbGlkYXRpb24gb3Igb24gYnVpbGQgdmFsaWRhdGlvbi4gQ2hvb3NlIGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSB2YWxpZGF0b3Igb3IgdXBkYXRlIGl0J3MgZGV0YWlsZWQgc2V0dGluZ3MgYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbiBpbiB0aGUgPGI+U2V0dGluZ3M8L2I+IGNvbHVtbi4gTm90IGFsbCB2YWxpZGF0b3JzIGhhdmUgZGV0YWlsZWQgc2V0dGluZ3MuCi0KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIGxhYmVsPSJWYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWxnbG9iYWxwcmVmLmh0bWwiIGxhYmVsPSJPdmVycmlkaW5nIGdsb2JhbCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J0dW5ldmFsaWRhdC5odG1sIiBsYWJlbD0iVHVuaW5nIHZhbGlkYXRvcnMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcnZhbGVyci5odG1sIiBsYWJlbD0iQ29tbW9uIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBzb2x1dGlvbnMiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9Imp2Z3AwMTAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgTmV3IEZpbHRlciBSdWxlIGRpYWxvZyBhZGRzIGEgbmV3IHJ1bGUgdG8gZWl0aGVyIGFuIEluY2x1ZGUgR3JvdXAgb3IgYW4gRXhjbHVkZSBHcm91cC4gVGhlcmUgYXJlIHNldmVyYWwgdHlwZXMgb2YgcnVsZXM6Ci0KLTxiPkZpbGUgZXh0ZW5zaW9uPC9iPiAtIEEgcnVsZSB0aGF0IGlzIG9ubHkgY29uY2VybmVkIHdpdGggbWF0Y2hpbmcgZmlsZSBleHRlbnNpb25zLCBmb3IgZXhhbXBsZSBodG1sIGZvciBIVE1MIGZpbGVzIG9yIHhtbCBmb3IgWE1MIGZpbGVzLgotCi08Yj5Gb2xkZXIgb3IgZmlsZSBuYW1lPC9iPiAtIEEgcnVsZSBmb3IgbWF0Y2hpbmcgZm9sZGVyIG9yIGZpbGUgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byBhIHByb2plY3QuCi0KLTxiPlByb2plY3QgbmF0dXJlPC9iPiAtIFRoZSBuZXh0IHBhZ2Ugc2hvd3MgYSBkcm9wIGRvd24gbGlzdCBvZiBhbGwgdGhlIGtub3duIHByb2plY3QgbmF0dXJlcy4KLQotPGI+RmFjZXQ8L2I+IC0gVHlwaWNhbGx5IHRoaXMgd291bGQgb25seSBiZSB1c2VkIGJ5IGFkdmFuY2VkIG9yIGludGVybmFsIHVzZXJzLCBhcyB5b3Ugd291bGQgbmVlZCB0byBrbm93IHRoZSBpbnRlcm5hbCBmYWNldCBpZHMuCi0KLTxiPkNvbnRlbnQgVHlwZTwvYj4gLSBUaGUgbmV4dCBwYWdlIHdpbGwgc2hvdyBhIGRyb3AgZG93biBsaXN0IG9mIGFsbCB0aGUga25vd24gY29udGVudCB0eXBlcy4gQ29udGVudCB0eXBlcyBhcmUgbW9yZSBwb3dlcmZ1bCB0aGFuIGZpbGUgZXh0ZW5zaW9ucywgYnV0IGFsc28gc2xvd2VyIHRvIG1hdGNoIGF0IHJ1bnRpbWUuCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianZncDAxMDEiPgotPGRlc2NyaXB0aW9uPkEgcnVsZSBmb3IgbWF0Y2hpbmcgZmlsZSBleHRlbnNpb25zLiBUaGUgZmlsZSBjYW4gYmUgbG9jYXRlZCBhbnl3aGVyZSBpbiB0aGUgcHJvamVjdC4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqdmdwMDEwMiI+Ci08ZGVzY3JpcHRpb24+Rm9sZGVyIG9yIGZpbGUgbmFtZXMuIFlvdSBjYW4gZWl0aGVyIHVzZSBGaWxlIG9yIEZvbGRlciBicm93c2Vycywgb3IgdHlwZSBpbiBhIG5hbWUgZGlyZWN0bHkuIFRoZXNlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byBhIHByb2plY3QuIAotCi1JZiB5b3Ugc2VsZWN0IGEgZmlsZSBvciBmb2xkZXIgdGhhdCBpcyBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiBhIHByb2plY3QsIHRoZSBydWxlIHdpbGwgbm90IGJlIGFjdGl2YXRlZC4KLQotRm9yIGZpbGVzIHlvdSBjYW4gbWF0Y2ggb24gZWl0aGVyIHNpbXBsZSBuYW1lcywgb3IgcXVhbGlmaWVkIG5hbWVzLiBGb3IgZXhhbXBsZSBtYXRjaGluZyBvbiB0aGUgc2ltcGxlIG5hbWUgInByb2R1Y3QueG1sIiwgd2lsbCBtYXRjaCB0aGUgZmlsZSBpbiBhbnkgZGlyZWN0b3J5LiBIb3dldmVyLCBtYXRjaGluZyBvbiB0aGUgcXVhbGlmaWVkIG5hbWUgIldFQi1JTkYvcHJvZHVjdC54bWwiIHdpbGwgb25seSBtYXRjaCB0aGUgZmlsZSBpbiB0aGUgV0VCLUlORiBkaXJlY3RvcnkuIAotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9Imp2Z3AwMTAzIj4KLTxkZXNjcmlwdGlvbj5UaGlzIGlzIGEgbGlzdCBvZiB0aGUgcmVnaXN0ZXJlZCBQcm9qZWN0IG5hdHVyZXMuCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianZncDAxMDQiPgotPGRlc2NyaXB0aW9uPlRoZSBpbnRlcm5hbCBmYWNldCBpZCBpcyBzcGVjaWZpZWQgaGVyZS4gU2luY2UgeW91IG5lZWQgdG8ga25vdyBpbnRlcm5hbCBpZHMgdGhpcyBzZXR0aW5nIGlzIHR5cGljYWxseSBub3QgdXNlZCBieSBlbmQgdXNlcnMuIAotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9Imp2Z3AwMTA1Ij4KLTxkZXNjcmlwdGlvbj5BIGxpc3Qgb2YgYWxsIHRoZSByZWdpc3RlcmVkIENvbnRlbnQgVHlwZXMuIENvbnRlbnQgdHlwZXMgYXJlIG1vcmUgcG93ZXJmdWwgdGhhbiB1c2luZyBmaWxlIGV4dGVuc2lvbnMgb3IgZmlsZSBuYW1lcywgYXMgdGhleSBjYW4gdXNlIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIG1vcmUgcHJlY2lzZWx5IGRlZmluZSBpdCdzIHR5cGUuIEhvd2V2ZXIsIHRoZXkgcmVxdWlyZSBtb3JlIGNvbXB1dGVyIHJlc291cmNlcyB0byBjYWxjdWxhdGUuCi0KLUNvbnRlbnQgdHlwZXMgZm9ybSBoaWVyYXJjaGllcywgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91IHJlcXVpcmUgYW4gZXhhY3QgbWF0Y2gsIG9yIHdoZXRoZXIgc3VidHlwZXMgaW4gdGhlIGhpZXJhcmNoeSBzaG91bGQgbWF0Y2ggYXMgd2VsbC4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFkN2Q1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9WYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotCi08Y29udGV4dHM+Ci0JPCEtLSBWYWxpZGF0aW9uIHNldHRpbmdzIGZvciBwcm9qZWN0IC0tPgotCi08Y29udGV4dCBpZD0ianZwcDAwMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBwcm9qZWN0IHZhbGlkYXRpb24gcGFnZSBhbGxvd3MgeW91IHRvIHZpZXcgb3IgY2hhbmdlIHRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIGZvciBhIHByb2plY3QuIEEgdmFsaWRhdG9yIGlzIGEgdG9vbCB0aGF0IGNoZWNrcyB0aGF0IHJlc291cmNlcyBjb25mb3JtIHRvIGEgc3BlY2lmaWNhdGlvbiwgRFRELCBvciBzb21lIG90aGVyIHNldCBvZiBydWxlcy4KLQotRWFjaCB2YWxpZGF0b3IgY2FuIGFwcGx5IHRvIGNlcnRhaW4gdHlwZXMgb2YgZmlsZXMsIGNlcnRhaW4gcHJvamVjdCBuYXR1cmVzLCBhbmQgY2VydGFpbiBwcm9qZWN0IGZhY2V0cy4gV2hlbiBhIHZhbGlkYXRvciBhcHBsaWVzIHRvIGEgcHJvamVjdCBmYWNldCBvciBuYXR1cmUsIHRoZSB3b3JrYmVuY2ggdXNlcyB0aGF0IHZhbGlkYXRvciBvbmx5IG9uIHByb2plY3RzIHRoYXQgaGF2ZSB0aGF0IGZhY2V0IG9yIG5hdHVyZS4gTGlrZXdpc2UsIG1vc3QgdmFsaWRhdG9ycyBhcHBseSBvbmx5IHRvIGNlcnRhaW4gdHlwZXMgb2YgZmlsZXMsIHNvIHRoZSB3b3JrYmVuY2ggdXNlcyB0aG9zZSB2YWxpZGF0b3JzIG9ubHkgb24gdGhvc2UgdHlwZXMgb2YgZmlsZXMuCi0KLVNlbGVjdCB0aGUgPGI+T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgc2V0IGluIHRoZSB3b3JrYmVuY2ggUHJlZmVyZW5jZXMgcGFnZS4gSWYgdGhlIDxiPk92ZXJyaWRlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXM8L2I+IGNoZWNrIGJveCBpcyBub3QgZW5hYmxlZCwgZ28gdG8gPGI+V2luZG93PC9iPiAmZ3Q7IDxiPlByZWZlcmVuY2VzPC9iPiAmZ3Q7IDxiPlZhbGlkYXRpb248L2I+IGFuZCBzZWxlY3QgdGhlIDxiPkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3M8L2I+IGNoZWNrIGJveC4KLQotU2VsZWN0IHRoZSA8Yj5TdXNwZW5kIGFsbCB2YWxpZGF0b3JzPC9iPiBjaGVjayBib3ggdG8gcHJldmVudCB2YWxpZGF0aW9uIGZvciB0aGlzIHByb2plY3QuCi0KLUluIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGUgY2hlY2sgYm94ZXMgbmV4dCB0byBlYWNoIHZhbGlkYXRvciB5b3Ugd2FudCB0byB1c2UgZm9yIHRoaXMgcHJvamVjdC4gRWFjaCB2YWxpZGF0b3IgaGFzIGEgY2hlY2sgYm94IHRvIHNwZWNpZnkgd2hldGhlciBpdCBpcyB1c2VkIG9uIG1hbnVhbCB2YWxpZGF0aW9uIG9yIG9uIGJ1aWxkIHZhbGlkYXRpb24uIENob29zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIGEgdmFsaWRhdG9yIG9yIGNoYW5nZSBpdCdzIGRldGFpbGVkIHNldHRpbmdzIGJ5IGNsaWNraW5nIHRoZSBidXR0b24gaW4gdGhlIDxiPlNldHRpbmdzPC9iPiBjb2x1bW4uIE5vdCBhbGwgdmFsaWRhdG9ycyBoYXZlIGRldGFpbGVkIHNldHRpbmdzLgotCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiBsYWJlbD0iVmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsZ2xvYmFscHJlZi5odG1sIiBsYWJlbD0iT3ZlcnJpZGluZyBnbG9iYWwgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9ydHVuZXZhbGlkYXQuaHRtbCIgbGFiZWw9IlR1bmluZyB2YWxpZGF0b3JzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3J2YWxlcnIuaHRtbCIgbGFiZWw9IkNvbW1vbiB2YWxpZGF0aW9uIGVycm9ycyBhbmQgc29sdXRpb25zIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqdnBwMDEwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIE5ldyBGaWx0ZXIgUnVsZSBkaWFsb2cgYWRkcyBhIG5ldyBydWxlIHRvIGVpdGhlciBhbiBJbmNsdWRlIEdyb3VwIG9yIGFuIEV4Y2x1ZGUgR3JvdXAuIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIHJ1bGVzOgotCi08Yj5GaWxlIGV4dGVuc2lvbjwvYj4gLSBBIHJ1bGUgdGhhdCBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG1hdGNoaW5nIGZpbGUgZXh0ZW5zaW9ucywgZm9yIGV4YW1wbGUgaHRtbCBmb3IgSFRNTCBmaWxlcyBvciB4bWwgZm9yIFhNTCBmaWxlcy4KLQotPGI+Rm9sZGVyIG9yIGZpbGUgbmFtZTwvYj4gLSBBIHJ1bGUgZm9yIG1hdGNoaW5nIGZvbGRlciBvciBmaWxlIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gYSBwcm9qZWN0LgotCi08Yj5Db250ZW50IFR5cGU8L2I+IC0gVGhlIG5leHQgcGFnZSB3aWxsIHNob3cgYSBkcm9wIGRvd24gbGlzdCBvZiBhbGwgdGhlIGtub3duIGNvbnRlbnQgdHlwZXMuIENvbnRlbnQgdHlwZXMgYXJlIG1vcmUgcG93ZXJmdWwgdGhhbiBmaWxlIGV4dGVuc2lvbnMsIGJ1dCBhbHNvIHNsb3dlciB0byBtYXRjaCBhdCBydW50aW1lLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNkM2JiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBWYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBWYWxpZGF0aW9uUHJvalByZWZzX0hlbHBDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMDcwOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUcmFuc2xhdGlvbiBJbnN0cnVjdGlvbjogc2VjdGlvbiB0byBiZSB0cmFuc2xhdGVkCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUGx1Z2luLm5hbWUgPSBXU1QgdmFsaWRhdGlvbiBpbmZvcG9wIHBsdWctaW4KLVBsdWdpbi5wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjI3YmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICA8Y29udGV4dHMgZmlsZT0iVmFsaWRhdGlvblByb2pQcmVmc19IZWxwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpIiAvPgotCTxjb250ZXh0cyBmaWxlPSJWYWxpZGF0aW9uUHJlZnNfSGVscENvbnRleHRzLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aSIgLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIwY2FhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTJmNDYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0NDgwYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2OGNmOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIENvcmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBjb21tb24gY29yZSBmdW5jdGlvbmFsaXR5LgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFkNDA5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4yLjUucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmplbS51dGlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NGZjMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI1YjBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDI5NDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBDb21tb24gQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIGNvbW1vbiBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCAxNCwgMjAxMDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NGZjMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI1YjBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM5MjViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbAotZmVhdHVyZXMKLXBsdWdpbnMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg2MjUwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzMwZTc4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5zb3VyY2UgIAotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODM2YWY0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBjb21tb24gdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGM3MDkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4yLjUucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uYXBpLmRvYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmRvYy5pc3YiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDE0LCAyMDEwPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi0KLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQotICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgotCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLQotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBhZjdkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxMTY0Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwZmJhMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIGNvbW1vbiBVSSBmdW5jdGlvbmFsaXR5LgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCAxNCwgMjAxMFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKLVxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKLVxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNzE5OTAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMi41LnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODRjYTMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzMTRlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzBiNzNjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTdkZDcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDQzYWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIFVJIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBDb21tb24gVUkuCi0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgMTQsIDIwMTBcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzMTRlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzBiNzNjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIENvbW1vbiBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODg5NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqZW11dGlsIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqZW11dGlsLW5vbndvcmtibmVjaCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGViZGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLUBkb3QKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2NTQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2VmaWxlPWZhbHNlCi1vcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dsZXZlbD1XQVJOSU5HClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTQxMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmplbS51dGlsPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzI5NTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gQXByIDE1IDIxOjE1OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTc5Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotI1R1ZSBKdWwgMzEgMjA6Mzk6NDggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGUxYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEZlYiAyMSAxMDowOToxOSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWZvcm1hdHRlcl9wcm9maWxlPV9qdmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEwCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0NmIyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jRnJpIE1heSAxMyAxMDoxMDowNCBFRFQgMjAwNQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MgotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0yCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0yCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0yCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjMzZTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamVtLnV0aWw7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMS4zLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlciwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSIzLjguMSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwyLjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9QRVJGTVNSX1JFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1BFUkZNU1JfUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwZTJkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1BFUkZNU1JfUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLW9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZSBjb2RlIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGVyZm1zci5qYXIgbG9hZGVkIGFzIGJpbmFyeSBpbiB0aGlzCi1wcm9qZWN0LiBTaW5jZSB0aGlzIGlzIG9wdGlvbmFsLCB3ZSBuZWVkZWQgdG8gYmUgYWJsZSB0byBjb21waWxlIHdpdGhvdXQgdGhlIHRydWUKLXBsdWdpbiBiZWluZyBhdmFpbGFibGUuIFNvIHdlIGNyZWF0ZWQgdGhlIHN0dWIgamFyIGNvbnRhaW5pbmcganVzdCB3aGF0IHdlIG5lZWRlZC4KLQotSWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGUgc3R1YiBqYXIsIHlvdSB3aWxsIG5lZWQgdG8gY2hlY2tvdXQKLXRoZSBmb2xkZXIgb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIuIFRoaXMgd2lsbCB0aGVuCi1iZSBhIHNlcGFyYXRlIHByb2plY3QuIFlvdSBjYW4gdGhlbiBtYWtlIHRoZSBjaGFuZ2VzIHRoZXJlLCBhbmQgdGhlbiBmb2xsb3dpbmcgdGhlCi1SRUFETUUgaW4gdGhhdCBwcm9qZWN0IHRvIGNyZWF0ZSBhbmQgY29tbWl0IHRoZSBjaGFuZ2VzLiAKLQotVGhlIGphciBpcyBpbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgsIGJ1dCBpdCBpcyBub3QgZXhwb3J0ZWQgYW5kIGlzIG5vdCBpbgotdGhlIHBsdWdpbi54bWwgb3IgYnVpbGQucHJvcGVydGllcy4gVGhpcyBtZWFucyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24KLWJ1dCBpdCB3b24ndCBzaG93IHVwIGluIHRoZSBydW50aW1lIHdvcmtiZW5jaC4KLQotMDUvMTMvMjAwOSBTZWUgYnVnIDI3NDUzNCAiQ2FuIHdlIHJlbW92ZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUiCi1Ob3RlOiB0aGUgb3B0aW9uYWwgcHJlcmVxLCAKLSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLXdhcyByZW1vdmVkIHNpbmNlIGl0IHdhcyBjb25mdXNpbmcgdG8gYnVpbGQgb3IgcmVsZW5nIHRlYW1zLCB3aG8gd2FudCB0byBtYWtlIAotc3VyZSB0aGV5IF9jb3VsZF8gZ2V0IGFsbCB0aGUgYnVuZGxlcywgb3B0aW9uYWwgb3Igbm90LCBpZiB0aGV5IHdhbnRlZCB0by4gCi1XaGVyZWFzIHRoaXMgamFyIGlzIG1vcmUgZm9yIGRpYWdub3Npbmcgb3IgY2hlY2tpbmcgcGVyZm9ybWFuY2UgaXNzdWVzIC4uLiBub3RoaW5nIAotdGhhdCBpcyBkb25lIGFueSBsb25nZXIgb24gdGhpcyBjb2RlLiBUaGUgY29kZSBpdHNlbGYgaGFzbid0IGJlZW4gY2hhbmdlZCwgc28gc2hvdWxkIGJlIAotZWFzeSB0byByZXN1cmVjdCBpZiBldmVyIHJlcXVpcmVkIGluIHRoZSBmdXR1cmUuIElmIHRoaXMgY29kZSBpcyBldmVyIGNoYW5nZWQgZHJhc3RpY2FsbHksIAotc3VjaCBhcyByZWZhY3RvcmVkLCBJJ20gbm90IHN1cmUgdGhlIG9sZCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBjb2RlIG5lZWRzIHRvIGJlIGNhcnJpZWQgCi1mb3J3YXJkLCBhcyBJIHRoaW5rIHRoZXJlIGFyZSBuZXdlciBtZXRob2RzIG9mIGRvaW5nIHNpbWlsYXIgdGhpbmdzLCB0aGF0IHdvdWxkbid0IHJlcXVpcmUKLWEgImRldmVsb3BtZW50IHRpbWUgb25seSIgYnVuZGxlIGFzIGFuIG9wdGlvbmFsIHByZS1yZXEuICAKZGlmZiAtLWdpdCAiYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIiAiYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4ZTk0YS4uMDAwMDAwMAotLS0gImEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLURvIG5vdCBpbmNsdWRlIGEgbmV3IGRlcGVuZGVuY3kgcGx1Z2luIHRvIHRoZSBNQU5JRkVTVCBmb3IgdGhpcyBwbHVnaW5kISEhCi0KLVRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGlzIHBsdWdpbiBpcyBhbHNvIGV4ZWN1dGVkIG91dHNpZGUgb2YgRWNsaXBzZSBmcmFtZXdvcmssIHN1Y2ggSUJNIFdlYnNwaGVyZSBBcHBsaWNhdGlvbiBTZXJ2ZXIgKGMpIElCTS4gV2UgY2Fubm90IGFkZAotbmV3IGRlcGVuZGVuY2llcyB0byB0aGUgcGx1Z2luIGJlY2F1c2UgdGhlIGN1cnJlbnQgc2V0IGlzIGNvbnNpZGVyZWQgdG8gYmUgQVBJLiBBZGRpbmcgYSBuZXcgc2V0IHdpdGhvdXQgY29uc3VsdGluZyB0aG9zZSB1c2VycyB3b3VsZCBicmVhawotdGhlbS4KLQotVGhlIGV4dGVybmFsIEFQSSBpcyBhbnl0aGluZyBpbiB0aGUgamVtdXRpbC1ub253b3JrYmVuY2ggZm9sZGVyLiBJZiBpdCBpcyBvbmx5IGZvciBhIGNsYXNzIGluIHRoZSBvdGhlciBzb3VyY2UgZm9sZGVyKHMpIGl0IG1heSBiZSBPSyBzaW5jZSB0aGV5IHdvdWxkIG5vdCBiZSAKLXVzaW5nIHRoYXQgY29kZS4gQnV0IGl0IHdvdWxkIGJlIGJlc3QgdG8gY29uc3VsdCB3aXRoIHRoZW0gZmlyc3QuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNlYTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPjxoZWFkPjx0aXRsZT5BYm91dDwvdGl0bGU+Ci0KLQotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L2hlYWQ+PGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMGQ4NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgotc3JjLmluY2x1ZGVzID0gc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gamVtdXRpbC8sXAotICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8sXAotICAgICAgICAgICBqZW11dGlsLW5vbndvcmtibmVjaC8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLWV4dHJhLi4gPSAuL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9Mb2dFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvTG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5NzJmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9Mb2dFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIHdoZW4gbG9nZ2luZyBpbmZvcm1hdGlvbiB3aGljaCBzaG91bGQgYmUgZ3JvdXBlZCB0b2dldGhlci4gSW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGV2ZXJ5IHRpbWUgaXQKLSAqIGlzIG5lZWRlZCwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGNyZWF0ZSBhbiBpbnN0YW5jZSBhbmQgcmV1c2UgaXQuCi0gKiA8cD4KLSAqIEN1cnJlbnRseSB0aGUgb25seSBmaWVsZHMgdGhhdCBhcmUgbG9nZ2VkIGFyZSB0aGUge0BsaW5rICNnZXRUZXh0KCl9IGFuZCB7QGxpbmsgI2dldFRhcmdldEV4Y2VwdGlvbigpfS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dFbnRyeSB7Ci0KLQlwcml2YXRlIGludCBfZXhlY3V0aW9uTWFwID0gMDsKLQotCXByaXZhdGUgVGhyb3dhYmxlIF9jYXVnaHRFeGNlcHRpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgX3Byb3BlcnRpZXNGaWxlTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBsb2NhbGVPZk9yaWdpbiA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBzb3VyY2VJZGVudGlmaWVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgZWxhcHNlZFRpbWU7Ci0KLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZVR5cGVJZGVudGlmaWVyOwotCi0JLyoqCi0JICogVGhlIGZpbGUgbmFtZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG5hbWUgd2hpY2ggY2FuIGJlIHVzZWQgYnkgUmVzb3VyY2VCdW5kbGUgdG8gbG9hZCB0aGUgc3RyaW5nIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuIFRoZSBwYXJhbWV0ZXIgbXVzdCBub3QKLQkgKiBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnRpZXNGaWxlTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBMb2dFbnRyeShTdHJpbmcgcHJvcGVydGllc0ZpbGVOYW1lKSB7Ci0JCXNldFByb3BlcnRpZXNGaWxlTmFtZShwcm9wZXJ0aWVzRmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTG9nRW50cnkoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IGV4ZWN1dGlvbiBtYXAKLQkgKiAKLQkgKiBAcmV0dXJuIGV4ZWN1dGlvbiBtYXAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4ZWN1dGlvbk1hcCgpIHsKLQkJcmV0dXJuIF9leGVjdXRpb25NYXA7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9wZXJ0aWVzIGZpbGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gcHJvcGVydGllcyBmaWxlIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9wcm9wZXJ0aWVzRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRhcmdldCBleGNlcHRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRhcmdldCBleGNlcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldFRhcmdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIF9jYXVnaHRFeGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0IGxvY2FsZSBvZiBvcmlnaW4KLQkgKiAKLQkgKiBAcmV0dXJuIGxvY2FsZSBvZiBvcmlnaW4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsZU9mT3JpZ2luKCkgewotCQlyZXR1cm4gbG9jYWxlT2ZPcmlnaW47Ci0JfQotCi0JLyoqCi0JICogR2V0IHNvdXJjZSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gc291cmNlIGlkZW50aWZpZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZWlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBzb3VyY2VJZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEdldCBlbGFwc2VkIHRpbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGVsYXBzZWQgdGltZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxhcHNlZFRpbWUoKSB7Ci0JCXJldHVybiBlbGFwc2VkVGltZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1lc3NhZ2UgdHlwZSBpZGVudGlmaWVyCi0JICogCi0JICogQHJldHVybiBtZXNzYWdlIHR5cGUgaWRlbnRpZmllciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVR5cGVJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gbWVzc2FnZVR5cGVJZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIFNldCBleGVjdXRpb24gbWFwCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4ZWN1dGlvbk1hcChpbnQgbWFwKSB7Ci0JCV9leGVjdXRpb25NYXAgPSBtYXA7Ci0JfQotCi0JLyoqCi0JICogU2V0IHByb3BlcnRpZXMgZmlsZSBuYW1lCi0JICogCi0JICogQHBhcmFtIGZOYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydGllc0ZpbGVOYW1lKFN0cmluZyBmTmFtZSkgewotCQlfcHJvcGVydGllc0ZpbGVOYW1lID0gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRhcmdldCBleGNlcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZXhjCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RXhjZXB0aW9uKFRocm93YWJsZSBleGMpIHsKLQkJX2NhdWdodEV4Y2VwdGlvbiA9IGV4YzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgc3RhY2t0cmFjZSBvZiBjdXJyZW50IHN0YWNrIChhdCB0aGUgdGltZSBvZiBjYWxsIHRvIHRoaXMgbWV0aG9kKSB0byB0aGUgdGV4dCBidWZmZXIuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kU3RhY2tUcmFjZSgpIHsKLQkJLy8gR3JhYiB0aGUgc3RhY2sgdHJhY2UgZnJvbSB0aGUgVGhyZWFkIC4uLgotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoYnl0ZU91dHB1dCk7Ci0JCS8vIENhbid0IGNhbGwgVGhyZWFkLmR1bXBTdGFjaygpIGJlY2F1c2UgaXQgZG9lc24ndCB0YWtlIGEgd3JpdGVyIGFzIGlucHV0LgotCQkvLyBDb3B5IGl0cyBtZWNoYW5pc20gaW5zdGVhZC4KLQkJbmV3IEV4Y2VwdGlvbigiU3RhY2sgdHJhY2UiKS5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOyAvLyROT04tTkxTLTEkCi0JCXByaW50V3JpdGVyLmZsdXNoKCk7Ci0KLQkJLy8gYW5kIHVwZGF0ZSB0aGUgdGV4dCB0byB0aGUgTG9nRW50cnkncyB0ZXh0LgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldFRleHQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChieXRlT3V0cHV0LnRvU3RyaW5nKCkpOwotCQlzZXRUZXh0KGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRleHQuCi0JICogCi0JICogQHJldHVybiB0ZXh0IG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgc3RyaW5nKSB7Ci0JCXRleHQgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0IGV2ZXJ5IGVudHJ5IHRvIHRoZSBkZWZhdWx0IHZhbHVlIGV4Y2VwdCB0aGUgcHJvcGVydGllcyBmaWxlIG5hbWUuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXNldEV4ZWN1dGlvbk1hcCgwKTsKLQkJc2V0VGFyZ2V0RXhjZXB0aW9uKG51bGwpOwotCQlsb2NhbGVPZk9yaWdpbiA9IG51bGw7Ci0JCXNvdXJjZUlkZW50aWZpZXIgPSBudWxsOwotCQllbGFwc2VkVGltZSA9IG51bGw7Ci0JCXNldFRleHQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGxvY2FsZSBvZiBvcmlnaW4uCi0JICogCi0JICogQHBhcmFtIG9yaWdpbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsZU9mT3JpZ2luKFN0cmluZyBvcmlnaW4pIHsKLQkJbG9jYWxlT2ZPcmlnaW4gPSBvcmlnaW47Ci0JfQotCi0JLyoqCi0JICogU2V0IHNvdXJjZSBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VJRChTdHJpbmcgaWQpIHsKLQkJc291cmNlSWRlbnRpZmllciA9IGlkOwotCX0KLQotCS8qKgotCSAqIFNldCBlbGFwc2VkIHRpbWUuCi0JICogCi0JICogQHBhcmFtIHRpbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGFwc2VkVGltZShsb25nIHRpbWUpIHsKLQkJZWxhcHNlZFRpbWUgPSBTdHJpbmcudmFsdWVPZih0aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc291cmNlIGlkZW50aWZpZXIuCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQlzZXRTb3VyY2VJRChzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCBtZXNzYWdlIHR5cGUgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0VGV4dChTdHJpbmcpfSBpbnN0ZWFkIGFuZCBjYWxsaW5nIGl0IHdpdGggdGhlIHJlc3VsdCBvZiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSl9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVR5cGVJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJbWVzc2FnZVR5cGVJZGVudGlmaWVyID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldCBtZXNzYWdlIHR5cGUgaWQuIFNhbWUgYXMgPGNvZGU+c2V0TWVzc2FnZVR5cGVJZGVudGlmaWVyLjwvY29kZT4KLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0VGV4dChTdHJpbmcpfSBpbnN0ZWFkIGFuZCBjYWxsaW5nIGl0IHdpdGggdGhlIHJlc3VsdCBvZiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQjZm9ybWF0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSl9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVR5cGVJRChTdHJpbmcgc3RyaW5nKSB7Ci0JCXNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0b2tlbnMuIChDdXJyZW50bHkgdGhpcyBpcyBpZ25vcmVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRva2VucyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoYnl0ZU91dHB1dCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQlwcmludFdyaXRlci5wcmludGxuKHRleHQpOwotCQlpZiAoX2NhdWdodEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQlfY2F1Z2h0RXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShwcmludFdyaXRlcik7Ci0JCX0KLQkJcHJpbnRXcml0ZXIuZmx1c2goKTsKLQkJcmV0dXJuIGJ5dGVPdXRwdXQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyN2ZkYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBsdWdpbiBlcnJvciBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKLSAqIEJhc2ljIGxvZyByZW5kZXJlciBpbnRlcmZhY2UuIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBleHRlbnNpb24gPGNvZGU+SUxvZ1JlbmRlcmVyMi48L2NvZGU+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dSZW5kZXJlciB7Ci0KLQkvKioKLQkgKiBMb2dnZWQgdG8gY29uc29sZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05TT0xFX0RFU0NSSVBUSU9OID0gImNvbnNvbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMb2dnZWQgdG8gd29ya2JlbmNoLgotCSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdPUktCRU5DSF9ERVNDUklQVElPTiA9ICJ3b3JrYmVuY2ggbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTm90IGxvZ2dlZC4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBOT0xPR19ERVNDUklQVElPTiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMb2cgbGV2ZWxzLiBUaGVzZSBhcmUgZGVwcmVjYXRlZCwgdXNlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9jb2RlPiBjb2RlcyBpbnN0ZWFkLgotCSAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19FUlJPUiA9IDA7Ci0KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBMT0dfVFJBQ0UgPSAxOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX1dBUk5JTkcgPSAyOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX0lORk8gPSAzOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFBsdWdpbklEID0gIm9yZy5lY2xpcHNlLmplbS51dGlsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9nIHRoZSBzdHJpbmcgYXQgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSk7Ci0KLQkvKioKLQkgKiBTdGFydCBvciBzdG9wIHRoZSB0cmFjaW5nLgotCSAqIAotCSAqIEBwYXJhbSBGbGFnCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBzdGFydCB0aGUgdHJhY2luZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBGbGFnKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2IxM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotIAotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBMb2cgcmVuZGVyZXIgdGhhdCBwcm92aWRlcyBtb3JlIGZ1bmN0aW9uLiBCYXNpY2FsbHkgaXQgY2FuIGhhbmRsZQotICogdGhlIGxvZ2dpbmcgb2Ygc3BlY2lmaWMgdHlwZXMgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYW4gdGhlIGRlZmF1bHQKLSAqIGNvbnZlcnNpb24gdG8gc3RyaW5nIHN1cHBsaWVkIGJ5IExvZ2dlci4KLSAqIAotICogSXQgYWxzbyB1c2VzIHRoZSBMZXZlbCBjbGFzc2VzIGZyb20gamF2YS51dGlsLmxvZ2dpbmcgYXMgdGhlIGxvZ2dpbmcgbGV2ZWxzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nUmVuZGVyZXIyIGV4dGVuZHMgSUxvZ1JlbmRlcmVyIHsKLQkKLQkvKioKLQkgKiBXaGVuIExvZ2dlci5zZXRMZXZlbChERUZBVUxUKTogcmVzdG9yZSB0byB3aGF0IHRoZSBkZWZhdWx0IGxldmVsIHdhcy4KLQkgKiBXaGVuIGxvZyguLi4sREVGQVVMVCk6IExvZyBhdCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhlIHR5cGUgb2Ygb2JqZWN0LgotCSAqLwotCXN0YXRpYyBmaW5hbCBMZXZlbCBERUZBVUxUID0gbmV3IExvZ2dlci5Mb2NhbExldmVsKCJERUZBVUxUIiwgSW50ZWdlci5NQVhfVkFMVUUtMSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBXaGVuIGxvZyguLi4sVFJBQ0UpIDogTG9nIG9ubHkgd2hlbiBpbiB0cmFjZSBtb2RlLgotCSAqIERvbid0IHVzZSBpbiBMb2dnZXIuc2V0TGV2ZWwoKS4gSGFzIG5vIG1lYW5pbmcgaW4gdGhhdCBjYXNlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBMZXZlbCBUUkFDRSA9IG5ldyBMb2dnZXIuTG9jYWxMZXZlbCgiVFJBQ0UiLCBJbnRlZ2VyLk1BWF9WQUxVRS0yKTsJIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgdGhyb3dhYmxlKS4KLQkgKiAKLQkgKiBAcGFyYW0gdAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKFRocm93YWJsZSB0LCBMZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYW4gb2JqZWN0KS4KLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBib29sZWFuIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgYm9vbGVhbikuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhib29sZWFuIGIsIExldmVsIGxldmVsKTsJCi0KLQkvKioKLQkgKiBMb2cgdGhlIGNoYXIgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBjaGFyKS4KLQkgKiAKLQkgKiBAcGFyYW0gYwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbGV2ZWwpOwkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBieXRlKS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgc2hvcnQgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBzaG9ydCkuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsZXZlbCk7Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBpbnQgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYW4gaW50KS4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsZXZlbCk7Ci0KLQkvKioKLQkgKiBMb2cgdGhlIGxvbmcgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBsb25nKS4KLQkgKiAKLQkgKiBAcGFyYW0gbAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbGV2ZWwpOwotCi0JLyoqCi0JICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGZsb2F0KS4KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGZsb2F0IGYsIExldmVsIGxldmVsKTsKLQotCS8qKgotCSAqIExvZyB0aGUgZG91YmxlIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgZG91YmxlKS4KLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlTdHJpbmcgbG9nKGRvdWJsZSBkLCBMZXZlbCBsZXZlbCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9KREtDb25zb2xlUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0pES0NvbnNvbGVSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGEzOTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0pES0NvbnNvbGVSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBsdWdpbiBlcnJvciBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKLSAqIERlZmF1bHQgbG9nIHJlbmRlcmVyIHRvIHVzZSB3aGVuIG5vdCBydW5uaW5nIHVuZGVyIEVjbGlwc2UuIEl0IGxvZ3MgdG8gc3lzb3V0IGFuZCBzeXNlcnIuCi0gKiAKLSAqIEBzaW5jZSAxLjEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBKREtDb25zb2xlUmVuZGVyZXIgaW1wbGVtZW50cyBJTG9nUmVuZGVyZXIyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmVHJhY2VNb2RlID0gZmFsc2U7IC8vIHdpbGwgd2UgYWN0dWFsbHkgcHVuY2ggdHJhY2UgbWVzc2FnZWQgb3Igbm90Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMb2dnZXIgZk15TG9nZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdGVyIHRha2luZyBhIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEpES0NvbnNvbGVSZW5kZXJlcihMb2dnZXIgbG9nZ2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNeUxvZ2dlciA9IGxvZ2dlcjsKLQkJZlRyYWNlTW9kZSA9IGZNeUxvZ2dlci5nZXRUcmFjZU1vZGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCi0JCWlmICh0eXBlID09IElMb2dSZW5kZXJlci5MT0dfVFJBQ0UgJiYgIWZUcmFjZU1vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAodHlwZSA9PSBJTG9nUmVuZGVyZXIuTE9HX0VSUk9SKQotCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCWVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkNPTlNPTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI3NldFRyYWNlTW9kZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYWNlTW9kZShib29sZWFuIGZsYWcpIHsKLQotCQlpZiAoZlNldHRpbmdUcmFjZSkKLQkJCXJldHVybjsKLQkJZlNldHRpbmdUcmFjZSA9IHRydWU7Ci0JCWZUcmFjZU1vZGUgPSBmbGFnOwotCQlmTXlMb2dnZXIuc2V0VHJhY2VNb2RlKGZsYWcpOwotCQlmU2V0dGluZ1RyYWNlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzdHJpbmcgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2coU3RyaW5nIG1zZywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IExldmVsLlNFVkVSRSkKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJcmV0dXJuIElMb2dSZW5kZXJlci5DT05TT0xFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBpZiBsb2dnaW5nIGF0IHRoZSBnaXZlbiBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgbG9nZ2luZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2dnaW5nKExldmVsIGxvZ0xldmVsKSB7Ci0JCXJldHVybiBmVHJhY2VNb2RlIHx8IGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsb2dMZXZlbCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYm9vbGVhbiwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYnl0ZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYnl0ZSBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coY2hhciwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coZG91YmxlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhkb3VibGUgZCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGQpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGZsb2F0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoZiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coaW50LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGkpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGxvbmcsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGwpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YobyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coc2hvcnQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKHNob3J0IHMsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihzKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhqYXZhLmxhbmcuVGhyb3dhYmxlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhUaHJvd2FibGUgdCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLlNFVkVSRTsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKGZNeUxvZ2dlci5leGNlcHRpb25Ub1N0cmluZyh0KSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0xvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OWQ5NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBsdWdpbiBlcnJvciBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKLSAqIFRoaXMgaXMgYSBiYXNlLCBVSSBpbmRlcGVuZGVudCBsb2dnZXIuICAgSXQgd2lsbAotICogY29uc3RydWN0IGEgY29uc2lzdGVudCBtc2cuIGJvZHksIGFuZCBjYWxsIGFuIGVuZmlyb25tZW50IHNwZWNpZmljIElMb2dSZW5kZXJlci4KLSAqIEJ5IGRlZmF1bHQsIHRoaXMgbG9nZ2VyIHdpbGwgdXNlIGEgY29uc29sZSBiYXNlZCBJTG9nUmVuZGVyZXIsCi0gKiBhbmQgYSBKMkVFIFBsdWdpbiBpZGVudGlmaWNhdGlvbi4KLSAqIAotICogPHA+Ci0gKiBXaGVuIHJ1bm5pbmcgb3V0c2lkZSBvZiBFY2xpcHNlLCB0aGUgdHJhY2UgYW5kIGxvZ2dpbmcgbGV2ZWwgY29tZSBmcm9tIHRoZSBzeXN0ZW0gcHJvcGVydGllcwotICogPHVsPgotICogCQk8bGk+ImRlYnVnIiAoPSJ0cnVlIikgLSBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uIAotICogCQk8bGk+ImxvZ0xldmVsIiAoPSJsZXZlbCIgd2hlcmUgImxldmVsIiBpcyBhIGxldmVsIHN0cmluZywgZS5nLiBTRVZFUkUsIFdBUk5JTkcsIGV0Yy4gZnJvbSB0aGUgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+IGNsYXNzKS4KLSAqIAkJCVRoZSBkZWZhdWx0IGlzICJXQVJOSU5HIi4KLSAqIDwvdWw+Ci0gKiAKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCQotCS8vIFRoaXMgaXMgdXNlZCBieSBJTG9nUmVuZGVyZXIyIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBsZXZlbC4KLQlzdGF0aWMgY2xhc3MgTG9jYWxMZXZlbCBleHRlbmRzIExldmVsIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MjczMzU3MDc0NzY3ODU0ODgzTDsKLQotCQlwdWJsaWMgTG9jYWxMZXZlbChTdHJpbmcgbmFtZSwgaW50IGxldmVsKSB7Ci0JCQlzdXBlcihuYW1lLCBsZXZlbCk7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgYm9vbGVhbiBmVHJhY2VNb2RlID0gZmFsc2U7IC8vIHdpbGwgd2UgYWN0dWFsbHkgcHVuY2ggdHJhY2UgbWVzc2FnZWQgb3Igbm90ICAgICAgICAgICAgICAKLQlwcml2YXRlIFN0cmluZyBmUGx1Z2luSUQ7Ci0JcHJpdmF0ZSBJTG9nUmVuZGVyZXIgZlJlbmRlcmVyID0gbnVsbDsKLQlwcml2YXRlIElMb2dSZW5kZXJlcjIgcmVuZGVyZXIyID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIGZMaW5lU2VwZXJhdG9yOwotCXByaXZhdGUgTGV2ZWwgbGV2ZWw7Ci0JcHJpdmF0ZSBMZXZlbCBkZWZhdWx0TGV2ZWwgPSBMZXZlbC5TRVZFUkU7CS8vIEJ5IGRlZmF1bHQgb25seSBzZXZlcmUgb3IgZ3JlYXRlciBhcmUgbG9nZ2VkLgotCXByaXZhdGUgU3RyaW5nIGxvZ0ZpbGVOYW1lOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEZWZhdWx0TG9nZ2VyUGx1Z2luID0gSUxvZ1JlbmRlcmVyLkRlZmF1bHRQbHVnaW5JRDsKLQlzdGF0aWMgcHJpdmF0ZSBIYXNodGFibGUgTG9nZ2VycyA9IG5ldyBIYXNodGFibGUoKTsgLy8gS2VlcCB0cmFjayBvZiBhbGwgdGhlIExvZ2dlcnMKLQlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIExvZ01hcmsgPSB7ICIqKiogRVJST1IgKioqICIsIC8vJE5PTi1OTFMtMSQKLQkJIltUcmFjZV0gIiwgLy8kTk9OLU5MUy0xJAotCQkiKysrIFdhcm5pbmcgKysrICIsIC8vJE5PTi1OTFMtMSQKLQkJIkluZm8gIiB9OyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBGaWxsZXIgPSAiICAgICI7IC8vIFVzZSB0aGlzIHRvIGluZGVudCBtc2cuIGJvZHkgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBMb2dnZXIoKSB7Ci0JCXRoaXMoSUxvZ1JlbmRlcmVyLkRlZmF1bHRQbHVnaW5JRCk7Ci0JfQotCQotCXByb3RlY3RlZCBMb2dnZXIoU3RyaW5nIHBsdWdpbklEKSB7Ci0JCWZQbHVnaW5JRCA9IHBsdWdpbklEOwotCQlzZXRSZW5kZXJlcihuZXcgSkRLQ29uc29sZVJlbmRlcmVyKHRoaXMpKTsJLy8gU2V0IHVwIGRlZmF1bHQgdG8gdGhpcy4gU29tZW9uZSBjYW4gY2hhbmdlIGl0IGxhdGVyLgotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RhY2t0cmFjZSBhcyBhIHByaW50IGZvcm1hdHRlZCBzdHJpbmcuCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIHRoZSBzdGFja3RyYWNlIGFzIGEgc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXhjZXB0aW9uVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsKLQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcikpOwotCQlyZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc3lzdGVtIGRlZmF1bHQgbG9nZ2VyLiBUaGlzIGlzIHVzZWQgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBrbm93IGlmIHRoZXkKLQkgKiBhcmUgcnVubmluZyBpbiBFY2xpcHNlIG9yIG91dHNpZGUgb2YgaXQuIFRoaXMgd2F5IHRoZXkgaGF2ZSBhIGNvbW1vbiBsb2dnZXIgZm9ybWF0Ci0JICogd2hpY2ggc3dpdGNoIGNvcnJlY3RseS4KLQkgKiBAcmV0dXJuIGRlZmF1bHQgbG9nZ2VyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJTG9nZ2VyIGRlZmF1bHRMb2dnZXIgPSAoTG9nZ2VyKSBMb2dnZXJzLmdldChEZWZhdWx0TG9nZ2VyUGx1Z2luKTsKLQkJaWYgKGRlZmF1bHRMb2dnZXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdExvZ2dlciA9IG5ldyBMb2dnZXIoKTsKLQkJCWRlZmF1bHRMb2dnZXIuaW5pdCgpOwotCQkJTG9nZ2Vycy5wdXQoRGVmYXVsdExvZ2dlclBsdWdpbiwgZGVmYXVsdExvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRMb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbG9nZ2VyIGZvciBhIHNwZWNpZmljIHBsdWdpbi4KLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyBwbHVnZ2luLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwpCi0JCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcigpOwotCQlMb2dnZXIgTG9nZ2VyID0gKExvZ2dlcikgTG9nZ2Vycy5nZXQocGx1Z2luSWQpOwotCQlpZiAoTG9nZ2VyID09IG51bGwpIHsKLQkJCUxvZ2dlciA9IG5ldyBMb2dnZXIocGx1Z2luSWQpOwotCQkJTG9nZ2VyLmluaXQoKTsKLQkJCUxvZ2dlcnMucHV0KHBsdWdpbklkLCBMb2dnZXIpOwotCQl9Ci0JCXJldHVybiBMb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgYnkgc3ViY2xhc3MgdG8gZ2V0IGEgbG9nZ2VyIGlmIGl0IGV4aXN0cywgYnV0IG5vdCBjcmVhdGUgb25lLgotCSAqIEBwYXJhbSBwbHVnaW5JZAotCSAqIEByZXR1cm4gbG9nZ2VyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXN0YXRpYyBwcm90ZWN0ZWQgTG9nZ2VyIGdldExvZ2dlcklmRXhpc3RzKFN0cmluZyBwbHVnaW5JZCkgewotCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkKLQkJCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiAoTG9nZ2VyKSBMb2dnZXJzLmdldChwbHVnaW5JZCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwbHVnaW4gaWQgZm9yIHRoaXMgbG9nZ2VyLgotCSAqIEByZXR1cm4gcGx1Z2luaWQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gZlBsdWdpbklEOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHRyYWNlIG1vZGUgZm9yIHRoaXMgbG9nZ2VyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0cmFjaW5nIGlzIGdvaW5nIG9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFRyYWNlTW9kZSgpIHsKLQkJcmV0dXJuIGZUcmFjZU1vZGU7Ci0JfQotCQotCS8qCi0JICogSW5kZW50IHRoZSBNc2cuIEJvZHkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgbG9nCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGVudE1zZyhTdHJpbmcgbXNnLCBTdHJpbmdCdWZmZXIgbG9nTXNnKSB7Ci0JCS8vIExpbmUgc2VwZXJhdG9yIGlzIGRpZmZlcmVudCBvbiBkaWZmZXJlbnQgcGxhdGZvcm0sIHVuaXggPSBcbiwgd2luZG93cyBcclxuIGFuZCBtYWMgXHIKLQkJU3RyaW5nIHNlcCA9IGZMaW5lU2VwZXJhdG9yOwotCQlpZiAobXNnLmluZGV4T2YoIlxyXG4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc2VwID0gIlxyXG4iOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKG1zZy5pbmRleE9mKCJcbiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzZXAgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKG1zZy5pbmRleE9mKCJcciIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlzZXAgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1zZywgc2VwKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCWxvZ01zZy5hcHBlbmQoRmlsbGVyICsgdG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCX0gZWxzZQotCQkJCWxvZ01zZy5hcHBlbmQoZkxpbmVTZXBlcmF0b3IgKyBGaWxsZXIgKyB0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JfQotCS8qCi0JICogSWYgRWNsaXBzZSBpcyBzdGFydGVkIHdpdGggdGhlIC1YRGVidWcgb3IgLWRlYnVnIHR1cm4gdHJhY2VzIG9uIGZvciB0aGlzIExvZ2dlcgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzIzLzIwMDEgNzozNzowNCBQTSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZGVidWciKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQlmVHJhY2VNb2RlID0gdHJ1ZTsKLQkJbGV2ZWwgPSBkZWZhdWx0TGV2ZWwgPSBMZXZlbC5wYXJzZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxvZ0xldmVsIiwgTGV2ZWwuV0FSTklORy5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdHJ5IHsKLQkJCWZMaW5lU2VwZXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyBEaWZmIG9uIFdpbi9Vbml4L01hYyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmTGluZVNlcGVyYXRvciA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKgotCSAqIEdlbmVyaWMgbG9nLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzI0LzIwMDEgMTo1NTozNCBQTSkKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbXNnIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdHlwZSBpbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBsb2dBbnkoU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQkJU3RyaW5nQnVmZmVyIGxvZ01zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbG9nTXNnLmFwcGVuZChmTGluZVNlcGVyYXRvcik7Ci0JCWxvZ01zZy5hcHBlbmQoTG9nTWFya1t0eXBlXSk7Ci0JCXJldHVybiBwdW5jaExvZyhsb2dSZXN0KG1zZywgbG9nTXNnKSwgdHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaXMgdG8gYmUgdXNlZCBieSByZW5kZXJlcnMgdGhhdCB3YW50IHRvIHB1dCBhIG1zZyBvdXQKLQkgKiBpbiBhIGdlbmVyaWMgZm9ybWF0LiBUaGlzIGp1c3QgcmV0dXJucyB0aGUgc3RyaW5nIHRoYXQKLQkgKiBzaG91bGQgYmUgbG9nZ2VkLiBJdCBwdXRzIHRoaW5ncyBsaWtlIGhlYWRlcnMgb24gaXQuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcmV0dXJuIFRoZSBnZW5lcmljIG1lc3NhZ2UgZm9yIHRoZSBzdHJpbmcgYW5kIGxldmVsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJpY01zZyhTdHJpbmcgbXNnLCBMZXZlbCBhTGV2ZWwpIHsKLQkJU3RyaW5nQnVmZmVyIGdlbk1zZyA9IG5ldyBTdHJpbmdCdWZmZXIobXNnLmxlbmd0aCgpKzE2KTsKLQkJZ2VuTXNnLmFwcGVuZChmTGluZVNlcGVyYXRvcik7Ci0JCWdlbk1zZy5hcHBlbmQoZ2V0TGV2ZWxIZWFkZXIoYUxldmVsKSk7Ci0JCWdlbk1zZy5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJZ2VuTXNnLmFwcGVuZChuZXcgRGF0ZSgpKTsKLQkJaW5kZW50TXNnKG1zZywgZ2VuTXNnKTsKLQkJcmV0dXJuIGdlbk1zZy50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbFtdIExFVkVMX1NFQVJDSCA9IG5ldyBMZXZlbFtdIHsKLQkJTGV2ZWwuU0VWRVJFLAotCQlMZXZlbC5XQVJOSU5HLAotCQlMZXZlbC5JTkZPLAotCQlJTG9nUmVuZGVyZXIyLlRSQUNFCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMRVZFTF9NQVJLID0gbmV3IFN0cmluZ1tdIHsKLQkJIioqKiBFUlJPUiAqKioiLCAvLyROT04tTkxTLTEkCi0JCSIrKysgV2FybmluZyArKysiLCAvLyROT04tTkxTLTEkCi0JCSJJbmZvIiwgLy8kTk9OLU5MUy0xJAotCQkiW1RyYWNlXSIgLy8kTk9OLU5MUy0xJAotCX07Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGV2ZWxIZWFkZXIoTGV2ZWwgYUxldmVsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxMRVZFTF9TRUFSQ0gubGVuZ3RoOyBpKyspCi0JCQlpZiAoTEVWRUxfU0VBUkNIW2ldID09IGFMZXZlbCkKLQkJCQlyZXR1cm4gTEVWRUxfTUFSS1tpXTsKLQkJcmV0dXJuIGFMZXZlbC5nZXROYW1lKCk7CS8vIE5vdCBmb3VuZCwganVzdCB1c2UgbGV2ZWwgc3RyaW5nLgotCX0KLQkKLQkvLyBUaGUgd3JpdGUncyBhcmUgaGVyZSBmb3IgaGlzdG9yeS4gV2lsbCBpbXBsZW1lbnQgdXNpbmcgbG9nKG9iaiwgTGV2ZWwpIGZvciBhbGwgb2YgdGhlIHR5cGVzLgotCi0KLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coTGV2ZWwsIEV4Y2VwdGlvbikKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoTGV2ZWwgYUxldmVsLCBFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIGxvZyhhTGV2ZWwsIGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSkKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShUaHJvd2FibGUgZXgpIHsKLQkJcmV0dXJuIGxvZyhleCk7Ci0JfQotCQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhPYmplY3QsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gbG9nRW50cnkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIE9iamVjdCBsb2dFbnRyeSkgewotCQlyZXR1cm4gbG9nKGxvZ0VudHJ5LCBhTGV2ZWwpOwotCX0KLQkKLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coU3RyaW5nLCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gbG9nKHN0cmluZywgYUxldmVsKTsKLQl9Ci0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSwgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgVGhyb3dhYmxlIGV4KSB7Ci0JCXJldHVybiBsb2coZXgsIGFMZXZlbCk7Ci0JfQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coTGV2ZWwgYUxldmVsLCBFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIGxvZyhleCwgYUxldmVsKTsKLQl9Ci0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSwgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhMZXZlbCBhTGV2ZWwsIFRocm93YWJsZSBleCkgewotCQlyZXR1cm4gbG9nKGV4LCBhTGV2ZWwpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKLQkgKiBAcmV0dXJuIGxvZ2dpbmcgbGV2ZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTGV2ZWwgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBsZXZlbCBpcyBiZWluZyBsb2dnZWQuIChlLmcuIGlmIGN1cnJlbnQgbGV2ZWwgaXMgU0VWRVJFLCB0aGVuIEZJTkUgd2lsbCBub3QgYmUgbG9nZ2VkKS4KLQkgKiBAcGFyYW0gcmVxdWVzdGxldmVsCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGV2ZWwgd2lsbCBiZSBsb2dnZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2dnaW5nTGV2ZWwoTGV2ZWwgcmVxdWVzdGxldmVsKSB7Ci0JCWlmIChyZXF1ZXN0bGV2ZWwgPT0gSUxvZ1JlbmRlcmVyMi5UUkFDRSAmJiAhZ2V0VHJhY2VNb2RlKCkpCi0JCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGFyZW4ndCB0cmFjaW5nIGJ1dCByZXF1ZXN0ZWQgdHJhY2UuCi0JCQotCQlyZXR1cm4gIShyZXF1ZXN0bGV2ZWwuaW50VmFsdWUoKSA8IGdldExldmVsKCkuaW50VmFsdWUoKSB8fCBnZXRMZXZlbCgpID09IExldmVsLk9GRik7Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHN0cmluZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nRXJyb3IoU3RyaW5nIG1zZykgewotCQlyZXR1cm4gbG9nKG1zZywgTGV2ZWwuU0VWRVJFKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgYW4gZXJyb3IgdGhyb3dhYmxlCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dFcnJvcihUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIExldmVsLlNFVkVSRSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGluZm8gbWVzc2FnZS4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nSW5mbyhTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBsb2cobXNnLCBMZXZlbC5JTkZPKTsKLQl9Ci0JCi0vKioKLSAqIExvZyBhIHRocm93YWJsZSBhcyBhIHdhcm5pbmcuCi0gKiBAcGFyYW0gZQotICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nSW5mbyhUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIExldmVsLklORk8pOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHRvIGxvZ01zZyBidWZmZXIgcGFzc2VkIGluLiBBcHBlbmQgdGhlIGRhdGUgYW5kIGZvcm1hdCB0aGUKLQkgKiBzdHJpbmcgd2l0aCBuaWNlIGluZGVudGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gbG9nTXNnCi0JICogQHJldHVybiB0aGUgc3RyaW5nIGZyb20gdGhlIGxvZ01zZyBhZnRlciBsb2dnaW5nIHRoZSByZXN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nUmVzdChTdHJpbmcgbXNnLCBTdHJpbmdCdWZmZXIgbG9nTXNnKSB7Ci0JCWxvZ01zZy5hcHBlbmQobmV3IERhdGUoKSk7Ci0JCWluZGVudE1zZyhtc2csIGxvZ01zZyk7Ci0JCXJldHVybiBsb2dNc2cudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIG1zZyBhcyB0cmFjZSBvbmx5LgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dUcmFjZShTdHJpbmcgbXNnKSB7Ci0JCWlmIChmVHJhY2VNb2RlKQotCQkJcmV0dXJuIGxvZyhtc2csIElMb2dSZW5kZXJlcjIuVFJBQ0UpOwotCQllbHNlCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLk5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGFzIHRyYWNlIG9ubHkuCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dUcmFjZShUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIElMb2dSZW5kZXJlcjIuVFJBQ0UpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgbWVzc2FnZSBhcyB3YXJuaW5nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dXYXJuaW5nKFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIGxvZyhtc2csIExldmVsLldBUk5JTkcpOwotCX0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhcyBhIHdhcm5pbmcuCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2dXYXJuaW5nKFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBsb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JfQotCQotCS8qKgotCSAqIEFzayB0aGUgUmVuZGVyZXIgdG8gcHVuY2ggdGhlIG1zZy4gaW4gdGhlIGxvZy4uIG9uZQotCSAqIGNhbGxlciBhdCB0aGUgdGltZQotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzI0LzIwMDEgOToxOToxNyBBTSkKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbXNnIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdHlwZSBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBwdW5jaExvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCQlyZXR1cm4gZlJlbmRlcmVyLmxvZyhtc2csIHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHJlbmRlcmVyIHRvIHVzZS4KLQkgKiBAcGFyYW0gcmVuZGVyZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihJTG9nUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJZlJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JCXJlbmRlcmVyMiA9IChyZW5kZXJlciBpbnN0YW5jZW9mIElMb2dSZW5kZXJlcjIpID8gKElMb2dSZW5kZXJlcjIpIHJlbmRlcmVyIDogbnVsbDsKLQkJcmVuZGVyZXIuc2V0VHJhY2VNb2RlKGdldFRyYWNlTW9kZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB0cmFjZSBtb2RlLgotCSAqIEBwYXJhbSBmbGFnIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gb24gdHJhY2luZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7Ci0JCWZUcmFjZU1vZGUgPSBmbGFnOwotCQlpZiAoZlJlbmRlcmVyICE9IG51bGwpCi0JCQlmUmVuZGVyZXIuc2V0VHJhY2VNb2RlKGZsYWcpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGxldmVsIGN1dG9mZiBmb3IgbG9nZ2luZy4gQW55dGhpbmcgYmVsb3cgdGhpcyBsZXZlbCB3aWxsIG5vdCBsb2cuCi0JICogRG8gbm90IHNldCBsZXZlbCB0byA8Y29kZT5JTG9nUmVuZGVyZXIyLlRSQUNFPC9jb2RlPi4gSXQgZG9lc24ndCBtYWtlIHNlbnNlLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCAoVXNlIDxjb2RlPklMb2dSZW5kZXJlcjIuREVGQVVMVDwvY29kZT4gdG8gcmVzdG9yZSB0byBkZWZhdWx0IGZvciB0aGlzIGxvZ2dlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbChMZXZlbCBsZXZlbCkgewotCQl0aGlzLmxldmVsID0gbGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBkZWZhdWx0TGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuIEl0IHdvbid0IHRvdWNoIHRoZSBjdXJyZW50IGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRMZXZlbChMZXZlbCBsZXZlbCkgewotCQl0aGlzLmRlZmF1bHRMZXZlbCA9IGxldmVsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxvZyBmaWxlIG5hbWUuCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2dGaWxlTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gbG9nRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsb2cgZmlsZSBuYW1lLgotCSAqIEBwYXJhbSBsb2dGaWxlTmFtZSBUaGUgbG9nRmlsZU5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVOYW1lKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQl0aGlzLmxvZ0ZpbGVOYW1lID0gbG9nRmlsZU5hbWU7Ci0JfQotCQotCS8vIE5vdyBhbGwgb2YgdGhlIGxvZygpIHR5cGVzIHRoYXQgdXNlIGEgTGV2ZWwuCi0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhdCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgYSB0aHJvd2FibGUuIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBsb2coZSwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSBlLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGUsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJU3RyaW5nIHN0YWNrVHJhY2UgPSBleGNlcHRpb25Ub1N0cmluZyhlKTsKLQkJCXJldHVybiBsb2dBbnkoc3RhY2tUcmFjZSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLlNFVkVSRSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvKSB7Ci0JCXJldHVybiBsb2cobywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBvCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKG8sIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihvKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvLyBUaGUgZm9sbG93aW5nIGFyZSBhZGRlZCB0byBtYXRjaCB1cCB3aXRoIEh5YWRlcyBzbyB0aGF0IHByaW1pdGl2ZXMgY2FuIGJlIGxvZ2dlZCB0b28uCi0JCi0JLyoqCi0JICogTG9nIGEgYm9vbGVhbiBhdCB0aGUgZGVmYXVsdCBsZXZlbC4gCi0JICogQHBhcmFtIGIKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiKSB7Ci0JCXJldHVybiBsb2coYiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIGEgYm9vbGVhbiBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGIKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGIsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihiKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIGNoYXJhY3RlciBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gYwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhjaGFyIGMpIHsKLQkJcmV0dXJuIGxvZyhjLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGMsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihjKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgYnl0ZSBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gYgotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIpIHsKLQkJcmV0dXJuIGxvZyhiLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhiLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoYiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gcwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzKSB7Ci0JCXJldHVybiBsb2cocywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhzLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YocyksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGludCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gaQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSkgewotCQlyZXR1cm4gbG9nKGksIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgaW50IGF0IHRoZSBkZWZhdWx0IGxldmVsLgotCSAqIEBwYXJhbSBpCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGksIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihpKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgbG9uZyBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwpIHsKLQkJcmV0dXJuIGxvZyhsLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGxvbmcgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBsCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhsLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YobCksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gZgotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmKSB7Ci0JCXJldHVybiBsb2coZiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhmLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoZiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGRvdWJsZSBhdCB0aGUgZGVmYXVsdCBsZXZlbAotCSAqIEBwYXJhbSBkCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkKSB7Ci0JCXJldHVybiBsb2coZCwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGxldmVsCi0JICogCi0JICogQHBhcmFtIGQKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coZCwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGQpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8qCi0JICogVHVybiBuZXcgdHlwZSBpbnRvIG9sZCB0eXBlLiBUaGUgZGVmYXVsdExldmVsIGlzIHRoZQotCSAqIGxldmVsIHRvIHVzZSBpZiB0aGUgaW5jb21pbmcgbGV2ZWwgaXMgbWFya2VkIGFzIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0T2xkVHlwZShMZXZlbCBhTGV2ZWwpIHsKLQkJaWYgKGFMZXZlbCA9PSBMZXZlbC5TRVZFUkUpCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19FUlJPUjsKLQkJZWxzZSBpZiAoYUxldmVsID09IExldmVsLldBUk5JTkcpCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19XQVJOSU5HOwotCQllbHNlIGlmIChhTGV2ZWwgPT0gTGV2ZWwuSU5GTykKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX0lORk87Ci0JCWVsc2UgaWYgKGFMZXZlbCA9PSBJTG9nUmVuZGVyZXIyLlRSQUNFKQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfVFJBQ0U7Ci0JCWVsc2UKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX0lORk87CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4YTQzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS40ICQkICAkJERhdGU6IDIwMDUvMDYvMTYgMjA6MTQ6MjcgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSAgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgSU5TVEFOQ0U7Ci0JCi0Jc3RhdGljIHsKLQkJSU5TVEFOQ0UgPSBjcmVhdGVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBDbGFzcyBDT05UUklCVVRPUl9DTEFTUyA9IElFTUZDb250ZXh0Q29udHJpYnV0b3IuY2xhc3M7Ci0JcHJvdGVjdGVkIE1hcCBlbWZDb250ZXh0Q2FjaGUgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQotCQotCXByaXZhdGUgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZSgpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZUZyb21FeHRlbnNpb24oKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCWZhY3RvcnkgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkoKTsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZUZyb21FeHRlbnNpb24oKSB7Ci0JCWZpbmFsIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5W10gZmFjdG9yeUhvbGRlciA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeVsxXTsKLQkJUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IFJlZ2lzdHJ5UmVhZGVyKEpFTVV0aWxQbHVnaW4uSUQsICJpbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5IikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoImZhY3RvcnlDbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlmYWN0b3J5SG9sZGVyWzBdID0gKEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5KWVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBmYWN0b3J5SG9sZGVyWzBdOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFTUZOYXR1cmVGYWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY2FjaGVFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0LCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBlbWZDb250ZXh0KSB7Ci0JCWlmIChhUHJvamVjdCAhPSBudWxsICYmIGVtZkNvbnRleHQgIT0gbnVsbCkKLQkJCWVtZkNvbnRleHRDYWNoZS5wdXQoYVByb2plY3QsIGVtZkNvbnRleHQpOwotCX0KLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRDYWNoZWRFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSkgZW1mQ29udGV4dENhY2hlLmdldChhUHJvamVjdCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmFQcm9qZWN0PC9jb2RlPiBpcyBlaXRoZXIgYmVpbmcgY2xvc2VkIG9yIGRlbGV0ZWQgc28gd2UgbmVlZCB0byBjbGVhbnVwIG91ciBjYWNoZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDYWNoZWRQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCAhPSBudWxsKSAKLQkJCWVtZkNvbnRleHRDYWNoZS5yZW1vdmUoYVByb2plY3QpOyAKLQkJCi0JfQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBvciBleGlzdGluZyBFTUZOYXR1cmUgb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LiBBbGxvdyB0aGUgPGNvZGU+Y29udHJpYnV0b3I8L2NvZGU+Ci0JICogdG8gY29udHJpYnV0ZSB0byB0aGUgbmV3IG9yIGV4aXN0aW5nIG5hdHVyZSBwcmlvciB0byByZXR1cm5pbmcuCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJbRU1GV29ya2JlbmNoQ29udGV4dEJhc2VdIiArIEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5X1VJXzAiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoIWFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiW0VNRldvcmtiZW5jaENvbnRleHRCYXNlXSIgKyBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8xIiwgbmV3IE9iamVjdFtde2FQcm9qZWN0LmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNvbnRleHQgPSBnZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQkJYm9vbGVhbiBjb250cmlidXRvckZvdW5kID0gZmFsc2U7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCWNvbnRleHQgPSBwcmltQ3JlYXRlRU1GQ29udGV4dChhUHJvamVjdCk7Ci0JCQljYWNoZUVNRkNvbnRleHQoYVByb2plY3QsIGNvbnRleHQpOwotCQkJY29udHJpYnV0b3JGb3VuZCA9IGluaXRpYWxpemVFTUZDb250ZXh0RnJvbUNvbnRyaWJ1dG9ycyhhUHJvamVjdCwgY29udGV4dCwgY29udHJpYnV0b3IpOwotCQl9Ci0JCWlmIChjb250cmlidXRvciAhPSBudWxsICYmIGNvbnRleHQgIT0gbnVsbCAmJiAhY29udHJpYnV0b3JGb3VuZCkKLQkJCWNvbnRyaWJ1dG9yLnByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGNvbnRleHQpOwotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZUVNRkNvbnRleHRGcm9tQ29udHJpYnV0b3JzKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBlbWZDb250ZXh0LCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKSB7Ci0JCWJvb2xlYW4gY29udHJpYnV0b3JGb3VuZCA9IGZhbHNlOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBlbWZDb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gY29udHJpYnV0b3JGb3VuZDsKLQkJTGlzdCBydW50aW1lcyA9IEVNRk5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZXMoYVByb2plY3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSAoSVByb2plY3ROYXR1cmUpIHJ1bnRpbWVzLmdldChpKTsKLQkJCWlmIChuYXR1cmUgIT0gbnVsbCAmJiBDT05UUklCVVRPUl9DTEFTUy5pc0luc3RhbmNlKG5hdHVyZSkpIHsKLQkJCQlpZiAobmF0dXJlID09IGNvbnRyaWJ1dG9yKQotCQkJCQljb250cmlidXRvckZvdW5kID0gdHJ1ZTsKLQkJCQkoKElFTUZDb250ZXh0Q29udHJpYnV0b3IpIG5hdHVyZSkucHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoZW1mQ29udGV4dCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRyaWJ1dG9yRm91bmQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYXR1cmVFbmFibGVkKElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhUHJvamVjdC5pc05hdHVyZUVuYWJsZWQobmF0dXJlSWQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXROYXR1cmVJZHMoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCQlyZXR1cm4gYVByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0TmF0dXJlIGdldE5hdHVyZShJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYVByb2plY3QuZ2V0TmF0dXJlKG5hdHVyZUlkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBwcmltQ3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEVNRldvcmtiZW5jaENvbnRleHRCYXNlKGFQcm9qZWN0KTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIGFuIGV4aXN0aW5nIEVNRk5hdHVyZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIGdldENhY2hlZEVNRkNvbnRleHQoYVByb2plY3QpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBjcmVhdGVTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyKGFSZXNvdXJjZVNldCwgYVByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBkMjM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMzQuMi4yICQkICAkJERhdGU6IDIwMTAvMTIvMDIgMDU6NDU6NDggJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIGltcGxlbWVudHMgRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQgewotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1vZHVsZVVSSSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQl9QUk9UT0NPTF9JTkRYID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSkVDVF9OQU1FX0lORFggPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RVTEVfTkFNRV9JTkRYID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0lORFggPSAzOwotCX0KLQlwdWJsaWMgY2xhc3MgSW1tdXRhYmxlRUxpc3Q8RSBleHRlbmRzIE9iamVjdCAmIFJlc291cmNlPiBleHRlbmRzIFJlc291cmNlc0VMaXN0PEU+IGltcGxlbWVudHMgRUxpc3Q8RT4gewotCQkKLQkJCi0JCXByaXZhdGUgU3luY2hyb25pemVkUmVzb3VyY2VzRUxpc3QgZGVsZWdhdGU7Ci0KLQkJcHVibGljIEltbXV0YWJsZUVMaXN0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQotCQkgICAgc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZSgpOwotCi0JCSAgICAvLyBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgZGF0YS4KLQkJICAgIC8vCi0JCSAgICBpZiAoc2l6ZSA+IDApCi0JCSAgICB7IAotCQkgICAgICAvLyBBbGxvdyBmb3IgYSBiaXQtc2hpZnQgb2YgZ3Jvd3RoLgotCQkgICAgICAvLwotCQkgICAgICBkYXRhID0gbmV3RGF0YShzaXplICsgc2l6ZSAvIDggKyAxKTsgCi0JCSAgICAgIGNvbGxlY3Rpb24udG9BcnJheShkYXRhKTsKLQkJICAgIAotCQkgICAgfQotCQkJZGVsZWdhdGUgPSAoU3luY2hyb25pemVkUmVzb3VyY2VzRUxpc3QpY29sbGVjdGlvbjsKLQkJCQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldERhdGEoaW50IHNpemUsIE9iamVjdFtdIGRhdGEpIHsKLQkJCXN1cGVyLnNldERhdGEoc2l6ZSwgZGF0YSk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLmFjcXVpcmUoKTsKLQkJCWRlbGVnYXRlLnNldERhdGEoc2l6ZSwgZGF0YSk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgRSBzZXRVbmlxdWUoaW50IGluZGV4LCBFIG9iamVjdCkgewotCQkJT2JqZWN0IHRlbXA7Ci0JCQlzdXBlci5zZXRVbmlxdWUoaW5kZXgsIG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLmFjcXVpcmUoKTsKLQkJCXRlbXAgPSBkZWxlZ2F0ZS5zZXRVbmlxdWUoaW5kZXgsIG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJCXJldHVybiAoRSkgdGVtcDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRVbmlxdWUoRSBvYmplY3QpIHsKLQkJCXN1cGVyLmFkZFVuaXF1ZShvYmplY3QpOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQlkZWxlZ2F0ZS5hZGRVbmlxdWUob2JqZWN0KTsKLQkJCWRlbGVnYXRlLmxvY2sucmVsZWFzZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZFVuaXF1ZShpbnQgaW5kZXgsIEUgb2JqZWN0KSB7Ci0JCQlzdXBlci5hZGRVbmlxdWUoaW5kZXgsIG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLmFjcXVpcmUoKTsKLQkJCWRlbGVnYXRlLmFkZFVuaXF1ZShpbmRleCwgb2JqZWN0KTsKLQkJCWRlbGVnYXRlLmxvY2sucmVsZWFzZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbFVuaXF1ZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCQlib29sZWFuIHRlbXA7Ci0JCQlzdXBlci5hZGRBbGxVbmlxdWUoY29sbGVjdGlvbik7Ci0JCQlkZWxlZ2F0ZS5sb2NrLmFjcXVpcmUoKTsKLQkJCXRlbXAgPSBkZWxlZ2F0ZS5hZGRBbGxVbmlxdWUoY29sbGVjdGlvbik7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbFVuaXF1ZShpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gdGVtcDsKLQkJCXN1cGVyLmFkZEFsbFVuaXF1ZShpbmRleCwgY29sbGVjdGlvbik7Ci0JCQlkZWxlZ2F0ZS5sb2NrLmFjcXVpcmUoKTsKLQkJCXRlbXAgPSBkZWxlZ2F0ZS5hZGRBbGxVbmlxdWUoaW5kZXgsIGNvbGxlY3Rpb24pOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGxVbmlxdWUoT2JqZWN0W10gb2JqZWN0cywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQlib29sZWFuIHRlbXA7Ci0JCQlzdXBlci5hZGRBbGxVbmlxdWUob2JqZWN0cywgc3RhcnQsIGVuZCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLmFjcXVpcmUoKTsKLQkJCXRlbXAgPSBkZWxlZ2F0ZS5hZGRBbGxVbmlxdWUob2JqZWN0cywgc3RhcnQsIGVuZCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbFVuaXF1ZShpbnQgaW5kZXgsIE9iamVjdFtdIG9iamVjdHMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQkJYm9vbGVhbiB0ZW1wOwotCQkJc3VwZXIuYWRkQWxsVW5pcXVlKGluZGV4LCBvYmplY3RzLCBzdGFydCwgZW5kKTsKLQkJCWRlbGVnYXRlLmxvY2suYWNxdWlyZSgpOwotCQkJdGVtcCA9IGRlbGVnYXRlLmFkZEFsbFVuaXF1ZShpbmRleCwgb2JqZWN0cywgc3RhcnQsIGVuZCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBFIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCU9iamVjdCB0ZW1wOwotCQkJc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkJCWRlbGVnYXRlLmxvY2suYWNxdWlyZSgpOwotCQkJdGVtcCA9IGRlbGVnYXRlLnJlbW92ZShpbmRleCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJCXJldHVybiAoRSl0ZW1wOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBFIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCU9iamVjdCB0ZW1wOwotCQkJc3VwZXIubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQl0ZW1wID0gZGVsZWdhdGUubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gKEUpIHRlbXA7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEUgc2V0KGludCBpbmRleCwgRSBvYmplY3QpIHsKLQkJCU9iamVjdCB0ZW1wOwotCQkJc3VwZXIuc2V0KGluZGV4LCBvYmplY3QpOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQl0ZW1wID0gZGVsZWdhdGUuc2V0KGluZGV4LCBvYmplY3QpOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gKEUpIHRlbXA7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KSB7Ci0JCQlib29sZWFuIHRlbXA7Ci0JCQlzdXBlci5hZGQob2JqZWN0KTsKLQkJCWRlbGVnYXRlLmxvY2suYWNxdWlyZSgpOwotCQkJdGVtcCA9IGRlbGVnYXRlLmFkZChvYmplY3QpOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIG9iamVjdCkgewotCQkJc3VwZXIuYWRkKGluZGV4LCBvYmplY3QpOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQlkZWxlZ2F0ZS5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQkJYm9vbGVhbiB0ZW1wOwotCQkJc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQl0ZW1wID0gZGVsZWdhdGUuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCQlib29sZWFuIHRlbXA7Ci0JCQlzdXBlci5hZGRBbGwoaW5kZXgsIGNvbGxlY3Rpb24pOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQl0ZW1wID0gZGVsZWdhdGUuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCWRlbGVnYXRlLmxvY2sucmVsZWFzZSgpOwotCQkJcmV0dXJuIHRlbXA7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QpIHsKLQkJCWJvb2xlYW4gdGVtcDsKLQkJCXN1cGVyLnJlbW92ZShvYmplY3QpOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQl0ZW1wID0gZGVsZWdhdGUucmVtb3ZlKG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gdGVtcDsKLQkJCXN1cGVyLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLQkJCWRlbGVnYXRlLmxvY2suYWNxdWlyZSgpOwotCQkJdGVtcCA9IGRlbGVnYXRlLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLQkJCWRlbGVnYXRlLmxvY2sucmVsZWFzZSgpOwotCQkJcmV0dXJuIHRlbXA7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQkJYm9vbGVhbiB0ZW1wOwotCQkJc3VwZXIucmV0YWluQWxsKGNvbGxlY3Rpb24pOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQl0ZW1wID0gZGVsZWdhdGUucmV0YWluQWxsKGNvbGxlY3Rpb24pOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBtb3ZlKGludCBpbmRleCwgRSBvYmplY3QpIHsKLQkJCXN1cGVyLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLmFjcXVpcmUoKTsKLQkJCWRlbGVnYXRlLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNBZGQoRSBvYmplY3QsIE5vdGlmaWNhdGlvbkNoYWluIG5vdGlmaWNhdGlvbnMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIHRlbXAgPSBzdXBlci5iYXNpY0FkZChvYmplY3QsIG5vdGlmaWNhdGlvbnMpOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQlkZWxlZ2F0ZS5iYXNpY0FkZChvYmplY3QsIG5vdGlmaWNhdGlvbnMpOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJCQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1JlbW92ZShPYmplY3Qgb2JqZWN0LCBOb3RpZmljYXRpb25DaGFpbiBub3RpZmljYXRpb25zKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiB0ZW1wID0gc3VwZXIuYmFzaWNSZW1vdmUob2JqZWN0LCBub3RpZmljYXRpb25zKTsKLQkJCWRlbGVnYXRlLmxvY2suYWNxdWlyZSgpOwotCQkJZGVsZWdhdGUuYmFzaWNSZW1vdmUob2JqZWN0LCBub3RpZmljYXRpb25zKTsKLQkJCWRlbGVnYXRlLmxvY2sucmVsZWFzZSgpOwotCQkJcmV0dXJuIHRlbXA7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQlzdXBlci5jbGVhcigpOwotCQkJZGVsZWdhdGUubG9jay5hY3F1aXJlKCk7Ci0JCQlkZWxlZ2F0ZS5jbGVhcigpOwotCQkJZGVsZWdhdGUubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0KGludCBpbmRleCwgRSBvYmplY3QsIE5vdGlmaWNhdGlvbkNoYWluIG5vdGlmaWNhdGlvbnMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIHRlbXAgPSBzdXBlci5iYXNpY1NldChpbmRleCwgb2JqZWN0LCBub3RpZmljYXRpb25zKTsKLQkJCWRlbGVnYXRlLmxvY2suYWNxdWlyZSgpOwotCQkJZGVsZWdhdGUuYmFzaWNTZXQoaW5kZXgsIG9iamVjdCwgbm90aWZpY2F0aW9ucyk7Ci0JCQlkZWxlZ2F0ZS5sb2NrLnJlbGVhc2UoKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRSZXNvdXJjZXNFTGlzdDxFIGV4dGVuZHMgT2JqZWN0ICYgUmVzb3VyY2U+IGV4dGVuZHMgUmVzb3VyY2VzRUxpc3Q8RT4gaW1wbGVtZW50cyBFTGlzdDxFPiB7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByb3RlY3RlZCBmaW5hbCBJTG9jayBsb2NrID0gSm9iLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0KLQkJcHVibGljIHZvaWQgY29weUludG8oTGlzdCBsaXN0KXsKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJbGlzdC5hZGRBbGwodGhpcyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgRSBvYmplY3QpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvYmplY3QpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBFIG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBpbnQgb2xkUG9zaXRpb24pIHsKLQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2xkUG9zaXRpb24pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkQWxsKGMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkQWxsKGluZGV4LCBjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5jb250YWluc0FsbChjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5pbmRleE9mKG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmlzRW1wdHkoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJCQotCQkJdHJ5IHsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQlyZXR1cm4gc3VwZXIubGlzdEl0ZXJhdG9yKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmxpc3RJdGVyYXRvcihpbmRleCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShvKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5yZW1vdmVBbGwoYyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5yZXRhaW5BbGwoYyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIEUgc2V0KGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5zaXplKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQkJCi0JCQl0cnkgewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCXJldHVybiBzdXBlci5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoYSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVsZWFzZSBsb2NrIGR1cmluZyBub3RpZmljYXRpb25zCi0JCXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQotCQkJaW50IGxvY2tEZXB0aDsKLQkJCWxvY2tEZXB0aCA9IGxvY2suZ2V0RGVwdGgoKTsKLQkJCXRyeSB7Ci0JCQkJZm9yKGludCBpPTA7IGk8bG9ja0RlcHRoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpOwotCQkJCXN1cGVyLmRpc3BhdGNoTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcihpbnQgaT0wOyBpPGxvY2tEZXB0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBsb2NrLmFjcXVpcmUoKTsgIC8vIFJlLWFjcXVpcmUgbG9jayBhZnRlciBub3RpZnkKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QgZXh0ZW5kcyBFQWRhcHRlckxpc3QKLQl7Ci0KLS8qKgotICogCi0gKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzg1NTQzODMzOTE4NzU0MDcxOEw7Ci0KLQkJcHVibGljIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdChOb3RpZmllciBub3RpZmllcikgewotCQkJc3VwZXIobm90aWZpZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkKLQkJewotCQkJcmV0dXJuIHN1cGVyLmFkZChvYmplY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCQl7Ci0JCQlzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JCXsKLQkJCXJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KQotCQl7Ci0JCQlyZXR1cm4gc3VwZXIucmVtb3ZlKG9iamVjdCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkKLQkJewotCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JCXsKLQkJCXJldHVybiBzdXBlci5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkKLQkJewotCQkJc3VwZXIuY2xlYXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCQl7Ci0JCQlyZXR1cm4gc3VwZXIuc2V0KGluZGV4LCBvYmplY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgT2JqZWN0IG9iamVjdCkKLQkJewotCQkJc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2JqZWN0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgaW50IG9sZFBvc2l0aW9uKQotCQl7Ci0JCQlyZXR1cm4gc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2xkUG9zaXRpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZWFzaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByb3RlY3RlZCBMaXN0IHJlc291cmNlSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBPYmplY3QgcmVzb3VyY2VzTG9jayA9IG5ldyBPYmplY3QoKTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKCkgewotCQlzZXRVUklSZXNvdXJjZU1hcChuZXcgSGFzaE1hcCgxMCkpOwkvLyBUZWxsIGl0IHRvIGNhY2hlIHVyaS0+cmVzb3VyY2UgYWNjZXNzLgotCQlnZXRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX1BBUlNFUl9QT09MLCBFTUZOYXR1cmUuU0hBUkVEX1BBUlNFUl9QT09MKTsKLQl9Ci0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldEltcGwoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdGhpcygpOwotCQlzZXRQcm9qZWN0KGFQcm9qZWN0KTsKLQkJaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKSB7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0U2hhcmVkQ2FjaGUoKS5iZWdpbkxpc3RlbmluZyh0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxlYXNpbmcoKSB7Ci0JCXJldHVybiBpc1JlbGVhc2luZzsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVsZWdhdGVkR2V0UmVzb3VyY2UoVVJJLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkZWxlZ2F0ZWRHZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlSZXNvdXJjZSByZXMgPSBzdXBlci5kZWxlZ2F0ZWRHZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJlcyA9IGdldFJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQkvL0NoZWNrIHRoZSBtYXAgZmlyc3Qgd2hlbiBjcmVhdGluZyB0aGUgcmVzb3VyY2UgYW5kIGRvIG5vdAotCQkvL25vcm1hbGl6ZSBpZiBhIHZhbHVlIGlzIGZvdW5kLgotCQlib29sZWFuIGlzTWFwcGVkID0gZGV0ZWN0VVJJTWFwcGluZyh1cmkpOwotCQlTdHJpbmcgY29udGVudFR5cGVOYW1lID0gZ2V0Q29udGVudFR5cGVOYW1lKHVyaSk7Ci0JCWJvb2xlYW4gaGFzQ29udGVudFR5cGUgPSAoY29udGVudFR5cGVOYW1lICE9IG51bGwpOwotCQlVUkkgY29udmVydGVkID0gdXJpOwotCQlpZiAoIWlzTWFwcGVkKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWVsc2UgaWYgKGhhc0NvbnRlbnRUeXBlKQotCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCQotCQlpZiAoIWhhc0NvbnRlbnRUeXBlKSB7Ly8gQ2hlY2sgaWYgYWN0dWFsIHByb2plY3QgZmlsZSBleGlzdHMsIGFuZCBjYW4gZGV0ZXJtaW5lIGNvbnRlbnR0eXBlCi0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJCQljb250ZW50VHlwZU5hbWUgPSBkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsvLyBOb3cgY2hlY2sgaWYgdXJpIGNvbnRhaW5zIHByb2plY3QsIHRoZW4gYWRkIGlmIG5lZWRlZAotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmICghdXJpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKSB7Ci0JCQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUoY29udmVydGVkVXJpKTsKLQkJCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCQkJCQkJY29udGVudFR5cGVOYW1lID0gZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihjb250ZW50VHlwZU5hbWUgPT0gbnVsbCkKLQkJCWNvbnRlbnRUeXBlTmFtZSA9IGNvbnRlbnRUeXBlOwotCQkKLQkJCi0JCVJlc291cmNlIHJlc3VsdCA9IGNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKGNvbnZlcnRlZCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSAoY29udGVudFR5cGVOYW1lID09IG51bGwpID8gCi0JCQkJCWdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeSh1cmkpOgotCQkJCQlnZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkodXJpLGNvbnRlbnRUeXBlTmFtZSk7Ci0JCQkJCQkKLQkJICAgIGlmIChyZXNvdXJjZUZhY3RvcnkgIT0gbnVsbCkKLQkJICAgIHsvL1dlIGdvdCB0aGUgcmlnaHQgZmFjdG9yeSwgbm93IHVzZSB0aGUgcmlnaHQgVVJJCi0JCSAgICAgIHJlc3VsdCA9IHJlc291cmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZShjb252ZXJ0ZWQpOwotCQkgICAgICBnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJICAgIH0KLQkJfQotCQkJCi0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIENvbnRlbnRIYW5kbGVyLlVOU1BFQ0lGSUVEX0NPTlRFTlRfVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRldGVjdFVSSU1hcHBpbmcoVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuICEoKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcClnZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKHVyaSkuZXF1YWxzKHVyaSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIGZvciB0aGUgPGNvZGU+dXJpPC9jb2RlPiB3aXRoaW4gdGhlIFdvcmtzcGFjZS4gVGhpcyBVUkkgaXMgYXNzdW1lZCB0byBiZQotCSAqIGFic29sdXRlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uLgotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJLy9DaGVjayB0aGUgbWFwIGZpcnN0IHdoZW4gY3JlYXRpbmcgdGhlIHJlc291cmNlIGFuZCBkbyBub3QKLQkJLy9ub3JtYWxpemUgaWYgYSB2YWx1ZSBpcyBmb3VuZC4KLQkJYm9vbGVhbiBpc01hcHBlZCA9IGRldGVjdFVSSU1hcHBpbmcodXJpKTsKLQkJYm9vbGVhbiBoYXNDb250ZW50VHlwZSA9IChnZXRDb250ZW50VHlwZU5hbWUodXJpKSAhPSBudWxsKTsKLQkJVVJJIGNvbnZlcnRlZCA9IHVyaTsKLQkJaWYgKCFpc01hcHBlZCkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQllbHNlIGlmIChoYXNDb250ZW50VHlwZSkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQlSZXNvdXJjZSByZXN1bHQgPSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhjb252ZXJ0ZWQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQotCQkgICAgaWYgKHJlc291cmNlRmFjdG9yeSAhPSBudWxsKQotCQkgICAgewotCQkgICAgICByZXN1bHQgPSByZXNvdXJjZUZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoY29udmVydGVkKTsKLQkJICAgICAgZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCSAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VzTG9jaykgewotCQkgICAgICAgICAgZ2V0VVJJUmVzb3VyY2VNYXAoKS5wdXQodXJpLCByZXN1bHQpOwotCQkgICAgICB9Ci0JCSAgICAgIHJldHVybiByZXN1bHQ7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHJldHVybiBudWxsOwotCQkgICAgfQotCQkgIAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQoUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1JlbGVhc2luZykKLQkJCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCX0KLQkKLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBkZWNpZGUgdG8gY3JlYXRlIHRoZSBSZXNvdXJjZSBpbiBhbm90aGVyIG1hbm5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQloYW5kbGVyID0gKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSk7Ci0JCQlyZXNvdXJjZSA9IGhhbmRsZXIuY3JlYXRlUmVzb3VyY2UodGhpcywgdXJpKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogU2VlIGlmIGFueSByZXNvdXJjZSBoYW5kbGVycyBmcm9tIHRoZSBXb3JrYmVuY2hDb250ZXh0Ci0JICogY2FuIHJldHVybiBhIFJlc291cmNlIGZyb20gYSA8Y29kZT51cmk8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7Ci0JCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VIYW5kbGVycy5zaXplKCk7IGkrKykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSkpLmdldFJlc291cmNlKHRoaXMsIHVyaSk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIFNlbmQgb3V0IG5vdGlmaWNhdGlvbiBvZiByZWxlYXNlLgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWVOb3RpZnkobmV3IE5vdGlmaWNhdGlvbkltcGwoU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgTm90aWZpY2F0aW9uLk5PX0lOREVYLCBmYWxzZSkgewotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXRGZWF0dXJlSUQoamF2YS5sYW5nLkNsYXNzKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0RmVhdHVyZUlEKENsYXNzIGV4cGVjdGVkQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIFBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEOwotCQkJCX0KLQkJCQkKLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0Tm90aWZpZXIoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCQkJCXJldHVybiBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLnRoaXM7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJc2V0SXNSZWxlYXNpbmcodHJ1ZSk7Ci0JCWlmIChzeW5jaHJvbml6ZXIgIT0gbnVsbCkKLQkJCXN5bmNocm9uaXplci5kaXNwb3NlKCk7Ci0JCXN5bmNocm9uaXplciA9IG51bGw7Ci0JCXJlbW92ZUFuZFVubG9hZEFsbFJlc291cmNlcygpOwotCQlyZXNvdXJjZUhhbmRsZXJzID0gbnVsbDsKLQkJZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQkJc2V0UHJvamVjdChudWxsKTsKLQkJSkVNVXRpbFBsdWdpbi5nZXRTaGFyZWRDYWNoZSgpLnN0b3BMaXN0ZW5pbmcodGhpcyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFuZFVubG9hZEFsbFJlc291cmNlcygpIHsKLQkJYm9vbGVhbiBjYXVnaHRFeGNlcHRpb24gPSBmYWxzZTsKLQkJTGlzdCBsaXN0ID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChyZXNvdXJjZXNMb2NrKSB7Ci0JCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSByZXR1cm47Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdChnZXRSZXNvdXJjZXMoKSk7CQotCQkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJfQotCQlSZXNvdXJjZSByZXM7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlyZXMudW5sb2FkKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQljYXVnaHRFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChjYXVnaHRFeGNlcHRpb24pCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uKHMpIHVubG9hZGluZyByZXNvdXJjZXMgLSBjaGVjayBsb2cgZmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc1JlbGVhc2luZyhib29sZWFuIGFCb29sZWFuKSB7Ci0JCWlzUmVsZWFzaW5nID0gYUJvb2xlYW47Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHByb2plY3QuCi0JICogQHJldHVybiBSZXR1cm5zIGEgSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QuCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKHVyaS50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJRU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJcmVzdWx0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmkuZnJhZ21lbnQoKSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldEVPYmplY3RGcm9tSGFuZGxlcnModXJpLCBsb2FkT25EZW1hbmQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBjYW4gcmV0dXJuIGEgRU9iamVjdCBmcm9tIGEgPGNvZGU+dXJpPC9jb2RlPiBhZnRlcgotCSAqIGZhaWxpbmcgdG8gZmluZCBpdCB1c2luZyB0aGUgbm9ybWFsIG1lY2hhbmlzbXMuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlFT2JqZWN0IG9iaiA9IG51bGw7Ci0JCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQloYW5kbGVyID0gKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSk7Ci0JCQlvYmogPSBoYW5kbGVyLmdldEVPYmplY3RGYWlsZWQodGhpcywgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFkZChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUhhbmRsZXJzLmFkZChyZXNvdXJjZUhhbmRsZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRGaXJzdChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJlc291cmNlSGFuZGxlcnMuYWRkKDAsIHJlc291cmNlSGFuZGxlcik7Ci0JfQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUhhbmRsZXJzLnJlbW92ZShyZXNvdXJjZUhhbmRsZXIpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeW5jaHJvbml6ZXIuCi0JICogQHJldHVybiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBzeW5jaHJvbml6ZXI7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHN5bmNocm9uaXplci4KLQkgKiBAcGFyYW0gc3luY2hyb25pemVyIFRoZSBzeW5jaHJvbml6ZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVyKFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQl0aGlzLnN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IGZhY3RvcnlSZWcpIHsKLQkJaWYgKHJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwgJiYgZmFjdG9yeVJlZyAhPSBudWxsKSB7Ci0JCQlwcmVzZXJ2ZUVudHJpZXMoZmFjdG9yeVJlZy5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKSwgcmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkpOwotCQkJcHJlc2VydmVFbnRyaWVzKGZhY3RvcnlSZWcuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKSwgcmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKSk7Ci0JCQlwcmVzZXJ2ZUVudHJpZXMoZmFjdG9yeVJlZy5nZXRDb250ZW50VHlwZVRvRmFjdG9yeU1hcCgpLCByZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5nZXRDb250ZW50VHlwZVRvRmFjdG9yeU1hcCgpKTsKLQkJfQotCQlzdXBlci5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShmYWN0b3J5UmVnKTsKLQl9Ci0JLyoKLQkgKiBQcmVzZXJ2ZSB0aGUgZW50cmllcyBmcm9tIG1hcDIgaW4gbWFwMSBpZiBubyBjb2xsaXNpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VydmVFbnRyaWVzKE1hcCBtYXAxLCBNYXAgbWFwMikgewotCQlpZiAobWFwMi5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gbWFwMi5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIW1hcDEuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKQotCQkJCW1hcDEucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCi0JICAgIE1hcDxVUkksIFJlc291cmNlPiBtYXAgPSBnZXRVUklSZXNvdXJjZU1hcCgpOwotCSAgICBpZiAobWFwICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG1hcC5nZXQodXJpKTsKLQkgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCSAgICAgICAgewotCSAgICAgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkgICAgICAgIH0gICAgICAgIAotCSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgVVJJQ29udmVydGVyIHRoZVVSSUNvbnZlcnRlciA9IGdldFVSSUNvbnZlcnRlcigpOwotCSAgICBVUkkgbm9ybWFsaXplZFVSSSA9IHRoZVVSSUNvbnZlcnRlci5ub3JtYWxpemUodXJpKTsKLQkgICAgTGlzdCByZXNvdXJjZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgc3luY2hyb25pemVkIChyZXNvdXJjZXNMb2NrKSB7Ci0JICAgIAlMaXN0PFJlc291cmNlPiBjID0gZ2V0SW1tdXRhYmxlUmVzb3VyY2VzKCk7Ci0JICAgICAgICAKLQkgICAgICAgIHN5bmNocm9uaXplZChjKSB7Ci0JCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGMpIHsKLQkJCQkJaWYgKHRoZVVSSUNvbnZlcnRlci5ub3JtYWxpemUocmVzb3VyY2UuZ2V0VVJJKCkpLmVxdWFscyhub3JtYWxpemVkVVJJKSkgewotCQotCQkJCQkJaWYgKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpID09IG51bGwpIHsgLy8gbG9hZGluZyBmcm9tIGxlZ2FjeSBhcmNoaXZlIGFwaSBvciBub24tdHlwZWQgcmVzb3VyY2UKLQkJCQkJCQlpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCQkJCQkJCX0KLQkKLQkJCQkJCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQkJCQkJbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHJlc291cmNlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlSZXNvdXJjZSBsb2FkZWRSZXMgPSBsb2FkV2l0aENvbnRlbnRUeXBlKHJlc291cmNlLCB1cmksIG1hcCwgbG9hZE9uRGVtYW5kLCByZXNvdXJjZXNUb1JlbW92ZSk7Ci0JCQkJCQkJaWYgKGxvYWRlZFJlcyAhPSBudWxsKQotCQkJCQkJCQlyZXR1cm4gbG9hZGVkUmVzOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCSAgICAgICAgfQotCQl9Ci0JICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VzTG9jaykgewotCSAgICAvLyBDbGVhbnVwIGludmFsaWQgcmVzb3VyY2VzCi0JICAgIAlnZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwocmVzb3VyY2VzVG9SZW1vdmUpOwotCSAgICB9Ci0JICAgIFJlc291cmNlIGRlbGVnYXRlZFJlc291cmNlID0gZGVsZWdhdGVkR2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCSAgICBpZiAoZGVsZWdhdGVkUmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgZGVsZWdhdGVkUmVzb3VyY2UpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gZGVsZWdhdGVkUmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICBpZiAobG9hZE9uRGVtYW5kKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZW1hbmRDcmVhdGVSZXNvdXJjZSh1cmkpOwotCSAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGEgcmVzb3VyY2UgZm9yICciICsgdXJpICsgIic7IGEgcmVnaXN0ZXJlZCByZXNvdXJjZSBmYWN0b3J5IGlzIG5lZWRlZCIpOwotCSAgICAgIH0KLQkgICAgICAKLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkgICAgICB9ICAKLQotCSAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCi0JICAgICAgICAgIAotCSAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgfQotCi0JICAgIHJldHVybiBudWxsOwotCSAgCi0JfQotCXByaXZhdGUgUmVzb3VyY2UgbG9hZFdpdGhDb250ZW50VHlwZShSZXNvdXJjZSByZXNvdXJjZSwgVVJJIHVyaSwgTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCwgYm9vbGVhbiBsb2FkT25EZW1hbmQsIExpc3QgcmVzb3VyY2VzVG9SZW1vdmUpIHsKLQkJLy8gY29udGVudCB0eXBlIGlzIGtub3duCi0JCWJvb2xlYW4gcmVzb3VyY2VFeGlzdHMgPSBmYWxzZTsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpCi0JCQlyZXNvdXJjZUV4aXN0cyA9IGZpbGUuZXhpc3RzKCk7Ci0JCVN0cmluZyByZXNvdXJjZUNvbnRlbnRUeXBlSUQgPSBnZXRDb250ZW50VHlwZUlEKHJlc291cmNlKTsKLQkJU3RyaW5nIHVyaUNvbnRlbnRUeXBlSUQgPSBnZXRDb250ZW50VHlwZU5hbWUodXJpKTsKLQkJU3RyaW5nIGV4aXN0aW5nTWFwS2V5VHlwZSA9IChmaW5kS2V5KHJlc291cmNlKSAhPSBudWxsKSA/IGdldENvbnRlbnRUeXBlTmFtZShmaW5kS2V5KHJlc291cmNlKSkgOiBudWxsOwotCQlpZigoIW1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlKSB8fCAoKG1hcC5nZXQodXJpKSAhPSBudWxsKSAmJiBtYXAuZ2V0KHVyaSkuZXF1YWxzKHJlc291cmNlKSkpIC8vIGV4aXN0aW5nIHJlc291cmNlICB3aXRoIGFsdGVybmF0ZSBtYXBwaW5nIGRvZXNuJ3QgZXhpc3QgaW4gbWFwCi0JCQl8fCAgKChyZXNvdXJjZUNvbnRlbnRUeXBlSUQgIT0gbnVsbCAmJiByZXNvdXJjZUNvbnRlbnRUeXBlSUQuZXF1YWxzKHVyaUNvbnRlbnRUeXBlSUQpKSkpIHsKLQkJCQlpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCQkJCX0gLy8gaWYgZW1iZWRkZWQgdXJpIGNvbnRlbnQgdHlwZSBpcyBkaWZmZXJlbnQgdGhhbiByZXNvdXJjZSBjb250ZW50IHR5cGUsIGNvbnRpbnVlIHNlYXJjaGluZwotCQkJCWlmIChyZXNvdXJjZUNvbnRlbnRUeXBlSUQgIT0gbnVsbAotCQkJCQkJJiYgdXJpQ29udGVudFR5cGVJRCAhPSBudWxsKSB7Ci0JCQkJCWlmICgocmVzb3VyY2VDb250ZW50VHlwZUlELmVxdWFscyh1cmlDb250ZW50VHlwZUlEKSkgJiYgZXhpc3RpbmdNYXBLZXlUeXBlID09IG51bGwpIHJldHVybiBudWxsOwotCQkJCQlpZiAoKCFyZXNvdXJjZUNvbnRlbnRUeXBlSUQuZXF1YWxzKHVyaUNvbnRlbnRUeXBlSUQpKSB8fCAoZXhpc3RpbmdNYXBLZXlUeXBlICE9IG51bGwgJiYgIWV4aXN0aW5nTWFwS2V5VHlwZQotCQkJCQkJCS5lcXVhbHModXJpQ29udGVudFR5cGVJRCkpKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWVsc2UgaWYgKGV4aXN0aW5nTWFwS2V5VHlwZSA9PSBudWxsICYmICFyZXNvdXJjZUV4aXN0cykgewotCQkJCQkJcmVzb3VyY2VzVG9SZW1vdmUuYWRkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh1cmlDb250ZW50VHlwZUlEICE9IG51bGwgJiYgcmVzb3VyY2VDb250ZW50VHlwZUlEID09IG51bGwgJiYgIXJlc291cmNlRXhpc3RzKSB7Ci0JCQkJCXJlc291cmNlc1RvUmVtb3ZlLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0JCQotCQkJCWlmIChtYXAgIT0gbnVsbCAmJiAobWFwLmdldCh1cmkpID09IG51bGwpKSB7Ci0JCQkJCW1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFJlc291cmNlIHJlcykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXMuZ2V0VVJJKCkpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlpZiAocmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZShyZXMuZ2V0VVJJKCkpOwotCQkJCWlmICghcmVzLmdldFVSSSgpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQotCQkJCQlmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRUeXBlSUQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZXNjID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgVVJJIGZpbmRLZXkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJTWFwIGFNYXAgPSBnZXRVUklSZXNvdXJjZU1hcCgpOwotCQlTZXQga2V5cyA9IGFNYXAua2V5U2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVVSSSBuYW1lID0gKFVSSSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFNYXAuZ2V0KG5hbWUpLmVxdWFscyhyZXNvdXJjZSkpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnRUeXBlTmFtZShVUkkgdXJpKSB7Ci0JCQotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpIHx8ICFpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkodXJpKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyID0gKHVyaS5zZWdtZW50Q291bnQoKSA+IDMgPyB1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpIDogbnVsbCk7Ci0JCWlmIChjb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSh1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpKSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoVVJJIGFNb2R1bGVVUkkpIHsKLQkJaWYgKGFNb2R1bGVVUkkuc2VnbWVudENvdW50KCkgPCAzKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kLCBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQkKLQotCSAgICBNYXA8VVJJLCBSZXNvdXJjZT4gbWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXAuZ2V0KHVyaSk7Ci0JICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0JICAgICAgICB9ICAgICAgICAKLQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIFVSSUNvbnZlcnRlciB0aGVVUklDb252ZXJ0ZXIgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkgICAgVVJJIG5vcm1hbGl6ZWRVUkkgPSB0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VzTG9jaykgewotCSAgICAJTGlzdDxSZXNvdXJjZT4gYyA9IGdldEltbXV0YWJsZVJlc291cmNlcygpOwotCSAgICAgICAgCi0JICAgICAgICBzeW5jaHJvbml6ZWQoYykgewotCSAgICAgICAgCQotCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjKSB7Ci0JCQkJCWlmICh0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHJlc291cmNlLmdldFVSSSgpKS5lcXVhbHMobm9ybWFsaXplZFVSSSkpIHsKLQkJCQkJCWlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQlkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkJCQkJCX0KLQkKLQkJCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQkJCW1hcC5wdXQodXJpLCByZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9Ci0JICAgICAgICB9Ci0JCX0KLQkgICAgCi0JICAgIFJlc291cmNlIGRlbGVnYXRlZFJlc291cmNlID0gZGVsZWdhdGVkR2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCSAgICBpZiAoZGVsZWdhdGVkUmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgZGVsZWdhdGVkUmVzb3VyY2UpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gZGVsZWdhdGVkUmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICBpZiAobG9hZE9uRGVtYW5kKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZW1hbmRDcmVhdGVSZXNvdXJjZSh1cmkscmVzb3VyY2VGYWN0b3J5KTsKLQkgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhIHJlc291cmNlIGZvciAnIiArIHVyaSArICInOyBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgZmFjdG9yeSBpcyBuZWVkZWQiKTsKLQkgICAgICB9Ci0KLQkgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgcmVzb3VyY2UpOwotCSAgICAgIH0gICAgICAKLQkgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICByZXR1cm4gbnVsbDsKLQkgIAotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0I3Jlc2V0Tm9ybWFsaXplZFVSSUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldE5vcm1hbGl6ZWRVUklDYWNoZSgpIHsKLQkJaWYgKGdldFVSSVJlc291cmNlTWFwKCkgIT0gbnVsbCkKLQkJCWdldFVSSVJlc291cmNlTWFwKCkuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGRlbWFuZENyZWF0ZVJlc291cmNlKFVSSSB1cmksIEZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KSB7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmkscmVzb3VyY2VGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEVMaXN0PFJlc291cmNlPiBnZXRSZXNvdXJjZXMoKSB7Ci0JCSByZXR1cm4gcHJpbUdldFJlc291cmNlcygpOwotCX0KLQlwcml2YXRlIEVMaXN0PFJlc291cmNlPiBwcmltR2V0UmVzb3VyY2VzKCkgewotCQkgaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkgICAgewotCQkgICAgICByZXNvdXJjZXMgPSBuZXcgU3luY2hyb25pemVkUmVzb3VyY2VzRUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCSAgICB9Ci0JCSAgICByZXR1cm4gcmVzb3VyY2VzOwotCX0KLQkvKioKLQkgKiBDcmVhdGluZyBhIGNvcHkgb2YgdGhlIHJlc291cmNlcyBsaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFTGlzdDxSZXNvdXJjZT4gZ2V0SW1tdXRhYmxlUmVzb3VyY2VzKCkgewotCQkgRUxpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IHByaW1HZXRSZXNvdXJjZXMoKTsKLQkJIHJldHVybiBuZXcgSW1tdXRhYmxlRUxpc3Q8UmVzb3VyY2U+KHJlc291cmNlcyk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCSAgICBBZGFwdGVyW10gZUFkYXB0ZXJzID0gZUJhc2ljQWRhcHRlckFycmF5KCk7Ci0JICAgIGlmIChlQWRhcHRlcnMgIT0gbnVsbCAmJiBlRGVsaXZlcigpKQotCSAgICB7Ci0JICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBlQWRhcHRlcnMubGVuZ3RoOyBpIDwgc2l6ZTsgKytpKQotCSAgICAgIHsKLQkgICAgICAJQWRhcHRlciB0ZW1wOwotCSAgICAJICBpZiAoKHRlbXAgPSBlQWRhcHRlcnNbaV0pICE9IG51bGwpCi0JICAgIAkJICB0ZW1wLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdCBlQWRhcHRlcnMoKQotCXsKLQkJaWYgKGVBZGFwdGVycyA9PSBudWxsKQotCQl7Ci0JCQllQWRhcHRlcnMgPSAgbmV3IEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZUFkYXB0ZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzNDEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtzcGFjZVJlc291cmNlSGFuZGxlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byByZWRpcmVjdCwgaWYgbmVjZXNzYXJ5LCB0byBhbm90aGVyIAotICogUmVzb3VyY2VTZXQuICBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlcgotICogc28gdGhhdCB0aGUgVVJJcyBwYXNzZWQgd2lsbCB1c2UgdGhlIHBsYXRmb3JtIHByb3RvY29sLiAgQW55dGhpbmcgZWxzZSB3aWxsIGJlIGNvbnNpZGVyZWQKLSAqIHRvIGJlIGFtYmlndW91cyBhbmQgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byByZWRpcmVjdC4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlciBpbXBsZW1lbnRzIFJlc291cmNlSGFuZGxlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkvKgotCSogQHNlZSBJUmVzb3VyY2VIYW5kbGVyI2dldFJlc291cmNlKFJlc291cmNlU2V0LCBVUkkpCi0JKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKQotCQkJcmV0dXJuIGdldFJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlVUkkgbWFwcGVkVVJJID0gKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcClvcmlnaW5hdGluZ1Jlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmdldFVSSU1hcCgpKS5nZXRVUkkodXJpKTsKLQkJaWYgKGlzR2xvYmFsUGx1Z2luTG9hZChtYXBwZWRVUkkpKQotCQkJcmV0dXJuIGdldFJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSA8Y29kZT51cmk8L2NvZGU+LgotCSAqIFRoZSA8Y29kZT51cmk8L2NvZGU+IHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgcGxhdGZvcm06L3Jlc291cmNlL1twcm9qZWN0IG5hbWVdLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSB1cmkuc2VnbWVudCgxKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qZWN0KTsKLQkJCWlmIChvcmlnaW5hdGluZ1Jlc291cmNlU2V0ICE9IHNldCkKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkJICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSA8Y29kZT51cmk8L2NvZGU+LgotCQkgKiBUaGUgPGNvZGU+dXJpPC9jb2RlPiB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9bcHJvamVjdCBuYW1lXS4KLQkJICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCQkKLQkJUmVzb3VyY2VTZXQgc2V0ID0gSkVNVXRpbFBsdWdpbi5nZXRQbHVnaW5SZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBzZXQpOwotCQl9Ci0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHJlZGlyZWN0ZWRSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gcmVkaXJlY3RlZFJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JfQotCS8qKgotCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGZpbGUgbmFtZS4KLQkgKiBUaGlzIGlzIGZvciBjb21wYXRhYmlsaXR5IHB1cnBvc2VzIGZvciBwZW9wbGUgdXNpbmcgdGhlIHBsYXRmb3JtOi9yZXNvdXJjZSBwcm90b2NvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gdXJpLnNlZ21lbnQoMSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvamVjdCk7Ci0JCQlpZiAob3JpZ2luYXRpbmdSZXNvdXJjZVNldCAhPSBzZXQpCi0JCQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSwgc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGZpbGUgbmFtZS4KLQkJICogVGhpcyBpcyBmb3IgY29tcGF0YWJpbGl0eSBwdXJwb3NlcyBmb3IgcGVvcGxlIHVzaW5nIHRoZSBwbGF0Zm9ybTovcmVzb3VyY2UgcHJvdG9jb2wuCi0JCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQkJCi0JCVJlc291cmNlU2V0IHNldCA9IEpFTVV0aWxQbHVnaW4uZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSwgc2V0KTsKLQkJCQotCX0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2VTZXQgcmVkaXJlY3RlZFJlc291cmNlU2V0KSB7Ci0JCXJldHVybiByZWRpcmVjdGVkUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCUlXb3Jrc3BhY2Ugd3MgPSBnZXRXb3Jrc3BhY2UoKTsKLQkJaWYgKHdzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRQcm9qZWN0KHJlc291cmNlU2V0KTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZXNvdXJjZUhhbmRsZXIjY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQsIFVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKQotCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlVUkkgbWFwcGVkVVJJID0gKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcClvcmlnaW5hdGluZ1Jlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmdldFVSSU1hcCgpKS5nZXRVUkkodXJpKTsKLQkJaWYgKGlzR2xvYmFsUGx1Z2luTG9hZChtYXBwZWRVUkkpKQotCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZXNvdXJjZUhhbmRsZXIjZ2V0RU9iamVjdEZhaWxlZChSZXNvdXJjZVNldCwgVVJJLCBib29sZWFuKQotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3RGYWlsZWQoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzR2xvYmFsUGx1Z2luTG9hZChVUkkgYVVSSSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSShhVVJJKSkgewotCQkJU3RyaW5nW10gZ2xvYmFsUGx1Z2lucyA9IEpFTVV0aWxQbHVnaW4uZ2V0R2xvYmFsTG9hZGluZ1BsdWdpbk5hbWVzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxnbG9iYWxQbHVnaW5zLmxlbmd0aDtpKyspIHsKLQkJCQlpZiAoYVVSSS5zZWdtZW50KDEpLnN0YXJ0c1dpdGgoZ2xvYmFsUGx1Z2luc1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTBhZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmllckltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY2FwdHVyZSBhbGwgQUREIGFuZCBSRU1PVkUgbm90aWZpY2F0aW9ucyBmcm9tIGVhY2ggUHJvamVjdFJlc291cmNlU2V0Ci0gKiBhbmQgZm9yd2FyZCBpdCBvbiB0byBhbnkgaW50ZXJyZXN0ZWQgbGlzdGVuZXJzLiAgVGhpcyBpcyB0byBhbGxvdyB5b3UgdG8gbGlzdGVuIHRvIG9uZSBvYmplY3QKLSAqIHRvIGdhaW4gYWxsIEFERCBhbmQgUkVNT1ZFIG5vdGlmaWNhdGlvbnMgZm9yIGVhY2ggUmVzb3VyY2VTZXQgd2l0aGluIHRoZSBzeXN0ZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyIGV4dGVuZHMgTm90aWZpZXJJbXBsIHsKLQlwcm90ZWN0ZWQgQWRhcHRlciBwcm9qZWN0QWRhcHRlciA9IG5ldyBXb3Jrc3BhY2VSZXNvdXJjZUNhY2hlQWRhcHRlcigpOwotCi0JY2xhc3MgV29ya3NwYWNlUmVzb3VyY2VDYWNoZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qKgotCQkgKiBGb3J3YXJkIEFERCBhbmQgUkVNT1ZFIG5vdGlmaWNhdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCQkJZU5vdGlmeShtc2cpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBXb3Jrc3BhY2VSZXNvdXJjZUNhY2hlLgotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byBhIFByb2plY3RSZXNvdXJjZVNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpbkxpc3RlbmluZyhQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmIChhUmVzb3VyY2VTZXQgIT0gbnVsbCkgeyAKLQkJCWlmIChhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkgPT0gbnVsbCB8fCAgCi0JCQkhYVJlc291cmNlU2V0LmVBZGFwdGVycygpLmNvbnRhaW5zKHByb2plY3RBZGFwdGVyKSkKLQkJCWFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5hZGQocHJvamVjdEFkYXB0ZXIpOwotCQl9Ci0JfQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIGEgUHJvamVjdFJlc291cmNlU2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmcoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwpCi0JCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHByb2plY3RBZGFwdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVmN2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZOYXR1cmVSZWdpc3RyeS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFTUZOYXR1cmVSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX1JFR0lTVFJBVElPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbC5uYXR1cmVfcmVnaXN0cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkUgID0gIm5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIEVNRk5hdHVyZVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQlyZWFkUmVnaXN0cnkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRU1GTmF0dXJlUmVnaXN0cnkgc2luZ2xldG9uOwotCQotCXB1YmxpYyBmaW5hbCBTZXQgUkVHSVNURVJFRF9OQVRVUkVfSURTID0gbmV3IEhhc2hTZXQoKTsKLQkKLQlwdWJsaWMgc3RhdGljIEVNRk5hdHVyZVJlZ2lzdHJ5IHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQkJc2luZ2xldG9uID0gbmV3IEVNRk5hdHVyZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkvLyByZWdpc3RlciBOYXR1cmUgSURzIGZvciB0aGUgSjJFRU5hdHVyZXMKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHIgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZSA9IHIuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKE5BVFVSRV9SRUdJU1RSQVRJT05fUE9JTlQpOwotCQlTdHJpbmcgbmF0dXJlSWQ7Ci0JCWZvciAoaW50IGk9MDsgaTxjZS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNlW2ldLmdldE5hbWUoKS5lcXVhbHMoTkFUVVJFKSkgewotCQkJCW5hdHVyZUlkID0gY2VbaV0uZ2V0QXR0cmlidXRlKFNUQVRJQ19JRCk7Ci0JCQkJaWYgKG5hdHVyZUlkICE9IG51bGwpCi0JCQkJCXJlZ2lzdGVyTmF0dXJlSUQobmF0dXJlSWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTmF0dXJlSUQoU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCWlmICghUkVHSVNURVJFRF9OQVRVUkVfSURTLmNvbnRhaW5zKG5hdHVyZUlkKSkKLQkJCVJFR0lTVEVSRURfTkFUVVJFX0lEUy5hZGQobmF0dXJlSWQpOwotCQllbHNlCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GTmF0dXJlUmVnaXN0cnlfRVJST1JfMCIsIG5ldyBPYmplY3RbXSB7bmF0dXJlSWR9KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25scy9FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25scy9FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhOGU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5sczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZW1md29ya2JlbmNoIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQkJCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQl0cnkge3JldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge3JldHVybiBnZXRTdHJpbmcoa2V5KTt9Ci0KLX0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvQ2hhcmFjdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL0NoYXJhY3RlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MmIwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvQ2hhcmFjdGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlVURjE2OwotIAotCi0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW4gdGhlIG5ldyBVVEYgbXVsdGktY2hhciBmb3JtYXQuCi0gKiBJdCBpcyBuZWVkZWQgYmVjYXVzZSBJQ1U0SiBjdXJyZW50bHkgZG9lc24ndCBoYW5kbGUgc29tZSBjb3JyZWN0bHkgeWV0IHRoYXQgd2UKLSAqIG5lZWQgdG8gaGF2ZSB3b3JraW5nLiBBcyBJQ1U0SiBnZXRzIHRoZW0gd29ya2luZywgdGhlIG1ldGhvZHMgaGVyZSB3aWxsIGJlY29tZQotICogZGVwcmVjYXRlZC4KLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJVdGlsIHsKLQotCXByaXZhdGUgQ2hhcmFjdGVyVXRpbCgpIHsKLQkJCi0JfQotCQotCQotCS8qKgotCSAqIFRPRE8gU28gdW50aWwgSUNVNEogZG9lcyB3b3JrIGNvcnJlY3RseSB0aGlzIHV0aWwgd2lsbCBiZSBuZWVkZWQuIEl0IHdpbGwKLQkgKiBzdGF5IGFyb3VuZCBiZWNhdXNlIGl0IGlzIEFQSSwgYnV0IGF0IHRoYXQgdGltZSBpdCB3aWxsIGJlIG1hcmtlZCBkZXByZWNhdGVkLiBJdCBzaG91bGQKLQkgKiBhbHNvIHRoZW4gcmVyb3V0ZSB0byBJQ1U0SiBpbnN0ZWFkIG9mIGRvaW5nIHRoZSBtZXRob2QgcmVmbGVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIE1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQsIE1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVDsKLQkKLQlzdGF0aWMgewotCQkvLyBUcnkgdG8gZ2V0IHRoZSBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllcihpbnQpIG1ldGhvZC4gSWYgdGhlcmUsIHRoZW4gd2UgYXJlIGluIDEuNSBvciBhYm92ZS4gRWxzZSB1c2UgdGhlIGNoYXIgZm9ybS4KLQkJdHJ5IHsKLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQgPSBDaGFyYWN0ZXIuY2xhc3MuZ2V0TWV0aG9kKCJpc0phdmFJZGVudGlmaWVyU3RhcnQiLCBuZXcgQ2xhc3NbXSB7SW50ZWdlci5UWVBFfSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUID0gbnVsbDsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUID0gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUID0gQ2hhcmFjdGVyLmNsYXNzLmdldE1ldGhvZCgiaXNKYXZhSWRlbnRpZmllclBhcnQiLCBuZXcgQ2xhc3NbXSB7SW50ZWdlci5UWVBFfSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgPSBudWxsOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJLy8gRGVmYXVsdCB0byB1c2UgKGNoYXIpIHR5cGUgaW5zdGVhZC4KLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCA9IG51bGw7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIElzIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllcgotCSAqIEBwYXJhbSBpbnRDaGFyIGludCBjaGFyYWN0ZXIgKFVURiBtdWx0aS1jaGFyIGlzIHZhbGlkKQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3RhcnQgb2YgamF2YSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBzZWUgQ2hhcmFjdGVyI2lzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyKQotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZGVudGlmaWVyU3RhcnQoaW50IGludENoYXIpIHsKLQkJaWYgKE1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChCb29sZWFuKSBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJULmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGludENoYXIpfSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGNoYXIpIGludENoYXIpOwotCX0KLQkKLQkvKioKLQkgKiBJcyBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIKLQkgKiBAcGFyYW0gaW50Q2hhciBpbnQgY2hhcmFjdGVyIChVVEYgbXVsdGktY2hhciBpcyB2YWxpZCkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAc2VlIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyU3RhcnQoY2hhcikKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclBhcnQoaW50IGludENoYXIpIHsKLQkJaWYgKE1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEJvb2xlYW4pIE1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbnRDaGFyKX0pKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoKGNoYXIpIGludENoYXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hhckl0ZXJhdG9yIHsKLQotCQkKLQkJcHJvdGVjdGVkIGZpbmFsIENoYXJTZXF1ZW5jZSBjaGFyU2VxOwotCQlwcml2YXRlIGludCBwb3MgPSAwOwotCQlwcml2YXRlIGludCBsYXN0Q2hhckluZGV4ID0gMDsKLQotCQkvKioKLQkJICogQ3JlYXRlIHdpdGggYSBzdHJpbmcuCi0JCSAqIEBwYXJhbSBjaGFyU2VxCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdENoYXJJdGVyYXRvcihDaGFyU2VxdWVuY2UgY2hhclNlcSkgewotCQkJdGhpcy5jaGFyU2VxID0gY2hhclNlcTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgbmV4dCBjaGFyIGluZGV4LgotCQkgKiBAcGFyYW0gaW5kZXgKLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7Ci0JCQlwb3MgPSBpbmRleDsKLQkJfQotCi0JCS8qKgotCQkgKiBIYXMgYW5vdGhlciBjaGFyLgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGFub3RoZXIgY2hhciB0byByZXR1cm4uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gcG9zIDwgY2hhclNlcS5sZW5ndGgoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEhhcyBhbm90aGVyIGNoYXIgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBEb2luZyBwcmV2aW91cwotCQkgKiB3aWxsIHJldHVybiB0aGUgY2hhciB0aGF0IHdhcyBqdXN0IHJldHVybmVkLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkJcmV0dXJuIHBvcyA+IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gbmV4dCBjaGFyIGZyb20gdGhlIG9uZSB0aGF0IHdhcyBqdXN0IHJldHVybmVkLgotCQkgKiBAcmV0dXJuIG5leHQgY2hhci4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGludCBuZXh0KCkgewotCQkJaWYgKCFoYXNOZXh0KCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCi0JCQlpbnQgbmV4dCA9IHV0ZkNoYXJBdChwb3MpOwotCQkJbGFzdENoYXJJbmRleCA9IHBvczsKLQkJCXBvcyArPSBVVEYxNi5nZXRDaGFyQ291bnQobmV4dCk7Ci0JCQlyZXR1cm4gbmV4dDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgVVRGLTMyIGNoYXIgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgotCQkgKiBAcGFyYW0gcG9zCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IGludCB1dGZDaGFyQXQoaW50IHBvcyk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgZnJvbSB0aGUgb25lIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGludCBwcmV2aW91cygpIHsKLQkJCWlmICghaGFzUHJldmlvdXMoKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLQkJCWludCBuZXh0OwotCQkJaWYgKFVURjE2LmlzVHJhaWxTdXJyb2dhdGUoY2hhclNlcS5jaGFyQXQoLS1wb3MpKSkgewotCQkJCWlmIChwb3MgPiAwKQotCQkJCQluZXh0ID0gdXRmQ2hhckF0KC0tcG9zKTsKLQkJCQllbHNlCi0JCQkJCW5leHQgPSBjaGFyU2VxLmNoYXJBdChwb3MpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0ID0gY2hhclNlcS5jaGFyQXQocG9zKTsKLQkJCX0KLQkJCWxhc3RDaGFySW5kZXggPSBwb3M7Ci0JCQlyZXR1cm4gbmV4dDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgVVRGMTYgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSBjaGFyIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQgZnJvbSBlaXRoZXIKLQkJICogcHJldmlvdXMgb3IgbmV4dC4KLQkJICogVGhpcyBpcyB0aGUgKGNoYXIpIHBvc2l0aW9uIG5vdCB0aGUKLQkJICogcG9zaXRpb24gb2YgbG9naWNhbCBpbnQgY2hhcnMgcmV0dXJuZWQuIEZvciBleGFtcGxlIGEgc3RhbmRhcmQgc3RyaW5nIG9mCi0JCSAqIDxjb2RlPiJhYmMiPC9jb2RlPiB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXIgJ2InIGlzIDEuIEJ1dCB0YWtlIHRoZSBzdHJpbmcKLQkJICogPGNvZGU+ImFiMWIyYyI8L2NvZGU+IHdoZXJlICJiMWIyIiBpcyBvbmUgVVRGLTMyIGNoYXIsIHRoZW4gdGhlIHBvc2l0aW9uCi0JCSAqIG9mICdjJyBpcyAzLiBJdCB3b3VsZCBub3QgYmUgMiwgd2hpY2ggaXMgd2hhdCB0aGUgbG9naWNhbCBjaGFyIHBvc2l0aW9uCi0JCSAqIHdvdWxkIGJlIGlmIHRha2luZyBVRlQzMiBpbnRvIGFjY291bnQuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJCXJldHVybiBsYXN0Q2hhckluZGV4OwotCQl9Ci0JCi0JfQotCQotCS8qKgotCSAqIFNwZWNpYWwgY2hhciBpdGVyYXRvciB0aGF0IHJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGNoYXJzIGZvcgotCSAqIHdhbGtpbmcgc3RyaW5ncyB0aGF0IGNhbiBjb250YWluIFVURiBtdWx0aS1jaGFycy4gVGhpcyBpcwotCSAqIGEgbGltaXRlZCB2ZXJzaW9uIG9mIHtAbGluayBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3J9LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7Ci0JCQotCi0JCS8qKgotCQkgKiBDcmVhdGUgd2l0aCBhIHN0cmluZy4KLQkJICogQHBhcmFtIHN0cgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nSXRlcmF0b3IoU3RyaW5nIHN0cikgewotCQkJc3VwZXIoc3RyKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLkNoYXJhY3RlclV0aWwuQWJzdHJhY3RDaGFySXRlcmF0b3IjdXRmQ2hhckF0KGludCkKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgdXRmQ2hhckF0KGludCBwb3MpIHsKLQkJCXJldHVybiBVVEYxNi5jaGFyQXQoKFN0cmluZykgY2hhclNlcSwgcG9zKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbCBjaGFyIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBpbnRzIGluc3RlYWQgb2YgY2hhcnMgZm9yCi0JICogd2Fsa2luZyBzdHJpbmdzIHRoYXQgY2FuIGNvbnRhaW4gVVRGIG11bHRpLWNoYXJzLiBUaGlzIGlzCi0JICogYSBsaW1pdGVkIHZlcnNpb24gb2Yge0BsaW5rIGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcn0uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdCdWZmZXJJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0Q2hhckl0ZXJhdG9yIHsKLQkJCi0KLQkJLyoqCi0JCSAqIENyZWF0ZSB3aXRoIGEgc3RyaW5nLgotCQkgKiBAcGFyYW0gc3RyQnVmZmVyCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdCdWZmZXJJdGVyYXRvcihTdHJpbmdCdWZmZXIgc3RyQnVmZmVyKSB7Ci0JCQlzdXBlcihzdHJCdWZmZXIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuQ2hhcmFjdGVyVXRpbC5BYnN0cmFjdENoYXJJdGVyYXRvciN1dGZDaGFyQXQoaW50KQotCQkgKi8KLQkJcHJvdGVjdGVkIGludCB1dGZDaGFyQXQoaW50IHBvcykgewotCQkJcmV0dXJuIFVURjE2LmNoYXJBdCgoU3RyaW5nQnVmZmVyKSBjaGFyU2VxLCBwb3MpOwotCQl9Ci0JCQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL05vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhZjJiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjMgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnN0YW50aWF0aW9uIHRvIHVzZSBpZiB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBwbHVnaW4gaXMgbm90IGluc3RhbGxlZC4gSXQgYmFzaWNhbGx5IGRvZXMgbm90aGluZy4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yIGV4dGVuZHMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCB7Ci0KLQkvKgotCSAqIE9ubHkgaW5zdGFudGlhdGVkIGZyb20gdGhpcyBwYWNrYWdlLgotCSAqLwotCU5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI3NldFZhcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgewotCX0KLQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QZXJmb3JtYW5jZU1vbml0b3JVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmYzYTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QZXJmb3JtYW5jZU1vbml0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLklQZXJmb3JtYW5jZU1vbml0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgd3JhcHBlciB0byB0aGUgSVBlcmZvcm1hbmNlTW9uaXRvciB0aGF0IGhpZGVzIGl0IHNvIHRoYXQgdGhlIGFjdHVhbCBwbHVnaW4gY2FuIGJlIG9wdGlvbmFsIGFuZCBub3QgcmVxdWlyZWQuCi0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgewotCS8qKgotCSAqIEV2ZW50IGZvciBQZXJmb3JtYW5jZUxpc3RlbmVyIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcmZvcm1hbmNlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2ODAwNzE0NjI3NTAxODAzMzlMOwotCi0JCVBlcmZvcm1hbmNlRXZlbnQoT2JqZWN0IHNvdXJjZSwgaW50IHN0ZXApIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlzbmFwc2hvd1dpdGhUeXBlcyA9IGZhbHNlOwotCQkJdGhpcy5zdGVwID0gc3RlcDsKLQkJCXRoaXMudHlwZXMgPSAwOwkvLyBOb3Qgc2V0LgotCQl9Ci0JCQotCQlQZXJmb3JtYW5jZUV2ZW50KE9iamVjdCBzb3VyY2UsIGludCBzdGVwLCBpbnQgdHlwZXMpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlzbmFwc2hvd1dpdGhUeXBlcyA9IHRydWU7Ci0JCQl0aGlzLnN0ZXAgPSBzdGVwOwotCQkJdGhpcy50eXBlcyA9IHR5cGVzOwotCQl9Ci0KLQkJCi0JCS8qKgotCQkgKiBTbmFwc2hvdCB3aXRoIHR5cGVzIGlmIDxjb2RlPnRydWU8L2NvZGU+LgotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBib29sZWFuIHNuYXBzaG93V2l0aFR5cGVzOwotCi0JCS8qKgotCQkgKiBTdGVwIG9mIHNuYXBzaG90Ci0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIGludCBzdGVwOwotCQkKLQkJLyoqCi0JCSAqIHR5cGVzIG9mIHNuYXBzaG90LgotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBpbnQgdHlwZXM7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1hbmNlIExpc3RlbmVyIGludGVyZmFjZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUGVyZm9ybWFuY2VMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBTbmFwc2hvdCB3YXMgY2FsbGVkLgotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc25hcHNob3QoUGVyZm9ybWFuY2VFdmVudCBldmVudCk7Ci0JfQotCQotCXByaXZhdGUgUGVyZm9ybWFuY2VMaXN0ZW5lcltdIGxpc3RlbmVyczsKLQotCXB1YmxpYyBpbnRlcmZhY2UgVHlwZXMgewotCi0JCS8qKgotCQkgKiAxIC0gV3JpdGUgb3V0IHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGVzZSBpbmNsdWRlIHdvcmtpbmcgc2V0LCBwZWFrIHdvcmtpbmcgc2V0LCBlbGFwc2VkIHRpbWUsIHVzZXIgdGltZSwgYW5kCi0JCSAqIGtlcm5lbCB0aW1lLgotCQkgKi8KLQkJaW50IE9wZXJhdGluZ1N5c3RlbUNvdW50ZXJzID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5PcGVyYXRpbmdTeXN0ZW1Db3VudGVyczsKLQotCQkvKioKLQkJICogMiAtIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHBlcmZvcm1hbmNlIGluZm8uIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpa2UgdGhlIHRvdGFsIGNvbW1pdHRlZCBtZW1vcnkgZm9yIHRoZSBlbnRpcmUgc3lzdGVtLgotCQkgKiAKLQkJICogVGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSBHZXRQZXJmb3JtYW5jZUluZm8oKSBmdW5jdGlvbiBiZWluZyBhdmFpbGFibGUgaW4gdGhlIFdpbmRvd3MgcHNhcGkuZGxsLiBUaGlzIGlzIGF2YWlsYWJsZSBpbiBYUCBidXQgaXMgdXN1YWxseQotCQkgKiBub3QgYXZhaWxhYmxlIGluIFdpbi8yMDAwLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHRoZW4gdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCi0JCSAqLwotCQlpbnQgR2xvYmFsU3lzdGVtQ291bnRlcnMgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkdsb2JhbFN5c3RlbUNvdW50ZXJzOwotCi0JCS8qKgotCQkgKiA0IC0gV3JpdGUgb3V0IHRoZSBzaXplIG9mIHRoZSBKYXZhIEhlYXAuCi0JCSAqLwotCQlpbnQgSmF2YUhlYXBTaXplID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5KYXZhSGVhcFNpemU7Ci0KLQkJLyoqCi0JCSAqIDggLSBXcml0ZSBvdXQgaG93IG11Y2ggb2YgdGhlIEphdmEgaGVhcCBpcyBiZWluZyB1c2VkLiBUaGlzIGNhbGxzIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBzbyBpdCBtYXkgc2tldyB0aW1pbmcgcmVzdWx0cy4KLQkJICovCi0JCWludCBKYXZhSGVhcFVzZWQgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkphdmFIZWFwVXNlZDsKLQotCQkvKioKLQkJICogMTYgLSBUaGUgcGx1Z2luIHN0YXJ0dXAgYW5kIHNpemUgaW5mb3JtYXRpb24uCi0JCSAqLwotCQlpbnQgUGx1Z2luSW5mbyA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuUGx1Z2luSW5mbzsKLQotCQkvKiogMHhmZmZmIC0gRXZlcnl0aGluZy4gKi8KLQkJaW50IEFsbCA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuQWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgc2hhcmVkTW9uaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCBnZXRNb25pdG9yKCkgewotCQlpZiAoc2hhcmVkTW9uaXRvciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUNsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5QZXJmTXNyQ29yZVBsdWdpbiIpOyAvLyBUaGlzIGp1c3QgdGVzdHMgaWYgdGhlIHBlcmZvcm1hbmNlIHBsdWdpbiBpcyBhdmFpbGFibGUuIFRocm93cyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJCQkJIC8vIGV4Y2VwdGlvbiBvdGhlcndpc2UuCi0JCQkJQ2xhc3MgcHJlc2VudENsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLnV0aWwuUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvciIpOyAvLyBHZXQgdGhlIGNsYXNzIHdlIHVzZSB3cmFwcGVyIGl0LiAvLyROT04tTkxTLTEkCi0JCQkJc2hhcmVkTW9uaXRvciA9IChQZXJmb3JtYW5jZU1vbml0b3JVdGlsKSBwcmVzZW50Q2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCQlpZiAoIXNoYXJlZE1vbml0b3IuaXNWYWxpZCgpKQotCQkJCQlzaGFyZWRNb25pdG9yID0gbnVsbDsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGFueSBydW50aW1lIGV4Y2VwdGlvbiwganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGNsYXNzIG5vdCBmb3VuZCwgdGhlbiBwbHVnaW4gbm90IGF2YWlsYWJsZSwgc28ganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIFByb2JsZW0gaW5zdGFudGlhdGluZywgc28ganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCS8vIFNvbWUgaWxsZWdhbCBhY2Nlc3MsIHNvIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9Ci0JCQlpZiAoc2hhcmVkTW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJLy8gQ291bGRuJ3QgZ2V0IHRoZSBwZXJmb3JtYW5jZSBvbmUgZm9yIHNvbWUgcmVhc29uLiBVc2Ugbm90IHByZXNlbnQgb25lIGluc3RlYWQuCi0JCQkJc2hhcmVkTW9uaXRvciA9IG5ldyBOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNoYXJlZE1vbml0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFyaWF0aW9ucyB0aGF0IGFyZSBpbiBlZmZlY3QuCi0JICogCi0JICogQHBhcmFtIHZhcgotCSAqICAgICAgICAgICAgYSBjb21tYSBkZWxpbWl0ZWQgc3RyaW5nIG9mIHZhcmlhdGlvbiBudW1iZXJzCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpOwotCi0JLyoqCi0JICogVGFrZSBhIHNuYXBzaG90IG9mIHNvbWUgZGVmYXVsdCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHN0ZXAKLQkgKiAgICAgICAgICAgIHRoaXMgaWRlbnRpZmllcyB0aGUgc3RlcCB0aGF0IHRoZSBzbmFwc2hvdCBpcyBmb3IKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzbmFwc2hvdChpbnQgc3RlcCkgewotCQlkb1NuYXBzaG90KHN0ZXApOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCi0JCQlub3RpZnlTbmFwc2hvdChuZXcgUGVyZm9ybWFuY2VFdmVudCh0aGlzLCBzdGVwKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlTbmFwc2hvdChQZXJmb3JtYW5jZUV2ZW50IGV2ZW50KSB7Ci0JCVBlcmZvcm1hbmNlTGlzdGVuZXJbXSBsaXN0ID0gbGlzdGVuZXJzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3RbaV0uc25hcHNob3QoZXZlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERvIHRoZSBhY3R1YWwgc25hcHNob3QKLQkgKiBAcGFyYW0gc3RlcAotCSAqIAotCSAqIEBzZWUgI3NuYXBzaG90KGludCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKTsKLQotCS8qKgotCSAqIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgc2VsZWN0ZWQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGVwCi0JICogICAgICAgICAgICB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCi0JICogCi0JICogQHBhcmFtIHR5cGVzCi0JICogICAgICAgICAgICBUaGlzIGNvbnRyb2xzIHdoaWNoIG1lYXN1cmVtZW50cyBhcmUgc2VsZWN0ZWQuIEl0IGlzIGFuIG9yJ2QgdG9nZXRoZXIgbGlzdCBvZiB0aGUgSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcyBjb25zdGFudHMuCi0JICogCi0JICogQHNlZSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzCi0JICovCi0JcHVibGljIHZvaWQgc25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgewotCQlkb1NuYXBzaG90KHN0ZXAsIHR5cGVzKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJbm90aWZ5U25hcHNob3QobmV3IFBlcmZvcm1hbmNlRXZlbnQodGhpcywgc3RlcCwgdHlwZXMpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBEbyB0aGUgYWN0dWFsIHNuYXBzaG90Ci0JICogQHBhcmFtIHN0ZXAKLQkgKiAKLQkgKiBAc2VlICNzbmFwc2hvdChpbnQsIGludCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpOwkKLQkKLQkvKioKLQkgKiBBZGQgbGlzdGVuZXIgdG8gbGlzdC4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQZXJmb3JtYW5jZUxpc3RlbmVyKFBlcmZvcm1hbmNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZpbmRMaXN0ZW5lcihsaXN0ZW5lcikgIT0gLTEpCi0JCQlyZXR1cm47Ci0JCVBlcmZvcm1hbmNlTGlzdGVuZXJbXSBuZXdMaXN0ID0gbmV3IFBlcmZvcm1hbmNlTGlzdGVuZXJbbGlzdGVuZXJzICE9IG51bGwgPyBsaXN0ZW5lcnMubGVuZ3RoKzEgOiAxXTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIG5ld0xpc3QsIDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCQluZXdMaXN0W25ld0xpc3QubGVuZ3RoLTFdID0gbGlzdGVuZXI7Ci0JCWxpc3RlbmVycyA9IG5ld0xpc3Q7Ci0JfQotCQotCXByaXZhdGUgaW50IGZpbmRMaXN0ZW5lcihQZXJmb3JtYW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKQotCQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJmb3JtYW5jZUxpc3RlbmVyKFBlcmZvcm1hbmNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaW50IGluZGV4ID0gZmluZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJbGlzdGVuZXJzID0gbnVsbDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlQZXJmb3JtYW5jZUxpc3RlbmVyW10gbmV3TGlzdCA9IG5ldyBQZXJmb3JtYW5jZUxpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgbmV3TGlzdCwgMCwgaW5kZXgpOwotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIGluZGV4KzEsIG5ld0xpc3QsIGluZGV4LCBuZXdMaXN0Lmxlbmd0aC1pbmRleCk7Ci0JCQlsaXN0ZW5lcnMgPSBuZXdMaXN0OwotCQl9Ci0JfQotCS8qKgotCSAqIFVwbG9hZCB0aGUgcmVzdWx0cyB0byB0aGUgc2VydmVyLiBUaGlzIGNhdXNlcyB0aGUgZmlsZSB0byBiZQotCSAqIGNsb3NlZCwgYW5kIHRoZSBtb25pdG9yIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBmaW5pc2hlZCBzdGF0ZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIHVwbG9hZGhvc3QsIHVwbG9hZHBvcnQgYW5kIHVwbG9hZHVzZXJpZAotCSAqIGhhdmUgYmVlbiBjb25maWd1cmVkIGJlZm9yZSBoYW5kLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAoaXQgY2FuIGJlIG51bGwpCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBsb2FkKFN0cmluZyBkZXNjcmlwdGlvbil7cmV0dXJuIGZhbHNlO30KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDIxY2Q1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuSVBlcmZvcm1hbmNlTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgdmVyc2lvbiB1c2VkIHdoZW4gdGhlIHBlcmZvcm1hbmNlIHBsdWdpbiBpcyBhdmFpbGFibGUuCi0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvciBleHRlbmRzIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCN1cGxvYWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGxvYWQoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiBtb25pdG9yLnVwbG9hZChkZXNjcmlwdGlvbikuc3VjY2VzczsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGVyZm9ybWFuY2VNb25pdG9yIG1vbml0b3I7Ci0KLQkvKgotCSAqIFNvIHRoYXQgb25seSBpbnN0YW50aWF0ZWQgYnkgdGhpcyBwYWNrYWdlLgotCSAqLwotCVByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IoKSB7Ci0JCW1vbml0b3IgPSBQZXJmTXNyQ29yZVBsdWdpbi5nZXRQZXJmb3JtYW5jZU1vbml0b3IodHJ1ZSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjaXNWYWxpZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIG1vbml0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjc2V0VmFyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLQkJbW9uaXRvci5zZXRWYXIodmFyKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2RvU25hcHNob3QoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXApIHsKLQkJbW9uaXRvci5zbmFwc2hvdChzdGVwKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2RvU25hcHNob3QoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKSB7Ci0JCW1vbml0b3Iuc25hcHNob3Qoc3RlcCwgdHlwZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzZjZjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFJlZ2lzdHJ5UmVhZGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNyAkJCAgJCREYXRlOiAyMDA5LzA4LzExIDE1OjMwOjMyICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBDbGFzcyB0byByZWFkIGEgcmVnaXN0cnkuIEl0IGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBzcGVjaWZpYyBmdW5jdGlvbi4KLSAqIAotICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWdpc3RyeVJlYWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcihTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlzdXBlcihwbHVnaW5JRCwgZXh0ZW5zaW9uUG9pbnQpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcGx1Z2luIGlkIG9mIGEgY29uZmlndWF0aW9uIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKiBAcmV0dXJuIHBsdWdpbiBpZCBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSAoQGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXIuZ2V0UGx1Z2luSWQoKSkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyLmdldFBsdWdpbklkKGNvbmZpZ3VyYXRpb25FbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVnaXN0cnlSZWFkZXIgdGFraW5nIGEgcmVnaXN0cnksIHBsdWdpbiBpZCwgYW5kIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2UgUmVnaXN0cnlSZWFkZXIocGx1Z2luLCBleHRlbnNpb25Qb2ludCkgaW5zdGVhZC4gVGhlIHJlZ2lzdHJ5IHBhc3NlZCBpbiBpcyBpZ25vcmVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcihJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwbHVnaW5JRCwgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRoaXMocGx1Z2luSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0byBzZWUgaWYgaXQgaXMgdmFsaWQgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4gQSB2YWxpZCByZWFzb24gbm90IHRvIHdvdWxkIGJlIHRoYXQgdGhlIHdvcmtzcGFjZSBpcwotCSAqIHNodXR0aW5nIGRvbncuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHZhbGlkIHBvaW50IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSAoQGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXIuY2FuQ3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigpKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5DcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlci5jYW5DcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3lzdGVtIGJ1bmRsZQotCSAqIAotCSAqIEByZXR1cm4gc3lzdGVtIGJ1bmRsZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1bmRsZSBnZXRTeXN0ZW1CdW5kbGUoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlci5nZXRTeXN0ZW1CdW5kbGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVGltZXJUZXN0cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyNGY3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVGltZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lclRlc3RzIHsKLQotCS8qKgotCSAqIERlZmF1bHQgVGltZXJUZXN0cyBjbGFzcyB0byB1c2Ugd2hlbiBub3QgdXNpbmcgeW91ciBvd24uIEl0J3MgYSBnbG9iYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBUaW1lclRlc3RzIGJhc2ljVGVzdCA9IG5ldyBUaW1lclRlc3RzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1BBUkVOVF9JRCA9ICJjdXJyZW50IHBhcmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRQYXJlbnRJZCA9IG51bGw7Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGltZXJTdGVwIHsKLQkJc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RPUCA9IDE7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfQ1VNVUxBVElWRSA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RPUF9DVU1VTEFUSVZFID0gMzsKLQkJc3RhdGljIGZpbmFsIGludCBTVEFSVF9BQ0NVTVVMQVRJTkcgPSA0OwotCQlzdGF0aWMgZmluYWwgaW50IFNUT1BfQUNDVU1VTEFUSU5HID0gNTsKLQkJcHJvdGVjdGVkIFN0cmluZyBpZDsKLQkJcHJvdGVjdGVkIGludCB0eXBlOwotCQlwcm90ZWN0ZWQgbG9uZyBjdXJyZW50VGltZTsKLQkJcHJvdGVjdGVkIGludCB0aHJlYWRJZDsKLX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRlc3RPbiA9IGZhbHNlOwotCXByb3RlY3RlZCBMaXN0IHN0ZXBzOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0U3RlcChTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlUaW1lclN0ZXAgc3RlcCA9IGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUQVJUKTsKLQkJcmV0dXJuIHN0ZXAgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGltZXJTdGVwIGNyZWF0ZVRpbWVyU3RlcChTdHJpbmcgaWQsIGludCBzdGVwVHlwZSkgewotCQlUaW1lclN0ZXAgbmV3U3RlcCA9IG5ldyBUaW1lclN0ZXAoKTsKLQkJbmV3U3RlcC50aHJlYWRJZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaGFzaENvZGUoKTsKLQkJbmV3U3RlcC5pZCA9IGlkOwotCQluZXdTdGVwLnR5cGUgPSBzdGVwVHlwZTsKLQkJbmV3U3RlcC5jdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlzdGVwcy5hZGQobmV3U3RlcCk7Ci0KLQkJcmV0dXJuIG5ld1N0ZXA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BTdGVwKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCQlUaW1lclN0ZXAgc3RlcCA9IGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUT1ApOwotCQlyZXR1cm4gc3RlcCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydEFjY3VtdWxhdGluZyhTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RBUlRfQUNDVU1VTEFUSU5HKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wQWNjdW11bGF0aW5nKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVE9QX0FDQ1VNVUxBVElORykgIT0gbnVsbDsKLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUQVJUX0NVTVVMQVRJVkUpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BDdW11bGF0aXZlU3RlcChTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUT1BfQ1VNVUxBVElWRSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgdGVzdHMgc28gdGhhdCB5b3UgY2FuIHJlc3RhcnQgYW5kIGRvIHNvbWUgbW9yZSB0ZXN0cy4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXJUZXN0cygpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm47Ci0JCXN0ZXBzLmNsZWFyKCk7Ci0JCWN1cnJlbnRQYXJlbnRJZCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVHVybiB0aGlzIHRlc3Qgb24uIElmIG5vdCB0dXJuZWQgb24gdGhlbiBhbGwgY2FsbHMgd2lsbCBxdWlja2x5IHJldHVybiB3aXRoIG5vIGVycm9ycy4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdG8gc3RheSBpbiBwbGFjZSBldmVuIHdoZW4gbm90Ci0JICogZGVidWdnaW5nLgotCSAqIDxwPgotCSAqIFdoZW4gdHVybmVkIG9mZiwgaXQgd2lsbCBjbGVhciB0aGUgdGVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdGVzdFN0YXRlKGJvb2xlYW4gb24pIHsKLQkJaWYgKG9uID09IHRlc3RPbikKLQkJCXJldHVybjsKLQkJaWYgKG9uKSB7Ci0JCQl0ZXN0T24gPSB0cnVlOwotCQkJaWYgKHN0ZXBzID09IG51bGwpCi0JCQkJc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXN0T24gPSBmYWxzZTsKLQkJCXN0ZXBzID0gbnVsbDsKLQkJfQotCQljdXJyZW50UGFyZW50SWQgPSBudWxsOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDdW11bGF0aXZlSW5mb3JtYXRpb24gewotCQlwdWJsaWMgVGltZXJTdGVwIGN1cnJlbnRDdW11bGF0aXZlU3RlcDsKLQkJcHVibGljIGxvbmcgY3VtVGltZTsKLQkJcHVibGljIGludCBjdW1Db3VudDsKLQkJcHVibGljIGludCBjdW1Db3VudE5vblplcm87Ci0JCXB1YmxpYyBsb25nIG1heFRpbWU7Ci0JCXB1YmxpYyBsb25nIG1pblRpbWUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJcHVibGljIGxvbmcgbWluVGltZU5vblplcm8gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHByaW50SXQoKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuOwotCQlpZiAoc3RlcHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTWFwIHN0ZXBJbmZvQnlUaHJlYWRJZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBpbmRlbnRzQnlUaHJlYWRJZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBjdW1TdGVwczsKLQkJVGltZXJTdGVwIHByZXZTdGVwID0gbnVsbDsKLQkJVGltZXJTdGVwIHN0YXJ0U3RlcDsKLQkJTnVtYmVyRm9ybWF0IHBlcmNlbnRGb3JtYXR0ZXIgPSBOdW1iZXJGb3JtYXQuZ2V0UGVyY2VudEluc3RhbmNlKCk7Ci0JCWRvdWJsZSB0b3RhbFRpbWUgPSAwOwotCQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTUwKTsKLQkJaWYgKHN0ZXBzLnNpemUoKSA+IDIpewotCQkJdG90YWxUaW1lID0gKChUaW1lclN0ZXApc3RlcHMuZ2V0KHN0ZXBzLnNpemUoKS0xKSkuY3VycmVudFRpbWUgLSAoKFRpbWVyU3RlcClzdGVwcy5nZXQoMCkpLmN1cnJlbnRUaW1lOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCVRpbWVyU3RlcCBzdGVwID0gKFRpbWVyU3RlcCkgc3RlcHMuZ2V0KGkpOwotCQkJSW50ZWdlciB0aHJlYWRJZCA9IG5ldyBJbnRlZ2VyKHN0ZXAudGhyZWFkSWQpOwotCQkJc3dpdGNoIChzdGVwLnR5cGUpIHsKLQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVDoKLQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QOgotCQkJCQlJbnRlZ2VyIHRocmVhZEluZGVudCA9IChJbnRlZ2VyKSBpbmRlbnRzQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpbnQgaW5kZW50ID0gMDsKLQkJCQkJaWYgKHN0ZXAudHlwZSA9PSBUaW1lclN0ZXAuU1RBUlQpIHsKLQkJCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKSArIDE7Ci0JCQkJCQlpbmRlbnRzQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIG5ldyBJbnRlZ2VyKGluZGVudCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQotCQkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpOwotCQkJCQkJaWYgKGluZGVudCA+IDApCi0JCQkJCQkJaW5kZW50c0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBuZXcgSW50ZWdlcihpbmRlbnQgLSAxKSk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpbmRlbnRzQnlUaHJlYWRJZC5yZW1vdmUodGhyZWFkSWQpOwotCQkJCQkJCWluZGVudCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc3RyYi5zZXRMZW5ndGgoMCk7Ci0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuY3VycmVudFRpbWUpOwotCQkJCQlzdHJiLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7Ci0JCQkJCQlzdHJiLmFwcGVuZCgiICAgICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXN3aXRjaCAoc3RlcC50eXBlKSB7Ci0JCQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVDoKLQkJCQkJCQlzdHJiLmFwcGVuZCgiU3RhcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCi0JCQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QOgotCQkJCQkJCXN0cmIuYXBwZW5kKCJTdG9wICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCTsKLQkJCQkJc3RyYi5hcHBlbmQoIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuaWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiXCIgICBpZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLnRocmVhZElkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlNYXAgc3RhcnRTdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoc3RhcnRTdGVwcyA9PSBudWxsKQotCQkJCQkJc3RlcEluZm9CeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgc3RhcnRTdGVwcyA9IG5ldyBIYXNoTWFwKCkpOwotCQkJCQlpZiAoc3RlcC50eXBlID09IFRpbWVyU3RlcC5TVEFSVCkgewotCQkJCQkJLy8gU3RvcmUgdGhlIHN0YXJ0IHN0ZXAgZm9yIGxhdGVyIGxvb2t1cCB3aGVuIGNhbHVsYXRpbmcgdGhlIHRvdGFsIHRpbWUKLQkJCQkJCXN0YXJ0U3RlcHMucHV0KHN0ZXAuaWQsIHN0ZXApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gVGhpcyBpcyB0aGUgc3RvcCB0aW1lIGZvciBhIHN0ZXAuIFdlIG5lZWQgdG8gZmluZAotCQkJCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgc3RhcnQgdGltZSBhbmQgY2FsY3VsYXRlIHRoZSB0b3RhbCB0aW1lLgotCQkJCQkJT2JqZWN0IGl0ZW0gPSBzdGFydFN0ZXBzLnJlbW92ZShzdGVwLmlkKTsKLQkJCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVGltZXJTdGVwKSB7Ci0JCQkJCQkJc3RhcnRTdGVwID0gKFRpbWVyU3RlcCkgaXRlbTsKLQkJCQkJCQlpZiAoc3RhcnRTdGVwICE9IG51bGwpIHsKLQkJCQkJCQkJaW50IGFkZGNoYXJzID0gMTAwIC0gc3RyYi5sZW5ndGgoKTsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhZGRjaGFyczsgaisrKSB7Ci0JCQkJCQkJCQlzdHJiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJbG9uZyBkZWx0YSA9IHN0ZXAuY3VycmVudFRpbWUgLSBzdGFydFN0ZXAuY3VycmVudFRpbWU7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgVG90YWwgPSAiICsgZGVsdGEgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlpZiAodG90YWxUaW1lID4gMCkKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICAiICsgcGVyY2VudEZvcm1hdHRlci5mb3JtYXQoZGVsdGEvdG90YWxUaW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgIC0tLT4gQ291bGRuJ3QgZmluZCBTdGFydGluZyBwb2ludCBmb3IgXCIiICsgc3RlcC5pZCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlpZiAoaSA+IDAgJiYgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgPiAwKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLSAiICsgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgKyAiIG1zIC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlwcmV2U3RlcCA9IHN0ZXA7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJiKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVF9BQ0NVTVVMQVRJTkc6Ci0JCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChjdW1TdGVwcyA9PSBudWxsKQotCQkJCQkJc3RlcEluZm9CeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgY3VtU3RlcHMgPSBuZXcgSGFzaE1hcCgpKTsKLQkJCQkJY3VtU3RlcHMucHV0KHN0ZXAuaWQsIG5ldyBDdW11bGF0aXZlSW5mb3JtYXRpb24oKSk7Ci0JCQkJCXRocmVhZEluZGVudCA9IChJbnRlZ2VyKSBpbmRlbnRzQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpbmRlbnQgPSAwOwotCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCi0JCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKTsKLQkJCQkJc3RyYi5zZXRMZW5ndGgoMCk7Ci0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuY3VycmVudFRpbWUpOwotCQkJCQlzdHJiLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7Ci0JCQkJCQlzdHJiLmFwcGVuZCgiICAgICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXN0cmIuYXBwZW5kKCJTdGFydCBBY2N1bXVsYXRpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZCgiIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5pZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcIiAgIGlkKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAudGhyZWFkSWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpID4gMCAmJiAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSA+IDApCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tICIgKyAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSArICIgbXMgLS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXByZXZTdGVwID0gc3RlcDsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cmIpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUX0NVTVVMQVRJVkU6Ci0JCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChjdW1TdGVwcyAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgaW5mbyA9IGN1bVN0ZXBzLmdldChzdGVwLmlkKTsKLQkJCQkJCWlmIChpbmZvIGluc3RhbmNlb2YgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKQotCQkJCQkJCSgoQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSBpbmZvKS5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAgPSBzdGVwOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QX0NVTVVMQVRJVkU6Ci0JCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChjdW1TdGVwcyAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgaW5mbyA9IGN1bVN0ZXBzLmdldChzdGVwLmlkKTsKLQkJCQkJCWlmIChpbmZvIGluc3RhbmNlb2YgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSB7Ci0JCQkJCQkJQ3VtdWxhdGl2ZUluZm9ybWF0aW9uIGN1bUluZm8gPSAoQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSBpbmZvOwotCQkJCQkJCWlmIChjdW1JbmZvLmN1cnJlbnRDdW11bGF0aXZlU3RlcCAhPSBudWxsKSB7Ci0JCQkJCQkJCWN1bUluZm8uY3VtQ291bnQrKzsKLQkJCQkJCQkJbG9uZyBkZWx0YSA9IHN0ZXAuY3VycmVudFRpbWUgLSBjdW1JbmZvLmN1cnJlbnRDdW11bGF0aXZlU3RlcC5jdXJyZW50VGltZTsKLQkJCQkJCQkJY3VtSW5mby5jdW1UaW1lICs9IGRlbHRhOwotCQkJCQkJCQlpZiAoY3VtSW5mby5tYXhUaW1lIDwgZGVsdGEpCi0JCQkJCQkJCQljdW1JbmZvLm1heFRpbWUgPSBkZWx0YTsKLQkJCQkJCQkJaWYgKGRlbHRhIDwgY3VtSW5mby5taW5UaW1lKQotCQkJCQkJCQkJY3VtSW5mby5taW5UaW1lID0gZGVsdGE7Ci0JCQkJCQkJCWlmIChkZWx0YSAhPSAwKSB7Ci0JCQkJCQkJCQljdW1JbmZvLmN1bUNvdW50Tm9uWmVybysrOwotCQkJCQkJCQkJaWYgKGRlbHRhIDwgY3VtSW5mby5taW5UaW1lTm9uWmVybykKLQkJCQkJCQkJCQljdW1JbmZvLm1pblRpbWVOb25aZXJvID0gZGVsdGE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgVGltZXJTdGVwLlNUT1BfQUNDVU1VTEFUSU5HOgotCQkJCQl0aHJlYWRJbmRlbnQgPSAoSW50ZWdlcikgaW5kZW50c0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaW5kZW50ID0gMDsKLQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQotCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCk7Ci0JCQkJCXN0cmIuc2V0TGVuZ3RoKDApOwotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmN1cnJlbnRUaW1lKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgewotCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzdHJiLmFwcGVuZCgiU3RvcCAgQWNjdW11bGF0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuaWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiXCIgICBpZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLnRocmVhZElkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGluZm8gPSBjdW1TdGVwcy5nZXQoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgewotCQkJCQkJCUN1bXVsYXRpdmVJbmZvcm1hdGlvbiBjdW1JbmZvID0gKEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgaW5mbzsKLQkJCQkJCQlpZiAoY3VtSW5mby5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAgIT0gbnVsbCkgewotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgY3VtdWxhdGl2ZSB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8uY3VtVGltZSk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBjdW11bGF0aXZlIGNvdW50PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8uY3VtQ291bnQpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgbWF4IHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5tYXhUaW1lKTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIG1pbiB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8ubWluVGltZSk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBhdmcgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZCgoKGRvdWJsZSkgY3VtSW5mby5jdW1UaW1lKS9jdW1JbmZvLmN1bUNvdW50KTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIE5vblplcm8gdGltZXM6IGN1bXVsYXRpdmUgfjAgY291bnQ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5jdW1Db3VudE5vblplcm8pOwotCQkJCQkJCQlpZiAoY3VtSW5mby5jdW1Db3VudE5vblplcm8gIT0gMCkgewotCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIG1pbiB+MCB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLm1pblRpbWVOb25aZXJvKTsKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBhdmcgfjAgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJc3RyYi5hcHBlbmQoKChkb3VibGUpIGN1bUluZm8uY3VtVGltZSkgLyBjdW1JbmZvLmN1bUNvdW50Tm9uWmVybyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGkgPiAwICYmIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpID4gMCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gIiArIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpICsgIiBtcyAtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcHJldlN0ZXAgPSBzdGVwOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyYik7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjY2Q2NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjYgJCQgICQkRGF0ZTogMjAwOS8wNy8zMCAyMjoxMToyMyAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLQotLyoqCi0gKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3IgVUlDb250ZXh0IGRldGVybWluYXRpb24uCi0gKiAKLSAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IChAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUNvbnRleHREZXRlcm1pbmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFETEVTU19DT05URVhUX0xJVEVSQUwgPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uLkhFQURMRVNTX0NPTlRFWFRfTElURVJBTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfTElURVJBTCA9IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24uVUlfQ09OVEVYVF9MSVRFUkFMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBRExFU1NfQ09OVEVYVCA9IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24uSEVBRExFU1NfQ09OVEVYVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJX0NPTlRFWFQgPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uLlVJX0NPTlRFWFQ7Ci0KLQlwcml2YXRlIFVJQ29udGV4dERldGVybWluYXRpb24oKXt9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3MgYmFzZWQgb24gdGhlIFVJIG9yIEhlYWRsZXNzIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4gbmV3IGNsYXNzIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4ga2V5LgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGtleSBpcyBpbnZhbGlkIChlLmcuIG5vIGV4dGVuc2lvbiBpcyBmb3VuZCBmb3IgdGhlIGtleSkKLQkgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSAoQGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgpKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUluc3RhbmNlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2Uoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRleHQgLS0gZGV0ZXJtaW5lcyB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudCBjb250ZXh0Ci0JICogQHNlZSAjSEVBRExFU1NfQ09OVEVYVAotCSAqIEBzZWUgI1VJX0NPTlRFWFQKLQkgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSAoQGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5nZXRDdXJyZW50Q29udGV4dCgpKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEN1cnJlbnRDb250ZXh0KCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5nZXRDdXJyZW50Q29udGV4dCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDFiMjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIFVJVGVzdGVyLiBUaGUgImNsYXNzbmFtZSIgYXR0cmlidXRlIG9uIHRoZSAidWlUZXN0ZXIiIGV4dGVuc2lvbiBwb2ludCBzaG91bGQgaW1wbGVtZW50IHRoaXMgY2xhc3MuCi0gKgotICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJVGVzdGVyKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVUlUZXN0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSVRlc3RlciB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZmY2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIENvbnRleHRCYXNlIGZvciBFTUZXb3JrYmVuY2guCi0gKiAKLSAqIDxwPgotICogVGhpcyBpcyBtZWFudCB0byBiZSBzdWJjbGFzc2VkIGFzIG5lZWRlZCBmb3IgYWRkaXRpb25hbCBvciBvdmVycmlkZSBmdW5jdGlvbi4gSXQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSB7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8xIikpOyAvLyROT04tTkxTLTEkCi0JCXByb2plY3QgPSBhUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoZSBjb250ZXh0IGJhc2UuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpCi0JCQlyZXNvdXJjZVNldC5yZWxlYXNlKCk7Ci0JCXJlc291cmNlU2V0ID0gbnVsbDsKLQkJcHJvamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IHRoaXMgY29udGV4dCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHJldHVybiBwcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2Ugc2V0IChjcmVhdGluZyBpZiBuZWVkZWQpIGZvciBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gcmVzb3VyY2Ugc2V0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCXJlc291cmNlU2V0ID0gY3JlYXRlUmVzb3VyY2VTZXQoKTsKLQkJCWluaXRpYWxpemVSZXNvdXJjZVNldChyZXNvdXJjZVNldCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIG9wdGltaXphdGlvbjsgYW5zd2VyIHdoZXRoZXIgYSByZXNvdXJjZVNldCBoYXMgYmVlbiBjcmVhdGVkCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJlc291cmNlIHNldCBoYXMgYmVlbiBjcmVhdGVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VTZXQgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXNvdXJjZVNldChQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWNyZWF0ZVJlc291cmNlU2V0U3luY2hyb25pemVyKGFSZXNvdXJjZVNldCk7Ci0JCWFSZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIoY3JlYXRlVVJJQ29udmVydGVyKGFSZXNvdXJjZVNldCkpOwotCQlhUmVzb3VyY2VTZXQuYWRkKG5ldyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIoKSk7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZEV4dGVuZGVkUmVzb3VyY2VIYW5kbGVycyhhUmVzb3VyY2VTZXQpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSByZXNvdXJjZSBzZXQuIEJ5IGRlZmF1bHQgaXQgaXMgYSBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLgotCSAqIAotCSAqIEByZXR1cm4gcHJvamVjdCdzIG5ldyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFByb2plY3RSZXNvdXJjZVNldEltcGwocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVVJJQ29udmVydGVyIGZvciB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuIGEgdXJpIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoVVJJQ29udmVydGVyIGNyZWF0ZVVSSUNvbnZlcnRlcihQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChnZXRQcm9qZWN0KCksIGFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0IHdvcmtiZW5jaCBzeW5jaHJvbml6ZXIuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBzZXQgd29ya2JlbmNoIHN5bmNocm9uaXplci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlUmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3luY2hyb25pemVyKGFSZXNvdXJjZVNldCwgZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgdGhlIHJlc291cmNlIGZyb20gdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCWRlbGV0ZUZpbGUoYVJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVGaWxlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8wIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHJlc291cmNlICh3aXRoIHRoZSBnaXZlbiBVUkkpIGZyb20gdGhlIHByb2plY3QgcmVzb3VyY2Ugc2V0LiBMb2FkIGl0IGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZSBmb3IgdGhlIHVyaSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0ZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjMxZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQgZXh0ZW5kcyBQcm9qZWN0UmVzb3VyY2VTZXQgewotCQotCQotCS8qKgotCSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgcmVzb2x2ZWQgYnkgdGhlIFVSSS4KLQkgICAqIDxwPgotCSAgICogQSByZXNvdXJjZSBzZXQgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgCi0JICAgKiBpbiBvcmRlciB0byByZXNvbHZlIHRoZSBnaXZlbiBVUkkgdG8gYSByZXNvdXJjZS4KLQkgICAqIEZpcnN0IGl0IHVzZXMgaXQncyB7QGxpbmsgI2dldFVSSUNvbnZlcnRlciBVUkkgY29udmVydGVyfSB0byB7QGxpbmsgVVJJQ29udmVydGVyI25vcm1hbGl6ZSBub3JtYWxpemV9IHRoZSBVUkkgCi0JICAgKiBhbmQgdGhlbiB0byBjb21wYXJlIGl0IHdpdGggdGhlIG5vcm1hbGl6ZWQgVVJJIG9mIGVhY2ggcmVzb3VyY2U7Ci0JICAgKiBpZiBpdCBmaW5kcyBhIG1hdGNoLCAKLQkgICAqIHRoYXQgcmVzb3VyY2UgYmVjb21lcyB0aGUgcmVzdWx0LgotCSAgICogRmFpbGluZyB0aGF0LAotCSAgICogaXQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZWxlZ2F0ZWRHZXRSZXNvdXJjZSBkZWxlZ2F0ZXN9IAotCSAgICogdG8gYWxsb3cgdGhlIFVSSSB0byBiZSByZXNvbHZlZCBlbHNld2hlcmUuCi0JICAgKiBGb3IgZXhhbXBsZSwgCi0JICAgKiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSNJTlNUQU5DRSBwYWNrYWdlIHJlZ2lzdHJ5fQotCSAgICogaXMgdXNlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5I2dldEVQYWNrYWdlIHJlc29sdmV9IAotCSAgICogdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UgbmFtZXNwYWNlIFVSSX0gb2YgYSBwYWNrYWdlCi0JICAgKiB0byB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoYXQgcGFja2FnZS4KLQkgICAqIFNvIHRoZSBpbXBvcnRhbnQgcG9pbnQgaXMgdGhhdCBhbiBhcmJpdHJhcnkgaW1wbGVtZW50YXRpb24gbWF5IHJlc29sdmUgdGhlIFVSSSB0byBhbnkgcmVzb3VyY2UsCi0JICAgKiBub3QgbmVjZXNzYXJpbHkgdG8gb25lIGNvbnRhaW5lZCBieSB0aGlzIHBhcnRpY3VsYXIgcmVzb3VyY2Ugc2V0LgotCSAgICogSWYgdGhlIGRlbGVnYXRpb24gc3RlcCBmYWlscyB0byBwcm92aWRlIGEgcmVzdWx0LAotCSAgICogYW5kIGlmIDxjb2RlPmxvYWRPbkRlbWFuZDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICAgKiBhIHJlc291cmNlIGlzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kQ3JlYXRlUmVzb3VyY2UgY3JlYXRlZH0gCi0JICAgKiBhbmQgdGhhdCByZXNvdXJjZSBiZWNvbWVzIHRoZSByZXN1bHQuCi0JICAgKiBJZiA8Y29kZT5sb2FkT25EZW1hbmQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+Ci0JICAgKiBhbmQgdGhlIHJlc3VsdCByZXNvdXJjZSBpcyBub3Qge0BsaW5rIFJlc291cmNlI2lzTG9hZGVkIGxvYWRlZH0sIAotCSAgICogaXQgd2lsbCBiZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQgbG9hZGVkfSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQuCi0JICAgKiA8L3A+Ci0JICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gcmVzb2x2ZS4KLQkgICAqIEBwYXJhbSBsb2FkT25EZW1hbmQgd2hldGhlciB0byBjcmVhdGUgYW5kIGxvYWQgdGhlIHJlc291cmNlLCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3RzLgotCSAgICogQHBhcmFtIHJlZ2lzdGVyZWRGYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgcmVzb3VyY2UgaWYgbmVlZGVkIAotCSAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgcmVzb2x2ZWQgYnkgdGhlIFVSSSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXNuJ3Qgb25lIGFuZCBpdCdzIG5vdCBiZWluZyBkZW1hbmQgbG9hZGVkLgotCSAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGEgcmVzb3VyY2UgY2FuJ3QgYmUgZGVtYW5kIGNyZWF0ZWQuCi0JICAgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGRlbWFuZCBsb2FkLgotCSAgICogQHNpbmNlIDIuMQotCSAgICovCi0JCi0JUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQsIEZhY3RvcnkgcmVnaXN0ZXJlZEZhY3RvcnkpOwotCQotCS8qKgotCSAgICogQ3JlYXRlcyBhIG5ldyByZXNvdXJjZSwgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUsIGFuZCByZXR1cm5zIGl0LgotCSAgICogPHA+Ci0JICAgKiBJdCBkZWxlZ2F0ZXMgdG8gdGhlIHJlc291cmNlIGZhY3Rvcnkge0BsaW5rICNnZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeX0gCi0JICAgKiB0byBkZXRlcm1pbmUgdGhlIHtAbGluayBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5I2dldEZhY3RvcnkgY29ycmVjdH0gZmFjdG9yeSwKLQkgICAqIGFuZCB0aGVuIGl0IHVzZXMgdGhhdCBmYWN0b3J5IHRvIHtAbGluayBSZXNvdXJjZS5GYWN0b3J5I2NyZWF0ZVJlc291cmNlIGNyZWF0ZX0gdGhlIHJlc291cmNlCi0JICAgKiBhbmQgYWRkIGl0IHRvIHRoZSB7QGxpbmsgI2dldFJlc291cmNlcyBjb250ZW50c30uCi0JICAgKiBJZiB0aGVyZSBpcyBubyByZWdpc3RlcmVkIGZhY3RvcnksIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQ7Ci0JICAgKiB3aGVuIHJ1bm5pbmcgd2l0aGluIEVjbGlwc2UsCi0JICAgKiBhIGRlZmF1bHQgWE1JIGZhY3Rvcnkgd2lsbCBiZSByZWdpc3RlcmVkLAotCSAgICogYW5kIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICAgKiA8L3A+Ci0JICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIHJlc291cmNlIHRvIGNyZWF0ZS4KLQkgICAqIEBwYXJhbSByZXNvdXJjZUZhY3RvcnkgCi0JICAgKiBAcmV0dXJuIGEgbmV3IHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBmYWN0b3J5IGlzIHJlZ2lzdGVyZWQuCi0JICAgKi8KLQkKLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NWQ3ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBJRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotLyoqCi0gKiBFTUYgQ29udGV4dCBDb250cmlidXRvciBpbnRlcmZhY2UuIEltcGxpbWVudGVycyBhcmUgY2FsbGVkIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbnRleHQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvcikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFTUZDb250ZXh0Q29udHJpYnV0b3IgewotCi0JLyoqCi0JICogVGhpcyBpcyB5b3VyIG9wcG9ydHVuaXR5IHRvIGFkZCBhIHByaW1hcnkgRU1GTmF0dXJlLiBUeXBpY2FsbHkgeW91IHdvdWxkIGFkZCB0byB0aGUgV29ya2JlbmNoQ29udGV4dCBoZWxkIGJ5IDxjb2RlPmFOYXR1cmU8L2NvZGU+IGluIG9yZGVyIHRvCi0JICogY2hhbmdlIHRoZSBjb250YWluZXIgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgb3IgYWRkIGFkYXB0ZXIgZmFjdG9yaWVzIHRvIHRoZSBSZXNvdXJjZVNldCBvciBhbnl0aGluZyBlbHNlIHRoYXQgaXMgbmVlZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBwcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgeW91ciBvcHBvcnR1bml0eSB0byBhZGQgYSBzZWNvbmRhcnkgRU1GTmF0dXJlLiBUeXBpY2FsbHkgeW91IHdvdWxkIGFkZCB0byB0aGUgV29ya2JlbmNoQ29udGV4dCBoZWxkIGJ5IDxjb2RlPmFOYXR1cmU8L2NvZGU+IGluIG9yZGVyCi0JICogdG8gY2hhbmdlIHRoZSBjb250YWluZXIgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgb3IgYWRkIGFkYXB0ZXIgZmFjdG9yaWVzIHRvIHRoZSBSZXNvdXJjZVNldCBvciBhbnl0aGluZyBlbHNlIHRoYXQgaXMgbmVlZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBzZWNvbmRhcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwZGQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBJbXBsaW1lbnRlcnMgYWxsb3dzIGNsaWVudHMsIGVnIHtAbGluayBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRk5hdHVyZUNvbnRyaWJ1dG9yfSwgdG8gZXh0ZW5kIHRoZSBiZWhhdmlvciBvZiB0aGUKLSAqIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIjYWRkRXh0ZW5kZXIoSVN5bmNocm9uaXplckV4dGVuZGVyKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN5bmNocm9uaXplckV4dGVuZGVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHByb2plY3QgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSk7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCBwcm9qZWN0IGhhcyBiZWVuIGNsb3NlZC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHByb2plY3RDbG9zZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzk3Njk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUHJvamVjdFJlc291cmNlU2V0LmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNSAkJCAgJCREYXRlOiAyMDA3LzA4LzMwIDAyOjM3OjA1ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIEEgUmVzb3VyY2VTZXQgZm9yIGFuIGVudGlyZSBwcm9qZWN0LiBJdCBhbGxvd3Mgc2hhcmluZyBvZiByZXNvdXJjZXMgZnJvbSBtdWx0aXBsZSBlZGl0b3JzL3ZpZXdlcnMgZm9yIGEgcHJvamVjdC4KLSAqIDxwPgotICogQW4gYWRkaXRpb25hbCBOb3RpZmljYXRpb24gdHlwZSBpcyBzZW50IG91dCBieSBQcm9qZWN0UmVzb3VyY2VTZXQncyBvZiBwcm9qZWN0IHJlc291cmNlIHNldCBhYm91dCB0byBiZSByZWxlYXNlZC4gQSByZWxlYXNlIGlzCi0gKiBjYWxsZWQgd2hlbiBwcm9qZWN0cyBhcmUgYWJvdXQgdG8gYmUgY2xvc2VkLiBUaGV5IHJlbGVhc2UgYWxsIG9mIHRoZSByZXNvdXJjZXMgYW5kIHVubG9hZCB0aGVtLiBUaGlzIG5vdGlmaWNhdGlvbiBjYW4gYmUgdXNlZCAKLSAqIHRvIGtub3cgdGhhdCB0aGlzIGlzIGFib3V0IHRvIGhhcHBlbiBhbmQgdG8gZG8gc29tZXRoaW5nIGJlZm9yZSB0aGUgcmVzb3VyY2VzIGJlY29tZSBpbnZhbGlkLiBJdCB3aWxsIGJlIHNlbnQgb3V0IGp1c3QgYmVmb3JlIHRoZQotICogcmVzb3VyY2Ugc2V0IHdpbGwgYmUgcmVsZWFzZWQuIAotICogCi0gKiBAc2VlIFByb2plY3RSZXNvdXJjZVNldCNTUEVDSUFMX05PVElGSUNBVElPTl9UWVBFCi0gKiBAc2VlIFByb2plY3RSZXNvdXJjZVNldCNQUk9KRUNUUkVTT1VSQ0VTRVRfQUJPVVRfVE9fUkVMRUFTRV9JRCAKLSAqIEBzaW5jZSAxLjAuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFJlc291cmNlU2V0IGV4dGVuZHMgUmVzb3VyY2VTZXQgewotCi0JSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0eXBlIGluIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgUHJvamVjdFJlc291cmNlU2V0IGZvcgotCSAqIHNwZWNpYWwgbm90aWZpY2F0aW9ucywgYW5kIG5vdCB0aGUgc3RhbmRhcmQgb25lcyBmcm9tIFJlc291cmNlU2V0LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uI2dldEV2ZW50VHlwZSgpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0Jc3RhdGljIGludCBTUEVDSUFMX05PVElGSUNBVElPTl9UWVBFID0gTm90aWZpY2F0aW9uLkVWRU5UX1RZUEVfQ09VTlQrNDsKLQkKLQkvKioKLQkgKiBOb3RpZmljYXRpb24gRmVhdHVyZSBJRCBmb3IgcmVzb3VyY2Ugc2V0IGFib3V0IHRvIGJlIHJlbGVhc2VkLgotCSAqIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uI2dldEZlYXR1cmVJRChqYXZhLmxhbmcuQ2xhc3MpfSB0bwotCSAqIGdldCB0aGlzIGlkLiBUaGUgZ2V0RmVhdHVyZSgpIG9uIG5vdGlmaWNhdGlvbiB3aWxsIHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXN0YXRpYyBpbnQgUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQgPSAxMDAwOwotCi0JLyoqCi0JICogQ2FsbCB3aGVuIHRoZSBSZXNvdXJjZVNldCBpcyBubyBsb25nZXIgdG8gYmUgdXNlZC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIHJlc291cmNlSGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlSGFuZGxlcgotCSAqICAgICAgICAgICAgSVJlc291cmNlSGFuZGxlcgotCSAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgd2FzIGFkZGVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCWJvb2xlYW4gYWRkKFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpOwotCi0JLyoqCi0JICogQWRkIHRoZSA8Y29kZT5yZXNvdXJjZUhhbmRsZXI8L2NvZGU+IHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCBvZiByZXNvdXJjZUhhbmRsZXJzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUhhbmRsZXIKLQkgKiAgICAgICAgICAgIElSZXNvdXJjZUhhbmRsZXIKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIGFkZEZpcnN0KFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSA8Y29kZT5yZXNvdXJjZUhhbmRsZXI8L2NvZGU+IGZyb20gdGhlIGxpc3Qgb2YgcmVzb3VyY2VIYW5kbGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VIYW5kbGVyCi0JICogICAgICAgICAgICBJUmVzb3VyY2VIYW5kbGVyCi0JICogQHJldHVybiBib29sZWFuIFJldHVybiB0cnVlIGlmIGl0IHdhcyByZW1vdmVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCWJvb2xlYW4gcmVtb3ZlKFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZVNldCBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIHN5bmNocm9uaXplIHRoZSBSZXNvdXJjZVNldCB3aXRoIGNoYW5nZXMgZnJvbSB0aGUgV29ya2JlbmNoLgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRTeW5jaHJvbml6ZXIoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgUmVzb3VyY2VTZXQgc3luY2hyb25pemVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZSB0aGUgUmVzb3VyY2VTZXQgd2l0aCBjaGFuZ2VzIGZyb20gdGhlIFdvcmtiZW5jaC4KLQkgKiAKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqIEByZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHNldFN5bmNocm9uaXplcihSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKTsKLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBjbGllbnRzIHdoZW5ldmVyIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHByb2plY3QgY2hhbmdlcyBzdWNoIHRoYXQgYW55IGNhY2hlZCBVUklzIHdpbGwgYmUgaW52YWxpZC4gRm9yIGV4YW1wbGUsIGlmIHRoZQotCSAqIHNvdXJjZSBmb2xkZXJzIHdpdGhpbiB0aGUgVVJJQ29udmVydGVyIGNoYW5nZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHJlc2V0Tm9ybWFsaXplZFVSSUNhY2hlKCk7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlMmU4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBQcm9qZWN0VXRpbGl0aWVzLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNiAkJCAgJCREYXRlOiAyMDA4LzAzLzA1IDE5OjQzOjE4ICQkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBFTUYgV29ya2JlbmNoIFByb2plY3QgVXRpbGl0aWVzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBQcm9qZWN0IGNvbnRyb2wgZmlsZSBuYW1lIGluIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9UX1BST0pFQ1QgPSAiLnByb2plY3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDbGFzc3BhdGggY29udHJvbCBmaWxlIG5hbWUgaW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfQ0xBU1NQQVRIID0gIi5jbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUHJvamVjdFV0aWxpdGllcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hdHVyZSBpZCB0byB0aGUgcHJvamVjdCBhaGVhZCBvZiBhbGwgb3RoZXIgbmF0dXJlIGlkcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvagotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAxLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQluZXdOYXR1cmVzWzBdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYXR1cmUgaWQgYWZ0ZXIgYWxsIG9mIHRoZSBvdGhlciBuYXR1cmUgaWRzIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvagotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3RMYXN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBuYXR1cmUgaWQgZnJvbSB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVOYXR1cmVGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJaW50IHNpemUgPSBwcmV2TmF0dXJlcy5sZW5ndGg7Ci0JCWludCBuZXdzaXplID0gMDsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWJvb2xlYW4gbWF0Y2hmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHByZXZOYXR1cmVzW2ldLmVxdWFscyhuYXR1cmVJZCkpIHsKLQkJCQltYXRjaGZvdW5kID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZQotCQkJCW5ld05hdHVyZXNbbmV3c2l6ZSsrXSA9IHByZXZOYXR1cmVzW2ldOwotCQl9Ci0JCWlmICghbWF0Y2hmb3VuZCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkVNVXRpbFBsdWdpbi5JRCwgMCwKLQkJCQkJIlRoZSBuYXR1cmUgaWQgIiArIG5hdHVyZUlkICsgIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCksIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJZWxzZSB7Ci0JCQlTdHJpbmdbXSB0ZW1wID0gbmV3TmF0dXJlczsKLQkJCW5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW25ld3NpemVdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBuZXdOYXR1cmVzLCAwLCBuZXdzaXplKTsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBsaXN0IG9mIHByb2plY3RzIHRvIGVuZCBvZiB0aGUgInJlZmVyZW5jZWQgcHJvamVjdHMiIGxpc3QgZnJvbSB0aGUgcHJvamVjdCdzIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHRvQmVBZGRlZFByb2plY3RzTGlzdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBMaXN0IHRvQmVBZGRlZFByb2plY3RzTGlzdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQotCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0JlQWRkZWRQcm9qZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5hZGQodG9CZUFkZGVkUHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7Ci0JCX0KLQotCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNpbmdsZSBwcm9qZWN0IHRvIHRoZSBlbmQgb2YgdGhlICJyZWZlcmVuY2VkIHByb2plY3RzIiBsaXN0IGZyb20gdGhlIHByb2plY3QncyBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwcm9qZWN0VG9CZUFkZGVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlZmVyZW5jZVByb2plY3RzKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0IHByb2plY3RUb0JlQWRkZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGRlc2NyaXB0aW9uLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCi0JCUFycmF5TGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZChwcm9qZWN0c1tpXSk7Ci0JCX0KLQotCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RUb0JlQWRkZWQpOwotCi0JCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEZvcmNlIGEgYW4gaW1tZWRpYXRlIGJ1aWxkIG9mIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JjZUF1dG9CdWlsZChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0cnkgewotCQkJcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIHByb2dyZXNzTW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vUmV2aXNpdDogTmVlZCB0byB1c2UgYSBMb2dnZXIKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBpZiBhdXRvIGJ1aWxkIGlzIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF1dG8gYnVpbGQgaXMgdHVybmVkIG9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDdXJyZW50QXV0b0J1aWxkU2V0dGluZygpIHsKLQotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCXJldHVybiB3ZC5pc0F1dG9CdWlsZGluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBtYXkgYmUgYW4gPGNvZGU+SVByb2plY3QsIElSZXNvdXJjZSwgSUFkYXB0YWJsZSAodG8gYW4gSVByb2plY3QpLCBFT2JqZWN0IChnZXRzIElQcm9qZWN0IGlmIG9iamVjdCBpcyBpbiBhIFByb2plY3RSZXNvdXJjZVNldDwvY29kZT4uCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogICAgICAgICAgICBpZiA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHJldHVybnMgcHJvamVjdC4gSWYgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gcmV0dXJucyBwcm9qZWN0IG9ubHkgaWYgcHJvamVjdCBoYXMgdGhpcyBuYXR1cmUgaWQuCi0JICogQHJldHVybiBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCUlQcm9qZWN0IHJlc3VsdCA9IGdldFByb2plY3Qob2JqZWN0KTsKLQkJaWYgKG5hdHVyZUlkID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmlzQWNjZXNzaWJsZSgpICYmIG5hdHVyZUlkICE9IG51bGwpCi0JCQl0cnkgewotCQkJCWlmIChyZXN1bHQuaGFzTmF0dXJlKG5hdHVyZUlkKSkKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIG1heSBiZSBhbiA8Y29kZT5JUHJvamVjdCwgSVJlc291cmNlLCBJQWRhcHRhYmxlICh0byBhbiBJUHJvamVjdCksIEVPYmplY3QgKGdldHMgSVByb2plY3QgaWYgb2JqZWN0IGlzIGluIGEgUHJvamVjdFJlc291cmNlU2V0PC9jb2RlPi4KLQkgKiBAcmV0dXJuIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQcm9qZWN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcmVzdWx0ID0gKElQcm9qZWN0KSBvYmplY3Q7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCXJlc3VsdCA9ICgoSVJlc291cmNlKSBvYmplY3QpLmdldFByb2plY3QoKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXJlc3VsdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBvYmplY3QpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJcmVzdWx0ID0gZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqZWN0KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIEVPYmplY3QuIChJZiBpbiBhIFByb2plY3RSZXNvdXJjZVNldCwgdGhlbiB0aGUgcHJvamVjdCBmcm9tIHRoYXQgcmVzb3VyY2Ugc2V0KS4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqIEByZXR1cm4gcHJvamVjdCBpZiBhc3NvY2lhdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCWlmIChhUmVmT2JqZWN0ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gYVJlZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiBnZXRQcm9qZWN0KHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7Ci0JCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOwotCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gUmVzb3VyY2UuIChJZiBpbiBhIFByb2plY3RSZXNvdXJjZVNldCwgdGhlbiB0aGUgcHJvamVjdCBmcm9tIHRoYXQgcmVzb3VyY2Ugc2V0KS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHByb2plY3QgaWYgYXNzb2NpYXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IHJlc291cmNlID09IG51bGwgPyBudWxsIDogcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHNldCA9PSBudWxsKSB7Ci0JCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHJldHVybiBudWxsOwotCQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKSAKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBmaWxlLmdldFByb2plY3QoKTsKLQkJfQotCQkJCi0JCWlmIChzZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCi0JCQlyZXR1cm4gKChQcm9qZWN0UmVzb3VyY2VTZXQpIHNldCkuZ2V0UHJvamVjdCgpOwotCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gc2V0ID09IG51bGwgPyBudWxsIDogc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyIGluc3RhbmNlb2YgV29ya2JlbmNoVVJJQ29udmVydGVyICYmICgoV29ya2JlbmNoVVJJQ29udmVydGVyKSBjb252ZXJ0ZXIpLmdldE91dHB1dENvbnRhaW5lcigpICE9IG51bGwpCi0JCQlyZXR1cm4gKChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnZlcnRlcikuZ2V0T3V0cHV0Q29udGFpbmVyKCkuZ2V0UHJvamVjdCgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGxpc3Qgb2YgcHJvamVjdHMgZnJvbSB0aGUgbGlzdCBvZiAicmVmZXJlbmNlZCBwcm9qZWN0cyIgaW4gdGhlIHByb2plY3QncyBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB0b0JlUmVtb3ZlZFByb2plY3RMaXN0Ci0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBMaXN0IHRvQmVSZW1vdmVkUHJvamVjdExpc3QpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQotCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0JlUmVtb3ZlZFByb2plY3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QucmVtb3ZlKHRvQmVSZW1vdmVkUHJvamVjdExpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcHJvamVjdCBmcm9tIHRoZSBsaXN0IG9mICJyZWZlcmVuY2VkIHByb2plY3RzIiBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHRvQmVSZW1vdmVkUHJvamVjdAotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3QgdG9CZVJlbW92ZWRQcm9qZWN0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKChwcm9qZWN0c1tpXSkpOwotCQl9Ci0KLQkJcHJvamVjdHNMaXN0LnJlbW92ZSh0b0JlUmVtb3ZlZFByb2plY3QpOwotCi0JCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFR1cm4gYXV0by1idWlsZGluZyBvZmYuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHR1cm5BdXRvQnVpbGRPZmYoKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJd2Quc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFR1cm4gYXV0by1idWlsZGluZyBvbi4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHVybkF1dG9CdWlsZE9uKCkgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCXdkLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYXV0by1idWlsZGluZyBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYUJvb2xlYW4KLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gYXV0by1idWlsZGluZyBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHVybkF1dG9CdWlsZE9uKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQl3ZC5zZXRBdXRvQnVpbGRpbmcoYUJvb2xlYW4pOwotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgYnVpbGRlciB0byB0aGUgYnVpbGQgc3BlYyBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkZXJJRAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBidWlsZGVyLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBQcm9qZWN0IHRvIGFkZCB0by4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaWQgd2FzIGFjdHVhbGx5IGFkZGVkIChpdCBtYXkgaGF2ZSBhbHJlYWR5IGV4aXN0ZWQpCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvQnVpbGRTcGVjKFN0cmluZyBidWlsZGVySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFkZFRvQnVpbGRTcGVjQmVmb3JlKGJ1aWxkZXJJRCwgbnVsbCwgcHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGJ1aWxkZXIgdG8gdGhlIGJ1aWxkIHNwZWMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3IgYnVpbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRlcklECi0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGJ1aWxkZXIuCi0JICogQHBhcmFtIHN1Y2Nlc3NvcklECi0JICogICAgICAgICAgICBUaGUgaWQgdG8gcHV0IHRoZSBidWlsZGVyIGJlZm9yZS4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaWQgd2FzIGFjdHVhbGx5IGFkZGVkIChpdCBtYXkgaGF2ZSBhbHJlYWR5IGV4aXN0ZWQpCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvQnVpbGRTcGVjQmVmb3JlKFN0cmluZyBidWlsZGVySUQsIFN0cmluZyBzdWNjZXNzb3JJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKGJ1aWxkZXJJRCkpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgewotCQkJYm9vbGVhbiBzdWNjZXNzb3JGb3VuZCA9IGZhbHNlOwotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGRlc2NyaXB0aW9uLm5ld0NvbW1hbmQoKTsKLQkJCWNvbW1hbmQuc2V0QnVpbGRlck5hbWUoYnVpbGRlcklEKTsKLQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoICsgMV07Ci0JCQlmb3IgKGludCBqID0gMCwgaW5kZXggPSAwOyBqIDwgY29tbWFuZHMubGVuZ3RoOyBqKyssIGluZGV4KyspIHsKLQkJCQlpZiAoc3VjY2Vzc29ySUQgIT0gbnVsbCAmJiBjb21tYW5kc1tqXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhzdWNjZXNzb3JJRCkpIHsKLQkJCQkJc3VjY2Vzc29yRm91bmQgPSB0cnVlOwotCQkJCQluZXdDb21tYW5kc1tpbmRleCsrXSA9IGNvbW1hbmQ7Ci0JCQkJfQotCQkJCW5ld0NvbW1hbmRzW2luZGV4XSA9IGNvbW1hbmRzW2pdOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzb3JGb3VuZCkKLQkJCQluZXdDb21tYW5kc1tuZXdDb21tYW5kcy5sZW5ndGggLSAxXSA9IGNvbW1hbmQ7Ci0JCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuICFmb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGJ1aWxkZXIgZnJvbSB0aGUgYnVpbGQgc3BlYy4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRlcklECi0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGJ1aWxkZXIuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFByb2plY3QgdG8gcmVtb3ZlIGZyb20uCi0JICogQHJldHVybiBib29sZWFuIGlmIHRoZSBidWlsZGVyIGlkIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tQnVpbGRTcGVjKFN0cmluZyBidWlsZGVySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVySUQpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZCkgewotCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggLSAxXTsKLQkJCWludCBuZXdDb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKCEoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlcklEKSkpIHsKLQkJCQkJLy9BZGQgdGhlIGV4aXN0bmcgdG8gdGhlIG5ldyBhcnJheQotCQkJCQluZXdDb21tYW5kc1tuZXdDb3VudF0gPSBjb21tYW5kc1tpXTsKLQkJCQkJbmV3Q291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQotCX0KLQotCS8qKgotCSAqIEVuc3VyZSB0aGUgY29udGFpbmVyIGlzIG5vdCByZWFkLW9ubHkuCi0JICogPHA+Ci0JICogRm9yIExpbnV4LCBhIFJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkIGluIGEgUmVhZE9ubHkgZm9sZGVyLiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBuZXcgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB3b3Jrc3BhY2UgcmVzb3VyY2UgdG8gbWFrZSByZWFkL3dyaXRlCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuZXhpc3RzKCkpIHsgLy9pdCBtdXN0IGJlIG5ldwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCVJlc291cmNlQXR0cmlidXRlcyBhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJd2hpbGUgKGF0dHIgIT0gbnVsbCAmJiAhYXR0ci5pc1JlYWRPbmx5KCkpIHsKLQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQlhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJfQotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGF0dHIgIT0gbnVsbCkKLQkJCQlhdHRyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwcm9qZWN0cyBmcm9tIHByaW1hcnkgbmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBuYXR1cmVJRAotCSAqIEByZXR1cm4gQWxsIHByb2plY3RzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gbmF0dXJlIGlkIGFzIHRoZSBmaXJzdCBuYXR1cmUgaWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFByb2plY3RzRm9yUHJpbWFyeU5hdHVyZShTdHJpbmcgbmF0dXJlSUQpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0c1dpdGhOYXR1cmUgPSBuZXcgSVByb2plY3RbXSB7fTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNQcm9qZWN0UHJpbWFyeU5hdHVyZShwcm9qZWN0c1tpXSwgbmF0dXJlSUQpKQotCQkJCXJlc3VsdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkocHJvamVjdHNXaXRoTmF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB3b3Jrc3BhY2UgcHJvamVjdHMKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsUHJvamVjdHMoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBuYXR1cmUgaWQgdGhlIHByaW1hcnkgbmF0dXJlIGlkIGZvciB0aGUgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIG5hdHVyZUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaXJzdCBuYXR1cmUgaWQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RQcmltYXJ5TmF0dXJlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmVJRCkgewotCQlTdHJpbmdbXSBuYXR1cmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQl9Ci0JCXJldHVybiAobmF0dXJlcyAhPSBudWxsICYmIG5hdHVyZXMubGVuZ3RoID4gMCAmJiBuYXR1cmVzWzBdLmVxdWFscyhuYXR1cmVJRCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggY3JlYXRlUGF0aChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHAuZ2V0TmFtZSgpKTsKLQkJcGF0aCA9IHBhdGguYXBwZW5kKGRlZmF1bHRTb3VyY2VOYW1lKTsKLQkJcGF0aCA9IHBhdGgubWFrZUFic29sdXRlKCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGV4aXN0aW5nIGZpbGVzIHdoaWNoIHdpbGwgYmUgbW9kaWZpZWQgaWYgdGhlIGNsYXNzcGF0aCBjaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gcHJvZWplY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWZmZWN0ZWQgZmlsZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEZpbGVzQWZmZWN0ZWRCeUNsYXNzcGF0aENoYW5nZShJUHJvamVjdCBwKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJYWRkRmlsZUlmRXhpc3RzKHAsIHJlc3VsdCwgRE9UX0NMQVNTUEFUSCk7Ci0JCWFkZEZpbGVJZkV4aXN0cyhwLCByZXN1bHQsIERPVF9QUk9KRUNUKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkRmlsZUlmRXhpc3RzKElQcm9qZWN0IHAsIExpc3QgYUxpc3QsIFN0cmluZyBmaWxlbmFtZSkgewotCQlJRmlsZSBhRmlsZSA9IHAuZ2V0RmlsZShmaWxlbmFtZSk7Ci0JCWlmIChhRmlsZSAhPSBudWxsICYmIGFGaWxlLmV4aXN0cygpKQotCQkJYUxpc3QuYWRkKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCBvZmYgYSBsZWFkaW5nICIvIiBmcm9tIGVhY2ggcHJvamVjdCBuYW1lIGluIHRoZSBhcnJheSwgaWYgaXQgaGFzIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjTmFtZXMKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHByb2plY3QgbmFtZXMgd2l0aCBhbGwgbGVhZGluZyAnLycgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2plY3ROYW1lc1dpdGhvdXRGb3J3YXJkU2xhc2goU3RyaW5nW10gcHJvamVjTmFtZXMpIHsKLQkJU3RyaW5nW10gcHJvak5hbWVzID0gbmV3IFN0cmluZ1twcm9qZWNOYW1lcy5sZW5ndGhdOwotCQlMaXN0IHRlbXAgPSBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChwcm9qZWNOYW1lcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSAodGVtcC5nZXQoaSkpOwotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9qTmFtZXNbaV0gPSBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvak5hbWVzW2ldID0gbmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvak5hbWVzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVVJMIGNyZWF0ZUZpbGVVUkwoSVBhdGggcGF0aCkgewotCQl0cnkgewotCQkJcmV0dXJuIHBhdGgudG9GaWxlKCkudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZmlyc3QgbmV3T2JqZWN0IHRoYXQgaXMgbm90IGluIHRoZSBvbGRPYmplY3RzIGFycmF5ICh1c2luZyAiPT0iKS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqZWN0cwotCSAqIEBwYXJhbSBuZXdPYmplY3RzCi0JICogQHJldHVybiBmaXJzdCBuZXdPYmplY3Qgbm90IGZvdW5kIGluIG9sZE9iamVjdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFsbCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXROZXdPYmplY3QoT2JqZWN0W10gb2xkT2JqZWN0cywgT2JqZWN0W10gbmV3T2JqZWN0cykgewotCQlpZiAob2xkT2JqZWN0cyAhPSBudWxsICYmIG5ld09iamVjdHMgIT0gbnVsbCAmJiBvbGRPYmplY3RzLmxlbmd0aCA8IG5ld09iamVjdHMubGVuZ3RoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld09iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IG5ld09iamVjdHNbaV07Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRPYmplY3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChvbGRPYmplY3RzW2pdID09IG9iamVjdCkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkKLQkJCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlpZiAob2xkT2JqZWN0cyA9PSBudWxsICYmIG5ld09iamVjdHMgIT0gbnVsbCAmJiBuZXdPYmplY3RzLmxlbmd0aCA9PSAxKQotCQkJcmV0dXJuIG5ld09iamVjdHNbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExpc3Qgb2YgYWxsIGZpbGVzIGluIHRoZSBwcm9qZWN0LgotCSAqIDxwPgotCSAqIE5vdGU6IEEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdXNlIHtAbGluayBJUmVzb3VyY2UjYWNjZXB0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvciwgaW50KX0KLQkgKiAKLQkgKiBAcGFyYW0gMS4wLjAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAc2VlIElSZXNvdXJjZSNhY2NlcHQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yLCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFByb2plY3RGaWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGNvbGxlY3RGaWxlcyhwcm9qZWN0Lm1lbWJlcnMoKSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGNvbGxlY3RGaWxlcyhJUmVzb3VyY2VbXSBtZW1iZXJzLCBMaXN0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyByZWN1cnNpdmVseSBjb2xsZWN0IGZpbGVzIGZvciB0aGUgZ2l2ZW4gbWVtYmVycwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBtZW1iZXJzW2ldOwotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQljb2xsZWN0RmlsZXMoKChJRm9sZGVyKSByZXMpLm1lbWJlcnMoKSwgcmVzdWx0KTsKLQkJCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlyZXN1bHQuYWRkKHJlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHJldHVybiBhIElQcm9qZWN0IGdpdmVuIHRoZSBwcm9qZWN0TmFtZQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGJ1aWxkZXIgbmFtZSBpcyBhdHRhY2hlZCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBidWlsZGVyTmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYnVpbGRlciBuYW1lIGlzIGF0dGFjaGVkIHRvIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNCdWlsZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBidWlsZGVyTmFtZSkgewotCQl0cnkgewotCQkJSUNvbW1hbmRbXSBidWlsZGVycyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXRCdWlsZFNwZWMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVpbGRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29tbWFuZCBidWlsZGVyID0gYnVpbGRlcnNbaV07Ci0JCQkJaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoYnVpbGRlci5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVyTmFtZSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTcwNzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBSZXNvdXJjZUhhbmRsZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHByb3ZpZGUgZXh0ZW5zaW9uIGNhcGFiaWxpdGllcyBvbiByZXNvdXJjZSBzZXQuIFN1Y2ggYXMgbG9va2luZyBvciBjcmVhdGluZyBpbiBvdGhlciByZXNvdXJjZSBzZXRzIGZvciBhCi0gKiByZXNvdXJjZSBvciBhbiBFT2JqZWN0LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0I2FkZChSZXNvdXJjZUhhbmRsZXIpCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUhhbmRsZXIgewotCi0JLyoqCi0JICogRWFjaCBSZXNvdXJjZUhhbmRsZXIgZm9yIGEgV29ya2JlbmNoQ29udGV4dCAod2hpY2ggaG9sZHMgYSBQcm9qZWN0UmVzb3VyY2VTZXQpIHdpbGwgZ2V0IGFuIG9wb3J0dW5pdHkgdG8gZ2V0IHRoZSBSZXNvdXJjZSBnaXZlbiB0aGUgdXJpU3RyaW5nCi0JICogcHJpb3IgdG8gdGhlIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQgZ2V0dGluZyBpdCBpbiB0aGUgbm9ybWFsIG1hbm5lci4KLQkgKiAKLQkgKiBJZiB0aGlzIGhhbmRsZXIgbG9hZGVkIGEgUmVzb3VyY2UgaW4gaXRzIGNyZWF0ZShSZXNvdXJjZVNldCwgdXJpU3RyaW5nKSB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhYmxlIHRvIHJldHVybiBpdCBhcyB3ZWxsLgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0Ci0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UgaWYgZm91bmQgb3IgPGNvZGU+bnVsbGwvY29kZT4gaWYgdGhpcyBoYW5kbGVyIGRpZG4ndCBmaW5kIGl0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpOwotCi0JLyoqCi0JICogR2V0IHRoZSBFT2JqZWN0IGZvciB0aGUgZ2l2ZW4gVVJJLCBpZiBpdCBjYW4uIExvYWQgdGhlIHJlc291cmNlIGlmIGxvYWRPbkRlbWFuZCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYXRpbmdSZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHVyaSBvZiBFT2JqZWN0IGJlaW5nIHJlcXVlc3RlZAotCSAqIEBwYXJhbSBsb2FkT25EZW1hbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlc291cmNlIHNob3VsZCBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIGVvYmplY3QgaWYgZm91bmQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90LgotCSAqLwotCUVPYmplY3QgZ2V0RU9iamVjdEZhaWxlZChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlc291cmNlIHBvaW50ZWQgdG8gYmUgdGhlIFVSSSBpZiB0aGlzIGhhbmRsZXIgd2lsbCBoYW5kbGUgaXQuCi0JICogCi0JICogQHBhcmFtIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZSBpZiBjcmVhdGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBoYW5kbGVyIGRvZXNuJ3QgaGFuZGxlIHRoaXMgdHlwZS4KLQkgKi8KLQlSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiNTA1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuOSAkJCAgJCREYXRlOiAyMDEwLzA1LzEyIDIyOjQ3OjQ1ICQkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0KLS8qKgotICogU3luY2hyb25pemVyIG9uIHRoZSB3b3JrYmVuY2guIEl0IGxpc3RlbnMgZm9yIHRoZSBwcm9qZWN0IHRvIHNlZSBpZiBpdCBpcyBjbG9zZWQgb3IgZGVsZXRlZC4gSWYgaXQgZG9lcyBpdCBub3RpZmllcyB0aGlzIG91dC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JLyoqIEV4dGVuZGVycyB0aGF0IHdpbGwgYmUgbm90aWZpZWQgYWZ0ZXIgYSBwcmUgYnVpbGQgcmVzb3VyY2UgY2hhbmdlICovCi0JcHJvdGVjdGVkIFF1ZXVpbmdIYXNoU2V0IDxJU3luY2hyb25pemVyRXh0ZW5kZXI+IGV4dGVuZGVyczsKLQotCS8qKgotCSAqIFRoaXMgSGFzaFNldCBpcyBzaW1pbGFyIHRvIGEgcmVndWxhciBIYXNoU2V0IGV4Y2VwdCBpdCBjYW4gYmUgcHV0IGluCi0JICogcXVldWluZyBtb2RlIHdpdGggYSBjYWxsIHRvIHRoZSB7QGxpbmsgI3N0YXJ0UXVldWluZygpfSBtZXRob2QuCi0JICogV2hpbGUgaW4gcXVldWluZyBtb2RlIGFueSBhZGRzIG9yIHJlbW92ZXMgd2lsbCBub3QgYmUgY29tbWl0dGVkIHRvIAotCSAqIHRoZSBzZXQgdW50aWwgYSBjYWxsIHRvIHtAbGluayAjc3RvcFF1ZXVpbmcoKX0gaXMgbWFkZS4gVGhpcyBhbGxvd3MKLQkgKiB0aGUgUXVldWluZ0hhc1NldCB0byBiZSBwdXQgaW4gcXVldWluZyBtb2RlIHByaW9yIHRvIGl0ZXJhdGluZyBvdmVyCi0JICogdGhlIGNvbnRlbnRzIHdpdGhvdXQgbmVlZGluZyB0byB3b3JyeSBhYm91dCBjaGFuZ2VzIGNvbWluZyBpbiBhbmQKLQkgKiB0aHJvd2luZyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ucy4KLQkgKiAKLQkgKiBAYXV0aG9yIGpzaG9sbAotCSAqCi0JICogQHBhcmFtIDxFPgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBRdWV1aW5nSGFzaFNldCA8RT4gZXh0ZW5kcyBIYXNoU2V0IDxFPiB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjk1OTM1NDA2MDk1MDgxNjc4NEw7Ci0JCi0JCXByaXZhdGUgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gcXVldWluZyA9IGZhbHNlOwotCQlwcml2YXRlIFNldCA8RT4gYWRkUXVldWUgPSBudWxsOwotCQlwcml2YXRlIFNldCByZW1vdmVRdWV1ZSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IGluaXRpYWxDYXBhY2l0eSA9IDM7Ci0JCQotCQlwdWJsaWMgUXVldWluZ0hhc2hTZXQoaW50IGNhcGFjaXR5KSB7Ci0JCQlzdXBlcihjYXBhY2l0eSk7Ci0JCQlhZGRRdWV1ZSA9IG5ldyBIYXNoU2V0PEU+KGNhcGFjaXR5KTsKLQkJCXJlbW92ZVF1ZXVlID0gbmV3IEhhc2hTZXQoY2FwYWNpdHkpOwotCQkJaW5pdGlhbENhcGFjaXR5ID0gY2FwYWNpdHk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydFF1ZXVpbmcoKSB7Ci0JCQlzeW5jaHJvbml6ZWQobG9jayl7Ci0JCQkJaWYocXVldWluZyl7Ci0JCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic3RhcnRRdWV1aW5nIG1heSBvbmx5IGJlIGNhbGxlZCB3aGlsZSBub3QgYWxyZWFkeSBxdWV1aW5nIik7Ci0JCQkJfQotCQkJCXRoaXMucXVldWluZyA9IHRydWU7Ci0JCQkJYWRkUXVldWUuY2xlYXIoKTsKLQkJCQlyZW1vdmVRdWV1ZS5jbGVhcigpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIHNldCBvZiBhZGRzIHdoaWNoIG9jY3VycmVkIHdoaWxlIGluIHF1ZXVpbmcgbW9kZS4KLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIFNldCA8RT4gc3RvcFF1ZXVpbmcoKSB7Ci0JCQlzeW5jaHJvbml6ZWQobG9jayl7Ci0JCQkJaWYoIXF1ZXVpbmcpewotCQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInN0b3BRdWV1aW5nIG1heSBvbmx5IGJlIGNhbGxlZCB3aGlsZSBxdWV1aW5nIik7Ci0JCQkJfQotCQkJCXF1ZXVpbmcgPSBmYWxzZTsKLQkJCQlyZW1vdmVBbGwocmVtb3ZlUXVldWUpOwotCQkJCWFkZEFsbChhZGRRdWV1ZSk7Ci0JCQkJaWYoIWFkZFF1ZXVlLmlzRW1wdHkoKSl7Ci0JCQkJCVNldCA8RT4gcXVldWUgPSBhZGRRdWV1ZTsKLQkJCQkJYWRkUXVldWUgPSBuZXcgSGFzaFNldDxFPihpbml0aWFsQ2FwYWNpdHkpOwotCQkJCQlyZXR1cm4gcXVldWU7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gYWRkKEUgb2JqZWN0KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQlpZihxdWV1aW5nKXsKLQkJCQkJaWYoY29udGFpbnMob2JqZWN0KSl7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGFkZFF1ZXVlLmFkZChvYmplY3QpOwotCQkJCX0gZWxzZXsKLQkJCQkJcmV0dXJuIHN1cGVyLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQlpZihxdWV1aW5nKXsKLQkJCQkJaWYoY29udGFpbnMob2JqZWN0KSl7Ci0JCQkJCQlyZXR1cm4gcmVtb3ZlUXVldWUuYWRkKG9iamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3VwZXIucmVtb3ZlKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCXJldHVybiBzdXBlci5pc0VtcHR5KCk7CQotCQkJfQotCQl9Ci0JCQotCX07Ci0JCi0KLQkvKiogVGhlIGRlbHRhIGZvciB0aGlzIHByb2plY3QgdGhhdCB3aWxsIGJlIGJyb2FkY2FzdCB0byB0aGUgZXh0ZW5kZXJzICovCi0JcHJvdGVjdGVkIElSZXNvdXJjZURlbHRhIGN1cnJlbnRQcm9qZWN0RGVsdGE7Ci0KLQlwcml2YXRlIGludCBjdXJyZW50RXZlbnRUeXBlID0gLTE7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB0YWtpbmcgYSByZXNvdXJjZSBzZXQgYW5kIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQsIElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJlc291cmNlU2V0ID0gYVJlc291cmNlU2V0OwotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JCWlmIChhUmVzb3VyY2VTZXQgIT0gbnVsbCAmJiBhUmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCi0JCQkoKFByb2plY3RSZXNvdXJjZVNldCkgYVJlc291cmNlU2V0KS5zZXRTeW5jaHJvbml6ZXIodGhpcyk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgZm9yIHRoaXMgc3luY2hyb25pemVyCi0JICogCi0JICogQHJldHVybiBwcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWN1cnJlbnRFdmVudFR5cGUgPSBldmVudC5nZXRUeXBlKCk7Ci0JCWN1cnJlbnRQcm9qZWN0RGVsdGEgPSBudWxsOwotCQlpZiAoKGN1cnJlbnRFdmVudFR5cGUgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHx8IGN1cnJlbnRFdmVudFR5cGUgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkKLQkJCQkmJiBldmVudC5nZXRSZXNvdXJjZSgpLmVxdWFscyhnZXRQcm9qZWN0KCkpKSB7Ci0JCQlub3RpZnlFeHRlbmRlcnNPZkNsb3NlKCk7Ci0JCQlyZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUV4dGVuZGVyc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAoY3VycmVudEV2ZW50VHlwZSAhPSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8fCBjdXJyZW50UHJvamVjdERlbHRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmKGV4dGVuZGVycyAhPSBudWxsKXsKLQkJCVNldCA8SVN5bmNocm9uaXplckV4dGVuZGVyPiBleHRlbmRlcnNUb05vdGlmeSA9IGV4dGVuZGVyczsKLQkJCXdoaWxlKCFleHRlbmRlcnNUb05vdGlmeS5pc0VtcHR5KCkpewotCQkJCXRyeXsKLQkJCQkJZXh0ZW5kZXJzLnN0YXJ0UXVldWluZygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIDxJU3luY2hyb25pemVyRXh0ZW5kZXI+IGl0ZXJhdG9yID0gZXh0ZW5kZXJzVG9Ob3RpZnkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJZXh0ZW5kZXIucHJvamVjdENoYW5nZWQoY3VycmVudFByb2plY3REZWx0YSk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlleHRlbmRlcnNUb05vdGlmeSA9IGV4dGVuZGVycy5zdG9wUXVldWluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUV4dGVuZGVyc09mQ2xvc2UoKSB7Ci0JCWlmKGV4dGVuZGVycyAhPSBudWxsKXsKLQkJCVNldCA8SVN5bmNocm9uaXplckV4dGVuZGVyPiBleHRlbmRlcnNUb05vdGlmeSA9IGV4dGVuZGVyczsKLQkJCXdoaWxlKCFleHRlbmRlcnNUb05vdGlmeS5pc0VtcHR5KCkpewotCQkJCXRyeXsKLQkJCQkJZXh0ZW5kZXJzLnN0YXJ0UXVldWluZygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIDxJU3luY2hyb25pemVyRXh0ZW5kZXI+IGl0ZXJhdG9yID0gZXh0ZW5kZXJzVG9Ob3RpZnkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJZXh0ZW5kZXIucHJvamVjdENsb3NlZCgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZXh0ZW5kZXJzVG9Ob3RpZnkgPSBleHRlbmRlcnMuc3RvcFF1ZXVpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLAotCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGUgc3luY2hyb25pemVyLiBDYWxsZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHByb2plY3QgaXMgZ29pbmcgYXdheSBzbyB3ZSBuZWVkIHRvIGNsZWFudXAgb3Vyc2VsZiBhbmQgdGhlIFJlc291cmNlU2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChKRU1VdGlsUGx1Z2luLmlzQWN0aXZhdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJCQkoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpLnJlbGVhc2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UucmVtb3ZlQ2FjaGVkUHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBleHRlbmRlciB0byBiZSBub3RpZmllZCBvZiBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGV4dGVuZGVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXh0ZW5kZXIoSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyKSB7Ci0JCWlmIChleHRlbmRlcnMgPT0gbnVsbCl7Ci0JCQlleHRlbmRlcnMgPSBuZXcgUXVldWluZ0hhc2hTZXQgPElTeW5jaHJvbml6ZXJFeHRlbmRlcj4oMyk7Ci0JCX0KLQkJZXh0ZW5kZXJzLmFkZChleHRlbmRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGV4dGVuZGVyIGZyb20gbm90aWZpY2F0aW9uIG9mIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5kZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHRlbmRlcihJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIpIHsKLQkJaWYgKGV4dGVuZGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlleHRlbmRlcnMucmVtb3ZlKGV4dGVuZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICcoJyArICgoZ2V0UHJvamVjdCgpICE9IG51bGwpID8gZ2V0UHJvamVjdCgpLmdldE5hbWUoKSA6ICJudWxsIikgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUZWxsIFN5bmNocm9uaXplciB0aGF0IGEgZmlsZSBpcyBhYm91dCB0byBiZSBzYXZlZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYW4gRU1GIHJlc291cmNlLgotCSAqIDxwPgotCSAqIERlZmF1bHQgZG9lcyBub3RoaW5nLCBidXQgc3ViY2xhc3NlcyBjYW4gZG8gc29tZXRoaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiAgICAgICAgICAgIGZpbGUgYWJvdXQgdG8gYmUgc2F2ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcHJlU2F2ZShJRmlsZSBhRmlsZSkgewotCQkvL0RlZmF1bHQgaXMgZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MmY1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci0KLS8qKgotICogQnl0ZUFycmF5IE91dHB1dFN0cmVhbSBmb3IgdGhlIFdvcmtiZW5jaC4gSXQgd29ya3Mgd2l0aCB0aGUgc3luY2hyb25pemVyIHtAbGluayBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyfXRvCi0gKiBub3RpZnkgb2YgYSBzYXZlLiBJdCBhbHNvIGNoYW5nZXMgYWxsIG9mIHRoZSBsaW5lIHNlcGFyYXRvcnMgdG8gdGhlIGN1cnJlbnQgc3lzdGVtIGxpbmUgc2VwYXJhdG9yLCBpLmUuIGlmIHRoZXJlIGFyZSBzb21lICdccicgYW5kIHdlIGFyZSBvbgotICogV2luZG93cyhSKSB0aGVuIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gJ1xuXHInKSwgaWYgdGhlIHNldHRpbmcgZm9yIHRoZSBzdHJlYW0gaXMgdG8gZG8gZW9sIGNvbnZlcnNpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbC5QbGF0Zm9ybVJlc291cmNlT3V0cHV0U3RyZWFtIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmQ29udmVydEVPTCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShJRmlsZSBhRmlsZSkgewotCQl0aGlzKGFGaWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIElGaWxlIGFuZCBhIHN5bmNocm9uaXplci4gVGhpcyB3YXkgc3luY2hyb25pemVyIHdpbGwga25vdyB3aGVuIGZpbGUgaXMgYWJvdXQgdG8gYmUgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKElGaWxlIGFGaWxlLCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7Ci0JCXN1cGVyKGFGaWxlLCBmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCXN5bmNocm9uaXplciA9IGFTeW5jaHJvbml6ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc3luY2hyb25pemVyICE9IG51bGwpCi0JCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShmaWxlKTsKLQkJc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwuUGxhdGZvcm1SZXNvdXJjZU91dHB1dFN0cmVhbSNmbHVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoc3luY2hyb25pemVyICE9IG51bGwpCi0JCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShmaWxlKTsKLQkJc3VwZXIuZmx1c2goKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnQgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29udmVydEVPTChieXRlW10gZGF0YSkgewotCQkvLyBBbGdvcml0aG06Ci0JCS8vIFJlbW92ZSBhbGwgJ1xyJyBjaGFycwotCQkvLyBSZXBsYWNlIGFsbCAnXG4nIGNoYXJzIHdpdGggbGluZSBzZXBlcmF0b3IgY2hhcnMKLQotCQlTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlieXRlW10gRU9MQnl0ZXMgPSBFT0wuZ2V0Qnl0ZXMoKTsKLQotCQlpbnQgb3V0ID0gMDsKLQotCQlmb3IgKGludCBpbiA9IDA7IGluIDwgZGF0YS5sZW5ndGg7IGluKyspIHsKLQkJCWlmIChkYXRhW2luXSA9PSAnXHInKSB7Ci0JCQkJLy8gZG9uJ3Qgb3V0cHV0IChpZSwgdGhyb3cgdGhlIGNoYXIgYXdheSkKLQkJCX0gZWxzZSBpZiAoZGF0YVtpbl0gPT0gJ1xuJykgewotCQkJCS8vIFRoZSBjb2RlIGRvZXMgbm90IGN1cnJlbnRseSBoYW5kbGUgZXhwYW5kaW5nIHRoZSBhcnJheQotCQkJCWlmICgoaW4gLSBvdXQgKyAxKSA8IEVPTEJ5dGVzLmxlbmd0aCkKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW06IEV4cGFuZGluZyBFT0wgY2hhcnMgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgRU9MQnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGF0YVtvdXQrK10gPSBFT0xCeXRlc1tpXTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIEp1c3QgY29weSB0aGUgZGF0YQotCQkJCWRhdGFbb3V0KytdID0gZGF0YVtpbl07Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3V0OwotCX0KLQotCS8qKgotCSAqIElzIEVPTCBjb252ZXJzaW9uIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIEVPTCBjb252ZXJzaW9uIGlzIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnZlcnRFT0xDaGFycygpIHsKLQkJcmV0dXJuIGZDb252ZXJ0RU9MOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgRU9MIGNvbnZlcnNpb24gZmxhZy4KLQkgKiAKLQkgKiBAcGFyYW0gc2V0Ci0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiBFT0wgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBjdXJyZW50IGxpbmUgc2VwYXJhdG9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDaGFycyhib29sZWFuIHNldCkgewotCQlmQ29udmVydEVPTCA9IHNldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3RvQnl0ZUFycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKLQkJYnl0ZVtdIGNvbnRlbnRzID0gc3VwZXIudG9CeXRlQXJyYXkoKTsKLQkJaWYgKGlzQ29udmVydEVPTENoYXJzKCkpCi0JCQljb252ZXJ0RU9MKGNvbnRlbnRzKTsKLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTI2MjM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNiAkJCAgJCREYXRlOiAyMDA4LzAzLzEyIDE0OjIxOjM5ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLldvcmtzcGFjZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIFdvcmtiZW5jaCByZXNvdXJjZSBoZWxwZXIKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgewotCi0JLyoqCi0JICogRXZlcnl0aGluZyBpcyBzdGF0aWMsIGRvbid0IGtub3cgd2h5IHRoZXJlIGlzIGFuIGluc3RhbmNlIGhlcmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgSU5TVEFOQ0UgPSBuZXcgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlciB3b3Jrc3BhY2VVUklMb2FkZXIgPSBuZXcgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJTGlzdCBjb250YWluZWQgPSByZWZPYmplY3QuZUNvbnRlbnRzKCk7Ci0JCUVPYmplY3QgbW9mT2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lZC5zaXplKCk7IGkrKykgewotCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIGNvbnRhaW5lZC5nZXQoaSk7Ci0JCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc29sdmVOb25Db250YWluZWRQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IHJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOwotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAoIXJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCQlpZiAocmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZS5zaXplKCk7IGorKykKLQkJCQkJCXZhbHVlLmdldChqKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWZPYmplY3QuZUdldChyZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZvcmNlIGFsbCBvZiB0aGUgcHJveGllcyB3aXRoIDxjb2RlPnJlc291cmNlPC9jb2RlPiB0byBiZSByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUxpc3QgdG9wTGV2ZWxzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJCUVPYmplY3QgbW9mT2JqZWN0OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BMZXZlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQltb2ZPYmplY3QgPSAoRU9iamVjdCkgdG9wTGV2ZWxzLmdldChpKTsKLQkJCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBwcm94aWVzIHRoYXQgYXJlIGNvbnRhaW5lZCBieSB0aGUgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gbGlzdCBvZiBwcm94aWVzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnYXRoZXJQcm94aWVzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0b3BMZXZlbHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IHRvcExldmVscy5zaXplKCk7Ci0JCUVPYmplY3QgbW9mT2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIHRvcExldmVscy5nZXQoaSk7Ci0JCQlnYXRoZXJQcm94aWVzKChJbnRlcm5hbEVPYmplY3QpIG1vZk9iamVjdCwgbGlzdCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdhdGhlclByb3hpZXMoSW50ZXJuYWxFT2JqZWN0IHJlZk9iamVjdCwgTGlzdCBwcm94aWVzKSB7Ci0JCWlmIChyZWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGlzdCBjb250YWlucyA9IHJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCWlmIChjb250YWlucyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNvbnRhaW5zLnNpemUoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgY29udGFpbnMuZ2V0KGkpOwotCQkJCWdhdGhlclByb3hpZXMocmVmT2JqZWN0LCBzZiwgcHJveGllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2F0aGVyUHJveGllcyhJbnRlcm5hbEVPYmplY3QgcmVmT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YsIExpc3QgcHJveGllcykgewotCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSBudWxsOwotCQlpZiAoc2YuaXNNYW55KCkgfHwgcmVmT2JqZWN0LmVJc1NldChzZikpIHsKLQkJCXZhbHVlID0gcmVmT2JqZWN0LmVHZXQoc2YsIGZhbHNlKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNmLmlzTWFueSgpKSB7Ci0JCQkJCUl0ZXJhdG9yIGogPSAoKEludGVybmFsRUxpc3QpIHZhbHVlKS5iYXNpY0l0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChqLmhhc05leHQoKSkgewotCQkJCQkJcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBqLm5leHQoKTsKLQkJCQkJCWlmIChwcm94eS5lSXNQcm94eSgpKQotCQkJCQkJCXByb3hpZXMuYWRkKHByb3h5KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoKChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKS5lSXNQcm94eSgpKQotCQkJCQlwcm94aWVzLmFkZCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJaWYgKHJlZk9iamVjdCAhPSBudWxsKSB7Ci0JCQlyZXNvbHZlTm9uQ29udGFpbmVkUHJveGllcyhyZWZPYmplY3QpOwotCQkJcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMocmVmT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBleGlzdGluZyBjb250ZXh0IGJhc2Ugb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEByZXR1cm4gdGhlIGNvbnRleHQgYmFzZSBmb3IgdGhlIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLmdldEVNRkNvbnRleHQoYVByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlc291cmNlIGZyb20gdGhlIFVSSS4gVGhlIFVSSSBtdXN0IGNvbnRhaW4gdGhlIHByb2plY3QgbmFtZSwgZWl0aGVyIGFzIHRoZSBmaXJzdCBzZWdtZW50LCBvciBpZiBpbiBwbGF0Zm9ybSByZXNvdXJjZSB1cmwgcHJvdG9jb2wuCi0JICoge0BsaW5rICNnZXRSZXNvdXJjZVNldChVUkkpfQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIGEgbmV3IHJlc291cmNlIGZvciB0aGUgdXJpIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgdXJpCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHVyaSk7Ci0JCWlmIChzZXQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGEgY2FjaGVkIFJlc291cmNlIGZvciB0aGUgZ2l2ZW4gVVJJLCBpZiBub25lIGlzIGZvdW5kLCBjcmVhdGUgYSBuZXcgUmVzb3VyY2UgZm9yIHdpdGggdGhlIFVSSSBhZ2FpbnN0IHRoZSBwcm9wZXIgUmVzb3VyY2VTZXQuCi0JICogCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgotCSAqIEByZXR1cm4gcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgcHJvamVjdCB1cmkuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKHVyaSwgZ2V0UmVzb3VyY2VTZXQodXJpKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgSUZpbGUgZm9yIHRoZSBVUkkuIFRoZSBVUkkgbXVzdCBiZSBhIHdvcmtiZW5jaCBwcm9qZWN0IHN0eWxlIFVSSS4gCi0JICogQHBhcmFtIHVyaSBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgotCSAqIEByZXR1cm4gdGhlIElGaWxlIGlmIHRoZSBVUkkgaXMgYSBwcm9qZWN0IGZvcm0sIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgZm9ybSwgT1IgdGhlIHByb2plY3QgZG9lc24ndCBleGlzdC4gVGhlIElGaWxlIHJldHVybmVkIGRvZXNuJ3QgbmVjZXNzYXJpbHkgZXhpc3QuIFVzZSB7QGxpbmsgSUZpbGUjZXhpc3RzKCl9IHRvIHRlc3QgdGhhdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldElGaWxlKFVSSSB1cmkpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QodXJpKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aDsKLQkJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJCS8vIE5lZWQgdG8gZ2V0IHRoZSBwYXRoIGFuZCByZW1vdmUgdGhlIGZpcnN0IHR3byBzZWdtZW50cyAoL3Jlc291cmNlL3Byb2plY3QgbmFtZS8pLgotCQkJCXBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBOZWVkIHRvIGdldCB0aGUgcGF0aCBhbmQgcmVtb3ZlIHRoZSBmaXJzdCBzZWdtZW50ICgvcHJvamVjdCBuYW1lLykuCi0JCQkJcGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUodXJpLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcHJvamVjdC5nZXRGaWxlKHBhdGgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhIGNhY2hlZCBSZXNvdXJjZSBmb3IgdGhlIGdpdmVuIFVSSSwgaWYgbm9uZSBpcyBmb3VuZCwgY3JlYXRlIGEgbmV3IFJlc291cmNlIGZvciB3aXRoIHRoZSBVUkkgYWdhaW5zdCB0aGUgZ2l2ZW4gUmVzb3VyY2VTZXQuCi0JICogCi0JICogQHBhcmFtIHVyaSAKLQkgKiBAcGFyYW0gc2V0Ci0JICogQHJldHVybiByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzZXQgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9IHNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQlyZXMgPSBzZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJCXJldHVybiByZXM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IG9yIGV4aXN0aW5nIGNvbnRleHQgYmFzZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uIEFsbG93IHRoZSA8Y29kZT5jb250cmlidXRvcjwvY29kZT4gdG8gY29udHJpYnV0ZSB0byB0aGUgbmV3IG9yIGV4aXN0aW5nCi0JICogbmF0dXJlIHByaW9yIHRvIHJldHVybmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcGFyYW0gY29udHJpYnV0b3IKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IGJhc2UgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgewotCQlyZXR1cm4gRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlRU1GQ29udGV4dChhUHJvamVjdCwgY29udHJpYnV0b3IpOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhlIHBhc3NlZCBVUkkgaGF2ZSB0aGUgZm9ybSBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uID8KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBhIHBsYXRmb3JtIHJlc291cmNlIHByb3RvY29sLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtUmVzb3VyY2VVUkkoVVJJIHVyaSkgewotCQlyZXR1cm4gSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmVxdWFscyh1cmkuc2VnbWVudCgwKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhcGkgbWF5IGJlIHVzZWQgdG8gY2FjaGUgYSBSZXNvdXJjZSBpZiBpdCBoYXMgYSBVUkkgdGhhdCBpcyBXb3Jrc3BhY2UgcmVsYXRpdmUuIFJldHVybiB0cnVlIGlmIGl0IGlzIGNhY2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCB3YXMgc3VjY2Vzc2Z1bCB0byBjYWNoZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FjaGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldChhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKHNldCAhPSBudWxsKQotCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXBpIGlzIHVzZWQgaWYgeW91IGNyZWF0ZSBhIG5ldyBNT0YgcmVzb3VyY2UgYW5kIHlvdSB3YW50IHRvIGFkZCBpdCB0byB0aGUgY29ycmVjdCBSZXNvdXJjZVNldC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZCB0aGUgSVByb2plY3QKLQkgKiB0aGF0IHlvdSB3YW50IGFSZXNvdXJjZSB0byBiZSBjYWNoZWQgd2l0aGluIGFzIHdlbGwgYXMgdGhlIElQYXRoIHdoaWNoIGlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgUmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEBwYXJhbSBmdWxsUGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzb3VyY2Ugd2FzIGNhY2hlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FjaGVSZXNvdXJjZShJUHJvamVjdCBhUHJvamVjdCwgUmVzb3VyY2UgYVJlc291cmNlLCBJUGF0aCBmdWxsUGF0aCkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBhUmVzb3VyY2UgPT0gbnVsbCB8fCAhYVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KGFQcm9qZWN0KTsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlVUkkgY29udmVydGVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShhUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKGNvbnZlcnRlZCAhPSBhUmVzb3VyY2UuZ2V0VVJJKCkpCi0JCQkJYVJlc291cmNlLnNldFVSSShjb252ZXJ0ZWQpOwotCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwYXRoIG9mIHRoZSBwcm9qZWN0IHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb3IgcmVsYXRpdmUgdG8gdGhlIGxpc3Qgb2YgY29udGFpbmVycyBpbiB0aGlzIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEByZXR1cm4gcGF0aAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdHVhbFByb2plY3RSZWxhdGl2ZVVSSShJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgPT0gbnVsbCB8fCAhYVJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBhUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBwYXRoID0gZ2V0UGF0aEluUHJvamVjdChwcm9qZWN0LCBhUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCXJldHVybiBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIElQYXRoIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCBhIFJlc291cmNlIHVzaW5nIHRoZSA8Y29kZT5mdWxsUGF0aDwvY29kZT4uIFRoaXMgd2lsbCBiZSBhIHByb2plY3QgcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBmdWxsUGF0aAotCSAqIEByZXR1cm4gcGF0aAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGF0aEluUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBmdWxsUGF0aCkgewotCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRQcm9qZWN0VVJJQ29udmVydGVyQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJaWYgKCFjb250YWluZXJzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBnZXRQYXRoRnJvbUNvbnRhaW5lcnMoY29udGFpbmVycywgZnVsbFBhdGgpOwotCQlyZXR1cm4gZnVsbFBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFByb2plY3RVUklDb252ZXJ0ZXJDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgbmF0dXJlID0gY3JlYXRlRU1GQ29udGV4dChwcm9qZWN0LCBudWxsKTsKLQkJaWYgKG5hdHVyZSAhPSBudWxsKSB7Ci0JCQlXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJaWYgKGNvbnYgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29udi5nZXRJbnB1dENvbnRhaW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHBhdGggaXMgY29udGFpbmVkIHdpdGhpbiBvbmUgb2YgdGhlIGxpc3RlZCBjb250YWluZXJzLCB0aGVuIHJldHVybiB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXJzCi0JICogQHBhcmFtIGZ1bGxQYXRoCi0JICogQHJldHVybiBwYXRoIHJlbGF0aXZlIHRvIGEgY29udGFpbmVyLCBvciB1bmNoYW5nZWQgcGF0aCBpZiBub3QgaW4gYSBjb250YWluZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQYXRoRnJvbUNvbnRhaW5lcnMoTGlzdCBjb250YWluZXJzLCBJUGF0aCBmdWxsUGF0aCkgewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCUlQYXRoIHJlc3VsdDsKLQkJaW50IHNpemUgPSBjb250YWluZXJzLnNpemUoKTsKLQkJaW50IG1hdGNoaW5nID0gLTE7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQljb250YWluZXIgPSAoSUNvbnRhaW5lcikgY29udGFpbmVycy5nZXQoaSk7Ci0JCQljb250YWluZXJQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCQltYXRjaGluZyA9IGZ1bGxQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhjb250YWluZXJQYXRoKTsKLQkJCWlmIChtYXRjaGluZyA+IDAgJiYgbWF0Y2hpbmcgPT0gY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSkgewotCQkJCXJlc3VsdCA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmcpOwotCQkJCXJlc3VsdCA9IHJlc3VsdC5tYWtlUmVsYXRpdmUoKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmdWxsUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgPGNvZGU+dXJpPC9jb2RlPiBoYXMgaXRzIGNvbnRhaW5lciBzZWdtZW50cyB2aXNpYmxlIGZyb20gdGhlIGlucHV0IGNvbnRhaW5lcnMgZm9yIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1cmkgaXMgdmlzaWJsZSBmcm9tIHRoZSBpbnB1dCBjb250YWluZXJzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb250YWluZXJTdHJ1Y3R1cmUoSVByb2plY3QgcHJvamVjdCwgVVJJIHVyaSkgewotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHVyaSAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpLnRvU3RyaW5nKCkpOwotCQkJTGlzdCBjb250YWluZXJzID0gZ2V0UHJvamVjdFVSSUNvbnZlcnRlckNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCUlQYXRoIGNvbnRhaW5lclBhdGggPSBzZWdtZW50Q291bnQgPiAxID8gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkgOiBudWxsOwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJY29udGFpbmVyID0gKElDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KGkpOwotCQkJCWlmICghY29udGFpbmVyLmlzQWNjZXNzaWJsZSgpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoc2VnbWVudENvdW50ID09IDEpIHsKLQkJCQkJaWYgKGNvbnRhaW5lciA9PSBwcm9qZWN0KQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChjb250YWluZXJQYXRoICE9IG51bGwpIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKGNvbnRhaW5lclBhdGgpOwotCQkJCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgZm9sZGVyLmlzQWNjZXNzaWJsZSgpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIGZvciB0aGUgdXJpLiBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLiBJdCB3aWxsIGJlIGxvYWRlZCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuIElmIGl0IGlzIG5vdCB0bwotCSAqIGJlIGxvYWRlZCBpZiBub3QgbG9hZGVkIHVzZSB7QGxpbmsgI2dldFJlc291cmNlKFVSSSwgYm9vbGVhbil9IGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIHVyaSBtdXN0IGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4iIGZvcm0gb3IgaXQgbXVzdCBiZSAicHJvamVjdC1uYW1lLy4uLiIuIEFueSBvdGhlciBmb3JtIHdpbGwgYmUgaW52YWxpZC4KLQkgKiBAcmV0dXJuIHJlc291cmNlIGlmIHVyaSBpcyBmb3IgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9qZWN0IG5vdCBmb3VuZCBvciBub3QgYSB2YWxpZCBwcm9qZWN0IHJlc291cmNlLgotCSAqIAotCSAqIEB0aHJvd3MgV3JhcHBlZEV4Y2VwdGlvbiBpZiB2YWxpZCBwcm9qZWN0IGZvcm1hdCBVUkkgYnV0IGZpbGUgbm90IGZvdW5kIG9yIHNvbWUgb3RoZXIgZXJyb3Igb24gbG9hZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZSBmb3IgdGhlIHBhc3NlZCBJRmlsZSB3aXRob3V0IGZvcmNpbmcgYSBsb2FkLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKElGaWxlIGFGaWxlKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShhRmlsZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2UgZm9yIHRoZSBwYXNzZWQgSUZpbGUsIGZvcmNpbmcgYSBsb2FkIGlmIDxjb2RlPmxvYWRPbkRlbWFuZDwvY29kZT4gc2F5cyBzby4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIGZvcmNlIGEgbG9hZCBvZiByZXNvdXJjZSBpZiBub3QgbG9hZGVkLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKElGaWxlIGFGaWxlLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBsb2FkT25EZW1hbmQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlIGZvciB0aGUgcGFzc2VkIElGaWxlIHdpdGhvdXQgYSBsb2FkIGlmIG5vdCBsb2FkZWQuCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgbG9hZChJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoYUZpbGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgZm9yIHRoZSB1cmkuIFRoZSBVUkkgTVVTVCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uLiIgdHlwZSBVUkkgb3IgaXQKLQkgKiBtdXN0IGJlIG9mIHR5cGUgInByb2plY3QtbmFtZS8uLi4iLiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIHJlc291cmNlcyB0aGF0IGFyZSB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZXMuCi0JICogQW55IG90aGVyIHR5cGUgb2YgVVJJIHdpbGwgY2F1c2UgPGNvZGU+bnVsbDwvY29kZT4gdG8gYmUgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIHVyaSBtdXN0IGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4iIGZvcm0gb3IgaXQgbXVzdCBiZSAicHJvamVjdC1uYW1lLy4uLiIuIEFueSBvdGhlciBmb3JtIHdpbGwgYmUgaW52YWxpZC4KLQkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgY2F1c2UgcmVzb3VyY2UgdG8gYmUgbG9hZGVkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KLQkgKiBAcmV0dXJuIHJlc291cmNlIGlmIHVyaSBpcyBmb3IgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvamVjdCBub3QgZm91bmQsIG9yIG5vdCBhIHZhbGlkIHByb2plY3QgcmVzb3VyY2UgdXJpLgotCSAqIAotCSAqIEB0aHJvd3MgV3JhcHBlZEV4Y2VwdGlvbiBpZiB2YWxpZCBwcm9qZWN0IGZvcm1hdCBVUkkgYnV0IGZpbGUgbm90IGZvdW5kIG9yIHNvbWUgb3RoZXIgZXJyb3Igb24gbG9hZCBpZiBsb2FkT25EZW1hbmQgaXMgdHJ1ZS4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHVyaSk7Ci0JCWlmIChzZXQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZXNvdXJjZVNldCBmb3IgdGhlIHBhc3NlZCBVUkkuIFRoZSBVUkkgc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQgcGxhdGZvcm06L3Jlc291cmNlL3twcm9qZWN0IG5hbWV9Ly4uLiBvciB7cHJvamVjdCBuYW1lfS8uLi4gZm9yIHRoaXMKLQkgKiBhcGkgdG8gd29yay4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBvZiBjb3JyZWN0IGZvcm0gb3IgcHJvamVjdCBkb2Vzbid0IGhhdmUgYSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChVUkkgdXJpKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHVyaSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZVNldChwcm9qZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogR2V0IHRoZSBwcm9qZWN0IGZvciB0aGUgdXJpIGlmIHRoZSB1cmkgaXMgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCBmb3JtYXQgdXJpLiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFVSSSB1cmkpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lOwotCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCi0JCQlwcm9qZWN0TmFtZSA9IHVyaS5zZWdtZW50KDEpOwotCQllbHNlIGlmICh1cmkuc2NoZW1lKCkgPT0gbnVsbCkgewotCQkJcHJvamVjdE5hbWUgPSBuZXcgUGF0aCh1cmkucGF0aCgpKS5zZWdtZW50KDApOyAvL2Fzc3VtZSBwcm9qZWN0IG5hbWUgaXMgZmlyc3QgaW4gdGhlIFVSSQotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoVVJJLmRlY29kZShwcm9qZWN0TmFtZSkpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gcHJvamVjdDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZVNldCBmb3IgdGhlIHBhc3NlZCBJUHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIG5hdCA9IGNyZWF0ZUVNRkNvbnRleHQocHJvamVjdCwgbnVsbCk7Ci0JCWlmIChuYXQgIT0gbnVsbCkKLQkJCXJldHVybiBuYXQuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB3b3Jrc3BhY2UuIChqdXN0IHVzZSB7QGxpbmsgUmVzb3VyY2VzUGx1Z2luI2dldFdvcmtzcGFjZSgpfSkuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBzZXQKLQkgKiBAcmV0dXJuIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVzb3VyY2Ugc2V0IG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZVNldCBzZXQpIHsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlpZiAoc2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KSB7Ci0JCQkJUHJvamVjdFJlc291cmNlU2V0IHBzZXQgPSAoUHJvamVjdFJlc291cmNlU2V0KSBzZXQ7Ci0JCQkJcmV0dXJuIHBzZXQuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWRVUklNYXBwaW5nKFN0cmluZyBocmVmKSB7Ci0JCWlmIChocmVmICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWxlID0gaHJlZjsKLQkJCWludCBpbmRleCA9IGhyZWYuaW5kZXhPZignIycpOwotCQkJaWYgKGluZGV4ID4gLTEpCi0JCQkJZmlsZSA9IGhyZWYuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCXJldHVybiBVUklDb252ZXJ0ZXIuVVJJX01BUC5nZXQoZmlsZSkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIHJlc291cmNlIHNldCBhbmQgdGhlbiB1bmxvYWQgdGhlbS4gVW5sb2FkIGZvcmNlcyBhbGwgb2YgdGhlIG9iamVjdHMgdG8gYmVjb21lIHByb3hpZXMgc28gbmV4dCByZXNvbHZlIHdpbGwKLQkgKiByZWxvYWQgdGhlIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gYVNldAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbmRVbmxvYWRBbGwoTGlzdCByZXNvdXJjZXMsIFJlc291cmNlU2V0IGFTZXQpIHsKLQkJaWYgKGFTZXQgPT0gbnVsbCB8fCByZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlhU2V0LmdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZXNvdXJjZXMpOwotCQlSZXNvdXJjZSByZXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZXMudW5sb2FkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUdXJuIG9iamVjdCBpbnRvIGEgcHJveHkuCi0JICogCi0JICogQHBhcmFtIGFuT2JqZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvYmplY3Qgd2FzIGFibGUgdG8gYmVjb21lIGEgcHJveHkuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGJlY29tZVByb3h5KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKGFuT2JqZWN0ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlcyA9IGFuT2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKLQkJCQkoKEludGVybmFsRU9iamVjdCkgYW5PYmplY3QpLmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQocmVzLmdldFVSSUZyYWdtZW50KGFuT2JqZWN0KSkpOwotCQkJCS8vYW5PYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIFdyYXBwZWRFeGNlcHRpb24gaXMgYWN0dWFsbHkgYSBSZXNvdXJjZSBOb3QgRm91bmQuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZWRFeAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgZXhjZXB0aW9uIHdyYXBwZXJzIGEgcmVzb3VyY2Ugbm90IGZvdW5kLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jlc291cmNlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKLQkJRXhjZXB0aW9uIGV4Y2VwID0gd3JhcHBlZEV4LmV4Y2VwdGlvbigpOwotCQl3aGlsZSAoZXhjZXAgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uKSB7Ci0JCQlleGNlcCA9ICgoV3JhcHBlZEV4Y2VwdGlvbikgZXhjZXApLmV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBwcmltSXNSZXNvdXJjZU5vdEZvdW5kKGV4Y2VwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByaW1Jc1Jlc291cmNlTm90Rm91bmQoVGhyb3dhYmxlIGV4Y2VwKSB7Ci0JCWlmIChleGNlcCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBleGNlcCkuZ2V0U3RhdHVzKCk7Ci0JCQlyZXR1cm4gc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EICYmIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMuZXF1YWxzKHN0YXR1cy5nZXRQbHVnaW4oKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBXcmFwcGVkRXhjZXB0aW9uIGlzIGFjdHVhbGx5IGEgUmVzb3VyY2UgTm90IEZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVkRXgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIGV4Y2VwdGlvbiB3cmFwcGVycyBhIHJlc291cmNlIG5vdCBmb3VuZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXNvdXJjZU5vdEZvdW5kKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKLQkJcmV0dXJuIHByaW1Jc1Jlc291cmNlTm90Rm91bmQod3JhcHBlZEV4LmdldENhdXNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFVSSSByZXByZXNlbmF0aW9uIG9mIHRoZSBwbGF0Zm9ybVVSSSB3aXRob3V0IHRoZSBsZWFkaW5nICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpZiBwcmVzZW50LgotCSAqIAotCSAqIEBwYXJhbSBwbGF0Zm9ybVVSSQotCSAqIEByZXR1cm4gdXJpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0Tm9uUGxhdGZvcm1VUkkoVVJJIHBsYXRmb3JtVVJJKSB7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkocGxhdGZvcm1VUkkpKSB7Ci0JCQlTdHJpbmcgdXJpU3RyaW5nID0gcHJpbUdldE5vblBsYXRmb3JtVVJJU3RyaW5nKHBsYXRmb3JtVVJJKTsKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIHBsYXRmb3JtVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbmF0aW9uIG9mIHRoZSBwbGF0Zm9ybVVSSSB3aXRob3V0IHRoZSBsZWFkaW5nICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpZiBwcmVzZW50LgotCSAqIAotCSAqIEBwYXJhbSBwbGF0Zm9ybVVSSQotCSAqIEByZXR1cm4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb25QbGF0Zm9ybVVSSVN0cmluZyhVUkkgcGxhdGZvcm1VUkkpIHsKLQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSShwbGF0Zm9ybVVSSSkpIHsgcmV0dXJuIHByaW1HZXROb25QbGF0Zm9ybVVSSVN0cmluZyhwbGF0Zm9ybVVSSSk7IH0KLQkJcmV0dXJuIHBsYXRmb3JtVVJJLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmUgInBsYXRmb3JtOi9yZXNvdXJjZS8iIGZyb20gdGhlIGZyb250IG9mIHRoZSBwbGF0Zm9ybVVSSSBhbmQgcmV0dXJuIHRoZSByZW1haW5pbmcgU3RyaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwcmltR2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcoVVJJIHBsYXRmb3JtVVJJKSB7Ci0JCVN0cmluZyB1cmlTdHJpbmcgPSBwbGF0Zm9ybVVSSS50b1N0cmluZygpOwotCQkvLyJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpcyAxOSBjaGFyYWN0ZXJzLgotCQlyZXR1cm4gdXJpU3RyaW5nLnN1YnN0cmluZygxOSwgdXJpU3RyaW5nLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoZSBwYXNzZWQgVVJJIGhhdmUgdGhlIGZvcm0gcGxhdGZvcm06L3BsdWdpbi8uLi4gPwotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVyaSBpcyBwbGF0Zm9ybSBwbHVnaW4gcHJvdG9jb2wuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSShVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BMVUdJTi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTY4NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIFdvcmtiZW5jaFVSSSBjb252ZXJ0ZXJzLiBXb3JrYmVuY2ggVVJJIGNvbnZlcnRlcnMgaGFuZGxlIHJlZmVyZW5jZXMgdG8gZmlsZXMgaW4gdGhlIHByb2plY3QncyBjb250YWluZXJzLgotICogVGhpcyBjb252ZXJ0ZXIgaXMgb25seSBuZWNlc3NhcnkgdG8gcmVzb2x2ZSBvbGQgYW1iaWd1b3VzIHdvcmtiZW5jaCBVUklzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2JlbmNoVVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVyIHsKLQotCS8qKgotCSAqIEFkZCBpbnB1dCBjb250YWluZXIgdG8gdG8gdGhlIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbnRhaW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgYWRkSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKTsKLQotCS8qKgotCSAqIEFkZCBsaXN0IG9mIGNvbnRhaW5lcnMgdG8gdGhlIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVycwotCSAqICAgICAgICAgICAgbGlzdCBvZiA8Y29kZT5JQ29udGFpbmVyPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgYWRkSW5wdXRDb250YWluZXJzKExpc3QgY29udGFpbmVycyk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbGUgcmVsYXRpdmUgdG8gYSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gZmlsZSByZWxhdGl2ZSB0byBhIGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUZpbGUgZ2V0RmlsZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEdldCBmaXJzdCBpbnB1dCBjb250YWluZXIKLQkgKiAKLQkgKiBAcmV0dXJuIGZpcnN0IGlucHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJQ29udGFpbmVyIGdldElucHV0Q29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGlucHV0IGNvbnRhaW5lcnMuCi0JICogCi0JICogQHJldHVybiBhbGwgaW5wdXQgY29udGFpbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlMaXN0IGdldElucHV0Q29udGFpbmVycygpOwotCi0JLyoqCi0JICogR2V0IHRoZSBvdXRwdXQgY29udGFpbmVyIGlmIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIG91dHB1dCBjb250YWluZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJQ29udGFpbmVyIGdldE91dHB1dENvbnRhaW5lcigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBvdXRwdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHNldE91dHB1dENvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSUZpbGUgZm9yCi0JICogCi0JICogQGFQYXRoLiBJZiB3ZSBoYXZlIGEgcGFyZW50IGFuZCB3ZSBkbyBub3QgY29udGFpbiB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgYVBhdGgsIGZvcndhcmQgdG8gdGhlIHBhcmVudCB0byByZXRyaWV2ZSB0aGUgZmlsZS4KLQkgKiBAcGFyYW0gYVBhdGgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUZpbGUgZ2V0T3V0cHV0RmlsZShJUGF0aCBhUGF0aCk7Ci0KLQkvKioKLQkgKiBHZXQgb3V0cHV0IGZpbGUgd2l0aCBtYXBwaW5nIGFwcGxpZWQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJRmlsZSBnZXRPdXRwdXRGaWxlV2l0aE1hcHBpbmdBcHBsaWVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogUmVtb3ZlIGlucHV0IGNvbnRhaW5lciBmcm9tIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGFDb250YWluZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlbW92ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JYm9vbGVhbiByZW1vdmVJbnB1dENvbnRhaW5lcihJQ29udGFpbmVyIGFDb250YWluZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgd2UgY2FuIHJldHJpZXZlIHRoZSByZXNvdXJjZSB1c2VkIHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtIG9uLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZU5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbGVuYW1lIGlzIHZhbGlkIGZvciBmaWxlIHN0cmVhbSBhY2Nlc3MuCi0JICogQHNpbmNlIDEuMC4wCi0JICogIAotCSAqLwotCWJvb2xlYW4gY2FuR2V0VW5kZXJseWluZ1Jlc291cmNlKFN0cmluZyBhRmlsZU5hbWUpOwotCi0JLyoqCi0JICogSXMgZm9yY2Ugc2F2ZSByZWxhdGl2ZSBmbGFnIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZvcmNlIHNhdmUgcmVsYXRpdmUgaXMgdHVybmVkIG9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCWJvb2xlYW4gaXNGb3JjZVNhdmVSZWxhdGl2ZSgpOwotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgaWYgeW91IGRvIG5vdCB3YW50IGFueSBwYXRoIG1hbmlwdWxhdGlvbiB3aGVuIGNyZWF0aW5nIHRoZSBvdXRwdXQgc3RyZWFtLi4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2VTYXZlUmVsYXRpdmUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZvcmNlIHNhdmVzIGFzIHJlbGF0aXZlLgotCSAqLwotCXZvaWQgc2V0Rm9yY2VTYXZlUmVsYXRpdmUoYm9vbGVhbiBmb3JjZVNhdmVSZWxhdGl2ZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjU1NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS42ICQkICAkJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NDUgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBpbnRlcmZhY2UuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbCBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwgaW1wbGVtZW50cyBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgV09SS1NQQUNFX1JPT1QgPSBVUklDb252ZXJ0ZXJJbXBsLndvcmtzcGFjZVJvb3Q7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdPUktTUEFDRV9ST09UX0xPQ0FUSU9OID0gV09SS1NQQUNFX1JPT1QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIElOVkFMSURfUEFUSCA9IG5ldyBQYXRoKCIhISEhfiEhISEiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbGUgSU5WQUxJRF9GSUxFID0gV09SS1NQQUNFX1JPT1QuZ2V0RmlsZShJTlZBTElEX1BBVEguYXBwZW5kKElOVkFMSURfUEFUSCkpOwotCi0JLy9Vc2VkIHRvIGF2b2lkIHRyeWluZyB0byBmaXh1cCB0aGUgVVJJIHdoZW4gZ2V0dGluZyB0aGUKLQkvL091dHB1dFN0cmVhbQotCXByb3RlY3RlZCBib29sZWFuIGZvcmNlU2F2ZVJlbGF0aXZlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBpbnB1dENvbnRhaW5lcnM7Ci0KLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBvdXRwdXRDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgcmVzb3VyY2VTZXRTeW5jaHJvbml6ZXI7Ci0JCi0JLyoKLQkgKiBLTFVER0U6IFdlIG5lZWQgdG8ga25vdyB0aGUgbWV0YSBkYXRhIGFyZWEuIFRoaXMgaXMgc28gdGhhdCBhbnkgdXJpIHRoYXQgc3RhcnRzIHdpdGggdGhlIG1ldGFkYXRhIGRpcmVjdG9yeQotCSAqIGlzIGNvbnNpZGVyZWQgYSBmaWxlIHVyaSBhbmQgTk9UIGEgd29ya3NwYWNlIHVyaS4gVGhlIG1ldGFkYXRhIGlzIHdoZXJlIHBsdWdpbidzIHN0b3JlIHRoZWlyIHdvcmtpbmcgZGF0YS4KLQkgKiBJdCBpcyBub3QgcGFydCBvZiB0aGUgd29ya3NwYWNlIHJvb3QuCi0JICogIAotCSAqIFRoZXJlIGlzIG5vIHJlcXVlc3QgZm9yIHNpbXBseSB0aGUgbWV0YWRhdGEgYXJlYS4gVGhlIGxvZyBmaWxlIGlzIGluIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkuIFNvIHdlIHdpbGwKLQkgKiBnZXQgdGhlIGxvZyBmaWxlIGxvY2F0aW9uIGFuZCBqdXN0IHJlbW92ZSB0aGUgbG9nIGZpbGUgbmFtZS4gVGhhdCBzaG91bGQgbGVhdmUgdXMgd2l0aCB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5Ci0JICogb25seS4gSWYgRWNsaXBzZSBldmVyIGRlY2lkZXMgdG8gbW92ZSBpdCBmcm9tIGhlcmUsIHRoaXMgd2lsbCBubyBsb25nZXIgd29yay4gQnV0IGl0IGhhc24ndCBtb3ZlZCBpbiB0aHJlZSAKLQkgKiB2ZXJzaW9ucy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBNRVRBREFUQV9MT0NBVElPTiA9IFBsYXRmb3JtLmdldExvZ0ZpbGVMb2NhdGlvbigpLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb252ZXJ0ZXIgY29uc3RydWN0b3IsIG5vIGNvbnRhaW5lcnMuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyKSB7Ci0JCXRoaXMoYW5JbnB1dENvbnRhaW5lciwgKFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBpbnB1dCBjb250YWluZXIgYW5kIGEgc3luY2hyb256aWVyLgotCSAqIAotCSAqIEBwYXJhbSBhQ29udGFpbmVyCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJdGhpcyhhQ29udGFpbmVyLCBudWxsLCBhU3luY2hyb25pemVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBpbnB1dCBjb250YWluZXIgYW5kIGFuIG91dHB1dCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIsIElDb250YWluZXIgYW5PdXRwdXRDb250YWluZXIpIHsKLQkJdGhpcyhhbklucHV0Q29udGFpbmVyLCBhbk91dHB1dENvbnRhaW5lciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyLCBvdXRwdXQgY29udGFpbmVyLCBhbmQgYSBzeW5jaHJvbml6ZXIuCi0JICogCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lciwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQlhZGRJbnB1dENvbnRhaW5lcihhbklucHV0Q29udGFpbmVyKTsKLQkJc2V0T3V0cHV0Q29udGFpbmVyKGFuT3V0cHV0Q29udGFpbmVyKTsKLQkJcmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIgPSBhU3luY2hyb25pemVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjYWRkSW5wdXRDb250YWluZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbnB1dENvbnRhaW5lcihJQ29udGFpbmVyIGFDb250YWluZXIpIHsKLQkJaWYgKGFDb250YWluZXIgIT0gbnVsbCAmJiAhZ2V0SW5wdXRDb250YWluZXJzKCkuY29udGFpbnMoYUNvbnRhaW5lcikpCi0JCQlnZXRJbnB1dENvbnRhaW5lcnMoKS5hZGQoYUNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNhZGRJbnB1dENvbnRhaW5lcnMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5wdXRDb250YWluZXJzKExpc3QgY29udGFpbmVycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWFkZElucHV0Q29udGFpbmVyKChJQ29udGFpbmVyKSBjb250YWluZXJzLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI3JlbW92ZUlucHV0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKSB7Ci0JCXJldHVybiBnZXRJbnB1dENvbnRhaW5lcnMoKS5yZW1vdmUoYUNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRJbnB1dENvbnRhaW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldElucHV0Q29udGFpbmVycygpIHsKLQkJaWYgKGlucHV0Q29udGFpbmVycyA9PSBudWxsKQotCQkJaW5wdXRDb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gaW5wdXRDb250YWluZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0SW5wdXRDb250YWluZXIoKQotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldElucHV0Q29udGFpbmVyKCkgewotCQlpZiAoIWdldElucHV0Q29udGFpbmVycygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSUNvbnRhaW5lcikgZ2V0SW5wdXRDb250YWluZXJzKCkuZ2V0KDApOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dENvbnRhaW5lcigpCi0JICovCi0JcHVibGljIElDb250YWluZXIgZ2V0T3V0cHV0Q29udGFpbmVyKCkgewotCQlpZiAob3V0cHV0Q29udGFpbmVyID09IG51bGwpCi0JCQlvdXRwdXRDb250YWluZXIgPSBnZXRJbnB1dENvbnRhaW5lcigpOwotCQlyZXR1cm4gb3V0cHV0Q29udGFpbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjc2V0T3V0cHV0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0Q29udGFpbmVyKElDb250YWluZXIgbmV3T3V0cHV0Q29udGFpbmVyKSB7Ci0JCW91dHB1dENvbnRhaW5lciA9IG5ld091dHB1dENvbnRhaW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dEZpbGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRPdXRwdXRGaWxlKElQYXRoIGFQYXRoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoZ2V0T3V0cHV0Q29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJaWYgKGZvcmNlU2F2ZVJlbGF0aXZlKQotCQkJCXJldHVybiBwcmltR2V0T3V0cHV0RmlsZShhUGF0aCk7Ci0JCQlmaWxlID0gZ2V0T3V0cHV0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMoYVBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcHJpbUdldE91dHB1dEZpbGUoYVBhdGgpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBwcmltR2V0T3V0cHV0RmlsZShJUGF0aCBhUGF0aCkgewotCQlyZXR1cm4gcHJpbUdldEZpbGUoZ2V0T3V0cHV0Q29udGFpbmVyKCksIGFQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0T3V0cHV0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMoSVBhdGggYVBhdGgpIHsKLQkJSUNvbnRhaW5lciBvdXQgPSBnZXRPdXRwdXRDb250YWluZXIoKTsKLQkJcmV0dXJuIGdldEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKGFQYXRoLCBvdXQsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMoSVBhdGggYVBhdGgsIElDb250YWluZXIgY29udGFpbmVyLCBib29sZWFuIHRlc3RFeGlzdHMpIHsKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAodGVzdEV4aXN0cykgewotCQkJY29udGFpbmVyUGF0aCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQlpZiAoIWNvbnRhaW5lclBhdGguaXNFbXB0eSgpKSB7Ci0JCQkJZmlsZSA9IGdldEZpbGVGb3JNYXRjaGluZ1BhdGgoYVBhdGgsIGNvbnRhaW5lclBhdGgsIGNvbnRhaW5lcik7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJfQotCQljb250YWluZXJQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCWZpbGUgPSBnZXRGaWxlRm9yTWF0Y2hpbmdQYXRoKGFQYXRoLCBjb250YWluZXJQYXRoLCBjb250YWluZXIpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZUZvck1hdGNoaW5nUGF0aChJUGF0aCBjb250YWluZXJQYXRoLCBJUGF0aCBzb3VyY2VQYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQlpbnQgbWF0Y2hlcyA9IDA7Ci0JCW1hdGNoZXMgPSBjb250YWluZXJQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhzb3VyY2VQYXRoKTsKLQkJaWYgKG1hdGNoZXMgPiAwICYmIG1hdGNoZXMgPT0gc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSkgewotCQkJSVBhdGggbG9hZFBhdGggPSBjb250YWluZXJQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hlcyk7Ci0JCQlyZXR1cm4gcHJpbUdldEZpbGUoY29udGFpbmVyLCBsb2FkUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRGaWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0RmlsZShuZXcgUGF0aCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbGUgZnJvbSB0aGUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKiBAc2VlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRGaWxlKFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShJUGF0aCBwYXRoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoZ2V0SW5wdXRDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCWphdmEudXRpbC5JdGVyYXRvciBpdCA9IGdldElucHV0Q29udGFpbmVycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNvbnRhaW5lciBjb24gPSAoSUNvbnRhaW5lcikgaXQubmV4dCgpOwotCQkJCWZpbGUgPSBnZXRJbnB1dEZpbGUoY29uLCBwYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpCi0JCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gSU5WQUxJRF9GSUxFOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3V0cHV0IGZpbGUgZnJvbSBzdHJpbmcgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dEZpbGUoSVBhdGgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGaWxlIGdldE91dHB1dEZpbGUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0T3V0cHV0RmlsZShuZXcgUGF0aCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGlucHV0IGZpbGUgZnJvbSB0aGUgY29udGFpbmVyIGFuZCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBjb24KLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0SW5wdXRGaWxlKElDb250YWluZXIgY29uLCBJUGF0aCBwYXRoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoV09SS1NQQUNFX1JPT1QuZXF1YWxzKGNvbikgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0JCQlwYXRoID0gSU5WQUxJRF9QQVRILmFwcGVuZChwYXRoKTsKLQkJZmlsZSA9IHByaW1HZXRGaWxlKGNvbiwgcGF0aCk7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQlmaWxlID0gZ2V0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMocGF0aCwgY29uLCB0cnVlKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlIHByaW1HZXRGaWxlKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29udGFpbmVyLmdldEZpbGUocGF0aCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjY2FuR2V0VW5kZXJseWluZ1Jlc291cmNlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuR2V0VW5kZXJseWluZ1Jlc291cmNlKFN0cmluZyBhRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoYUZpbGVOYW1lKTsKLQkJcmV0dXJuIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjaXNGb3JjZVNhdmVSZWxhdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JjZVNhdmVSZWxhdGl2ZSgpIHsKLQkJcmV0dXJuIGZvcmNlU2F2ZVJlbGF0aXZlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjc2V0Rm9yY2VTYXZlUmVsYXRpdmUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVNhdmVSZWxhdGl2ZShib29sZWFuIGZvcmNlU2F2ZVJlbGF0aXZlKSB7Ci0JCXRoaXMuZm9yY2VTYXZlUmVsYXRpdmUgPSBmb3JjZVNhdmVSZWxhdGl2ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIjbm9ybWFsaXplKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovcHVibGljIFVSSSBub3JtYWxpemUoVVJJIHVyaSkgewotCQlVUkkgcmVzdWx0ID0gdXJpOwotCQlTdHJpbmcgZnJhZ21lbnQgPSBudWxsOwotCQlpZiAodXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCWZyYWdtZW50ID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlyZXN1bHQgPSB1cmkudHJpbUZyYWdtZW50KCk7Ci0JCX0KLQkJcmVzdWx0ID0gZ2V0SW50ZXJuYWxVUklNYXAoKS5nZXRVUkkocmVzdWx0KTsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkocmVzdWx0KSkKLQkJCXJldHVybiBhcHBlbmRGcmFnbWVudChyZXN1bHQsIGZyYWdtZW50KTsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkocmVzdWx0KSkgewotCQkJVVJJIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQbHVnaW5VUkkocmVzdWx0LCBmcmFnbWVudCk7Ci0JCQlyZXR1cm4gKG5vcm1hbGl6ZWQgIT0gbnVsbCkgPyBub3JtYWxpemVkIDogdXJpOwotCQl9Ci0JCVN0cmluZyBwcm90b2NvbCA9IHJlc3VsdC5zY2hlbWUoKTsKLQkJVVJJIGZpbGVTZWFyY2hVUkkgPSBudWxsOwotCQlpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotCQkJZmlsZVNlYXJjaFVSSSA9IG5vcm1hbGl6ZUVtcHR5UHJvdG9jb2wocmVzdWx0LCBmcmFnbWVudCk7Ci0JCQlpZiAoZmlsZVNlYXJjaFVSSSAhPSBudWxsKQotCQkJCXJldHVybiBmaWxlU2VhcmNoVVJJOwotCQl9IGVsc2UgaWYgKEZJTEVfUFJPVE9DT0wuZXF1YWxzKHByb3RvY29sKSkgewotCQkJZmlsZVNlYXJjaFVSSSA9IG5vcm1hbGl6ZUZpbGVQcm90b2NvbChyZXN1bHQsIGZyYWdtZW50KTsKLQkJCWlmIChmaWxlU2VhcmNoVVJJICE9IG51bGwpCi0JCQkJcmV0dXJuIGZpbGVTZWFyY2hVUkk7Ci0JCX0gZWxzZSBpZiAoSkVNVXRpbFBsdWdpbi5XT1JLU1BBQ0VfUFJPVE9DT0wuZXF1YWxzKHByb3RvY29sKSkKLQkJCXJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQcm90b2NvbChyZXN1bHQsIGZyYWdtZW50KTsKLQkJcmV0dXJuIHN1cGVyLm5vcm1hbGl6ZSh1cmkpOwotCX0KLQotCS8qCi0JICogUmVzb2x2ZXMgYSBwbHVnaW4gZm9ybWF0IGludG8gdGhlIGFjdHVhbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZVBsdWdpblVSSShVUkkgdXJpLCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJaWYgKHVyaS5zZWdtZW50Q291bnQoKSA8IDIpCi0JCQlyZXR1cm4gdXJpOyAvLyBJbnZhbGlkLCBqdXN0IGxldCBpdCBnbyBvbi4KLQkJLy8gU2VlIGlmIGFscmVhZHkgbm9ybWFsaXplZC4KLQkJaW50IHVfc2NvcmVOZHggPSB1cmkuc2VnbWVudCgxKS5sYXN0SW5kZXhPZignXycpOwotCQlpZiAodV9zY29yZU5keCAhPSAtMSkgewotCQkJLy8gTm90IG5vcm1hbGl6ZWQuIFJlbW92ZSB0aGUgdmVyc2lvbiB0byBtYWtlIGl0IG5vcm1hbGl6ZWQuCi0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHVyaS5zZWdtZW50cygpOwotCQkJc2VnbWVudHNbMV0gPSBzZWdtZW50c1sxXS5zdWJzdHJpbmcoMCwgdV9zY29yZU5keCk7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZUhpZXJhcmNoaWNhbFVSSSh1cmkuc2NoZW1lKCksIHVyaS5hdXRob3JpdHkoKSwgdXJpLmRldmljZSgpLCBzZWdtZW50cywgdXJpLnF1ZXJ5KCksIGZyYWdtZW50KTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gdXJpOwotCX0KLQotCXByb3RlY3RlZCBVUkkgbm9ybWFsaXplV29ya3NwYWNlUHJvdG9jb2woVVJJIGFXb3Jrc3BhY2VVUkksIFN0cmluZyBmcmFnbWVudCkgewotCQlVUkkgcmVzdWx0OwotCQlTdHJpbmcgdXJpU3RyaW5nID0gYVdvcmtzcGFjZVVSSS50b1N0cmluZygpOwotCQl1cmlTdHJpbmcgPSB1cmlTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uV09SS1NQQUNFX1BST1RPQ09MLmxlbmd0aCgpICsgMSk7Ci0JCXJlc3VsdCA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHVyaVN0cmluZyk7Ci0JCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJcmVzdWx0ID0gYXBwZW5kRnJhZ21lbnQoYVdvcmtzcGFjZVVSSSwgZnJhZ21lbnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZUVtcHR5UHJvdG9jb2woVVJJIGFGaWxlVXJpLCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJLy9NYWtlIHRoZSByZWxhdGl2ZSBwYXRoIGFic29sdXRlIGFuZCByZXR1cm4gYSBwbGF0Zm9ybSBVUkkuCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChhRmlsZVVyaS50b1N0cmluZygpKTsKLQkJcmV0dXJuIG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKHBhdGgsIGZyYWdtZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkkgbm9ybWFsaXplVG9Xb3Jrc3BhY2VVUkkoSVBhdGggcGF0aCwgU3RyaW5nIGZyYWdtZW50KSB7Ci0JCVVSSSByZXN1bHQgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShwYXRoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCWZpbGUgPSBnZXRPdXRwdXRGaWxlKHBhdGgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXN1bHQgPSBhcHBlbmRGcmFnbWVudChyZXN1bHQsIGZyYWdtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZUZpbGVQcm90b2NvbChVUkkgYUZpbGVVcmksIFN0cmluZyBmcmFnbWVudCkgewotCQlVUkkgcmVzdWx0ID0gbnVsbDsKLQkJLy9NYWtlIHRoZSByZWxhdGl2ZSBwYXRoIGFic29sdXRlIGFuZCByZXR1cm4gYSBwbGF0Zm9ybSBVUkkuCi0JCVN0cmluZyBkZXZpY2VQYXRoID0gYUZpbGVVcmkuZGV2aWNlUGF0aCgpOwotCQkvL1Rlc3QgZm9yIHdvcmtzcGFjZSBsb2NhdGlvbi4KLQkJaWYgKCFkZXZpY2VQYXRoLnN0YXJ0c1dpdGgoTUVUQURBVEFfTE9DQVRJT04pICYmCi0JCQlkZXZpY2VQYXRoLnN0YXJ0c1dpdGgoV09SS1NQQUNFX1JPT1RfTE9DQVRJT04pICYmIGRldmljZVBhdGgubGVuZ3RoKCkgPiBXT1JLU1BBQ0VfUk9PVF9MT0NBVElPTi5sZW5ndGgoKSkgewotCQkJLy90ZXN0IGZvciB3b3Jrc3BhY2UgbG9jYXRpb24KLQkJCXJlc3VsdCA9IG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKG5ldyBQYXRoKGRldmljZVBhdGguc3Vic3RyaW5nKFdPUktTUEFDRV9ST09UX0xPQ0FUSU9OLmxlbmd0aCgpKSksIGZyYWdtZW50KTsKLQkJfSBlbHNlIGlmIChhRmlsZVVyaS5pc1JlbGF0aXZlKCkpIHsKLQkJCXJlc3VsdCA9IG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKG5ldyBQYXRoKGFGaWxlVXJpLnRvU3RyaW5nKCkpLCBmcmFnbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBhRmlsZVVyaTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgVVJJIGFwcGVuZEZyYWdtZW50KFVSSSByZXN1bHQsIFN0cmluZyBmcmFnbWVudCkgewotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQuYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQpOwotCQllbHNlCi0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0T3V0cHV0RmlsZVdpdGhNYXBwaW5nQXBwbGllZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRPdXRwdXRGaWxlV2l0aE1hcHBpbmdBcHBsaWVkKFN0cmluZyB1cmkpIHsKLQkJVVJJIGNvbnZlcnRlZCA9IGdldEludGVybmFsVVJJTWFwKCkuZ2V0VVJJKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JCXJldHVybiBnZXRPdXRwdXRGaWxlKG5ldyBQYXRoKGNvbnZlcnRlZC50b1N0cmluZygpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI2NyZWF0ZVBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0oU3RyaW5nIHBsYXRmb3JtUmVzb3VyY2VQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gV09SS1NQQUNFX1JPT1QuZ2V0RmlsZShuZXcgUGF0aChwbGF0Zm9ybVJlc291cmNlUGF0aCkpOwotCQlQcm9qZWN0VXRpbGl0aWVzLmVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KGZpbGUpOwotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShmaWxlLCByZXNvdXJjZVNldFN5bmNocm9uaXplcik7Ci0JfQotCi0JcHJvdGVjdGVkIFVSSSBnZXRDb250YWluZXJSZWxhdGl2ZVVSSShJRmlsZSBhRmlsZSkgewotCQlJUGF0aCBwYXRoID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFBhdGhGcm9tQ29udGFpbmVycyhpbnB1dENvbnRhaW5lcnMsIGFGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI2NyZWF0ZVBsYXRmb3JtUmVzb3VyY2VJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBjcmVhdGVQbGF0Zm9ybVJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHBsYXRmb3JtUmVzb3VyY2VQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gV09SS1NQQUNFX1JPT1QuZ2V0RmlsZShuZXcgUGF0aChwbGF0Zm9ybVJlc291cmNlUGF0aCkpOwotCQl0cnkgewotCQkJaWYgKCFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9PTkUpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZSBpb2ZpbGUgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9GaWxlKCk7Ci0JCQkJCWlmIChpb2ZpbGUuZXhpc3RzKCkgfHwgZmlsZS5leGlzdHMoKSkKLQkJCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJaWYgKGNlLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSBJUmVzb3VyY2VTdGF0dXMuV09SS1NQQUNFX0xPQ0tFRCkKLQkJCQkJCXRocm93IGNlOwotCQkJCX0KLQkJCX0KLQkJCS8vIENIQU5HRUQgZnJvbSA8bm8tYXJncz4gdG8gPHRydWU+IFs5NDAxNV0KLQkJCXJldHVybiBmaWxlLmdldENvbnRlbnRzKHRydWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmMjg4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZOYXR1cmUuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS40ICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFBhcnNlclBvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFBhcnNlclBvb2xJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBFTUZOYXR1cmUuCi0gKiA8cD4KLSAqIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLCBidXQgdGhlcmUgYXJlIGRlZmF1bHQgc3ViY2xhc3NlcyBhdmFpbGFibGUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRU1GTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgewotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZW1mQ29udGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbmZpZ3VyZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIFhNTFBhcnNlclBvb2wgU0hBUkVEX1BBUlNFUl9QT09MID0gbmV3IFhNTFBhcnNlclBvb2xJbXBsKCk7CQotCi0JcHVibGljIEVNRk5hdHVyZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hdHVyZSBpZCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvagotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVByb2plY3RVdGlsaXRpZXMuYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2osIG5hdHVyZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhpcyBuYXR1cmUuIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuIFRoZQotCSAqIG5hdHVyZSBleHRlbnNpb24gaWQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgbmF0dXJlcyBvbiB0aGUgcHJvamVjdCBieSA8Y29kZT5JUHJvamVjdC5hZGROYXR1cmU8L2NvZGU+LCBhbmQgbmVlZCBub3QgYmUgYWRkZWQgaGVyZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBbGwgc3VidHlwZXMgbXVzdCBjYWxsIHN1cGVyLiBUaGUgYmV0dGVyIHdheSBmb3Igc3VidHlwZXMgaXMgdG8gb3ZlcnJpZGUgcHJpbUNvbmZpZ3VyZSBpbnN0ZWFkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlpZiAoIWhhc0NvbmZpZ3VyZWQpIHsKLQkJCWhhc0NvbmZpZ3VyZWQgPSB0cnVlOwotCQkJcHJpbUNvbmZpZ3VyZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGZyb20gY29uZmlndXJlIHRoZSBmaXJzdCB0aW1lIGNvbmZpZ3VyZSBpcyBjYWxsZWQgb24gdGhlIG5hdHVyZS4gRGVmYXVsdCBpcyBkbyBub3RoaW5nLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgYWRkIGluIHRoZWlyIG93bgotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1Db25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIEVNRiBjb250ZXh0IGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbWZDb250ZXh0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlRU1GQ29udGV4dChnZXRQcm9qZWN0KCksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZvbGRlciByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBiYXNlZCBvbiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKFN0cmluZyBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcgIT0gbnVsbCAmJiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gY3JlYXRlRm9sZGVyKG5ldyBQYXRoKGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZvbGRlciByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBiYXNlZCBvbiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChhUHJvamVjdFJlbGF0aXZlUGF0aCAhPSBudWxsICYmICFhUHJvamVjdFJlbGF0aXZlUGF0aC5pc0VtcHR5KCkpIHsKLQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihnZXRQcm9qZWN0UGF0aCgpLmFwcGVuZChhUHJvamVjdFJlbGF0aXZlUGF0aCkpOwotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlQcm9qZWN0VXRpbGl0aWVzLmVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KGZvbGRlcik7Ci0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBmb2xkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGlzIG5hdHVyZSBmcm9tIHRoZSBwcm9qZWN0LCBwZXJmb3JtaW5nIGFueSByZXF1aXJlZCBkZWNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4gYW5kCi0JICogc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gVGhlIG5hdHVyZSBpZCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgbmF0dXJlcyBvbiB0aGUgcHJvamVjdCBieQotCSAqIDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4sIGFuZCBuZWVkIG5vdCBiZSByZW1vdmVkIGhlcmUuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQllbWZDb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgSUZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGZpbGVuYW1lIGNhbiBiZSByZWxhdGl2ZSB0byBvbmUgb2YgdGhlIGlucHV0IGZpbGUgcGF0aHMgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaWxlbmFtZSBleGlzdHMgaW4gdGhpcyBwcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgYUZpbGVOYW1lKSB7Ci0JCWlmIChhRmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYUZpbGVOYW1lKTsKLQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5leGlzdHMoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldFdvcmtiZW5jaFVSSUNvbnZlcnRlcigpLmNhbkdldFVuZGVybHlpbmdSZXNvdXJjZShhRmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2Ugc2V0IGZvciB0aGUgcHJvamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBnZXRFbWZDb250ZXh0QmFzZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRU1GIHJvb3QgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4gRGVmYXVsdHMgdG8gdGhlIHByb2plY3QuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlLgotCSAqIAotCSAqIEByZXR1cm4gRU1GIHJvb3QgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRFTUZSb290KCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIG9wdGltaXphdGlvbnM7IGFuc3dlcnMgd2hldGhlciBhIG1vZiBjb250ZXh0IGZvciB0aGlzIG5hdHVyZSBoYXMgZXhpc3RzIHlldAotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBoYXNSZXNvdXJjZVNldCgpOwotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbnRleHQoKSB7Ci0JCXJldHVybiBoYXNSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIElzIHRoZXJlIGEgcmVzb3VyY2Ugc2V0IHlldCBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIHJlc291cmNlIHNldCBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBlbWZDb250ZXh0ICE9IG51bGwgJiYgZW1mQ29udGV4dC5oYXNSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIExhenkgaW5pdGlhbGl6ZXI7IGZvciBtaWdyYXRpb24gb2YgZXhpc3Rpbmcgd29ya3NwYWNlcyB3aGVyZSBjb25maWd1cmUgd2lsbCBuZXZlciBnZXQgY2FsbGVkLgotCSAqIAotCSAqIEByZXR1cm4gY29udGV4dCBiYXNlIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0RW1mQ29udGV4dEJhc2UoKSB7Ci0JCWlmIChlbWZDb250ZXh0ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlRW1mQ29udGV4dCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVtZkNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBJRmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIGluIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGVOYW1lCi0JICogICAgICAgICAgICBmaWxlbmFtZSBjYW4gYmUgcmVsYXRpdmUgdG8gb25lIG9mIHRoZSBpbnB1dCBmaWxlIHBhdGhzIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyLgotCSAqIEByZXR1cm4gZmlsZSBpdCBpdCBpcyBpbiB0aGlzIHByb2plY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXNuJ3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGFGaWxlTmFtZSkgewotCQlyZXR1cm4gZ2V0V29ya2JlbmNoVVJJQ29udmVydGVyKCkuZ2V0RmlsZShhRmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmF0dXJlJ3MgSUQuCi0JICogCi0JICogQHJldHVybiBuYXR1cmUgaWQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hdHVyZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGlzIG5hdHVyZSBpcyBjb250YWluZWQgd2l0aGluLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgcHJvamVjdCBuYXR1cmUgYXBwbGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGhhbmRsZQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGZ1bGwgcHJvamVjdCBwYXRoIChyZWxhdGl2ZSB0byB3b3Jrc3BhY2UpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQYXRoIGdldFByb2plY3RQYXRoKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzZXJ2ZXIgcHJvcGVydHkgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgc3VwcGxpZWQga2V5Ci0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBkZXByZWNhdGVkIHdlIGNhbm5vbnQgdXNlIHBlcnNpc3RlbnQgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RTZXJ2ZXJWYWx1ZShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJUXVhbGlmaWVkTmFtZSB3aG9sZU5hbWUgPSBxdWFsaWZpZWRLZXkoa2V5KTsKLQkJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KHdob2xlTmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL0lmIHdlIGNhbid0IGZpbmQgaXQgYXNzdW1lIGl0IGlzIG51bGwKLQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IFdvcmtiZW5jaFVSSUNvbnZlcnRlciBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIFVSSUNvbnZlcnRlciBvbiB0aGUgUmVzb3VyY2VTZXQgaXMgdGhlIG9uZSB0aGF0IHdhcyBjcmVhdGVkIGZvciB0aGUgUmVzb3VyY2VTZXQgb24gYmVoYWxmIG9mIHRoaXMgbmF0dXJlIHJ1bnRpbWUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoVVJJQ29udmVydGVyIGdldFdvcmtiZW5jaFVSSUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JfQotCi0JcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFhtaVJlc291cmNlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBmb3IgdGhpcyB1cmkuIEl0IHdpbGwgdXNlIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIHByb2plY3QgdG8gZmluZCBpdC4gSXQgd2lsbCBsb2FkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZXNvdXJjZSBpcyBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUmVzb3VyY2VOb3RGb3VuZChleCkpCi0JCQkJdGhyb3cgZXg7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0WG1pUmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBkZXBlbmRlbnQgY29tcG9uZW50cyBhcmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBSZXNvdXJjZVNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVwZW5kZW50Q29tcG9uZW50cygpIHsKLQkJLy9jb20uaWJtLmV0b29scy5qYXZhLmluaXQuSmF2YUluaXQuaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VYbWlSZXNvdXJjZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VYbWlSZXNvdXJjZShTdHJpbmcgdXJpLCBFTGlzdCBhbkV4dGVudCkgewotCQlSZXNvdXJjZSByZXMgPSBtYWtlWG1pUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkQWxsKGFuRXh0ZW50KTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlc291cmNlIGZvciB0aGlzIHVyaS4gSXQgd2lsbCB1c2UgdGhlIHJlc291cmNlIHNldCBvZiB0aGUgcHJvamVjdCB0byBjcmVhdGUgaXQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBRdWFsaWZlZFZhbHVlIGZvciBrZXkgZm9yIHN0b3JhZ2UgaW4gdGhlIHJlcG9zaXRvcnkuIFRoZSBrZXkgaXMgcXVhbGlmZWQgd2l0aCB0aGUgcGFja2FnZSBuYW1lIHRvIGF2b2lkIGNvbGxpc2lvbi4gQHJldHVybgotCSAqIFF1YWxpZmVkTmFtZSBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkS2V5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKGdldFBsdWdpbklEKCksIGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgdGhlIGdpdmVuIG5hdHVyZSBpZCBhcyBhbiBFTUZOYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZUlECi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTmF0dXJlSUQoU3RyaW5nIG5hdHVyZUlEKSB7Ci0JCUVNRk5hdHVyZVJlZ2lzdHJ5LnNpbmdsZXRvbigpLlJFR0lTVEVSRURfTkFUVVJFX0lEUy5hZGQobmF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBuYXR1cmUgYXBwbGllcy4gVXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBwcm9qZWN0IG5hdHVyZSBydW50aW1lLiBUaGlzIGlzIGNhbGxlZCBieQotCSAqIDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgbmF0dXJlIGFwcGxpZXMKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJcHJvamVjdCA9IG5ld1Byb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZXJ2ZXIgcHJvcGVydHkgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgc3VwcGxpZWQgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKiBAZGVwcmVjYXRlZCB3ZSBjYW5ub250IHVzZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IGFyZSBub3Qgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdFNlcnZlclZhbHVlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUXVhbGlmaWVkTmFtZSB3aG9sZU5hbWUgPSBxdWFsaWZpZWRLZXkoa2V5KTsKLQkJCQlnZXRQcm9qZWN0KCkuc2V0UGVyc2lzdGVudFByb3BlcnR5KHdob2xlTmFtZSwgdmFsdWUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvL0lmIHdlIGNhbid0IGZpbmQgaXQgYXNzdW1lIGl0IGlzIG51bGwKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2h1dGRvd24gdGhlIEVNRiBuYXR1cmUKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkKLQkJCSgoUHJvamVjdFJlc291cmNlU2V0KSBnZXRSZXNvdXJjZVNldCgpKS5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBFTUZOYXR1cmVzIGJhc2VkIG9uIHRoZSBuYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3Qgb2YgRU1GTmF0dXJlcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIG5hdHVyZXMgY29uZmlndXJlZCBmb3IgdGhlIHByb2plY3QuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlZ2lzdGVyZWRSdW50aW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJRU1GTmF0dXJlIG5hdHVyZSA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJU3RyaW5nIG5hdHVyZUlEOwotCQkJSXRlcmF0b3IgaXQgPSBFTUZOYXR1cmVSZWdpc3RyeS5zaW5nbGV0b24oKS5SRUdJU1RFUkVEX05BVFVSRV9JRFMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQluYXR1cmVJRCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQluYXR1cmUgPSAoRU1GTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShuYXR1cmVJRCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkJCQlyZXN1bHQuYWRkKG5hdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBuYXR1cmUgaWRzIGJhc2VkIG9uIHRoZSBuYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgY29uZmlndXJlZCBuYXR1cmUgaWRzLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlZ2lzdGVyZWRSdW50aW1lSURzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgbmF0dXJlSUQgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gRU1GTmF0dXJlUmVnaXN0cnkuc2luZ2xldG9uKCkuUkVHSVNURVJFRF9OQVRVUkVfSURTLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmF0dXJlSUQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKG5hdHVyZUlEKSkgewotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJCQlyZXN1bHQuYWRkKG5hdHVyZUlEKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBpZiB0aGUgcHJvamVjdCBoYXMgdGhlIGdpdmVuIG5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJvamVjdCBoYXMgZ2l2ZW4gbmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUobmF0dXJlSWQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBpZiB0aGUgcHJvamVjdCBoYXMgYW55IG9uZSBvZiB0aGUgcG9zc2libGUgZ2l2ZW4gbmF0dXJlIGlkcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwb3NzaWJsZU5hdHVyZUlkcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBwb3NzaWJsZSBuYXR1cmVzIGlkIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlSWRzKSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVOYXR1cmVJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaGFzUnVudGltZShwcm9qZWN0LCBwb3NzaWJsZU5hdHVyZUlkc1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0Fic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE1NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuKjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFBsdWdpbiBlcnJvciBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKLSAqIEJhc2UgbG9nIHJlbmRlcmVyIHRoYXQgbG9ncyB0byB0aGUgd29ya2JlbmNoLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIgaW1wbGVtZW50cyBJTG9nUmVuZGVyZXIyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmVHJhY2VNb2RlID0gZmFsc2U7IC8vIHdpbGwgd2UgYWN0dWFsbHkgcHVuY2ggdHJhY2UgbWVzc2FnZWQgb3Igbm90Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEJ1bmRsZSBmTXlCdW5kbGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIExvZ2dlciBmTXlMb2dnZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElMb2cgZldvcmtCZW5jaExvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RlciB0YWtpbmcgYSBsb2dnZXIuCi0JICogCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk15TG9nZ2VyID0gbG9nZ2VyOwotCQlmVHJhY2VNb2RlID0gZk15TG9nZ2VyLmdldFRyYWNlTW9kZSgpOwotCi0JCVN0cmluZyBwbHVnaW5JRCA9IGZNeUxvZ2dlci5nZXRQbHVnaW5JRCgpOwotCQlmTXlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCQlpZiAoZk15QnVuZGxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBQbHVnaW4gSUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZXb3JrQmVuY2hMb2dnZXIgPSBQbGF0Zm9ybS5nZXRMb2coZk15QnVuZGxlKTsKLQkJc2V0VHJhY2VNb2RlKGZNeUxvZ2dlci5nZXRUcmFjZU1vZGUoKSB8fCBpc0RlYnVnZ2luZyhmTXlCdW5kbGUpKTsKLQkJZk15TG9nZ2VyLnNldFJlbmRlcmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogVGhpcyB1c2VkIHRvIGNvbWUgZnJvbSB0aGUgUGx1Z2luIGluc3RhbmNlLiBCdXQgaW4gbmV3IE9TR2ksIHRoZXJlIGlzIG5vdCBuZWNlc3NhcmlseSBhIFBsdWdpbiBpbnN0YW5jZS4gU28gdXNlIHRoZSBzYW1lIGxvZ2ljIHRoZXkgdXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0RlYnVnZ2luZyhCdW5kbGUgYnVuZGxlKSB7Ci0JCVN0cmluZyBzeW1ib2xpY05hbWUgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCWlmIChzeW1ib2xpY05hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGtleSA9IHN5bWJvbGljTmFtZSArICIvZGVidWciOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihrZXkpOwotCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyBmYWxzZSA6IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGUgY29uc29sZSBsb2cgZm9yIGVjbGlwc2UgdHVybmVkIG9uIHRvIHN5c291dC4gSWYgdHJ1ZSwgdGhlbiB3ZSBzaG91bGRuJ3QgbG9nIHRvIGNvbnNvbGUgYW55dGhpbmcgYWxyZWFkeSBsb2dnZWQgYmVjYXVzZSBFY2xpcHNlIHdvdWxkIG9mCi0JICogbG9nZ2VkIGl0IGZvciB1cy4gVGhpcyBjb21lcyBmcm9tIHRoZSAtRGVjbGlwc2UuY29uc29sZUxvZz0idHJ1ZSIgd2hpY2ggaXMgdGhlIGRlZmF1bHQgd2hlbiBzdGFydGluZyBlY2xpcHNlIGZyb20gUERFLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb25zb2xlTG9nT247Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIGNvbnNvbG9nUHJvcGVydHlOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIEFjY2Vzc2luZyBhbiBpbnRlcm5hbCBmaWVsZCwgc28gdXNpbmcgcmVmbGVjdGlvbi4gVGhpcyB3YXkgaWYgY2hhbmdlcyBpbiBmdXR1cmUgd2Ugd29uJ3QgY3Jhc2guCi0JCQlDbGFzcyBlY2xpcHNlU3RhcnRlciA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yLkVjbGlwc2VTdGFydGVyIik7CS8vJE5PTi1OTFMtMSQKLQkJCUZpZWxkIGNvbnNvbGVsb2cgPSBlY2xpcHNlU3RhcnRlci5nZXREZWNsYXJlZEZpZWxkKCJQUk9QX0NPTlNPTEVfTE9HIik7CS8vJE5PTi1OTFMtMSQKLQkJCWNvbnNvbG9nUHJvcGVydHlOYW1lID0gKFN0cmluZykgY29uc29sZWxvZy5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY29uc29sZUxvZ09uID0gY29uc29sb2dQcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eShjb25zb2xvZ1Byb3BlcnR5TmFtZSkpIDsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIjc2V0VHJhY2VNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhY2VNb2RlKGJvb2xlYW4gZmxhZykgewotCQlpZiAoZlNldHRpbmdUcmFjZSkKLQkJCXJldHVybjsgLy8gRG8gbm90IGFsbG93IGN5Y2xlcwotCi0JCWZTZXR0aW5nVHJhY2UgPSB0cnVlOwotCQlmVHJhY2VNb2RlID0gZmxhZzsKLQkJZk15TG9nZ2VyLnNldFRyYWNlTW9kZShmbGFnKTsKLQkJZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCX0KLQotCS8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgZm9yIGhpc3RvcmljYWwgcmVuZGVyZXJzIGluIGNhc2UgdGhpcyBoYXMgYmVlbiBzdWJjbGFzc2VkIG91dHNpZGUKLQkvLyBvZiB1dGlsLgotCi0JLyoqCi0JICogTG9nIGEgc3RyaW5nIHRvIHRoZSB0cmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW0KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBsb2coU3RyaW5nIHBhcmFtKTsKLQotCS8qKgotCSAqIERlZmF1bHQgb25lIHRoYXQgbG9nIGEgc3RyaW5nIHRvIHRoZSB0cmFjZSBnaXZlbiBhIGxldmVsLiBEZWZhdWx0IHNpbXBseSBwYXNzZXMgaXQgdG8gbG9nKFN0cmluZykgc28gdGhhdCB3ZSBkb24ndCBicmVhayBvbGQgc3ViY2xhc3Nlcy4KLQkgKiA8cD4KLQkgKiBJZiBsb2dnZWRUb1dvcmtiZW5jaCBpcyB0cnVlLCB0aGVuIGl0IHNob3VsZG4ndCBiZSBsb2dnZWQgdG8gY29uc29sZSBpZiBjb25zb2xlTG9nT24gaXMgdHJ1ZSBiZWNhdXNlIHdvcmtiZW5jaCBhbHJlYWR5IGxvZ2dlZCB0byBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnLCBMZXZlbCBsLCBib29sZWFuIGxvZ2dlZFRvV29ya2JlbmNoKSB7Ci0JCWxvZyhtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2csIGludCB0eXBlKSB7Ci0KLQkJU3RyaW5nIHRhcmdldCA9IGxvZ1dvcmtCZW5jaChtc2csIHR5cGUpOwotCQlpZiAoZlRyYWNlTW9kZSB8fCB0YXJnZXQuZXF1YWxzKE5PTE9HX0RFU0NSSVBUSU9OKSkKLQkJCXJldHVybiBsb2cobXNnKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdG8gd29ya2JlbmNoLCBhIHN0cmluZyBvZiB0aGUgZ2l2ZW4gbGV2ZWwgPGNvZGU+SUxvZ1JlbmRlcmVyLkxPR188L2NvZGU+LiBsZXZlbHMuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9nJ3MgZGVzdGluYXRpb24gZS5nLiwgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElMb2dSZW5kZXJlciNMT0dfRVJST1IgYW5kIGFsbCBvZiB0aGUgb3RoZXIgbG9nIHR5cGVzLgotCSAqIEBzZWUgSUxvZ1JlbmRlcmVyI0NPTlNPTEVfREVTQ1JJUFRJT04KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ1dvcmtCZW5jaChTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCi0JCXRyeSB7Ci0JCQlpbnQgRXJyQ29kZTsKLQkJCWlmIChmV29ya0JlbmNoTG9nZ2VyICE9IG51bGwpIHsKLQkJCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQkJY2FzZSAoSUxvZ1JlbmRlcmVyLkxPR19FUlJPUik6Ci0JCQkJCQlFcnJDb2RlID0gSVN0YXR1cy5FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX1dBUk5JTkcpOgotCQkJCQkJRXJyQ29kZSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX0lORk8pOgotCQkJCQkJRXJyQ29kZSA9IElTdGF0dXMuSU5GTzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX1RSQUNFKToKLQkJCQkJCUVyckNvZGUgPSBJU3RhdHVzLk9LOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBMb2cgVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKEVyckNvZGUsIGZNeUJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgbXNnLCBudWxsKTsKLQkJCQlmV29ya0JlbmNoTG9nZ2VyLmxvZyhzdGF0dXMpOwotCQkJCXJldHVybiBXT1JLQkVOQ0hfREVTQ1JJUFRJT047Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7Ci0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JCX0KLQl9Ci0KLQkvLyBEZWZhdWx0IGltcGxlbnRhdGlvbiBvZiB0aGUgSUxvZ1JlbmRlcmVyMiBpbnRlcmZhY2UuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2dnaW5nKExldmVsIGxldmVsKSB7Ci0JCXJldHVybiBmVHJhY2VNb2RlIHx8IGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsZXZlbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1RBVFVTX0xFVkVMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWxbXSBTVEFUVVNfTEVWRUxfTE9PS1VQOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWxbXSBMRVZFTF9TVEFUVVM7Ci0KLQlzdGF0aWMgewotCQkvLyBTdGF0dXMgbGV2ZWxzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgbG9nIGxldmVscywgZnJvbSBmaW5lc3QgdG8gbm9uZSwgc2FtZSBpbmRleGVzIGFzIGZyb20gU1RBVFVTX0xFVkVMX0xPT0tVUC4KLQkJU1RBVFVTX0xFVkVMX0xPT0tVUCA9IG5ldyBMZXZlbFtdIHsgTGV2ZWwuSU5GTywgTGV2ZWwuV0FSTklORywgTGV2ZWwuU0VWRVJFfTsKLQkJU1RBVFVTX0xFVkVMID0gbmV3IGludFtdIHsgSVN0YXR1cy5JTkZPLCBJU3RhdHVzLldBUk5JTkcsIElTdGF0dXMuRVJST1J9OwotCi0JCS8vIExldmVscyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIElTdGF0dXMgbGV2ZWxzLgotCQlpbnQgbWF4SUQgPSBNYXRoLm1heChJU3RhdHVzLk9LLCBNYXRoLm1heChJU3RhdHVzLklORk8sIE1hdGgubWF4KElTdGF0dXMuV0FSTklORywgSVN0YXR1cy5FUlJPUikpKTsKLQkJTEVWRUxfU1RBVFVTID0gbmV3IExldmVsW21heElEICsgMV07Ci0JCUxFVkVMX1NUQVRVU1tJU3RhdHVzLk9LXSA9IExldmVsLkZJTkU7Ci0JCUxFVkVMX1NUQVRVU1tJU3RhdHVzLklORk9dID0gTGV2ZWwuSU5GTzsKLQkJTEVWRUxfU1RBVFVTW0lTdGF0dXMuV0FSTklOR10gPSBMZXZlbC5XQVJOSU5HOwotCQlMRVZFTF9TVEFUVVNbSVN0YXR1cy5FUlJPUl0gPSBMZXZlbC5TRVZFUkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIExldmVsIGZvciB0aGUgc3RhdHVzIGNvZGUgZnJvbSB0aGUgZ2l2ZW4gSVN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybiB0aGUgSmF2YSBMZXZlbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBMZXZlbCBnZXRMb2dMZXZlbChJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gTEVWRUxfU1RBVFVTW3N0YXR1cy5nZXRTZXZlcml0eSgpXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElTdGF0dXMgc3RhdHVzIGNvZGUgZm9yIHRoZSBnaXZlbiBKYXZhIExldmVsLgotCSAqIAotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgc3RhdHVzIGNvZGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTdGF0dXNTZXZlcml0eShMZXZlbCBsb2dMZXZlbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNUQVRVU19MRVZFTF9MT09LVVAubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChTVEFUVVNfTEVWRUxfTE9PS1VQW2ldID09IGxvZ0xldmVsKQotCQkJCXJldHVybiBTVEFUVVNfTEVWRUxbaV07Ci0JCX0KLQkJcmV0dXJuIElTdGF0dXMuT0s7IC8vIERlZmF1bHQgdG8gb2suCi0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzdHJpbmcgdG8gdGhlIHdvcmtiZW5jaCBmb3IgdGhlIGdpdmVuIGxldmVsCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhlIGxvZydzIGRlc3RpbmF0aW9uIGUuZy4sIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2dXb3JrYmVuY2goU3RyaW5nIG1zZywgTGV2ZWwgbGV2ZWwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IE5PTE9HX0RFU0NSSVBUSU9OOwotCQkvLyBUZXN0IGFnYWluIGJlY2F1c2Ugd2UgY291bGQgYmUgaGVyZSBzaW1wbHkgZHVlIHRvIHRyYWNlIG1vZGUsIGluIHdoaWNoIGNhc2Ugd2UKLQkJLy8gZG9uJ3Qgd2FudCB0byB3b3JrYmVuY2ggbG9nIGl0LgotCQlpZiAoZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxldmVsKSkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGZNeUJ1bmRsZSkubG9nKG5ldyBTdGF0dXMoZ2V0U3RhdHVzU2V2ZXJpdHkobGV2ZWwpLCBmTXlCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1zZywgbnVsbCkpOwotCQkJcmVzdWx0ID0gV09SS0JFTkNIX0RFU0NSSVBUSU9OOwotCQkJaWYgKGZUcmFjZU1vZGUpCi0JCQkJbG9nKG1zZywgbGV2ZWwsIHRydWUpOwotCQl9IGVsc2UgaWYgKGZUcmFjZU1vZGUpCi0JCQlsb2cobXNnLCBsZXZlbCwgZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXR1c01zZyhJU3RhdHVzIHMsIExldmVsIGwpIHsKLQkJaWYgKHMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhzLnRvU3RyaW5nKCkgKyBmTXlMb2dnZXIuZkxpbmVTZXBlcmF0b3IgKyBmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcocy5nZXRFeGNlcHRpb24oKSksIGwpOwotCQllbHNlCi0JCQlyZXR1cm4gZk15TG9nZ2VyLmdldEdlbmVyaWNNc2cocy50b1N0cmluZygpLCBsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIElTdGF0dXMgdG8gdGhlIHdvcmtiZW5jaCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2cncyBkZXN0aW5hdGlvbiBlLmcuLCA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nV29ya2JlbmNoKElTdGF0dXMgcywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IGdldExvZ0xldmVsKHMpOwotCQlTdHJpbmcgcmVzdWx0ID0gTk9MT0dfREVTQ1JJUFRJT047Ci0JCS8vIFRlc3QgYWdhaW4gYmVjYXVzZSB3ZSBjb3VsZCBiZSBoZXJlIHNpbXBseSBkdWUgdG8gdHJhY2UgbW9kZSwgaW4gd2hpY2ggY2FzZSB3ZQotCQkvLyBkb24ndCB3YW50IHRvIHdvcmtiZW5jaCBsb2cgaXQuCi0JCWlmIChmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobGV2ZWwpKSB7Ci0JCQlQbGF0Zm9ybS5nZXRMb2coZk15QnVuZGxlKS5sb2cocyk7Ci0JCQlyZXN1bHQgPSBXT1JLQkVOQ0hfREVTQ1JJUFRJT047Ci0JCQlpZiAoZlRyYWNlTW9kZSkKLQkJCQlsb2coZ2V0U3RhdHVzTXNnKHMsIGxldmVsKSwgbGV2ZWwsIHRydWUpOwotCQl9IGVsc2UgaWYgKGZUcmFjZU1vZGUpCi0JCQlsb2coZ2V0U3RhdHVzTXNnKHMsIGxldmVsKSwgbGV2ZWwsIGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdG8gdGhlIHdvcmtiZW5jaCB0aGUgVGhyb3dhYmxlIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gdAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhlIGxvZydzIGRlc3RpbmF0aW9uIGUuZy4sIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2dXb3JrYmVuY2goVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBOT0xPR19ERVNDUklQVElPTjsKLQkJLy8gVGVzdCBhZ2FpbiBiZWNhdXNlIHdlIGNvdWxkIGJlIGhlcmUgc2ltcGx5IGR1ZSB0byB0cmFjZSBtb2RlLCBpbiB3aGljaCBjYXNlIHdlCi0JCS8vIGRvbid0IHdhbnQgdG8gd29ya2JlbmNoIGxvZyBpdC4KLQkJaWYgKGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsZXZlbCkpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhmTXlCdW5kbGUpLmxvZyhuZXcgU3RhdHVzKGdldFN0YXR1c1NldmVyaXR5KGxldmVsKSwgZk15QnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiRXhjZXB0aW9uIHRocm93bi4iLCB0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IFdPUktCRU5DSF9ERVNDUklQVElPTjsKLQkJCWlmIChmVHJhY2VNb2RlKQotCQkJCWxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcodCksIGxldmVsKSwgbGV2ZWwsIHRydWUpOwotCQl9IGVsc2UgaWYgKGZUcmFjZU1vZGUpCi0JCQlsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coZk15TG9nZ2VyLmV4Y2VwdGlvblRvU3RyaW5nKHQpLCBsZXZlbCksIGxldmVsLCBmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYnl0ZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYnl0ZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYnl0ZSBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coY2hhciwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coZG91YmxlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhkb3VibGUgZCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGQpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGZsb2F0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoZiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coaW50LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGkpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGxvbmcsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGwpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobyBpbnN0YW5jZW9mIElTdGF0dXMpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKChJU3RhdHVzKSBvLCBsZXZlbCk7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihvKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhzaG9ydCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKHMpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGphdmEubGFuZy5UaHJvd2FibGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSB0LCBMZXZlbCBsZXZlbCkgewotCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKCgoQ29yZUV4Y2VwdGlvbikgdCkuZ2V0U3RhdHVzKCksIGxldmVsKTsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLlNFVkVSRTsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpIHsKLQkJCXJldHVybiBsb2dXb3JrYmVuY2godCwgbGV2ZWwpOwotCQl9IGVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0NvbnNvbGVMb2dSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9Db25zb2xlTG9nUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkY2FiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0NvbnNvbGVMb2dSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGx1Z2luIGVycm9yIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAotICogTG9nIHJlbmRlcmVyIHRvIHRoZSBjb25zb2xlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVMb2dSZW5kZXJlciBleHRlbmRzIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgdGFraW5nIGEgbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgQ29uc29sZUxvZ1JlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKLQkJc3VwZXIobG9nZ2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2cpIHsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJcmV0dXJuIElMb2dSZW5kZXJlci5DT05TT0xFX0RFU0NSSVBUSU9OOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2csIExldmVsIGwsIGJvb2xlYW4gbG9nZ2VkVG9Xb3JrYmVuY2gpIHsKLQkJaWYgKCFsb2dnZWRUb1dvcmtiZW5jaCB8fCAhY29uc29sZUxvZ09uKSB7Ci0JCQlpZiAobCA9PSBMZXZlbC5TRVZFUkUpCi0JCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0RlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0RlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmZhYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGx1Z2luIGVycm9yIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAotICogTG9nZ2VyIHRoYXQgYWxzbyBsb2dzIHRvIGEgdHJhY2UgZmlsZSBpbiB0aGUgcGx1Z2luJ3MgbWV0YWRhdGEgYXJlYS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlciBleHRlbmRzIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIgewotCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgdHJhY2UgZmlsZSBpbiB0aGUgbWV0YWRhdGEgYXJlYS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQbHVnaW5UcmFjZUZpbGVOYW1lID0gIi8ubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZlRyYWNlRmlsZSA9IG51bGw7Ci0KLQlwcml2YXRlIFByaW50V3JpdGVyIHRyYWNlRmlsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0VUlMb2dSZW5kZXJlciBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICovCi0JcHVibGljIERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKLQkJc3VwZXIobG9nZ2VyKTsKLQotCQlmVHJhY2VGaWxlID0gUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihmTXlCdW5kbGUpLnRvU3RyaW5nKCkgKyBQbHVnaW5UcmFjZUZpbGVOYW1lOwotCQkobmV3IEZpbGUoZlRyYWNlRmlsZSkpLmRlbGV0ZSgpOyAvLyBTdGFydCBmcm9tIGZyZXNoIC4uLiBkbyBub3Qgd2FudCB0byBsZWFrIG9uIGRpc2sgc3BhY2UKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZVRyYWNlRmlsZSgpIHsKLQkJaWYgKHRyYWNlRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJdHJhY2VGaWxlLmZsdXNoKCk7Ci0JCQl0cmFjZUZpbGUuY2xvc2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyYWNlRmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2cpIHsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQotCQlvcGVuVHJhY2VGaWxlKCk7Ci0JCWlmICh0cmFjZUZpbGUgIT0gbnVsbCkgewotCQkJdHJhY2VGaWxlLnByaW50bG4obXNnKTsKLQkJCWNsb3NlVHJhY2VGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGZUcmFjZUZpbGU7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZywgTGV2ZWwgbCwgYm9vbGVhbiBsb2dnZWRUb1dvcmtiZW5jaCkgewotCQlpZiAoIWxvZ2dlZFRvV29ya2JlbmNoIHx8ICFjb25zb2xlTG9nT24pIHsKLQkJCWlmIChsID09IExldmVsLlNFVkVSRSkKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCi0JCW9wZW5UcmFjZUZpbGUoKTsKLQkJaWYgKHRyYWNlRmlsZSAhPSBudWxsKSB7Ci0JCQl0cmFjZUZpbGUucHJpbnRsbihtc2cpOwotCQkJY2xvc2VUcmFjZUZpbGUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuVHJhY2VGaWxlKCkgewotCQl0cnkgewotCQkJdHJhY2VGaWxlID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZUcmFjZUZpbGUsIHRydWUpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBvcGVuaW5nIHRoZSBsb2cgZmlsZSBzbyBsb2cgdG8gdGhlIGNvbnNvbGUKLQkJCXRyYWNlRmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9FY2xpcHNlTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0VjbGlwc2VMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNTZjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0VjbGlwc2VMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0gCi0vKioKLSAqIEBkZXByZWNhdGVkIFBsdWdpbiBlcnJvciBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKLSAqIEdldCBhbiBFY2xpcHNlIGxvZ2dlci4gVGhpcyBnZXRzIGEgbG9nZ2VyIHRoYXQga25vd3MgaXQgaXMgZm9yIGEgcGx1Z2luLiAKLSAqIAotICogRm9yIGVhY2ggcGx1Z2luLCB0aGUgZm9sbG93aW5nIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIC5vcHRpb24gZmlsZToKLSAqIAkJe3BsdWdpbi1pZH0vZGVidWcvbG9nVHJhY2UKLSAqIAkJCVRoZSB2YWx1ZXMgdmFsaWQgZm9yIHRoaXMgYXJlICJ0cnVlIiwgImZhbHNlIiwgb3IgImRlZmF1bHQiLiBJZiB0cnVlIHRoZW4gbG9nZ2VycyB3aWxsIGJlIHNldCBpbnRvCi0gKiAJCQl0cmFjZSBtb2RlLiBUaGlzIG1lYW5zIGV2ZXJ5dGhpbmcgbG9nZ2VkIChldmVuIHRob3NlIHRoYXQgYXJlIGZpbHRlcmVkIG91dCBkdWUgdG8gbm90IG1lZXRpbmcgbG9nIGxldmVsKQotICogCQkJd2lsbCBiZSB0cmFjZWQgb3V0LiBJZiB0aGUgdmFsdWUgaXMgInRydWUiIHRoZXkgd2lsbCBiZSB0cmFjZWQgdG8gdGhlIHN5c3RlbSBjb25zb2xlLiAgCi0gKiAJCQlJZiBpdCBpcyAiZGVmYXVsdCIgb3Igbm90IHNldCBhdCBhbGwsIHRoZW4gaXQgd2lsbCBiZSB0aGUgdmFsdWUgaW4gdGhlICJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dUcmFjZSIgLm9wdGlvbnMgc2V0dGluZy4KLSAqIAkJCUlmIG5vdCBzZXQgdGhlcmUsIHRoZW4gZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGZhbHNlLgotICogCi0gKiAJCXtwbHVnaW4taWR9L2RlYnVnL2xvZ1RyYWNlRmlsZQotICogCQkJVGhlIHZhbHVlcyB2YWxpZCBmb3IgdGhpcyBhcmUgInRydWUiLCAiZmFsc2UiLCBvciAiZGVmYXVsdCIuIElmIHRydWUgdGhlbiBsb2dnZXJzIHdpbGwgdHJhY2UgdG8gCi0gKiAJCQl0aGUgc3lzdGVtIGNvbnNvbGUgQU5EIHRvIHRoZSAiLmxvZyIgZmlsZSBpbiB0aGUgcGx1Z2lucyB3b3JrIGFyZWEgaW4gdGhlIG1ldGFkYXRhIHNlY3Rpb24gb2YgdGhlIHdvcmtzcGFjZS4KLSAqIAkJCUlmICJmYWxzZSIgdGhlbiBub3QgdHJhY2VkIHRvIGEgdHJhY2UgZmlsZS4gCi0gKiAJCQlJZiBpdCBpcyAiZGVmYXVsdCIgb3Igbm90IHNldCBhdCBhbGwsIHRoZW4gaXQgd2lsbCBiZSB0aGUgdmFsdWUgaW4gdGhlICJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dUcmFjZUZpbGUiIC5vcHRpb25zIHNldHRpbmcuCi0gKiAJCQlJZiBub3Qgc2V0IHRoZXJlLCB0aGVuIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLSAqIAotICogCQl7cGx1Z2luLWlkfS5kZWJ1Zy9sb2dMZXZlbAotICogCQkJVGhlIHZhbHVlcyB2YWxpZCBmb3IgdGhpcyBhcmUgdGhlIG5hbWVzIGZyb20gPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+LCBhbmQgImRlZmF1bHQiLiBUaGVzZQotICogCQkJYXJlIHRoZSB0cmFjZSBjdXRvZmYgbGV2ZWxzIHRvIHVzZS4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbGV2ZWwgd2FzIFNFVkVSRSwgdGhlbiBvbmx5IGxldmVsIFNFVkVSRSBtc2dzCi0gKiAJCQlhcmUgbG9nZ2VkLiBUaGUgcmVzdCBhcmUgc2tpcHBlZC4gT3IgaWYgdGhlIGxldmVsIHdhcyBXQVJOSU5HLCB0aGVuIG9ubHkgbGV2ZWwgU0VWRVJFIGFuZCBXQVJOSU5HIGFyZQotICogCQkJbG9nZ2VkLgotICogCQkJSWYgaXQgaXMgImRlZmF1bHQiIG9yIG5vdCBzZXQgYXQgYWxsLCB0aGVuIGl0IHdpbGwgYmUgdGhlIHZhbHVlIGluIHRoZSAib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nTGV2ZWwiIC5vcHRpb25zIHNldHRpbmcuCi0gKiAJCQlJZiBub3Qgc2V0IHRoZXJlLCB0aGVuIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBXQVJOSU5HLgotICogCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBleHRlbmRzIExvZ2dlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19UUkFDRV9PUFRJT04gPSAiL2RlYnVnL2xvZ3RyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1RSQUNFX0ZJTEVfT1BUSU9OID0gIi9kZWJ1Zy9sb2d0cmFjZWZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfTE9HX0xFVkVMX09QVElPTiA9ICIvZGVidWcvbG9nbGV2ZWwiOyAvLyBUaGUgbG9nZ2luZyBsZXZlbCB0byB1c2Ugd2hlbiBubyBIeWFlZGVzLiAod2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCBhdCB0aGlzIHRpbWUpLiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PUFRJT04gPSAiZGVmYXVsdCI7CS8vIElmIG9wdGlvbiB2YWx1ZSBpcyB0aGlzLCB0aGVuIHRoZSB2YWx1ZSBmcm9tIFdUUCBDb21tb24gcGx1Z2luIG9wdGlvbnMgd2lsbCBiZSB1c2VkIGZvciBib3RoIGxvZ1RyYWNlIGFuZCBsb2dMZXZlbC4JIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsb2dnZXIgYmFzZWQgdXBvbiB0aGUgUGx1Z2luLiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldEVjbGlwc2VMb2dnZXIoUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gZ2V0RWNsaXBzZUxvZ2dlcihwbHVnaW4uZ2V0QnVuZGxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsb2dnZXIgYmFzZWQgdXBvbiB0aGUgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0RWNsaXBzZUxvZ2dlcihCdW5kbGUgYnVuZGxlKSB7Ci0JCVN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJTG9nZ2VyIGxvZ2dlciA9IGdldExvZ2dlcklmRXhpc3RzKGlkKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsKQotCQkJcmV0dXJuIGxvZ2dlcjsKLQkJCi0JCWxvZ2dlciA9IGdldExvZ2dlcihpZCk7CS8vIENyZWF0ZSBvbmUsIHdlIHdpbGwgbm93IGN1c3RvbWl6ZSBpdC4KLQkJCi0JCVN0cmluZyBwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihpZCArIERFQlVHX1RSQUNFX09QVElPTik7Ci0JCWlmIChwbHVnaW5PcHRpb24gPT0gbnVsbCB8fCAiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pKSAvLyROT04tTkxTLTEkCi0JCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIERFQlVHX1RSQUNFX09QVElPTik7Ci0JCWJvb2xlYW4gbG9nVHJhY2UgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oaWQgKyBERUJVR19UUkFDRV9GSUxFX09QVElPTik7Ci0JCWlmIChwbHVnaW5PcHRpb24gPT0gbnVsbCB8fCAiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pKSAvLyROT04tTkxTLTEkCi0JCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIERFQlVHX1RSQUNFX0ZJTEVfT1BUSU9OKTsKLQkJYm9vbGVhbiBsb2dUcmFjZUZpbGUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCQotCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihpZCArIERFQlVHX0xPR19MRVZFTF9PUFRJT04pOwotCQlpZiAocGx1Z2luT3B0aW9uID09IG51bGwgfHwgImRlZmF1bHQiLmVxdWFsc0lnbm9yZUNhc2UocGx1Z2luT3B0aW9uKSkgLy8kTk9OLU5MUy0xJAotCQkJcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSkVNVXRpbFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBERUJVR19MT0dfTEVWRUxfT1BUSU9OKTsKLQkJCi0JCUxldmVsIGxvZ0xldmVsID0gTGV2ZWwuV0FSTklORzsKLQkJaWYgKHBsdWdpbk9wdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvZ0xldmVsID0gTGV2ZWwucGFyc2UocGx1Z2luT3B0aW9uKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsb2dUcmFjZSkKLQkJCWxvZ2dlci5zZXRUcmFjZU1vZGUodHJ1ZSk7Ci0JCWxvZ2dlci5zZXRMZXZlbChsb2dMZXZlbCk7Ci0JCWlmICghbG9nVHJhY2VGaWxlKQotCQkJbG9nZ2VyLnNldFJlbmRlcmVyKG5ldyBDb25zb2xlTG9nUmVuZGVyZXIobG9nZ2VyKSk7Ci0JCWVsc2UKLQkJCWxvZ2dlci5zZXRSZW5kZXJlcihuZXcgRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIobG9nZ2VyKSk7Ci0JCQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvSU1zZ0xvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9JTXNnTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDUwMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9JTXNnTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbHVnaW4gZXJyb3IgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCi0gKiBJbnRlcmZhY2UgZm9yIGEgbWVzc2FnZSBsb2dnZXIuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNc2dMb2dnZXIgewotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvcGx1Z2luL0pFTVV0aWxQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9wbHVnaW4vSkVNVXRpbFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I5YjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9wbHVnaW4vSkVNVXRpbFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEpFTVV0aWxQbHVnaW4uamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS41ICQkICAkJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NDUgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0vKioKLSAqIFBsdWdpbiBmb3IgRU1GV29ya2JlbmNoIHV0aWxzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEpFTVV0aWxQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuamVtLnV0aWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUGx1Z2luIGlkIG9mIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IElEOwkKLQotCS8qKgotCSAqIFVJIENvbnRleHQgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfRVhURU5TSU9OX1BPSU5UID0gInVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVUlUZXN0ZXIgZWxlbWVudCBuYW1lLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1RFU1RFUl9FWFRFTlNJT05fUE9JTlQgPSAidWlUZXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUHJvdG9jb2wgZm9yIHdvcmtzcGFjZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9QUk9UT0NPTCA9ICJ3b3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcm90b2NvbCBmb3IgcGxhdGZvcm0gdXJpJ3MuIGkuZS4gInBsYXRmb3JtOi8uLi4iCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVzb3VyY2UgaW5kaWNhdGlvbiBpbiBwbGF0Zm9ybSBwcm90b2NvbC4gSW5kaWNhdGVzIHVybCBpcyBmb3IgYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLiBpLmUuICJwbGF0Zm9ybTovcmVzb3VyY2UvcHJvamVjdG5hbWUvLi4uIgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFID0gInJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGx1Z2luIGluZGljYXRpb24gaW4gcGxhdGZvcm0gcHJvdG9jb2wuIEluZGljYXRlcyB1cmwgaXMgZm9yIGEgZmlsZS9kaXJlY3RvcnkgaW4gdGhlIHBsdWdpbnMgYXJlYS4gaS5lLiAicGxhdGZvcm06L3BsdWdpbi9wbHVnaW5pZC8uLi4iCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUExVR0lOID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIgc2hhcmVkQ2FjaGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZVNldCBwbHVnaW5SZXNvdXJjZVNldDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUzsKLQotCXByaXZhdGUgc3RhdGljIEpFTVV0aWxQbHVnaW4gREVGQVVMVDsKLQotCXB1YmxpYyBKRU1VdGlsUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlERUZBVUxUID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdvcmtzcGFjZS4gSnVzdCB1c2UgUmVzb3VyY2VQbHVnaW4uZ2V0V29ya3NwYWNlKCkgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBsdWdpbiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHBsdWdpbiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpFTVV0aWxQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkQ2FjaGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyIGdldFNoYXJlZENhY2hlKCkgewotCQlpZiAoc2hhcmVkQ2FjaGUgPT0gbnVsbCkKLQkJCXNoYXJlZENhY2hlID0gbmV3IFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIoKTsKLQkJcmV0dXJuIHNoYXJlZENhY2hlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNoYXJlZENhY2hlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2hhcmVkQ2FjaGUKLQkgKiAgICAgICAgICAgIFRoZSBzaGFyZWRDYWNoZSB0byBzZXQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hhcmVkQ2FjaGUoV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBhU2hhcmVkQ2FjaGUpIHsKLQkJc2hhcmVkQ2FjaGUgPSBhU2hhcmVkQ2FjaGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUlzb2xhdGVkUmVzb3VyY2VTZXQoSVByb2plY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVJc29sYXRlZFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gQWRhcHRlci4gWW91IGNhbiB1c2UgdGhpcyBhcGkgdG8gbGlzdGVuIGZvciBhbnkgc2hhcmVkIHJlc291cmNlIGJlaW5nIGxvYWRlZCBvciByZW1vdmVkIGZyb20gYW55IFByb2plY3RSZXNvdXJjZVNldCBpbiB0aGUgV29ya2JlbmNoCi0JICogaW5zdGVhZCBvZiB0cnlpbmcgdG8gbGlzdGVuIHRvIGVhY2ggaW5kaXZpZHVhbCBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkV29ya3NwYWNlRU1GUmVzb3VyY2VMaXN0ZW5lcihBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiAhZ2V0U2hhcmVkQ2FjaGUoKS5lQWRhcHRlcnMoKS5jb250YWlucyhhZGFwdGVyKSkKLQkJCWdldFNoYXJlZENhY2hlKCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGFkYXB0ZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiAKLQkgKiBAc2VlICNhZGRXb3Jrc3BhY2VFTUZSZXNvdXJjZUxpc3RlbmVyKEFkYXB0ZXIpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVdvcmtzcGFjZUVNRlJlc291cmNlTGlzdGVuZXIoQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlnZXRTaGFyZWRDYWNoZSgpLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIHBsdWdpbiBhY3RpdmUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhY3RpdmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlyZXR1cm4gYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBXb3JrYmVuY2hDb250ZXh0IGlzIGluc3RhbnRpYXRlZCBvbiBhbiBFTUZOYXR1cmUuCi0JICogPHA+Ci0JICogVGhpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiAKLQkgKiBAc2VlIHBsdWdpbi54bWwjUmVzb3VyY2VIYW5kbGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbmRlZFJlc291cmNlSGFuZGxlcnMoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwY3QgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChnZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgIlJlc291cmNlSGFuZGxlckV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb24gPSBwY3QuZ2V0RXh0ZW5zaW9ucygpOwotCQlJRXh0ZW5zaW9uIGNvbmZpZzsKLQkJZm9yIChpbnQgbCA9IDA7IGwgPCBleHRlbnNpb24ubGVuZ3RoOyArK2wpIHsKLQkJCWNvbmZpZyA9IGV4dGVuc2lvbltsXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNFbGVtcyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY0VsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaGFuZGxlciA9IChSZXNvdXJjZUhhbmRsZXIpIGNFbGVtc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJydW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWhhbmRsZXIgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoaGFuZGxlciAhPSBudWxsKQotCQkJCQlhUmVzb3VyY2VTZXQuYWRkKGhhbmRsZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IChhbmQgdGhlIGRpcmVjdG9yeSBpZiBkZWxldGVSb290IGlzIHRydWUpLgotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIGRlbGV0ZVJvb3QgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZGVsZXRlIHRoZSByb290IGRpcmVjdG9yeSB0b28uCi0JICogQHBhcmFtIG1vbml0b3IgCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZGVsZXRpbmcgYW55dGhpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnQoRmlsZSByb290LCBib29sZWFuIGRlbGV0ZVJvb3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCWlmIChyb290LmNhblJlYWQoKSkgewotCQkJaWYgKHJvb3QuaXNEaXJlY3RvcnkoKSkgewotCQkJCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdFV0aWxfRGVsZXRlXzEiKSwgbmV3IE9iamVjdFtdIHtyb290LmdldE5hbWUoKX0pLCBmaWxlcy5sZW5ndGgrKGRlbGV0ZVJvb3QgPyAxIDogMCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQkJCWVycm9yIHw9IGRlbGV0ZURpcmVjdG9yeUNvbnRlbnQoZmlsZXNbaV0sIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQllbHNlIHsKLQkJCQkJCWVycm9yIHw9ICFmaWxlc1tpXS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RVdGlsX0RlbGV0ZV8xIiksIG5ldyBPYmplY3RbXSB7cm9vdC5nZXROYW1lKCl9KSwgMSk7CQkJCSAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZGVsZXRlUm9vdCkgewotCQkJCWVycm9yIHw9ICFyb290LmRlbGV0ZSgpOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBjbGVhbiByZXNvdXJjZSBjaGFuZ2VsaXN0ZW5lci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAcGFyYW0gZXZlbnRNYXNrIG1hc2sgb2YgZXZlbnQgdHlwZXMgdG8gbGlzdGVuIGZvciBpbiBhZGRpdGlvbiB0byBvbmVzIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgY2xlYW4uIFVzZSAwIGlmIG5vIGFkZGl0aW9uYWwgb25lcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2xlYW5SZXNvdXJjZUNoYW5nZUxpc3RlbmVyKENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgewotCQkvLyBQUkVfQlVJTEQ6IEhhbmRsZSBDbGVhbi4KLQkJLy8gVE9ETyBVbnRpbCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxOTQyIGlzIGZpeGVkLCB3ZSBtdXN0IGRvIFBPU1RfQlVJTEQsIHRoYXQgd2lsbCBwcm9iYWJseSBiZSBzZW50IGJlY2F1c2UgYSBjbGVhbiB3aWxsIGNhdXNlIGEgYnVpbGQgdG8gb2NjdXIgd2hpY2ggc2hvdWxkIGNhdXNlIGEgZGVsdGEuCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2sgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsJCQotCX0KLQkKLQkvKioKLQkgKiBBIHJlc291cmNlIGxpc3RlbmVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbGlzdGVuIGZvciBDbGVhbiByZXF1ZXN0cyBhbmQgcHJvY2VzcyB0aGVtLgotCSAqIDxwPgotCSAqIFVzZSA8Y29kZT57QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUFJFX0JVSUxEfTwvY29kZT4gd2hlbiBhZGRpbmcgYXMgbGlzdGVuZXIgdG8gZ2V0IHRoZQotCSAqIGNsZWFuIGV2ZW50cy4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlPC9iPiA6IFRPRE8gVW50aWwgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTk0MiBpcyBmaXhlZCwgeW91IG11c3QgZG8gUE9TVF9CVUlMRCwgdGhhdCB3aWxsIHByb2JhYmx5IGJlIHNlbnQgYmVjYXVzZSBhIGNsZWFuIHdpbGwgY2F1c2UgYSBidWlsZCB0byBvY2N1ciB3aGljaCBzaG91bGQgY2F1c2UgYSBkZWx0YS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBoYW5kbGUgbW9yZSBldmVudHMgdGhhbiBqdXN0IGNsZWFuLgotCQkJaWYgKGV2ZW50LmdldEJ1aWxkS2luZCgpID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQkJY2xlYW5Qcm9qZWN0KChJUHJvamVjdCkgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJCWVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkKLQkJCQkJY2xlYW5BbGwoKTsJCQkJCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgb3V0IHRoZSBwcm9qZWN0LgotCQkgKiBAcGFyYW0gcHJvamVjdAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbGVhblByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkJLyoqCi0JCSAqIENsZWFuIGFsbC4KLQkJICogPHA+Ci0JCSAqIEJ5IGRlZmF1bHQgdGhpcyB3aWxsIHNpbXBseSBjYWxsIGEgY2xlYW4gcHJvamVjdCBvbiBlYWNoIG9wZW4gcHJvamVjdC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGVpdGhlcgotCQkgKiBhZGQgbW9yZSBmdW5jdGlvbiB0byBjbGVhciBvdXQgbm9uLXByb2plY3QgZGF0YSBhbmQgdGhlbiBjYWxsIHN1cGVyLiBPciBpZiB0aGV5IGNhbiBoYW5kbGUgYWxsIG9mIHRoZSBwcm9qZWN0cwotCQkgKiBpbiBhIGZhc3RlciB3YXksIHRoZW4gY2FuIGNvbXBsZXRlbHkgaGFuZGxlIHRoaXMuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNsZWFuQWxsKCkgewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJY2xlYW5Qcm9qZWN0KHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCByZXNvdXJjZSBzZXQgZm9yIHRoZSBwbHVnaW4gKHRoZXJlIGlzIG9uZSBmb3IgdGhlIHdob2xlIHN5c3RlbSkuCi0JICogCi0JICogQHJldHVybiBzeXN0ZW0td2lkZSByZXNvdXJjZSBzZXQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRQbHVnaW5SZXNvdXJjZVNldCgpIHsKLQkJaWYgKHBsdWdpblJlc291cmNlU2V0ID09IG51bGwpCi0JCQlwbHVnaW5SZXNvdXJjZVNldCA9IG5ldyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKG51bGwpOwotCQlyZXR1cm4gcGx1Z2luUmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzeXN0ZW0td2lkZSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHNldAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQbHVnaW5SZXNvdXJjZVNldChSZXNvdXJjZVNldCBzZXQpIHsKLQkJcGx1Z2luUmVzb3VyY2VTZXQgPSBzZXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBnbG9iYWwgbG9hZGluZyBwbHVnaW4gbmFtZXMuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpIHsKLQkJaWYgKEdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUyA9PSBudWxsKQotCQkJR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTID0gcmVhZEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpOwotCQlyZXR1cm4gR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgTG9nZ2VyIGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGxvZ2dlciBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihJRCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcmVhZEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleFBvaW50ID0gcmVnLmdldEV4dGVuc2lvblBvaW50KElELCAiZ2xvYmFsUGx1Z2luUmVzb3VyY2VMb2FkIik7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleFBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2V4dGVuc2lvbnMubGVuZ3RoXTsKLQkJaWYgKGV4dGVuc2lvbnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCW5hbWVzW2ldID0gZXh0ZW5zaW9uc1tpXS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTI5YzgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9QRVJGTVNSLlJFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL1BFUkZNU1IuUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4NmEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL1BFUkZNU1IuUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVRoaXMgaXMgYSBzdHViIHBsdWdpbiBmb3IgcGVyZm1zci4gSXQgaXMgaGVyZSBqdXN0IHNvIHRoYXQgb3JnLmVjbGlwc2UuamVtLnV0aWwgY2FuIGNvbXBpbGUuCi0KLUl0IHNob3VsZCBub3QgYmUgYW4gb3BlbiBwcm9qZWN0IGR1cmluZyBub3JtYWwgdXNhZ2UuIFdoZW5ldmVyIGFueSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBwcm9qZWN0Ci1hcmUgY2hhbmdlZCwgInBlcmZtc3IuamFyZGVzYyIgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBuZXcgY2hhbmdlZCBhcHByb3ByaWF0ZSBqYXIuIERvIHRoaXMgYnk6Ci0KLTEpIFNlbGVjdCBwZXJmbXNyLmphcmRlc2MKLTIpIE9uIHBvcHVwIG1lbnUgc2VsZWN0ICJDcmVhdGUgSkFSIgotMykgSGl0ICJGaW5pc2giCi00KSBDb21taXQgYWxsIGNoYW5nZXMgdG8gQ1ZTLgotNSkgR28gdG8gb3JnLmVjbGlwc2UuamVtLnV0aWwgcHJvamVjdCwgc2VsZWN0IHRoZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1YiBmb2xkZXIKLSAgIGFuZCBzZWxlY3QgUmVwbGFjZS0+TGF0ZXN0IGZyb20gSEVBRC4gVGhpcyB3aWxsIGNhdXNlIHlvdXIganVzdCBjb21taXR0ZWQgY2hhbmdlcwotICAgZnJvbSBzdGVwIDQgdG8gYmUgcHV0IGludG8gb3JnLmVjbGlwc2UuamVtLnV0aWwgYW5kIHdpbGwgYmUgcGlja2VkIHVwIGZvciB0aGF0Ci0gICBwbHVnaW4gdG8gY29tcGlsZSBhZ2FpbnN0LgotNikgRWl0aGVyIGNsb3NlIG9yIGRlbGV0ZSB0aGUgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWYgcHJvamVjdCBmcm9tIHRoZSB3b3Jrc3BhY2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWYyMzhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4zMHRoIE1hcmNoLCAyMDA0PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBFUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgRVBMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBFUEwuPC9wPgotCi08cD48Yj5WZXJzaW9uOjwvYj4gdjIwMDQwNjI0YQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkYjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgICouamFyCi1zb3VyY2UucGVyZm1zci5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViYmE4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcmRlc2MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4ZTIyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08amFyZGVzYz4KLSAgICA8amFyIHBhdGg9Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyIi8+Ci0gICAgPG9wdGlvbnMgYnVpbGRJZk5lZWRlZD0idHJ1ZSIgY29tcHJlc3M9InRydWUiIGRlc2NyaXB0aW9uTG9jYXRpb249Ii9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcmRlc2MiIGV4cG9ydEVycm9ycz0idHJ1ZSIgZXhwb3J0V2FybmluZ3M9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiIHNhdmVEZXNjcmlwdGlvbj0idHJ1ZSIgdXNlU291cmNlRm9sZGVycz0iZmFsc2UiLz4KLSAgICA8bWFuaWZlc3QgZ2VuZXJhdGVNYW5pZmVzdD0idHJ1ZSIgbWFuaWZlc3RMb2NhdGlvbj0iL1ZFU2NyYXBQcm9qZWN0L01BTklGRVNULm1mIiBtYW5pZmVzdFZlcnNpb249IjEuMCIgcmV1c2VNYW5pZmVzdD0iZmFsc2UiIHNhdmVNYW5pZmVzdD0iZmFsc2UiIHVzZXNNYW5pZmVzdD0idHJ1ZSI+Ci0gICAgICAgIDxzZWFsaW5nIHNlYWxKYXI9ImZhbHNlIj4KLSAgICAgICAgICAgIDxwYWNrYWdlc1RvU2VhbC8+Ci0gICAgICAgICAgICA8cGFja2FnZXNUb1VuU2VhbC8+Ci0gICAgICAgIDwvc2VhbGluZz4KLSAgICA8L21hbmlmZXN0PgotICAgIDxzZWxlY3RlZEVsZW1lbnRzIGV4cG9ydENsYXNzRmlsZXM9InRydWUiIGV4cG9ydEphdmFGaWxlcz0idHJ1ZSIgZXhwb3J0T3V0cHV0Rm9sZGVyPSJmYWxzZSI+Ci0gICAgICAgIDxqYXZhRWxlbWVudCBoYW5kbGVJZGVudGlmaWVyPSI9b3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjIi8+Ci0gICAgPC9zZWxlY3RlZEVsZW1lbnRzPgotPC9qYXJkZXNjPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjBlZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QbHVnaW4ubmFtZT1QZXJmb3JtYW5jZSBNb25pdG9yCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2OTI2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZSIKLSAgIG5hbWU9IiVQbHVnaW4ubmFtZSIKLSAgIHZlcnNpb249IjMuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLlBlcmZNc3JDb3JlUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwZXJmbXNyLmphciI+PGV4cG9ydCBuYW1lPSIqIi8+PC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL0lQZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5OTJjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlOwotCi0vKioKLSAqIFRha2Ugc25hcHNob3RzIG9mIHRoZSB2YXJpb3VzIHBlcmZvcm1hbmNlIGNvdW50ZXJzLgotICogKioqKioqKioqKioqKiBUaGlzIGlzIGp1c3QgYSBzdHViIG9mIHRoZSByZWFsIGludGVyZmFjZSB0byBnZXQgb3JnLmVjbGlwc2UuamVtLnV0aWwgCi0gKiAgICAgICAgICAgICAgIHRvIGNvbXBpbGUuIEl0IGlzIG5vdCB1c2FibGUgYnkgaXRzZWxmLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBlcmZvcm1hbmNlTW9uaXRvcgotewotCS8qKgotCSAqIFRoZXNlIGNvbnN0YW50cyBjb250cm9sIGhvdyBtdWNoIGluZm9ybWF0aW9uIGlzIGdhdGhlcmVkIGZvciBhIHBhcnRpY3VsYXIgc25hcHNob3QuCi0JICogVGhleSBhcmUgb3InZWQgdG9nZXRoZXIgYW5kIHBhc3NlZCBpbnRvIHRoZSBzbmFwc2hvdCBtZXRob2QuICAKLQkgKi8KLQlpbnRlcmZhY2UgVHlwZXMKLQl7Ci0JCS8qKiAKLQkJICogMSAtIFdyaXRlIG91dCB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVGhlc2UKLQkJICogaW5jbHVkZSB3b3JraW5nIHNldCwgcGVhayB3b3JraW5nIHNldCwgZWxhcHNlZCB0aW1lLCB1c2VyIHRpbWUsIGFuZCAKLQkJICoga2VybmVsIHRpbWUuCi0JCSAqLwotCQlpbnQgT3BlcmF0aW5nU3lzdGVtQ291bnRlcnMJCT0gMTsKLQkJCi0JCS8qKgotCQkgKiAyIC0gV3JpdGUgb3V0IHRoZSBnbG9iYWwgcGVyZm9ybWFuY2UgaW5mby4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB0aGUgdG90YWwKLQkJICogY29tbWl0dGVkIG1lbW9yeSBmb3IgdGhlIGVudGlyZSBzeXN0ZW0uCi0JCSAqIAotCQkgKiBUaGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIEdldFBlcmZvcm1hbmNlSW5mbygpIGZ1bmN0aW9uIGJlaW5nIGF2YWlsYWJsZSBpbgotCQkgKiB0aGUgV2luZG93cyBwc2FwaS5kbGwuIFRoaXMgaXMgYXZhaWxhYmxlIGluIFhQIGJ1dCBpcyB1c3VhbGx5IG5vdCBhdmFpbGFibGUKLQkJICogaW4gV2luLzIwMDAuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgdGhlbiB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KLQkJICovCi0JCWludCBHbG9iYWxTeXN0ZW1Db3VudGVycwkJPSAyOwotCQkKLQkJLyoqCi0JCSAqIDQgLSBXcml0ZSBvdXQgdGhlIHNpemUgb2YgdGhlIEphdmEgSGVhcC4KLQkJICovCi0JCWludCBKYXZhSGVhcFNpemUJCQkJPSA0OwotCi0JCS8qKgotCQkgKiA4IC0gV3JpdGUgb3V0IGhvdyBtdWNoIG9mIHRoZSBKYXZhIGhlYXAgaXMgYmVpbmcgdXNlZC4gVGhpcyBjYWxscyB0aGUgCi0JCSAqIGdhcmJhZ2UgY29sbGVjdG9yIHNvIGl0IG1heSBza2V3IHRpbWluZyByZXN1bHRzLgotCQkgKi8KLQkJaW50IEphdmFIZWFwVXNlZAkJCQk9IDg7Ci0JCQotCQkvKioKLQkJICogMTYgLSBUaGUgcGx1Z2luIHN0YXJ0dXAgYW5kIHNpemUgaW5mb3JtYXRpb24uCi0JCSAqLwotCQlpbnQgUGx1Z2luSW5mbwkJCQkJPSAxNjsKLQkJCi0JCS8qKiAweGZmZmYgLSBFdmVyeXRoaW5nLiAqLwotCQlpbnQgQWxsCQkJCQkJCT0gMHhmZmZmOwkKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHNvbWUgbW9yZSAiZXh0cmEiIHZhcmlhdGlvbnMuIAotCSAqIAotCSAqIFRoZSB2YXJpYXRpb25zIHRoYXQgYXJlIGluIGVmZmVjdCBhcmUgbWFkZSB1cCBvZiB0aGVzZSBleHRyYSB2YXJpYXRpb25zIHBsdXMgYW55IHZhcmlhdGlvbnMKLQkgKiB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IHdpdGggdGhlIHNldFZhcigpIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFyTGlzdCBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHZhcmlhdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYXJBcHBlbmQoU3RyaW5nIHZhckxpc3QpOwotCQotCS8qKgotCSAqIFNldCB0aGUgZHJpdmVyIG5hbWUuIAotCSAqIAotCSAqIEBwYXJhbSBkcml2ZXIgYSBsYWJlbCB0aGF0IGlkZW50aWZpZXMgdGhlIGRyaXZlciB0aGF0IGlzIGJlaW5nIHRlc3RlZC4gSWYgaXQgaXMgYSBXU0FECi0JICogZHJpdmVyLCB0aGlzIHdpbGwgdXN1YWxseSBiZSBzZXQgYnkgdGhlIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIGRyaXZlcik7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgZmlsZSwgdGhhdCBpcyB0aGUgcGxhY2Ugd2hlcmUKLQkgKiB0aGUgbWVhc3VyZW1lbnRzIGFyZSBzdG9yZWQuCi0JICogCi0JICogQHBhcmFtIGxvZ0ZpbGUgdGhlIGZpbGUgbmFtZSBvZiB3aGVyZSB0aGUgbG9nIHNob3VsZCBiZSB3cml0dGVuLiBVc3VhbGx5IHRoaXMgaXMgZnVsbHkgcXVhbGlmaWVkCi0JICogcGF0aCBuYW1lLiBGb3IgZXhhbXBsZSAieDpcbG9nc1x0aW1lci54bWwiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGUoU3RyaW5nIGxvZ0ZpbGUpOwotCQotCS8qKgotCSAqIFNldCB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciB0byBiZSBvbiBvciBvZmYuIElmIGl0IGlzIG9mZiB0aGVuIG1vc3Qgb2YgdGhlIG90aGVyIAotCSAqIG9wZXJhdGlvbnMgd2lsbCBuby1vcC4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCBpcyBmb3IgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgdG8gYmUgb2ZmIHVubGVzcyBpdCdzIHNwZWNpYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LiAKLQkgKiBXaGVuIGNhbGxlZCBmcm9tIHRoZSBVSSwgdGhlIFVJIHNob3VsZCBjYWxsIHRoaXMgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbihib29sZWFuIGlzT24pOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHRlc3QgY2FzZSBudW1iZXIgZm9yIHRoaXMgbWVhc3VyZW1lbnQgcnVuLgotCSAqICAKLQkgKiBAcGFyYW0gdGVzdGQgdGVzdCBjYXNlIGlkZW50aWZpZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0ZChpbnQgdGVzdGQpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHRlc3QgY2FzZSBuYW1lLiBJZiB3aWxsIGNhdXNlIGEgbmV3IHRlc3QgY2FzZSB0byBiZSBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIHRlc3ROYW1lIGEgc2ltcGxlIChzaG9ydCkgdGVzdCBjYXNlIG5hbWUuIEluIHRoZSBjYXNlIG9mIEpVbml0IHRlc3QgY2FzZXMsIGl0IHdvdWxkIHVzdWFsbHkgCi0JICogYmUgdGhlIEpVbml0IG5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdE5hbWUoU3RyaW5nIHRlc3ROYW1lKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHZhcmlhdGlvbnMgdGhhdCBhcmUgaW4gZWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSB2YXIgYSBjb21tYSBkZWxpbWl0ZWQgc3RyaW5nIG9mIHZhcmlhdGlvbiBudW1iZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpOwotCQotCS8qKgotCSAqIFNldCB0aGUgdXBsb2FkIGhvc3QKLQkgKiAKLQkgKiBAcGFyYW0gaG9zdCBETlMgbmFtZSBvZiB0aGUgdXBsb2FkIGhvc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGxvYWRIb3N0KFN0cmluZyBob3N0KTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHVwbG9hZCBwb3J0Ci0JICogCi0JICogQHBhcmFtIHBvcnQgdXBsb2FkIHBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGxvYWRQb3J0KGludCBwb3J0KTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHVwbG9hZCB1c2VyaWQKLQkgKiAKLQkgKiBAcGFyYW0gdXNlcmlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBsb2FkVXNlcmlkKFN0cmluZyB1c2VyaWQpOwotCQotCS8qKgotCSAqIFRha2UgYSBzbmFwc2hvdCBvZiBzb21lIGRlZmF1bHQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGVwIHRoaXMgaWRlbnRpZmllcyB0aGUgc3RlcCB0aGF0IHRoZSBzbmFwc2hvdCBpcyBmb3IKLQkgKi8KLQl2b2lkIHNuYXBzaG90KGludCBzdGVwKTsKLQkKLQkvKioKLQkgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHNlbGVjdGVkIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RlcCB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCi0JICogCi0JICogQHBhcmFtIHR5cGVzIFRoaXMgY29udHJvbHMgd2hpY2ggbWVhc3VyZW1lbnRzIGFyZSBzZWxlY3RlZC4gSXQgaXMgYW4gb3InZCB0b2dldGhlcgotCSAqIGxpc3Qgb2YgdGhlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMgY29uc3RhbnRzLgotCSAqIAotCSAqIEBzZWUgSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcyAKLQkgKi8KLQl2b2lkIHNuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpOwotCQotCS8qKgotCSAqIFdyaXRlIHRoZSBjb21tZW50IHRvIHRoZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBjb21tZW50Ci0JICovCi0Jdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpOwotCQotCS8qKgotCSAqIFVwbG9hZCB0aGUgcmVzdWx0cyB0byB0aGUgc2VydmVyLiBUaGlzIGNhdXNlcyB0aGUgZmlsZSB0byBiZQotCSAqIGNsb3NlZCwgYW5kIHRoZSBtb25pdG9yIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBmaW5pc2hlZCBzdGF0ZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIHVwbG9hZGhvc3QsIHVwbG9hZHBvcnQgYW5kIHVwbG9hZHVzZXJpZAotCSAqIGhhdmUgYmVlbiBjb25maWd1cmVkIGJlZm9yZSBoYW5kLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAoaXQgY2FuIGJlIG51bGwpCi0JICogCi0JICogQHJldHVybiBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBVcGxvYWQuU3RhdHVzIHVwbG9hZChTdHJpbmcgZGVzY3JpcHRpb24pOwotLy8JCi0vLwkvKioKLS8vCSAqIFVwbG9hZCB0aGUgcmVzdWx0cyB0byB0aGUgc2VydmVyLiBUaGlzIGNhdXNlcyB0aGUgZmlsZSB0byBiZQotLy8JICogY2xvc2VkLCBhbmQgdGhlIG1vbml0b3IgdG8gYmUgcGxhY2VkIGludG8gdGhlIGZpbmlzaGVkIHN0YXRlLgotLy8JICogCi0vLwkgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRoYXQgdGhlIGZpbGUgaXMgYmVpbmcgc2VudCB0bwotLy8JICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgb24gdGhlIGhvc3QKLS8vCSAqIEBwYXJhbSB1c2VyaWQgdGhlIHVzZXJpZCB0aGF0IGlzIGRvaW5nIHRoZSB1cGxvYWQKLS8vCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAoaXQgY2FuIGJlIG51bGwpCi0vLwkgKiAKLS8vCSAqIEByZXR1cm4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24KLS8vCSAqLwotLy8JVXBsb2FkLlN0YXR1cyB1cGxvYWQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdXNlcmlkLCBTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9QZXJmTXNyQ29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1BlcmZNc3JDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NWJhMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1BlcmZNc3JDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLSAKLQotLyoqCi0gKiAqKioqKioqKioqKioqIFRoaXMgaXMganVzdCBhIHN0dWIgb2YgdGhlIHJlYWwgY2xhc3MgdG8gZ2V0IG9yZy5lY2xpcHNlLmplbS51dGlsIAotICogICAgICAgICAgICAgICB0byBjb21waWxlLiBJdCBpcyBub3QgdXNhYmxlIGJ5IGl0c2VsZi4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmTXNyQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUGVyZm9ybWFuY2VNb25pdG9yIGdldFBlcmZvcm1hbmNlTW9uaXRvcihib29sZWFuIGJvb2wpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvVXBsb2FkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvVXBsb2FkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmE2NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1VwbG9hZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTsKLSAKLQotLyoqCi0gKiBVcGxvYWQuCi0gKiAqKioqKioqKioqKioqIFRoaXMgaXMganVzdCBhIHN0dWIgb2YgdGhlIHJlYWwgaW50ZXJmYWNlIHRvIGdldCBvcmcuZWNsaXBzZS5qZW0udXRpbCAKLSAqICAgICAgICAgICAgICAgdG8gY29tcGlsZS4gSXQgaXMgbm90IHVzYWJsZSBieSBpdHNlbGYuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotcHVibGljIGludGVyZmFjZSBVcGxvYWQgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdHVzIHsKLQkJcHVibGljIGJvb2xlYW4gc3VjY2VzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzZGI2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvY29tbW9uLm1vdmUvd2VidG9vbHMuY29tbW9uLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMzowNzo0NSAkCi0jCi0KLQotcGx1Z2luTmFtZT1KYXZhIEVNRiBNb2RlbCBVdGlsaXRpZXMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWJlNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gRXh0ZW5zaW9uIHBvaW50IHRvIHJlZ2lzdGVyIFJlc291cmNlSGFuZGxlcnMgdGhhdCB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byAKLQluZXcgV29ya2JlbmNoQ29udGV4dHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJSZXNvdXJjZUhhbmRsZXJFeHRlbnNpb24iIG5hbWU9IlJlc291cmNlSGFuZGxlckV4dGVuc2lvbiIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZ2xvYmFsUGx1Z2luUmVzb3VyY2VMb2FkIiBuYW1lPSJHbG9iYWwgUGx1Z2luIFJlc291cmNlIExvYWQiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im5hdHVyZV9yZWdpc3RyYXRpb24iIG5hbWU9IkVNRiBOYXR1cmUgcmVnaXN0cmF0aW9uIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5IiBuYW1lPSJJbnRlcm5hbCBXb3JrYmVuY2ggQ29udGV4dCBGYWN0b3J5Ii8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyIgbmFtZT0iVUkgQ29udGV4dCBTZW5zaXRpdmUgQ2xhc3MiIHNjaGVtYT0ic2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InVpVGVzdGVyIiBuYW1lPSJVSSBUZXN0ZXIiIHNjaGVtYT0ic2NoZW1hL3VpVGVzdGVyLmV4c2QiLz4gICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3Byb3BlcnR5X2ZpbGVzL2VtZndvcmtiZW5jaC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wcm9wZXJ0eV9maWxlcy9lbWZ3b3JrYmVuY2gucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkOTQ4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3Byb3BlcnR5X2ZpbGVzL2VtZndvcmtiZW5jaC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzA9SVdBRTAwMDNFIE1ldGhvZCBub3QgeWV0IGltcGxlbWVudGVkLgotRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMT1JV0FFMDAwNUUgUHJvamVjdCBjYW4gbm90IGJlIG51bGwuCi1FTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8yPUlXQUUwMDA2RSBBdHRlbXB0IHRvIGNyZWF0ZSByZXNvdXJjZSBzZXQgd2l0aCBudWxsIHByb2plY3QKLUVNRk5hdHVyZVJlZ2lzdHJ5X0VSUk9SXzA9SVdBRTAwMDdFIER1cGxpY2F0ZSBFTUYgbmF0dXJlIHJlZ2lzdHJhdGlvbiBmb3IgaWQ6IHswfQotRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlfVUlfMD1UaGUgcHJvamVjdCBzaG91bGQgbm90IGJlIG51bGwuCi1FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8xPVRoZSBwcm9qZWN0IFwiezB9XCIgaXMgbm90IGFjY2Vzc2libGUuCi0KLVByb2plY3RVdGlsX0RlbGV0ZV8xPURlbGV0aW5nIFwiezB9XCIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzBlOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZW0udXRpbCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiIGlkPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyIgbmFtZT0iVUkgQ29udGV4dCBTZW5zaXRpdmUgQ2xhc3MiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29tcG9uZW50cyBhcmUgb2Z0ZW4gZGVzaWduZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSAmcXVvdDtIZWFkbGVzcyZxdW90OyBvciBub24tZ3JhcGhpY2FsIHBvcnRpb25zIGFyZSBzZXBhcmF0ZSBmcm9tIHRoZSBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UgKEdVSSkgcG9ydGlvbnMuIFNvbWV0aW1lcyB0aGlzIGlzIGRvbmUgdG8gZm9sbG93IGdvb2QgZGVzaWduIHByaW5jaXBsZXMsIG90aGVyIHRpbWVzIHRoZXJlIGlzIGEgc3BlY2lmaWMgdXNlIGNhc2UgZm9yIGRvaW5nIHNvLiBXaGVuIHBsdWdpbnMgZm9sbG93IHRoaXMgcHJhY3RpY2UgYmVjYXVzZSB0aGV5IG11c3QgdmFyeSB0aGVpciBiZWhhdmlvciBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIHJ1bm5pbmcgaW4gYSBoZWFkbGVzcyBlbnZpcm9ubWVudCBvciBhIGdyYXBoaWNhbCBlbnZpcm9ubWVudCwgdGhleSBvZnRlbiBuZWVkIHRvIGNob29zZSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHBhcnRpY3VsYXIgdHlwZS4gVGhlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlZCBieSB0aGUgSkVNIGNvbXBvbmVudCBzb2x2ZXMgZXhhY3RseSB0aGlzIHByb2JsZW0uCi0mbHQ7cCZndDsgICAgCi1UbyB1c2UgdGhlIGV4dGVuc2lvbiBwb2ludCwgeW91IG11c3QgcHJvdmlkZSB0d28gZXh0ZW5zaW9ucyB0aGF0IGFyZSBsaW5rZWQgYnkgYSBrZXkuIFRoZSBrZXkgaXMgYSB1bmlxdWUgU3RyaW5nLWJhc2VkIHZhbHVlIHRoYXQgeW91IHdpbGwgbGF0ZXIgdXNlIHRvIGluc3Rhbml0YXRlIHlvdXIgY2xhc3MuCi0mbHQ7cCZndDsKLVRoZSBmaXJzdCB1c2FnZSBvZiB0aGUgZXh0ZW5zaW9uIHNwZWNpZmllcyB5b3VyIGtleSwgYW5kIHRoZSBIZWFkbGVzcyBjb250ZXh0LCBhbmQgdGhlIGNsYXNzIHRoYXQgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBmb3IgdGhpcyAoa2V5LCBjb250ZXh0KSBwYWlyLiBUaGlzIG1lYW5zIGluIHRoZSBoZWFkbGVzcyBlbnZpcm9ubWVudCB0aGlzIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVxdWVzdGVkLgotJmx0O3AmZ3Q7Ci1UaGUgc2Vjb25kIGV4dGVuc2lvbiBzcGVjaWZpZXMgdGhlIFVJIGNvbnRleHQgYW5kIHRoZSBzYW1lIGtleSwgYnV0IGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIGZvciBncmFwaGljYWwgZW52aXJvbm1lbnRzLiBUaGlzIG1lYW5zIGluIHRoZSBVSSBlbnZpcm9ubWVudCB0aGlzIG90aGVyIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVxdWVzdGVkLgotJmx0O3AmZ3Q7Ci1UaGUgYWN0dWFsIHJlcXVlc3QgaXMgZG9uZSBpbiB5b3VyIGNvZGUgdmlhOgotJmx0O3ByZSZndDsKLUlNeUludGVyZmFjZSBpbnN0YW5jZSA9IChJTXlJbnRlcmZhY2UpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoJnF1b3Q7bXlLZXkmcXVvdDspOwotJmx0Oy9wcmUmZ3Q7Ci13aGVyZSAmbHQ7Y29kZSZndDsmcXVvdDtteUtleSZxdW90OyZsdDsvY29kZSZndDsgaXMgdGhlIGtleSB1c2VkIG9uIGJvdGggZXh0ZW5zaW9ucy4gSXQgd2lsbCB0aGVuIGNob29zZSBlaXRoZXIgdGhlIFVJIG9yIHRoZSBIZWFkbGVzcyBleHRlbnNpb24gZGVwZW5kaW5nIHVwb24gdGhlIGNvbnRleHQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQW4gZXh0ZW5zaW9uIHBvaW50IHRoYXQgZGVmaW5lcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGFuZCBpdHMgYXBwcm9wcmlhdGUgY29udGV4dCAoVUkgb3IgSGVhZGxlc3MpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUga2V5IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDb250ZXh0IFNlbnNpdGl2ZSBzdXBlciBjbGFzcy9pbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gZm9yIGVpdGhlciBhIFVJIG9yIEhlYWRsZXNzIGNvbnRleHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGV4dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT25lIG9mICZxdW90O1VJJnF1b3Q7IG9yICZxdW90O0hlYWRsZXNzJnF1b3Q7IFRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuIEl0IG11c3QgbWF0Y2ggZXhhY3RseSBhcyBzaG93biBoZXJlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVUkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZGxlc3MiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDYuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2FnZSBmb3IgdGhlIFVJIGNvbnRleHQ6Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBVSSBDb250ZXh0IENsYXNzJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuQ29udGV4dFNlbnNpdGl2ZUNsYXNzJnF1b3Q7Jmd0OwotICAgICAmbHQ7dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICBjb250ZXh0PSZxdW90O1VJJnF1b3Q7Ci0gICAgICAga2V5PSZxdW90O3dvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIGNsYXNzTmFtZT0mcXVvdDtjb20uaWJtLnd0cC5jb21tb24udWkuV1RQVUlXb3JraW5nQ29weU1hbmFnZXImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDticiZndDsKLVVzYWdlIGZvciB0aGUgSGVhZGxlc3MgY29udGV4dDoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgaWQ9JnF1b3Q7Y29udGV4dC5TZW5zaXRpdmUuQ2xhc3Mud29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgbmFtZT0mcXVvdDtXb3JraW5nIENvcHkgTWFuYWdlciAtIEhlYWRsZXNzIENvbnRleHQgQ2xhc3MmcXVvdDsKLSAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0udXRpbC5Db250ZXh0U2Vuc2l0aXZlQ2xhc3MmcXVvdDsmZ3Q7Ci0gICAgICZsdDt1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgY29udGV4dD0mcXVvdDtIZWFkbGVzcyZxdW90OwotICAgICAgICAga2V5PSZxdW90O3dvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgICAgY2xhc3NOYW1lPSZxdW90O2NvbS5pYm0ud3RwLmNvbW1vbi51aS5XVFBIZWFkbGVzc1dvcmtpbmdDb3B5TWFuYWdlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0O2JyJmd0OwotQW5kIGZpbmFsbHkgdGhlIHJldHJpZXZhbCBvZiB0aGUgY2xhc3MgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQ6Ci0KLSZsdDtwcmUmZ3Q7Ci1JV29ya2luZ0NvcHlNYW5hZ2VyIG1hbmFnZXIgPSAoSVdvcmtpbmdDb3B5TWFuYWdlcikgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgmcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDspOwotJmx0Oy9wcmUmZ3Q7Ci0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBTZWUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiZsdDsvY29kZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIElCTSAyMDAzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpVGVzdGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aVRlc3Rlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlhYjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpVGVzdGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuamVtLnV0aWwiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiBpZD0idWlUZXN0ZXIiIG5hbWU9IlVJIFRlc3RlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIHVzZWQgdG8gdGVsbCBKRU0gdGhhdCBpdCBpcyBydW5uaW5nIGluIGEgbm9uLUhFQURMRVNTIGVudmlyb25tZW50LiBUeXBpY2FsbHkgVUkgZW52aXJvbm1lbnQgaXMgbm9uLUhFQURMRVNTLiBUaGUgZGVmYXVsdCBpZiB0aGVyZSBhcmUgbm8gaW1wbGVtZW50ZXJzIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgcmV0dXJuIHRydWUgaXMgSEVBRExFU1MuCi0mbHQ7cCZndDsKLUEgSEVBRExFU1MgZW52aXJvbm1lbnQgaXMgdHlwaWNhbGx5IGEgYmF0Y2ggc2l0dWF0aW9uIHdoZXJlIHRoZXJlIGlzIG5vIFVJIGFuZCB0aGUgd29ya3NwYWNlIGlzIHVzZWQgZm9yIG9uZSBvcGVyYXRpb24gYW5kIHRoZW4gdGVybWluYXRlZC4gTW9zdCBoZWFkbGVzcyB0YXNrcyBhcmUgZG9uZSB1bmRlciBvbmUgb3BlcmF0aW9uIGFuZCB0aGUgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgbWF5IG5vdCBoYXZlIGEgY2hhbmNlIHRvIGZsdXNoIGEgYmFkIHJlZmxlY3Rpb24gYmVmb3JlIHRoZSByZWFsIHR5cGUgbmVlZHMgdG8gYmUgZm91bmQgYW5kIGNhbiBiZSBmb3VuZC4gU28gd2hhdCB3b3VsZCBoYXBwZW4gaXMgaWYgYSBjbGFzcyB3YXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvbmUgb3BlcmF0aW9uIGl0IHdvdWxkIG5vdCBiZSBmb3VuZCBiZWNhdXNlIHRoZSBub3RpZmljYXRpb25zIGhhZCBub3QgeWV0IGdvbmUgb3V0LiAKLSZsdDtwJmd0OwotSW4gYSBVSSBlbnZpcm9ubWVudCB0aGUgb3BlcmF0aW9ucyBhcmUgdHlwaWNhbGx5IHNob3J0IGFuZCBkbyBvbmx5IGEgZmV3IHRoaW5ncyBhbmQgdGhlIHJlc3VsdHMgYXJlbiZhcG9zO3QgbmVlZGVkIHVudGlsIGFmdGVyIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4gSW4gdGhhdCBjYXNlIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIG5vdCBrZWVwIGNoZWNraW5nIGlmIGEgY2xhc3MgaGFzIGFwcGVhcmVkIGV2ZXJ5dGltZSBhIHJlcXVlc3QgaXMgbWFkZSwgaW5zdGVhZCBpdCB3aWxsIHdhaXQgZm9yIHRoZSBub3RpZmljYXRpb24gb2YgdGhlIGFkZGVkIGNsYXNzIHRvIGFwcGVhciBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZWZpbml0aW9uIHRvIGFsbG93IGNoZWNraW5nIGFnYWluIGxhdGVyLgotJmx0O3AmZ3Q7Ci1JZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGltcGxlbWVudGVyIG9mIHRoaXMgaW50ZXJmYWNlIGluIHRoZSBhcHBsaWNhdGlvbiwgdGhlbiBpdCB3aWxsIGdvIHRocm91Z2ggZWFjaCBvZiB0aGVtIG9uY2UgdW50aWwgb25lIHJldHVybnMgdHJ1ZS4gQXMgc29vbiBhcyBvbmUgcmV0dXJucyB0cnVlIGl0IHdpbGwgc3RvcCBhbmQgbWFyayB0aGUgYXBwbGljYXRpb24gYXMgYmVpbmcgbm9uLUhFQURMRVNTLiBUaGlzIHdpbGwgYmUgZG9uZSBvbmx5IG9uY2UgZm9yIHRoZSBhcHBsaWNhdGlvbi4gSXQgd2lsbCBub3QgYmUgYWdhaW4gdW50aWwgdGhlIG5leHQgc2Vzc2lvbiBvZiB0aGUgYXBwbGljYXRpb24uCi0mbHQ7cCZndDsKLVRoaXMgaXMgdHlwaWNhbGx5IGFuIGludGVybmFsIGV4dGVuc2lvbiBwb2ludCBvbmx5LiBUaGUgSkVNIFVJIHBsdWdpbiB3aWxsIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBQbGF0Zm9ybSBVSSBpcyBhY3RpdmUuIFNvIHRoaXMgd2lsbCBub3JtYWxseSBub3QgYmUgbmVlZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vc3QgY3VzdG9tZXJzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aVRlc3RlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idWlUZXN0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSB1aVRlc3RlciBkZWZpbml0aW9uIGVsZW1lbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgVUlUZXN0ZXIgZm9yIHRoaXMgZXh0ZW5zaW9uLiBJdCBtdXN0IGltcGxlbWVudCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW1wbGVtZW50ZXI6IAotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0udXRpbC51aVRlc3RlciZxdW90OyZndDsKLSAgJmx0O3VpVGVzdGVyCi0gICBjbGFzc05hbWU9JnF1b3Q7Y29tLmV4YW1wbGUuVUlUZXN0ZXJJbXBsZW1lbnRhdGlvbiZxdW90Oy8mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7Y2xhc3NOYW1lJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgbXVzdCBiZSBhIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmplbS51dGlsLlVJVGVzdGVyJmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UgZm9yIHRoZSB0ZXN0ZXIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZXJlIGlzIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgY2xhc3MuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM1ZTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4NmQyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjAyOTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jRnJpIFNlcCAxMSAxOToyNDo0NyBQRFQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmViNzc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuSnN0Q29tbW9uVUlQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSIxLjEuNDAwIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IjEuMi4wIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5hc3NlbWJseS53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZDViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkF1Z3VzdCwgMjAwOTwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE0N2YwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL2ljb25zL2phcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL2ljb25zL2phcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmExZDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9pY29ucy9qYXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9pY29ucy9tYW5pZmVzdC1jbGFzc3BhdGgtYmFubmVyLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9pY29ucy9tYW5pZmVzdC1jbGFzc3BhdGgtYmFubmVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzZTIwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvaWNvbnMvbWFuaWZlc3QtY2xhc3NwYXRoLWJhbm5lci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvaWNvbnMvdXRpbC13aXotaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzhiMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL2ljb25zL3V0aWwtd2l6LWljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGJhNGIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXI9RWNsaXBzZS5vcmcKLQotQnVuZGxlLU5hbWUuMCA9IENvbW1vbiBKU1QgVUkgUGx1Zy1pbgotQXJjaGl2ZT1BcmNoaXZlcyBmcm9tIFdvcmtzcGFjZQotRXh0ZXJuYWxfQXJjaGl2ZT1BcmNoaXZlcyBmcm9tIEZpbGUgU3lzdGVtCi1WYXJpYWJsZT1BcmNoaXZlIHZpYSBQYXRoIFZhcmlhYmxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmU1OThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KLTxwbHVnaW4+Ci0KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5yZWZlcmVuY2VXaXphcmRGcmFnbWVudCI+Ci0gICAgICAgPHJlZmVyZW5jZUZyYWdtZW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuYXNzZW1ibHkud2l6YXJkLkphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50IgotICAgICAgICAgICAgIGljb249Imljb25zL2phcl9vYmouZ2lmIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmphclJlZmVyZW5jZSIKLSAgICAgICAgICAgICBuYW1lPSIlQXJjaGl2ZSI+Ci0gICAgICAgPC9yZWZlcmVuY2VGcmFnbWVudD4KLSAgICAgICA8cmVmZXJlbmNlRnJhZ21lbnQKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5hc3NlbWJseS53aXphcmQuRXh0ZXJuYWxKYXJSZWZlcmVuY2VXaXphcmRGcmFnbWVudCIKLSAgICAgICAgICAgICBpY29uPSJpY29ucy9qYXJfb2JqLmdpZiIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5leHRlcm5hbEphclJlZmVyZW5jZSIKLSAgICAgICAgICAgICBuYW1lPSIlRXh0ZXJuYWxfQXJjaGl2ZSI+Ci0gICAgICAgPC9yZWZlcmVuY2VGcmFnbWVudD4KLSAgICAgICA8cmVmZXJlbmNlRnJhZ21lbnQKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5hc3NlbWJseS53aXphcmQuVmFyaWFibGVSZWZlcmVuY2VXaXphcmRGcmFnbWVudCIKLSAgICAgICAgICAgICBpY29uPSJpY29ucy9qYXJfb2JqLmdpZiIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS52YXJpYWJsZVJlZmVyZW5jZSIKLSAgICAgICAgICAgICBuYW1lPSIlVmFyaWFibGUiPgotICAgICAgIDwvcmVmZXJlbmNlRnJhZ21lbnQ+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpLnZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyIj4KLSAgICAgICA8cHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuYXNzZW1ibHkud2l6YXJkLkNsYXNzcGF0aENvbnRhaW5lclJlZkxhYmVsUHJvdmlkZXIiIHdlaWdodD0iMyIvPgotICAgIDwvZXh0ZW5zaW9uPiAgICAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL0lKc3RDb21tb25VSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL0lKc3RDb21tb25VSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE0ZmI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9JSnN0Q29tbW9uVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yOiBBaWR5bCBLYXJlaAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKc3RDb21tb25VSUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HU1RPUkVfTEFTVEVYVEFSQ0hJVkU9IEpzdENvbW1vblVJUGx1Z2luLlBMVUdJTl9JRCArICIubGFzdGV4dGFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvSUpzdENvbW1vblVJQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL0lKc3RDb21tb25VSUNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0YWZhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvSUpzdENvbW1vblVJQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yOiBBaWR5bCBLYXJlaAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKc3RDb21tb25VSUNvbnRleHRJZHMgewotCS8vCSBOZXcgcmVmZXJlbmNlcyB3aXphcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZTUVOVF9BU1NFTUJMWV9ORVdfVkFSSUFCTEVfUkVGRVJFTkNFX1AxID0gSnN0Q29tbW9uVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ERVBMT1lNRU5UX0FTU0VNQkxZX05FV19WQVJJQUJMRV9SRUZFUkVOQ0VfUDEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZTUVOVF9BU1NFTUJMWV9ORVdfRVhURVJOQUxfQVJDSElWRV9SRUZFUkVOQ0VfUDEgPSBKc3RDb21tb25VSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkRFUExPWU1FTlRfQVNTRU1CTFlfTkVXX0VYVEVSTkFMX0FSQ0hJVkVfUkVGRVJFTkNFX1AxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlRfQVNTRU1CTFlfTkVXX0FSQ0hJVkVfUkVGRVJFTkNFX1AxID0gSnN0Q29tbW9uVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ERVBMT1lNRU5UX0FTU0VNQkxZX05FV19BUkNISVZFX1JFRkVSRU5DRV9QMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lNRU5UX0FTU0VNQkxZX1BSRUZFUkVOQ0VfUEFHRV9NQU5JRkVTVF9FTlRSSUVTX1RBQiA9IEpzdENvbW1vblVJUGx1Z2luLlBMVUdJTl9JRCArICIuREVQTE9ZTUVOVF9BU1NFTUJMWV9QUkVGRVJFTkNFX1BBR0VfTUFOSUZFU1RfRU5UUklFU19UQUIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvSnN0Q29tbW9uVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9Kc3RDb21tb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2I5ZWYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9Kc3RDb21tb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgSnN0Q29tbW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSnN0Q29tbW9uVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKc3RDb21tb25VSVBsdWdpbigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpzdENvbW1vblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVmZDQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEFyY2hpdmVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEFyY2hpdmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRGlhbG9nTmV3VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZURpYWxvZ05ld0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVJlZmVyZW5jZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhcmlhYmxlUmVmZXJlbmNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRNYW5pZmVzdEVudHJ5VGFza1dpemFyZERlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyZW50UHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21FbnRyeUJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVVcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRG93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5pZmVzdEVudHJ5Q29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmlmZXN0RW50cnlTb3VyY2VDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlUGFyZW50TGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkQXJjaGl2ZXNXYXJuaW5nOwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUgKyAiLm1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL0FkZE1hbmlmZXN0RW50cnlUYXNrV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL0FkZE1hbmlmZXN0RW50cnlUYXNrV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWUzZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9BZGRNYW5pZmVzdEVudHJ5VGFza1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0IGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIG1pc2MuIFVJIGNsZWFudXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuYXNzZW1ibHkud2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5KYXZhTW9kdWxlQ29tcG9uZW50VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLkpzdENvbW1vblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5hc3NlbWJseS53aXphcmQuTWFuaWZlc3RNb2R1bGVEZXBlbmRlbmN5Q29udHJvbC5NYW5pZmVzdExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEdyYXBoaWNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLldpemFyZEZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfUFJPSkVDVCA9ICJQQVJFTlRfUFJPSkVDVCI7IC8vIGRhdGEgbW9kZWwga2V5IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRF9QUk9KRUNUID0gIkNISUxEX1BST0pFQ1QiOyAvLyBkYXRhIG1vZGVsIGtleSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9SRUZFUkVOQ0VTID0gIkNVUlJFTlRfUkVGRVJFTkNFUyI7IC8vIGRhdGEgbW9kZWwga2V5IGZvciByZXR1cm4gdmFsIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk5FRF9SRUZFUkVOQ0VTID0gIlJFVFVSTkVEX1JFRkVSRU5DRVMiOyAvLyBkYXRhIG1vZGVsIGtleSBmb3IgcmV0dXJuIHZhbCAvLyROT04tTkxTLTEkCi0JcHVibGljIEFkZE1hbmlmZXN0RW50cnlUYXNrV2l6YXJkKCkgewotCQlzdXBlcihNZXNzYWdlcy5BZGRNYW5pZmVzdEVudHJ5VGFza1dpemFyZFRpdGxlLCBuZXcgTWFuaWZlc3RSb290RnJhZ21lbnQoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWFuaWZlc3RSb290RnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCQlwcml2YXRlIEJ1dHRvbiBhZGRDdXN0b207Ci0JCXByaXZhdGUgVGV4dCBjdXN0b21FbnRyeVRleHQ7Ci0JCXByb3RlY3RlZCBJUHJvamVjdCBwYXJlbnRQcm9qZWN0LCBjaGlsZFByb2plY3Q7Ci0JCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSBzZWxlY3RlZDsKLQkJcHJpdmF0ZSBTaG93UG9zc2libGVNYW5pZmVzdEVudHJ5Q29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQkJcHJpdmF0ZSBMaW5rIHBhcmVudENvbnRhaW5lckxpbms7Ci0JCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXByaXZhdGUgdm9pZCB1cGRhdGVXaWRnZXRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkKLQkJCXZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgR3JpZExheW91dCBnbGF5b3V0KCBmaW5hbCBpbnQgY29sdW1ucyApCi0JCXsKLQkJCWZpbmFsIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCggY29sdW1ucywgZmFsc2UgKTsKLQkJCWdsLm1hcmdpbldpZHRoID0gMDsKLQkJCWdsLm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkKLQkJCXJldHVybiBnbDsKLQkJfQotCQkKLQkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJCXBhcmVudFByb2plY3QgPSAoSVByb2plY3QpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFBBUkVOVF9QUk9KRUNUKTsKLQkJCWNoaWxkUHJvamVjdCA9IChJUHJvamVjdClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoQ0hJTERfUFJPSkVDVCk7Ci0JCQloYW5kbGUuc2V0VGl0bGUoTWVzc2FnZXMuQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmRUaXRsZSk7Ci0JCQloYW5kbGUuc2V0RGVzY3JpcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmREZXNjLCBwYXJlbnRQcm9qZWN0LmdldE5hbWUoKSkpOwotCQkJaGFuZGxlLnNldEltYWdlRGVzY3JpcHRvcihXb3JrYmVuY2hJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElXb3JrYmVuY2hHcmFwaGljQ29uc3RhbnRzLklNR19XSVpCQU5fRVhQT1JUX1dJWikpOwotCQkJaGFuZGxlLnNldEltYWdlRGVzY3JpcHRvciggQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCBKc3RDb21tb25VSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9tYW5pZmVzdC1jbGFzc3BhdGgtYmFubmVyLnBuZyIgKSApOwotCQkJCi0JCQlDb21wb3NpdGUgcm9vdCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlyb290LnNldExheW91dChnbGF5b3V0KDEpKTsKLQkJCQotCQkJdmlld2VyID0gTWFuaWZlc3RNb2R1bGVEZXBlbmRlbmN5Q29udHJvbC5jcmVhdGVNYW5pZmVzdFJlZmVyZW5jZVRhYmxlVmlld2VyKHJvb3QsIFNXVC5NVUxUSSk7Ci0JCQlmaW5hbCBHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ0RhdGEuaGVpZ2h0SGludCA9IDM1MDsKLQkJCXZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ0RhdGEpOwotCQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNob3dQb3NzaWJsZU1hbmlmZXN0RW50cnlDb250ZW50UHJvdmlkZXIocGFyZW50UHJvamVjdCwgY2hpbGRQcm9qZWN0LCBnZXRUYXNrTW9kZWwoKSk7Ci0JCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTWFuaWZlc3RMYWJlbFByb3ZpZGVyKCkpOwotCQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXZpZXdlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJZmluYWwgQ29tcG9zaXRlIGN1c3RvbUVudHJ5Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShyb290LFNXVC5OT05FKTsKLQkJCWN1c3RvbUVudHJ5Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJY3VzdG9tRW50cnlDb21wb3NpdGUuc2V0TGF5b3V0KGdsYXlvdXQoMikpOwotCQkJCi0JCQljdXN0b21FbnRyeVRleHQgPSBuZXcgVGV4dChjdXN0b21FbnRyeUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCQljdXN0b21FbnRyeVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQljdXN0b21FbnRyeVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZihjdXN0b21FbnRyeVRleHQuZ2V0VGV4dCgpID09IG51bGwgfHwgY3VzdG9tRW50cnlUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCBuZXcgUGF0aChjdXN0b21FbnRyeVRleHQuZ2V0VGV4dCgpLnRyaW0oKSkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJYWRkQ3VzdG9tLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQllbHNlCi0JCQkJCQlhZGRDdXN0b20uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IAotCQkJfSk7Ci0JCQkKLQkJCWFkZEN1c3RvbSA9IG5ldyBCdXR0b24oY3VzdG9tRW50cnlDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCWFkZEN1c3RvbS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCWFkZEN1c3RvbS5zZXRUZXh0KE1lc3NhZ2VzLkN1c3RvbUVudHJ5QnV0dG9uKTsKLQkJCWFkZEN1c3RvbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlhZGRDdXN0b21QcmVzc2VkKCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCQlhZGRDdXN0b20uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkKLQkJCWNyZWF0ZUNvbmZpZ0xpbmsocm9vdCk7Ci0JCQlwYXJlbnRDb250YWluZXJMaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJCi0JCQlyZXR1cm4gcm9vdDsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZEN1c3RvbVByZXNzZWQoKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBNYW5pZmVzdE1vZHVsZURlcGVuZGVuY3lDb250cm9sLmNyZWF0ZUR1bW15UmVmZXJlbmNlKAotCQkJCQluZXcgUGF0aChjdXN0b21FbnRyeVRleHQuZ2V0VGV4dCgpKS50b1N0cmluZygpLCBwYXJlbnRQcm9qZWN0LCBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwYXJlbnRQcm9qZWN0KSk7Ci0JCQljb250ZW50UHJvdmlkZXIuYWRkUG9zc2libGVSZWZlcmVuY2UocmVmKTsKLQkJCWN1c3RvbUVudHJ5VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJYWRkQ3VzdG9tLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHZpZXdlclNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0W10gb2JqID0gc2VsLnRvQXJyYXkoKTsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmV0ID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW29iai5sZW5ndGhdOwotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKysgKSB7Ci0JCQkJcmV0W2ldID0gKElWaXJ0dWFsUmVmZXJlbmNlKW9ialtpXTsKLQkJCX0KLQkJCXNlbGVjdGVkID0gcmV0OwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlnTGluayhDb21wb3NpdGUgYUdyb3VwKXsKLQkJCXBhcmVudENvbnRhaW5lckxpbmsgPSBuZXcgTGluayhhR3JvdXAsU1dULk5vbmUpOwotCQkJcGFyZW50Q29udGFpbmVyTGluay5zZXRUZXh0KCI8QT4iKyAvLyROT04tTkxTLTEkCi0JCQkJCU1lc3NhZ2VzLkNvbmZpZ3VyZVBhcmVudExpbmsrIjwvQT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcGFyZW50Q29udGFpbmVyTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgZG9MaW5rQWN0aXZhdGVkKExpbmsgZSkgewotCQkJCQlJUHJvamVjdCBwYXJlbnRQcm9qZWN0ID0gTWFuaWZlc3RSb290RnJhZ21lbnQudGhpcy5wYXJlbnRQcm9qZWN0OwotCQkJCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByb3BlcnR5RGlhbG9nLmNyZWF0ZURpYWxvZ09uKE1hbmlmZXN0Um9vdEZyYWdtZW50LnRoaXMuZ2V0UGFnZSgpLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCQkJCSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuRGVwbG95bWVudEFzc2VtYmx5UGFnZSIsIHBhcmVudFByb2plY3QpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkaWFsb2cgIT0gbnVsbCkgewotCQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJdXBkYXRlV2lkZ2V0cygpOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGllKSB7Ci0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRvTGlua0FjdGl2YXRlZCgoTGluaykgZS53aWRnZXQpOwkJCQkJCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkb0xpbmtBY3RpdmF0ZWQoKExpbmspIGUud2lkZ2V0KTsJCQkJCQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCX0KLQkJCi0JCQotCQkvLyBqdXN0IHJldHVybiB0aGUgc2VsZWN0ZWQgcmVmcwotCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KFJFVFVSTkVEX1JFRkVSRU5DRVMsIHNlbGVjdGVkKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNob3dQb3NzaWJsZU1hbmlmZXN0RW50cnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBcnJheUNvbnRlbnRQcm92aWRlciB7Ci0JCXByaXZhdGUgSVByb2plY3QgcGFyZW50LCBjaGlsZDsKLQkJcHJpdmF0ZSBUYXNrTW9kZWwgbW9kZWw7Ci0JCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSBwb3NzaWJsZTsKLQkJcHVibGljIFNob3dQb3NzaWJsZU1hbmlmZXN0RW50cnlDb250ZW50UHJvdmlkZXIoSVByb2plY3QgcGFyZW50LCBJUHJvamVjdCBjaGlsZCwgVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmNoaWxkID0gY2hpbGQ7Ci0JCQl0aGlzLm1vZGVsID0gdGFza01vZGVsOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlpZiggcG9zc2libGUgPT0gbnVsbCApIHsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGN1cnJlbnQgPSAoSVZpcnR1YWxSZWZlcmVuY2VbXSltb2RlbC5nZXRPYmplY3QoQ1VSUkVOVF9SRUZFUkVOQ0VTKTsKLQkJCQlwb3NzaWJsZSA9IEphdmFNb2R1bGVDb21wb25lbnRVdGlsaXR5LmZpbmRQb3NzaWJsZU1hbmlmZXN0RW50cmllcyhwYXJlbnQsIGNoaWxkLCBjdXJyZW50KTsKLQkJCX0KLQkJCXJldHVybiBwb3NzaWJsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRQb3NzaWJsZVJlZmVyZW5jZShJVmlydHVhbFJlZmVyZW5jZSByZWYpIHsKLQkJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gbmV3UmVmcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCQluZXdSZWZzLmFkZEFsbChBcnJheXMuYXNMaXN0KHBvc3NpYmxlKSk7Ci0JCQluZXdSZWZzLmFkZChyZWYpOwotCQkJcG9zc2libGUgPSBuZXdSZWZzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW25ld1JlZnMuc2l6ZSgpXSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJaWYgKG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCQlwb3NzaWJsZSA9IG51bGw7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL0NsYXNzcGF0aENvbnRhaW5lclJlZkxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvQ2xhc3NwYXRoQ29udGFpbmVyUmVmTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjM4YThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvQ2xhc3NwYXRoQ29udGFpbmVyUmVmTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLmFzc2VtYmx5LndpemFyZDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLkNsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5Kc3RDb21tb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLklWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIENsYXNzcGF0aENvbnRhaW5lclJlZkxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIENsYXNzcGF0aENvbnRhaW5lclJlZkxhYmVsUHJvdmlkZXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIChjb21wb25lbnQgaW5zdGFuY2VvZiBDbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZVRleHQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoKENsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQpY29tcG9uZW50KS5nZXRDbGFzc3BhdGhDb250YWluZXJQYXRoKCk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQlwdWJsaWMgSW1hZ2UgZ2V0U291cmNlSW1hZ2UoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmKCBpbWFnZSA9PSBudWxsICkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTCggSnN0Q29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIiksICJpY29ucy91dGlsLXdpei1pY29uLmdpZiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQkJaWYoIGltYWdlRGVzY3JpcHRvciAhPSBudWxsICkgCi0JCQkJCWltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQl9IGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUgKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvRXh0ZXJuYWxKYXJSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9FeHRlcm5hbEphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODI0YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9FeHRlcm5hbEphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLmFzc2VtYmx5LndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuSUpzdENvbW1vblVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuSUpzdENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLkpzdENvbW1vblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEV4dGVybmFsSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBKYXJSZWZlcmVuY2VXaXphcmRGcmFnbWVudCB7CQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7Ci0JCUNvbXBvc2l0ZSBjID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgaGFuZGxlKTsKLQkJaGFuZGxlLnNldFRpdGxlKE1lc3NhZ2VzLkV4dGVybmFsQXJjaGl2ZVRpdGxlKTsKLQkJaGFuZGxlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkV4dGVybmFsQXJjaGl2ZURlc2NyaXB0aW9uKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSnN0Q29tbW9uVUlDb250ZXh0SWRzLkRFUExPWU1FTlRfQVNTRU1CTFlfTkVXX0VYVEVSTkFMX0FSQ0hJVkVfUkVGRVJFTkNFX1AxKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZCgpIHsKLQkJc2VsZWN0ZWQgPSBjaG9vc2VFeHRlcm5hbEFyY2hpdmVFbnRyaWVzKGFkZC5nZXRTaGVsbCgpKTsKLQkJCi0JCWlmKHNlbGVjdGVkICE9IG51bGwpIHsKLQkJCXJlbW92ZUludmFsaWRBcmNoaXZlRmlsZXMoKTsKLQkJCi0JCQlmb3IoSVBhdGggcGF0aDogc2VsZWN0ZWQpIHsKLQkJCQlpZighYXJjaGl2ZXMuY29udGFpbnNLZXkocGF0aCkpIHsKLQkJCQkJYXJjaGl2ZXMucHV0KHBhdGgsIHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCWlmKGFyY2hpdmVzICE9IG51bGwgJiYgYXJjaGl2ZXMuc2l6ZSgpID4gMCkgewotCQkJCWlzQ29tcGxldGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlpc0NvbXBsZXRlID0gZmFsc2U7Ci0JCQl9Ci0JCQloYW5kbGUudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlJPT1RfQ09NUE9ORU5UKTsKLQkJU3RyaW5nIHJ1bnRpbWVMb2MgPSAoU3RyaW5nKWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkRFRkFVTFRfTElCUkFSWV9MT0NBVElPTik7Ci0JCWlmIChhcmNoaXZlcyAhPSBudWxsICYmIGFyY2hpdmVzLnNpemUoKSA+IDApIHsKLQkJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmTGlzdCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGFyY2hpdmVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkgICAgCQlJUGF0aCBwYXRoID0gKFBhdGgpaXRlcmF0b3IubmV4dCgpOwotCQkJCS8vIElQYXRoIGZ1bGxQYXRoID0gcHJvamVjdC5nZXRGaWxlKHNlbGVjdGVkW2ldKS5nZXRGdWxsUGF0aCgpOwotCQkJCVN0cmluZyB0eXBlID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUKLQkJCQkJCSsgSVBhdGguU0VQQVJBVE9SOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlCi0JCQkJCQkuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChyb290Q29tcG9uZW50LmdldFByb2plY3QoKSwKLQkJCQkJCQkJdHlwZSArIHBhdGgudG9TdHJpbmcoKSk7Ci0JCQkJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBuZXcgVmlydHVhbFJlZmVyZW5jZShyb290Q29tcG9uZW50LCBhcmNoaXZlKTsKLQkJCQlyZWYuc2V0QXJjaGl2ZU5hbWUocGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJCQlpZiAocnVudGltZUxvYyAhPSBudWxsKSB7Ci0JCQkJCXJlZi5zZXRSdW50aW1lUGF0aChuZXcgUGF0aChydW50aW1lTG9jKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCQkJfQotCQkJCXJlZkxpc3QuYWRkKHJlZik7Ci0JCQl9Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGZpbmFsUmVmcyA9IHJlZkxpc3QudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVmTGlzdC5zaXplKCldKTsKLQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkZJTkFMX1JFRkVSRU5DRSwgZmluYWxSZWZzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUGF0aFtdIGNob29zZUV4dGVybmFsQXJjaGl2ZUVudHJpZXMoU2hlbGwgc2hlbGwpIHsKLQkJU3RyaW5nIGxhc3RVc2VkUGF0aD0gSnN0Q29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkuZ2V0KElKc3RDb21tb25VSUNvbnN0YW50cy5ESUFMT0dTVE9SRV9MQVNURVhUQVJDSElWRSk7Ci0JCWlmIChsYXN0VXNlZFBhdGggPT0gbnVsbCkgewotCQkJbGFzdFVzZWRQYXRoPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlGaWxlRGlhbG9nIGRpYWxvZz0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5NVUxUSSk7Ci0JCWRpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLkFyY2hpdmVEaWFsb2dOZXdUaXRsZSk7Ci0JCVN0cmluZyBbXSBleHRlbnNpb25zID0gbmV3IFN0cmluZ1tdIHsiKi5qYXI7Ki53YXI7Ki5yYXI7Ki56aXAiLCAiKi4qIn07ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgobGFzdFVzZWRQYXRoKTsKLQotCQlTdHJpbmcgcmVzPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGZpbGVOYW1lcz0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQlpbnQgbkNob3Nlbj0gZmlsZU5hbWVzLmxlbmd0aDsKLQotCQlJUGF0aCBmaWx0ZXJQYXRoPSBQYXRoLmZyb21PU1N0cmluZyhkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpKTsKLQkJSVBhdGhbXSBlbGVtcz0gbmV3IElQYXRoW25DaG9zZW5dOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbkNob3NlbjsgaSsrKSB7Ci0JCQllbGVtc1tpXT0gZmlsdGVyUGF0aC5hcHBlbmQoZmlsZU5hbWVzW2ldKS5tYWtlQWJzb2x1dGUoKTsKLQkJfQotCQkKLQkJSnN0Q29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkucHV0KElKc3RDb21tb25VSUNvbnN0YW50cy5ESUFMT0dTVE9SRV9MQVNURVhUQVJDSElWRSwgZGlhbG9nLmdldEZpbHRlclBhdGgoKSk7Ci0JCQotCQlyZXR1cm4gZWxlbXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9KYXJSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9KYXJSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTE5NTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9hc3NlbWJseS93aXphcmQvSmFyUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVkIEhhdCBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBtaXNjLiBVSSBjbGVhbnVwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLmFzc2VtYmx5LndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkZpbHRlcmVkRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuSUpzdENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLkpzdENvbW1vblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEphclJlZmVyZW5jZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZCwgcmVtb3ZlOwotCXByb3RlY3RlZCBJUGF0aFtdIHBhdGhzOwotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIGhhbmRsZTsKLQlwcm90ZWN0ZWQgSVBhdGhbXSBzZWxlY3RlZCA9IG5ldyBJUGF0aFtde307Ci0JcHJvdGVjdGVkIE1hcCA8SVBhdGgsIElQYXRoPiBhcmNoaXZlcyA9IG5ldyBIYXNoTWFwPElQYXRoLCBJUGF0aD4oKTsKLQlib29sZWFuIGlzQ29tcGxldGUgPSBmYWxzZTsKLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBpc0NvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7Ci0JCXRoaXMuaGFuZGxlID0gaGFuZGxlOwotCQloYW5kbGUuc2V0VGl0bGUoTWVzc2FnZXMuQXJjaGl2ZVRpdGxlKTsKLQkJaGFuZGxlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkFyY2hpdmVEZXNjcmlwdGlvbik7Ci0JCWhhbmRsZS5zZXRJbWFnZURlc2NyaXB0b3IoSmF2YVBsdWdpbkltYWdlcy5ERVNDX1dJWkJBTl9BRERfTElCUkFSWSk7Ci0JCQkJCi0JCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSnN0Q29tbW9uVUlDb250ZXh0SWRzLkRFUExPWU1FTlRfQVNTRU1CTFlfTkVXX0FSQ0hJVkVfUkVGRVJFTkNFX1AxKTsKLQkJYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoYywgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29sdW1uID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCQotCQlmaW5hbCBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubWFyZ2luV2lkdGggPSAwOwotCQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCQkKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dCggZ2wgKTsKLQkJCi0JCWFkZCA9IG5ldyBCdXR0b24oYnV0dG9uQ29sdW1uLCBTV1QuTk9ORSk7Ci0JCWFkZC5zZXRUZXh0KE1lc3NhZ2VzLkFkZCk7Ci0JCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0ZvcihhZGQpLmFwcGx5VG8oYWRkKTsKLQkJCi0JCXJlbW92ZSA9IG5ldyBCdXR0b24oYnV0dG9uQ29sdW1uLCBTV1QuTk9ORSk7Ci0JCXJlbW92ZS5zZXRUZXh0KE1lc3NhZ2VzLlJlbW92ZSk7Ci0JCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0ZvcihyZW1vdmUpLmFwcGx5VG8ocmVtb3ZlKTsKLQotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBjOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuUFJPSkVDVCk7Ci0JCXNlbGVjdGVkID0gY2hvb3NlRW50cmllcygKLQkJCQlhZGQuZ2V0U2hlbGwoKSwgCi0JCQkJcHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQotCQlpZihzZWxlY3RlZCAhPSBudWxsKSB7Ci0JCQlyZW1vdmVJbnZhbGlkQXJjaGl2ZUZpbGVzKCk7Ci0JCQotCQkJZm9yKElQYXRoIHBhdGg6IHNlbGVjdGVkKSB7Ci0JCQkJaWYoIWFyY2hpdmVzLmNvbnRhaW5zS2V5KHBhdGgpKSB7Ci0JCQkJCWFyY2hpdmVzLnB1dChwYXRoLCBwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQlpZihhcmNoaXZlcyAhPSBudWxsICYmIGFyY2hpdmVzLnNpemUoKSA+IDApIHsKLQkJCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXNDb21wbGV0ZSA9IGZhbHNlOwotCQkJfQotCQkJaGFuZGxlLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUJ1dHRvblByZXNzZWQoKSB7Ci0JCVRyZWVJdGVtW10gdG9SZW1vdmUgPSB2aWV3ZXIuZ2V0VHJlZSgpLmdldFNlbGVjdGlvbigpOwotCQkKLQkJaWYodG9SZW1vdmUgIT0gbnVsbCAmJiB0b1JlbW92ZS5sZW5ndGggPiAwKSB7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspIHsKLQkJCQlQYXRoIHBhdGggPSAoUGF0aCkgdG9SZW1vdmVbaV0uZ2V0RGF0YSgpOwotCQkJCWlmKGFyY2hpdmVzLmNvbnRhaW5zS2V5KHBhdGgpKSB7Ci0JCQkJCWFyY2hpdmVzLnJlbW92ZShwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQlpZihhcmNoaXZlcyAhPSBudWxsICYmIGFyY2hpdmVzLnNpemUoKSA+IDApIHsKLQkJCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXNDb21wbGV0ZSA9IGZhbHNlOwotCQkJfQotCQkJaGFuZGxlLnVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5ST09UX0NPTVBPTkVOVCk7Ci0JCVN0cmluZyBydW50aW1lTG9jID0gKFN0cmluZylnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5ERUZBVUxUX0xJQlJBUllfTE9DQVRJT04pOwotCQlpZiAoYXJjaGl2ZXMgIT0gbnVsbCAmJiBhcmNoaXZlcy5zaXplKCkgPiAwKSB7Ci0JCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlZkxpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhcmNoaXZlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgIAkJSVBhdGggcGF0aCA9IChQYXRoKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkvLyBJUGF0aCBmdWxsUGF0aCA9IHByb2plY3QuZ2V0RmlsZShzZWxlY3RlZFtpXSkuZ2V0RnVsbFBhdGgoKTsKLQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFCi0JCQkJCQkrIElQYXRoLlNFUEFSQVRPUjsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZQotCQkJCQkJLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQocm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCksCi0JCQkJCQkJCXR5cGUgKyBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOwotCQkJCVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gbmV3IFZpcnR1YWxSZWZlcmVuY2Uocm9vdENvbXBvbmVudCwgYXJjaGl2ZSk7Ci0JCQkJcmVmLnNldEFyY2hpdmVOYW1lKHBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQkJaWYgKHJ1bnRpbWVMb2MgIT0gbnVsbCkgewotCQkJCQlyZWYuc2V0UnVudGltZVBhdGgobmV3IFBhdGgocnVudGltZUxvYykubWFrZUFic29sdXRlKCkpOwotCQkJCX0KLQkJCQlyZWZMaXN0LmFkZChyZWYpOwotCQkJfQotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBmaW5hbFJlZnMgPSByZWZMaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3JlZkxpc3Quc2l6ZSgpXSk7Ci0JCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5GSU5BTF9SRUZFUkVOQ0UsIGZpbmFsUmVmcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZWxlbWVudCA9PSBudWxsID8gIiIgOiBlbGVtZW50LnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIgPSBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGFyY2hpdmVzID09IG51bGwgPyBuZXcgT2JqZWN0W117fSA6IGFyY2hpdmVzLnZhbHVlcygpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBjb250ZW50UHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElQYXRoW10gY2hvb3NlRW50cmllcyhTaGVsbCBzaGVsbCwgSVBhdGggaW5pdGlhbFNlbGVjdGlvbikgewotCQlDbGFzc1tdIGFjY2VwdGVkQ2xhc3Nlcz0gbmV3IENsYXNzW10geyBJRmlsZS5jbGFzcyB9OwotCQlUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IgdmFsaWRhdG9yPSBuZXcgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKGFjY2VwdGVkQ2xhc3NlcywgdHJ1ZSk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3Q9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJRmlsdGVyZWRFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSAgbmV3IEZpbHRlcmVkRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coc2hlbGwsIG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQlkaWFsb2cuc2V0VGl0bGUoTWVzc2FnZXMuQXJjaGl2ZURpYWxvZ05ld1RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuQXJjaGl2ZURpYWxvZ05ld0Rlc2NyaXB0aW9uKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChyb290KTsKLQkJZGlhbG9nLnNldENvbXBhcmF0b3IobmV3IFJlc291cmNlQ29tcGFyYXRvcihSZXNvdXJjZUNvbXBhcmF0b3IuTkFNRSkpOwotCQlkaWFsb2cuc2V0SW5pdGlhbEZpbHRlcigiKi5qYXIsKi53YXIsKi5yYXIsKi56aXAiKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuY3JlYXRlKCk7CQkKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlJUGF0aFtdIHJlcz0gbmV3IElQYXRoW2VsZW1lbnRzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIGVsZW09IChJUmVzb3VyY2UpZWxlbWVudHNbaV07Ci0JCQkJcmVzW2ldPSBlbGVtLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbnZhbGlkQXJjaGl2ZUZpbGVzKCl7Ci0JCS8vIFRyaWVzIHRvIG9wZW4gYXJjaGl2ZSB0byB2ZXJpZnkgaXQncyB2YWxpZAotCQkvLyBJZiBpdCBpcyBub3QgYSB2YWxpZCBhcmNoaXZlLCBhIGRpYWxvZyBpcyBzaG93biBpbmZvcm1pbmcgdGhlIHVzZXIgb2YgdGhlIGludmFsaWQgYXJjaGl2ZXMKLQkJQXJyYXlMaXN0PElQYXRoPiBpbnZhbGlkQXJjaGl2ZUZpbGVzID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oKTsKLQkJQXJyYXlMaXN0PElQYXRoPiB2YWxpZEFyY2hpdmVGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SVBhdGg+KCk7Ci0JCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCWZvcihJUGF0aCBwYXRoOnNlbGVjdGVkKXsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG9zUGF0aCA9IG51bGw7Ci0JCQkJaWYocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpewotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlJUGF0aCBsb2MgPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCQkJCQlpZihsb2MgIT0gbnVsbCkgeyAKLQkJCQkJCQlvc1BhdGggPSBsb2MudG9PU1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG9zUGF0aCA9PSBudWxsKXsKLQkJCQkJb3NQYXRoID0gcGF0aC50b09TU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZShuZXcgRmlsZShvc1BhdGgpKTsKLQkJCQl2YWxpZEFyY2hpdmVGaWxlcy5hZGQocGF0aCk7Ci0JCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZTEpewotCQkJCWludmFsaWRBcmNoaXZlRmlsZXMuYWRkKHBhdGgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpewotCQkJCWludmFsaWRBcmNoaXZlRmlsZXMuYWRkKHBhdGgpOwotCQkJfWZpbmFsbHkgewotCQkJCWlmICh6aXBGaWxlICE9IG51bGwpewotCQkJCQl0cnkgewotCQkJCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKc3RDb21tb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnN0Q29tbW9uVUlQbHVnaW4uUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGludmFsaWRBcmNoaXZlRmlsZXMuc2l6ZSgpID4gMCkgewotCQkJc2VsZWN0ZWQgPSB2YWxpZEFyY2hpdmVGaWxlcy50b0FycmF5KG5ldyBJUGF0aFt2YWxpZEFyY2hpdmVGaWxlcy5zaXplKCldKTsKLQkJCXNob3dJbnZhbGlkQXJjaGl2ZUZpbGVzQXNXYXJuaW5nKGludmFsaWRBcmNoaXZlRmlsZXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaG93SW52YWxpZEFyY2hpdmVGaWxlc0FzV2FybmluZyhBcnJheUxpc3Q8SVBhdGg+aW52YWxpZEFyY2hpdmVGaWxlcykgewotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLkludmFsaWRBcmNoaXZlc1dhcm5pbmc7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IoSVBhdGggcGF0aDogaW52YWxpZEFyY2hpdmVGaWxlcykgewotCQkJaWYoIWZpcnN0KSB7Ci0JCQkJbWVzc2FnZSArPSAiLCBcJyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZSArPSAiXCciOyAvLyROT04tTkxTLTEkCi0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCX0KLQkJCW1lc3NhZ2UgKz0gcGF0aC5sYXN0U2VnbWVudCgpICsgIlwnIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCAiV2FybmluZyIsIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgc3RhdGljIFZpZXdlckZpbHRlciBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBleGNsdWRlZEV4dGVuc2lvbnM9IHsgInR4dCIsICJjc3MiLCAiZGxsIiwgImh0bSIsICJodG1sIiwgImNsYXNzIiwgImphdmEiLCAiY2xhc3NwYXRoIiwgICAgICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJCSJjb21wYXRpYmlsaXR5IiwgImNvbXBvbmVudCIsICJjb250YWluZXIiLCAiY3ZzaWdub3JlIiwgImRlbCIsICJkbngiLCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCQkJCSJkdGQiLCAibWYiLCAicHJvamVjdCIsICJwcm9wZXJ0aWVzIiwgInBzZiIsICJyYyIsICJydW50aW1lIiwgInNoIiwgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCQkic3BlYyIsICJzcWwiLCAidGxkIiwgInhtaSIsICJ4bWwiLCAieHNkIiwgImdpZiIsICJqcGciLCAianMiLCAidnNkIiwgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJAotCQkJCSJwbmciLCAiYmF0IiwgInhzbCIsICJmYWN0b3J5cGF0aCJ9OyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAKLQotCQkJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGV4Y2x1ZGVkRXh0ZW5zaW9uc01hcCA9IG51bGw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYoZXhjbHVkZWRFeHRlbnNpb25zTWFwID09IG51bGwpIHsKLQkJCQkJaW5pdGlhbGl6ZUV4bHVkZU1hcCgpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyBleHQgPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQkJaWYoZXh0ICE9IG51bGwpIHsKLQkJCQkJCWV4dCA9IGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJCQkJaWYoZXhjbHVkZWRFeHRlbnNpb25zTWFwLmdldChleHQpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeyAvLyBJUHJvamVjdCwgSUZvbGRlcgotCQkJCQkvLyBpZ25vcmUgY2xvc2VkIHByb2plY3RzCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QgJiYgISgoSVByb2plY3QpZWxlbWVudCkuaXNPcGVuKCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCS8vIGlnbm9yZSAuc2V0dGluZ3MgZm9sZGVyCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZWxlbWVudDsKLQkJCQkJCWlmIChmb2xkZXIuZ2V0TmFtZSgpLmVxdWFscygiLnNldHRpbmdzIikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUmVzb3VyY2VbXSByZXNvdXJjZXM9ICgoSUNvbnRhaW5lcillbGVtZW50KS5tZW1iZXJzKCk7Ci0JCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJLy8gT25seSBzaG93IGNvbnRhaW5lcnMgdGhhdCBjb250YWluIGFuIGFyY2hpdmUKLQkJCQkJCQlpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50LCByZXNvdXJjZXNbaV0pKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKYXZhUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRXhsdWRlTWFwKCkgewotCQkJCWV4Y2x1ZGVkRXh0ZW5zaW9uc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBleGNsdWRlZEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0JCQkJZXhjbHVkZWRFeHRlbnNpb25zTWFwLnB1dChleGNsdWRlZEV4dGVuc2lvbnNbaV0sIGV4Y2x1ZGVkRXh0ZW5zaW9uc1tpXSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9NYW5pZmVzdE1vZHVsZURlcGVuZGVuY3lDb250cm9sLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL01hbmlmZXN0TW9kdWxlRGVwZW5kZW5jeUNvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3ZGI5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL01hbmlmZXN0TW9kdWxlRGVwZW5kZW5jeUNvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVkIEhhdCBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBtaXNjLiBVSSBjbGVhbnVwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLmFzc2VtYmx5LndpemFyZDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5KYXZhTW9kdWxlQ29tcG9uZW50VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5NYW5pZmVzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpLmludGVybmFsLklKc3RDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLkFic3RyYWN0UmVzb3VyY2VMaXN0VmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTW9kdWxlQ29yZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSVZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWJzdHJhY3RJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLk1vZHVsZUFzc2VtYmx5Um9vdFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE1hbmlmZXN0TW9kdWxlRGVwZW5kZW5jeUNvbnRyb2wgZXh0ZW5kcyBBYnN0cmFjdElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sIHsKLQkKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudDsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcGFyZW50UHJvamVjdDsKLQlwcm90ZWN0ZWQgTW9kdWxlQXNzZW1ibHlSb290UGFnZSBwcm9wUGFnZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uLCBtb3ZlVXBCdXR0b24sIG1vdmVEb3duQnV0dG9uOwotCXByb3RlY3RlZCBDb21ibyBwYXJlbnRTZWxlY3Rpb247Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIG1hbmlmZXN0RW50cnlWaWV3ZXI7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCXByaXZhdGUgU3RyaW5nIHByZXZpb3VzTWFuaWZlc3QgPSBudWxsOwotCQotCXB1YmxpYyBNYW5pZmVzdE1vZHVsZURlcGVuZGVuY3lDb250cm9sKGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0JCQlmaW5hbCBNb2R1bGVBc3NlbWJseVJvb3RQYWdlIHBhZ2UpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5wcm9wUGFnZSA9IHBhZ2U7Ci0JCXJvb3RDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBHcmlkTGF5b3V0IGdsYXlvdXQoIGZpbmFsIGludCBjb2x1bW5zICkKLQl7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCggY29sdW1ucywgZmFsc2UgKTsKLQkJZ2wubWFyZ2luV2lkdGggPSAwOwotCQlnbC5tYXJnaW5IZWlnaHQgPSAwOwotCQkKLQkJcmV0dXJuIGdsOwotCX0KLQkKLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHJvb3QgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJvb3QsIElKc3RDb21tb25VSUNvbnRleHRJZHMuREVQTE9ZTUVOVF9BU1NFTUJMWV9QUkVGRVJFTkNFX1BBR0VfTUFOSUZFU1RfRU5UUklFU19UQUIpOwotCQlyb290LnNldExheW91dChnbGF5b3V0KDEpKTsKLQkJCi0JCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnRTZWxlY3Rpb25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCByb290LCBTV1QuTk9ORSApOwotCQlwYXJlbnRTZWxlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotCQlwYXJlbnRTZWxlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0KCBnbGF5b3V0KCAyICkgKTsKLQkJCi0JCUxhYmVsIGwgPSBuZXcgTGFiZWwocGFyZW50U2VsZWN0aW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWwuc2V0VGV4dChNZXNzYWdlcy5QYXJlbnRQcm9qZWN0KTsKLQkJbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCi0JCXBhcmVudFNlbGVjdGlvbiA9IG5ldyBDb21ibyhwYXJlbnRTZWxlY3Rpb25Db21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlwYXJlbnRTZWxlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXBhcmVudFNlbGVjdGlvbi5zZXRJdGVtcyhnZXRQb3NzaWJsZVBhcmVudFByb2plY3RzKCkpOwotCQlwYXJlbnRTZWxlY3Rpb24uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlyZWZyZXNoVmlld2VyRnJvbU5ld1BhcmVudFByb2plY3QoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlmaW5hbCBDb21wb3NpdGUgbWFuaWZlc3RFbnRyeVZpZXdlckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHJvb3QsIFNXVC5OT05FICk7Ci0JCWZpbmFsIEdyaWREYXRhIG1hbmlmZXN0RW50cnlWaWV3ZXJDb21wb3NpdGVMYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0JPVEggKTsKLQkJbWFuaWZlc3RFbnRyeVZpZXdlckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBtYW5pZmVzdEVudHJ5Vmlld2VyQ29tcG9zaXRlTGF5b3V0RGF0YSApOwotCQltYW5pZmVzdEVudHJ5Vmlld2VyQ29tcG9zaXRlLnNldExheW91dCggZ2xheW91dCggMiApICk7Ci0JCQotCQltYW5pZmVzdEVudHJ5Vmlld2VyID0gY3JlYXRlTWFuaWZlc3RSZWZlcmVuY2VUYWJsZVZpZXdlcihtYW5pZmVzdEVudHJ5Vmlld2VyQ29tcG9zaXRlLCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpbnQgbnVtbGluZXMgPSBNYXRoLm1pbigxMCwgbWFuaWZlc3RFbnRyeVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gbWFuaWZlc3RFbnRyeVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIG51bWxpbmVzOwotCQltYW5pZmVzdEVudHJ5Vmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25Db2x1bW4gPSBuZXcgQ29tcG9zaXRlKG1hbmlmZXN0RW50cnlWaWV3ZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dChnbGF5b3V0KCAxICkpOwotCQkKLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db2x1bW4sIFNXVC5QVVNIKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuQWRkKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKGFkZEJ1dHRvbikuYXBwbHlUbyhhZGRCdXR0b24pOwotCQkKLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db2x1bW4sIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuUmVtb3ZlKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKHJlbW92ZUJ1dHRvbikuYXBwbHlUbyhyZW1vdmVCdXR0b24pOwotCQkKLQkJbW92ZVVwQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db2x1bW4sIFNXVC5QVVNIKTsKLQkJbW92ZVVwQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuTW92ZVVwKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKG1vdmVVcEJ1dHRvbikuYXBwbHlUbyhtb3ZlVXBCdXR0b24pOwotCQkKLQkJbW92ZURvd25CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbHVtbiwgU1dULlBVU0gpOwotCQltb3ZlRG93bkJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLk1vdmVEb3duKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKG1vdmVEb3duQnV0dG9uKS5hcHBseVRvKG1vdmVEb3duQnV0dG9uKTsKLQkJCi0JCUlGaWxlIG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3RJRmlsZShyb290Q29tcG9uZW50KTsKLQkJaWYobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlwcmV2aW91c01hbmlmZXN0ID0gbWFuaWZlc3QuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQltb3ZlVXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCW1vdmVEb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRQcmVzc2VkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVQcmVzc2VkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJbW92ZVVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb3ZlVXAoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQltb3ZlRG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW92ZURvd24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbWFuaWZlc3RFbnRyeVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBNYW5pZmVzdExhYmVsUHJvdmlkZXIoKSk7Ci0JCW1hbmlmZXN0RW50cnlWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBNYW5pZmVzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJbWFuaWZlc3RFbnRyeVZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCQlwYXJlbnRTZWxlY3Rpb24uc2VsZWN0KDApOwotCQkKLQkJbWFuaWZlc3RFbnRyeVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXZpZXdlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy9lbnN1cmUgdGhlIGJ1dHRvbnMgYXJlIHByb3Blcmx5IHVwZGF0ZWQgd2hlbiB0YWJsZSBzb3J0IG1vZGUgdG9nZ2xlZAotCQltYW5pZmVzdEVudHJ5Vmlld2VyLmdldFRhYmxlKCkuZ2V0Q29sdW1uKDApLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQkvL2Vuc3VyZSB0aGUgYnV0dG9ucyBhcmUgcHJvcGVybHkgdXBkYXRlZCB3aGVuIHRhYmxlIHNvcnQgbW9kZSB0b2dnbGVkCi0JCW1hbmlmZXN0RW50cnlWaWV3ZXIuZ2V0VGFibGUoKS5nZXRDb2x1bW4oMSkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiByb290OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2aWV3ZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCWlmKCFhZGRCdXR0b24uaXNFbmFibGVkKCkpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1vdmVVcEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1vdmVEb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaW50IGluZGV4ID0gbWFuaWZlc3RFbnRyeVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlpbnQgc2l6ZSA9IG1hbmlmZXN0RW50cnlWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpLmxlbmd0aDsKLQkJCWJvb2xlYW4gc29ydGVkID0gbWFuaWZlc3RFbnRyeVZpZXdlci5nZXRUYWJsZSgpLmdldFNvcnREaXJlY3Rpb24oKSAhPSBTV1QuTk9ORTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGluZGV4ICE9IC0xKTsKLQkJCW1vdmVVcEJ1dHRvbi5zZXRFbmFibGVkKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IDAgJiYgIXNvcnRlZCk7Ci0JCQltb3ZlRG93bkJ1dHRvbi5zZXRFbmFibGVkKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IHNpemUtMSAmJiAhc29ydGVkKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlVXAoKSB7Ci0JCWludCBpbmRleCA9IG1hbmlmZXN0RW50cnlWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBsaXN0LnJlbW92ZShpbmRleCk7Ci0JCWxpc3QuYWRkKGluZGV4LTEscmVmKTsKLQkJcmVmcmVzaFZpZXdlcigpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIG1vdmVEb3duKCkgewotCQlpbnQgaW5kZXggPSBtYW5pZmVzdEVudHJ5Vmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gbGlzdC5yZW1vdmUoaW5kZXgpOwotCQlsaXN0LmFkZChpbmRleCsxLHJlZik7Ci0JCXJlZnJlc2hWaWV3ZXIoKTsKLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVzc2VkKCkgewotCQlBZGRNYW5pZmVzdEVudHJ5VGFza1dpemFyZCB3aXphcmQgPSBuZXcgQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmQoKTsKLQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChBZGRNYW5pZmVzdEVudHJ5VGFza1dpemFyZC5DSElMRF9QUk9KRUNULCBwcm9qZWN0KTsKLQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChBZGRNYW5pZmVzdEVudHJ5VGFza1dpemFyZC5QQVJFTlRfUFJPSkVDVCwgcGFyZW50UHJvamVjdCk7Ci0JCXdpemFyZC5nZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmQuQ1VSUkVOVF9SRUZFUkVOQ0VTLCBsaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2xpc3Quc2l6ZSgpXSkpOwotCQlXaXphcmREaWFsb2cgd2QgPSBuZXcgV2l6YXJkRGlhbG9nKGFkZEJ1dHRvbi5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlpZiggd2Qub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmV0ID0gKElWaXJ0dWFsUmVmZXJlbmNlW10pd2l6YXJkLmdldFRhc2tNb2RlbCgpLmdldE9iamVjdChBZGRNYW5pZmVzdEVudHJ5VGFza1dpemFyZC5SRVRVUk5FRF9SRUZFUkVOQ0VTKTsKLQkJCWlmIChyZXQgIT0gbnVsbCkKLQkJCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHJldCkpOwotCQkJcmVmcmVzaFZpZXdlcigpOwotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJlc3NlZCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW1hbmlmZXN0RW50cnlWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGkgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCWxpc3QucmVtb3ZlKGkubmV4dCgpKTsKLQkJfQotCQlyZWZyZXNoVmlld2VyKCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYW5pZmVzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlcltdIGRlbGVnYXRlczsKLQkJcHJvdGVjdGVkIHZvaWQgZ2V0RGVsZWdhdGVzKCkgewotCQkJaWYoIGRlbGVnYXRlcyA9PSBudWxsICkKLQkJCQlkZWxlZ2F0ZXMgPSBEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIubG9hZERlbGVnYXRlcygpOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlnZXREZWxlZ2F0ZXMoKTsKLQkJCWlmKCBjb2x1bW5JbmRleCA9PSAxICkgewotCQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UgKSB7Ci0JCQkJCWZvciggaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLmxlbmd0aDsgaSsrICkKLQkJCQkJCWlmKCBkZWxlZ2F0ZXNbaV0uY2FuSGFuZGxlKCgoSVZpcnR1YWxSZWZlcmVuY2UpZWxlbWVudCkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKSkKLQkJCQkJCQlyZXR1cm4gZGVsZWdhdGVzW2ldLmdldFNvdXJjZUltYWdlKCgoSVZpcnR1YWxSZWZlcmVuY2UpZWxlbWVudCkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gTW9kdWxlQ29yZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImphcl9vYmoiKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UgKSB7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gKElWaXJ0dWFsUmVmZXJlbmNlKWVsZW1lbnQ7Ci0JCQkJaWYoIGNvbHVtbkluZGV4ID09IDAgJiYgcmVmLmdldEFyY2hpdmVOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlpZihyZWYuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkKLQkJCQkJCXJldHVybiByZWYuZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQocmVmLmdldEFyY2hpdmVOYW1lKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiByZWYuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQl9Ci0JCQkJaWYoIGNvbHVtbkluZGV4ID09IDEgKQotCQkJCQlyZXR1cm4gaGFuZGxlU291cmNlVGV4dChyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwcml2YXRlIFN0cmluZyBoYW5kbGVTb3VyY2VUZXh0KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQkJZ2V0RGVsZWdhdGVzKCk7Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5sZW5ndGg7IGkrKyApCi0JCQkJaWYoIGRlbGVnYXRlc1tpXS5jYW5IYW5kbGUoY29tcG9uZW50KSkKLQkJCQkJcmV0dXJuIGRlbGVnYXRlc1tpXS5nZXRTb3VyY2VUZXh0KGNvbXBvbmVudCk7Ci0KLQkJCS8vIGRlZmF1bHQgaW1wbAotCQkJaWYoIGNvbXBvbmVudC5pc0JpbmFyeSgpICkgewotCQkJCUlQYXRoIHAgPSAoSVBhdGgpY29tcG9uZW50LmdldEFkYXB0ZXIoSVBhdGguY2xhc3MpOwotCQkJCXJldHVybiBwID09IG51bGwgPyBudWxsIDogcC50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIGNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgTWFuaWZlc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiByZWZzRm9yQ3VycmVudFByb2plY3QgPT0gbnVsbCA/IG5ldyBPYmplY3RbXXt9IDogcmVmc0ZvckN1cnJlbnRQcm9qZWN0OwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByb3ZpZGVzIHRocmVlIHBvc3NpYmxlIHNvcnRzIGZvciBlYWNoIGNvbHVtbiBiYXNlZCBvbiB0aGUgdGV4dCBsYWJlbHMuCi0JICogRmlyc3QgY2xpY2sgb24gYW55IGNvbHVtbiB3aWxsIGVuYWJsZSBmb3J3YXJkIHNvcnRpbmcgZm9yIHRoYXQgY29sdW1uLAotCSAqIHNlY29uZCBjbGljayBvbiBhIGNvbHVtbiB3aWxsIGVuYWJsZSBiYWNrd2FyZHMgc29ydGluZywgYW5kIHRoaXJkIGNsaWNrCi0JICogd2lsbCBkaXNhYmxlIHNvcnRpbmcuCi0JICogQGF1dGhvciBqc2hvbGwKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWJsZVZpZXdlckNvbHVtblNvcnRUb2dnbGVyIHsKLQkJcHJpdmF0ZSBpbnQgc29ydERpcmVjdGlvbiA9IDA7Ci0JCXByaXZhdGUgaW50IHNvcnRDb2x1bW4gPSAwOwotCQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCQkKLQkJcHJpdmF0ZSBUYWJsZVZpZXdlckNvbHVtblNvcnRUb2dnbGVyKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKXsKLQkJCXRoaXMudGFibGVWaWV3ZXIgPSB0YWJsZVZpZXdlcjsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHRvZ2dsZVNvcnQoaW50IGNvbHVtbil7Ci0JCQlpZihzb3J0Q29sdW1uID09IGNvbHVtbil7Ci0JCQkJLy9jeWNsZSB0aHJvdWdoIHNvcnQgb3B0aW9ucwotCQkJCXN3aXRjaChzb3J0RGlyZWN0aW9uKXsKLQkJCQljYXNlIFNXVC5OT05FOgotCQkJCQlzb3J0RGlyZWN0aW9uID0gU1dULlVQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5VUDoKLQkJCQkJc29ydERpcmVjdGlvbiA9IFNXVC5ET1dOOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5ET1dOOgotCQkJCQlzb3J0RGlyZWN0aW9uID0gU1dULk5PTkU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy9jbGlja2VkIG9uIGEgZGlmZmVyZW50IGNvbHVtbiByZXNldCBjeWNsZQotCQkJCXNvcnRDb2x1bW4gPSBjb2x1bW47Ci0JCQkJc29ydERpcmVjdGlvbiA9IFNXVC5VUDsKLQkJCX0KLQkJCQotCQkJVmlld2VyQ29tcGFyYXRvciBjb21wYXJhdG9yID0gZ2V0Vmlld2VyQ29tcGFyYXRvcihjb2x1bW4sIHNvcnREaXJlY3Rpb24pOwotCQkJdGFibGVWaWV3ZXIuc2V0Q29tcGFyYXRvcihjb21wYXJhdG9yKTsKLQkJCQotCQkJVGFibGUgdGFibGUgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQkJVGFibGVDb2x1bW4gc29ydENvbHVtbiA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0Q29sdW1uKGNvbHVtbik7Ci0JCQl0YWJsZS5zZXRTb3J0Q29sdW1uKHNvcnRDb2x1bW4pOwotCQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihzb3J0RGlyZWN0aW9uKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBWaWV3ZXJDb21wYXJhdG9yIGdldFZpZXdlckNvbXBhcmF0b3IoZmluYWwgaW50IGNvbHVtbkluZGV4LCBmaW5hbCBpbnQgc29ydERpcmVjdGlvbikgewotCQkJaWYoc29ydERpcmVjdGlvbiA9PSBTV1QuTk9ORSl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0JCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyTG9jYWwsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJCUlCYXNlTGFiZWxQcm92aWRlciBiYXNlTGFiZWxQcm92aWRlciA9IHRhYmxlVmlld2VyLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQkJaWYoYmFzZUxhYmVsUHJvdmlkZXIgaW5zdGFuY2VvZiBJVGFibGVMYWJlbFByb3ZpZGVyKXsKLQkJCQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgdGFibGVMYWJlbFByb3ZpZGVyID0gKElUYWJsZUxhYmVsUHJvdmlkZXIpYmFzZUxhYmVsUHJvdmlkZXI7Ci0JCQkJCQlTdHJpbmcgdGV4dDEgPSB0YWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlMSwgY29sdW1uSW5kZXgpOwotCQkJCQkJaWYodGV4dDEgIT0gbnVsbCl7Ci0JCQkJCQkJU3RyaW5nIHRleHQyID0gdGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZTIsIGNvbHVtbkluZGV4KTsKLQkJCQkJCQlpbnQgY29tcCA9IGNvbGxhdG9yLmNvbXBhcmUodGV4dDEsIHRleHQyKTsKLQkJCQkJCQlpZihzb3J0RGlyZWN0aW9uID09IFNXVC5ET1dOKXsKLQkJCQkJCQkJY29tcCA9IC1jb21wOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gY29tcDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZU1hbmlmZXN0UmVmZXJlbmNlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCWludCBmbGFncyA9IFNXVC5CT1JERVIgfCBzdHlsZTsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIGZsYWdzKTsKLQkJVGFibGVWaWV3ZXIgdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZmluYWwgVGFibGVWaWV3ZXJDb2x1bW5Tb3J0VG9nZ2xlciBzb3J0Q29udHJvbGxlciA9IG5ldyBUYWJsZVZpZXdlckNvbHVtblNvcnRUb2dnbGVyKHZpZXdlcik7Ci0JCQotCQkvLyBzZXQgdXAgdGFibGUgbGF5b3V0Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyMDAsIHRydWUpKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkKLQkJLy8gdGFibGUgY29sdW1ucwotCQlUYWJsZUNvbHVtbiBmaWxlTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotCQlmaWxlTmFtZUNvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLk1hbmlmZXN0RW50cnlDb2x1bW4pOwotCQlmaWxlTmFtZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWZpbGVOYW1lQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0Q29udHJvbGxlci50b2dnbGVTb3J0KDApOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJVGFibGVDb2x1bW4gcHJvamVjdENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDEpOwotCQlwcm9qZWN0Q29sdW1uLnNldFRleHQoTWVzc2FnZXMuTWFuaWZlc3RFbnRyeVNvdXJjZUNvbHVtbik7Ci0JCXByb2plY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQlwcm9qZWN0Q29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0Q29udHJvbGxlci50b2dnbGVTb3J0KDEpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZUxheW91dC5sYXlvdXQodGFibGUsIHRydWUpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzRm9yQ3VycmVudFByb2plY3Q7Ci0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlckZyb21OZXdQYXJlbnRQcm9qZWN0KCkgewotCQlsaXN0LmNsZWFyKCk7Ci0JCVN0cmluZyBwYXJlbnRTdHJpbmcgPSBwYXJlbnRTZWxlY3Rpb24uZ2V0VGV4dCgpOwotCQlyZWZzRm9yQ3VycmVudFByb2plY3QgPSBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbXXt9OwotCQlpZiggcGFyZW50U3RyaW5nICE9IG51bGwgJiYgISIiLmVxdWFscyhwYXJlbnRTdHJpbmcpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXBhcmVudFByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGFyZW50U3RyaW5nKTsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gY3VycmVudCAgPSBKYXZhTW9kdWxlQ29tcG9uZW50VXRpbGl0eS5maW5kQ3VycmVudE1hbmlmZXN0RW50cmllcyhwYXJlbnRQcm9qZWN0LCBwcm9qZWN0KTsKLQkJCXJlZnNGb3JDdXJyZW50UHJvamVjdCA9IHNvcnRSZWZzRm9yQ3VycmVudFByb2plY3QoYWRkTWlzc2luZ0R1bW15RW50cmllcyhjdXJyZW50KSk7Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IHJlZnNGb3JDdXJyZW50UHJvamVjdC5sZW5ndGg7IGkrKyApIHsKLQkJCQlsaXN0LmFkZChyZWZzRm9yQ3VycmVudFByb2plY3RbaV0pOwotCQkJfQotCQl9Ci0JCW1hbmlmZXN0RW50cnlWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gc29ydFJlZnNGb3JDdXJyZW50UHJvamVjdChJVmlydHVhbFJlZmVyZW5jZVtdIGN1cnJlbnRSZWZzKSB7Ci0JCUlGaWxlIG1hbmlmZXN0RmlsZSA9IGdldE1hbmlmZXN0SUZpbGUocm9vdENvbXBvbmVudCk7Ci0JCWlmIChtYW5pZmVzdEZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBjdXJyZW50UmVmczsKLQkJCi0JCUhhc2hNYXA8U3RyaW5nLCBJVmlydHVhbFJlZmVyZW5jZT4gdW5zb3J0ZWRSZWZNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjdXJyZW50UmVmc1tpXTsKLQkJCVN0cmluZyBlbnRyeU5hbWU7Ci0JCQlpZihyZWYuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkKLQkJCQllbnRyeU5hbWUgPSByZWYuZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQocmVmLmdldEFyY2hpdmVOYW1lKCkpLnRvU3RyaW5nKCk7Ci0JCQllbHNlCi0JCQkJZW50cnlOYW1lID0gcmVmLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQl1bnNvcnRlZFJlZk1hcC5wdXQoZW50cnlOYW1lLCByZWYpOwotCQl9Ci0JCUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHNvcnRlZFJlZnMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCQlBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QgPSBNYW5pZmVzdFV0aWxpdGllcy5nZXRNYW5pZmVzdChtYW5pZmVzdEZpbGUpOwotCQlTdHJpbmdbXSBlbnRyaWVzID0gbWFuaWZlc3QuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gdW5zb3J0ZWRSZWZNYXAuZ2V0KGVudHJpZXNbaV0pOwotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJc29ydGVkUmVmcy5hZGQocmVmKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc29ydGVkUmVmcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtzb3J0ZWRSZWZzLnNpemUoKV0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VyKCkgewotCQlyZWZzRm9yQ3VycmVudFByb2plY3QgPSBsaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2xpc3Quc2l6ZSgpXSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaW50IG51bWxpbmVzID0gTWF0aC5taW4oMTAsIG1hbmlmZXN0RW50cnlWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IG1hbmlmZXN0RW50cnlWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtSGVpZ2h0KCkgKiBudW1saW5lczsKLQkJbWFuaWZlc3RFbnRyeVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW1hbmlmZXN0RW50cnlWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2VbXSBhZGRNaXNzaW5nRHVtbXlFbnRyaWVzKElWaXJ0dWFsUmVmZXJlbmNlW10gY3VycmVudCkgewotCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSBnZXRNYW5pZmVzdElGaWxlKHJvb3RDb21wb25lbnQpOwotCQlpZiggbWFuaWZlc3RGaWxlICE9IG51bGwgKSB7Ci0JCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlZnMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCQkJcmVmcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjdXJyZW50KSk7Ci0JCQlBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QgPSBNYW5pZmVzdFV0aWxpdGllcy5nZXRNYW5pZmVzdChtYW5pZmVzdEZpbGUpOwotCQkJU3RyaW5nW10gZW50cmllcyA9IG1hbmlmZXN0LmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQkJU3RyaW5nW10gdW51c2VkRW50cmllcyA9IGZpbmRVbnVzZWRFbnRyaWVzKGN1cnJlbnQsIGVudHJpZXMpOwotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCB1bnVzZWRFbnRyaWVzLmxlbmd0aDsgaSsrICkgewotCQkJCXJlZnMuYWRkKGNyZWF0ZUR1bW15UmVmZXJlbmNlKHVudXNlZEVudHJpZXNbaV0pKTsKLQkJCX0KLQkJCXJldHVybiByZWZzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3JlZnMuc2l6ZSgpXSk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnQ7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRHVtbXlWaXJ0dWFsQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUxpc3RWaXJ0dWFsQ29tcG9uZW50IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX0ZJUlNUX1NFR01FTlQgPSAiZHVtbXlWaXJ0dWFsQ29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgRHVtbXlWaXJ0dWFsQ29tcG9uZW50KElQcm9qZWN0IHAsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jaW5nQ29tcG9uZW50KSB7Ci0JCQlzdXBlcihwLCByZWZlcmVuY2luZ0NvbXBvbmVudCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0SWRTZWdtZW50KCkgewotCQkJcmV0dXJuIERVTU1ZX0ZJUlNUX1NFR01FTlQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSUNvbnRhaW5lcltdIGdldFVuZGVybHlpbmdDb250YWluZXJzKCkgewotCQkJcmV0dXJuIG5ldyBJQ29udGFpbmVyW117fTsKLQkJfQotCi0JCXByb3RlY3RlZCBJUmVzb3VyY2VbXSBnZXRMb29zZVJlc291cmNlcygpIHsKLQkJCXJldHVybiBuZXcgSVJlc291cmNlW117fTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlIGNyZWF0ZUR1bW15UmVmZXJlbmNlKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBjcmVhdGVEdW1teVJlZmVyZW5jZShwYXRoLCBwYXJlbnRQcm9qZWN0LCBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwYXJlbnRQcm9qZWN0KSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2UgY3JlYXRlRHVtbXlSZWZlcmVuY2UoU3RyaW5nIHBhdGgsIElQcm9qZWN0IHByb2plY3QsIElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG5ldyBEdW1teVZpcnR1YWxDb21wb25lbnQocHJvamVjdCwgcm9vdENvbXBvbmVudCk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKHJvb3RDb21wb25lbnQsIGNvbXApOwotCQlpZihwYXRoLmluZGV4T2YoIlxcIikgPiAwKSB7Ci0JCQlyZWYuc2V0UnVudGltZVBhdGgobmV3IFBhdGgoIiIpKTsKLQkJCXJlZi5zZXRBcmNoaXZlTmFtZShwYXRoKTsKLQkJCXJldHVybiByZWY7Ci0JCX0KLQkJSVBhdGggcGF0aDIgPSBuZXcgUGF0aChwYXRoLnRyaW0oKSk7Ci0JCUlQYXRoIHJ1bnRpbWVQYXRoID0gcGF0aDIuc2VnbWVudENvdW50KCkgPiAxID8gcGF0aDIucmVtb3ZlTGFzdFNlZ21lbnRzKDEpIDogbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQlyZWYuc2V0UnVudGltZVBhdGgocnVudGltZVBhdGgpOwotCQlyZWYuc2V0QXJjaGl2ZU5hbWUocGF0aDIubGFzdFNlZ21lbnQoKSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZmluZFVudXNlZEVudHJpZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSBjdXJyZW50LCBTdHJpbmdbXSBlbnRyaWVzKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbnRyaWVzKSk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgY3VycmVudC5sZW5ndGg7IGkrKyApIHsKLQkJCVN0cmluZyBjdXJyZW50RW50cnkgPSBjdXJyZW50W2ldLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGN1cnJlbnRbaV0uZ2V0QXJjaGl2ZU5hbWUoKSkudG9TdHJpbmcoKTsKLQkJCWxpc3QucmVtb3ZlKGN1cnJlbnRFbnRyeSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENsaWVudHMgd2hvIGZpbmQgdGhpcyB1bmFjY2VwdGFibGUgc2hvdWxkIG92ZXJyaWRlCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElGaWxlIGdldE1hbmlmZXN0SUZpbGUoSVZpcnR1YWxDb21wb25lbnQgcm9vdCkgewotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gcm9vdC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsRmlsZSB2ZiA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSk7Ci0JCWlmKCB2Zi5leGlzdHMoKSApCi0JCQlyZXR1cm4gdmYuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQb3NzaWJsZVBhcmVudFByb2plY3RzKCkgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gSmF2YU1vZHVsZUNvbXBvbmVudFV0aWxpdHkuZmluZFBhcmVudFByb2plY3RzKHByb2plY3QpOwotCQlTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1twcm9qZWN0cy5sZW5ndGhdOwotCQlmb3IoIGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrICkgewotCQkJc3RyaW5nc1tpXSA9IHByb2plY3RzW2ldLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nczsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaWYoYWRkQnV0dG9uICE9IG51bGwgJiYgYWRkQnV0dG9uLmlzRW5hYmxlZCgpKSB7Ci0JCQlJRGF0YU1vZGVsIHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1FUkdFLCBmYWxzZSk7Ci0JCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSwgZ2V0TWFuaWZlc3RJRmlsZShyb290Q29tcG9uZW50KSk7Ci0JCQlBcnJheUxpc3Q8U3RyaW5nPiBhc1N0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUl0ZXJhdG9yPElWaXJ0dWFsUmVmZXJlbmNlPiBpID0gbGlzdC5pdGVyYXRvcigpOwotCQkJSVZpcnR1YWxSZWZlcmVuY2UgdG1wOwotCQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCQl0bXAgPSBpLm5leHQoKTsKLQkJCQlpZih0bXAuZ2V0QXJjaGl2ZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCWlmKHRtcC5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwICkKLQkJCQkJCWFzU3RyaW5ncy5hZGQodG1wLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKHRtcC5nZXRBcmNoaXZlTmFtZSgpKS50b1N0cmluZygpKTsKLQkJCQkJZWxzZQotCQkJCQkJYXNTdHJpbmdzLmFkZCh0bXAuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNULCBhc1N0cmluZ3MpOwotCQkJdHJ5IHsKLQkJCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsICk7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gbG9nIEoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcmVmcmVzaFZpZXdlckZyb21OZXdQYXJlbnRQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCUlGaWxlIG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3RJRmlsZShyb290Q29tcG9uZW50KTsKLQkJaWYobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJcHJldmlvdXNNYW5pZmVzdCA9IG51bGw7Ci0JCQlhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlwZXJmb3JtRGVmYXVsdHMoKTsKLQkJfSBlbHNlIHsKLQkJCWlmKHByZXZpb3VzTWFuaWZlc3QgPT0gbnVsbCkgewotCQkJCXBlcmZvcm1EZWZhdWx0cygpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgY3VycmVudE1hbmlmZXN0ID0gbWFuaWZlc3QuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCQkJaWYoIXByZXZpb3VzTWFuaWZlc3QuZXF1YWxzKGN1cnJlbnRNYW5pZmVzdCkpIHsKLQkJCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCQkJfQotCQkJfQotCQkJcHJldmlvdXNNYW5pZmVzdCA9IG1hbmlmZXN0LmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOwotCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkKLQkJfQotCQl1cGRhdGVCdXR0b25zKCk7Ci0JCXBlcmZvcm1PaygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL2Fzc2VtYmx5L3dpemFyZC9WYXJpYWJsZVJlZmVyZW5jZVdpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL1ZhcmlhYmxlUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzY2RjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vdWkvaW50ZXJuYWwvYXNzZW1ibHkvd2l6YXJkL1ZhcmlhYmxlUmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVkIEhhdCBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBtaXNjLiBVSSBjbGVhbnVwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuYXNzZW1ibHkud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuYnVpbGRwYXRocy5DUFZhcmlhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5idWlsZHBhdGhzLkNQVmFyaWFibGVFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5JSnN0Q29tbW9uVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24udWkuaW50ZXJuYWwuSnN0Q29tbW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVmFyaWFibGVSZWZlcmVuY2VXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJvdGVjdGVkIElQYXRoW10gcGF0aHM7Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgaGFuZGxlOwotCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCWJvb2xlYW4gaXNDb21wbGV0ZSA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGlzQ29tcGxldGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJdGhpcy5oYW5kbGUgPSBoYW5kbGU7Ci0JCWhhbmRsZS5zZXRUaXRsZShNZXNzYWdlcy5WYXJpYWJsZVJlZmVyZW5jZVRpdGxlKTsKLQkJaGFuZGxlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlZhcmlhYmxlUmVmZXJlbmNlRGVzY3JpcHRpb24pOwotCQloYW5kbGUuc2V0SW1hZ2VEZXNjcmlwdG9yKEphdmFQbHVnaW5JbWFnZXMuREVTQ19XSVpCQU5fQUREX0xJQlJBUlkpOwotCQkJCQotCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUpzdENvbW1vblVJQ29udGV4dElkcy5ERVBMT1lNRU5UX0FTU0VNQkxZX05FV19WQVJJQUJMRV9SRUZFUkVOQ0VfUDEpOwotCQljLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoYywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZU5ld1NlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJZmQud2lkdGggPSAzOTA7Ci0JCWZkLmhlaWdodCA9IDE4NTsKLQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUpOwotCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZmQpOwotCQlyZXR1cm4gYzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTmV3U2VsZWN0aW9uKCkgewotCQlpc0NvbXBsZXRlID0gdHJ1ZTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IG8gPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmKCBvID09IG51bGwgKSB7Ci0JCQlpc0NvbXBsZXRlID0gZmFsc2U7Ci0JCQlzZWxlY3RlZCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3RlZCA9IG87Ci0JCQlJUGF0aCBwID0gbnVsbDsKLQkJCWlmKCBvIGluc3RhbmNlb2YgQ1BWYXJpYWJsZUVsZW1lbnQpIHsKLQkJCQlwID0gKChDUFZhcmlhYmxlRWxlbWVudClvKS5nZXRQYXRoKCk7Ci0JCQl9IGVsc2UgaWYoIG8gaW5zdGFuY2VvZiBFeHRlbmRlZFZhcmlhYmxlKSB7Ci0JCQkJcCA9ICgoRXh0ZW5kZWRWYXJpYWJsZSlvKS5lbGVtZW50LmdldFBhdGgoKS5hcHBlbmQoKChFeHRlbmRlZFZhcmlhYmxlKW8pLnBhdGhBZnRlckVsZW1lbnQpOwotCQkJfQotCQkJaWYocCA9PSBudWxsIHx8IHAuaXNFbXB0eSgpIHx8IHAudG9GaWxlKCkuaXNEaXJlY3RvcnkoKSB8fCAhaXNWYWxpZEFyY2hpdmUocCkpIHsKLQkJCQlpc0NvbXBsZXRlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaGFuZGxlLnVwZGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyPSBuZXcgVmFyaWFibGVzTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZhcmlhYmxlc0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBDUFZhcmlhYmxlRWxlbWVudExhYmVsUHJvdmlkZXIgZGVsZWdhdGUgPSBuZXcgQ1BWYXJpYWJsZUVsZW1lbnRMYWJlbFByb3ZpZGVyKGZhbHNlKTsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIENQVmFyaWFibGVFbGVtZW50KQotCQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRJbWFnZShlbGVtZW50KTsKLQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgRXh0ZW5kZWRWYXJpYWJsZSkgewotCQkJCWlmKCgoRXh0ZW5kZWRWYXJpYWJsZSllbGVtZW50KS5pc0ZvbGRlcigpKSAKLQkJCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7Ci0JCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZJTEUpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIENQVmFyaWFibGVFbGVtZW50KQotCQkJCXJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KGVsZW1lbnQpOwotCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBFeHRlbmRlZFZhcmlhYmxlKSAKLQkJCQlyZXR1cm4gKChFeHRlbmRlZFZhcmlhYmxlKWVsZW1lbnQpLnBhdGhBZnRlckVsZW1lbnQubGFzdFNlZ21lbnQoKTsKLQkJCXJldHVybiBlbGVtZW50ID09IG51bGwgPyAiIiA6IGVsZW1lbnQudG9TdHJpbmcoKTsvLyROT04tTkxTLTEkCi0JCX0JCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRWYXJpYWJsZSB7Ci0JCXB1YmxpYyBDUFZhcmlhYmxlRWxlbWVudCBlbGVtZW50OwotCQlwdWJsaWMgSVBhdGggcGF0aEFmdGVyRWxlbWVudDsKLQkJcHVibGljIEV4dGVuZGVkVmFyaWFibGUoQ1BWYXJpYWJsZUVsZW1lbnQgZSwgSVBhdGggcCkgewotCQkJZWxlbWVudCA9IGU7Ci0JCQlwYXRoQWZ0ZXJFbGVtZW50ID0gcDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZvbGRlcigpIHsKLQkJCXJldHVybiBlbGVtZW50LmdldFBhdGgoKS5hcHBlbmQocGF0aEFmdGVyRWxlbWVudCkudG9GaWxlKCkuaXNEaXJlY3RvcnkoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIENQVmFyaWFibGVFbGVtZW50W10gZWxlbWVudHM7Ci0JcHJpdmF0ZSBDUFZhcmlhYmxlRWxlbWVudFtdIGluaXRpYWxpemVFbGVtZW50cygpIHsKLQkJU3RyaW5nW10gZW50cmllcz0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGVOYW1lcygpOwotCQlBcnJheUxpc3QgZWxlbWVudHM9IG5ldyBBcnJheUxpc3QoZW50cmllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWU9IGVudHJpZXNbaV07Ci0JCQlJUGF0aCBlbnRyeVBhdGg9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKG5hbWUpOwotCQkJaWYgKGVudHJ5UGF0aCAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudHMuYWRkKG5ldyBDUFZhcmlhYmxlRWxlbWVudChuYW1lLCBlbnRyeVBhdGgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKENQVmFyaWFibGVFbGVtZW50W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IENQVmFyaWFibGVFbGVtZW50W2VsZW1lbnRzLnNpemUoKV0pOwotCX0KLQotCQotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyID0gbmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCWlmKCBlbGVtZW50cyA9PSBudWxsICkKLQkJCQkJCWVsZW1lbnRzID0gaW5pdGlhbGl6ZUVsZW1lbnRzKCk7Ci0JCQkJCXJldHVybiBlbGVtZW50czsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCQkJCX0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJCWlmKCBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ1BWYXJpYWJsZUVsZW1lbnQpIHsKLQkJCQkJCWlmKCgoQ1BWYXJpYWJsZUVsZW1lbnQpcGFyZW50RWxlbWVudCkuZ2V0UGF0aCgpLnRvRmlsZSgpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCQlTdHJpbmdbXSBuYW1lcyA9ICgoQ1BWYXJpYWJsZUVsZW1lbnQpcGFyZW50RWxlbWVudCkuZ2V0UGF0aCgpLnRvRmlsZSgpLmxpc3QoKTsKLQkJCQkJCQlFeHRlbmRlZFZhcmlhYmxlW10gZXh0ZW5zaW9ucyA9IG5ldyBFeHRlbmRlZFZhcmlhYmxlW25hbWVzLmxlbmd0aF07Ci0JCQkJCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrICkKLQkJCQkJCQkJZXh0ZW5zaW9uc1tpXSA9IG5ldyBFeHRlbmRlZFZhcmlhYmxlKChDUFZhcmlhYmxlRWxlbWVudClwYXJlbnRFbGVtZW50LCBuZXcgUGF0aChuYW1lc1tpXSkpOwotCQkJCQkJCXJldHVybiBleHRlbnNpb25zOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKCBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRXh0ZW5kZWRWYXJpYWJsZSkgewotCQkJCQkJRXh0ZW5kZWRWYXJpYWJsZSBwMSA9IChFeHRlbmRlZFZhcmlhYmxlKXBhcmVudEVsZW1lbnQ7Ci0JCQkJCQlJUGF0aCBwYXJlbnRMb2MgPSBwMS5lbGVtZW50LmdldFBhdGgoKTsKLQkJCQkJCXBhcmVudExvYyA9IHBhcmVudExvYy5hcHBlbmQocDEucGF0aEFmdGVyRWxlbWVudCk7Ci0JCQkJCQlTdHJpbmdbXSBuYW1lcyA9IHBhcmVudExvYy50b0ZpbGUoKS5saXN0KCk7Ci0JCQkJCQlpZiggbmFtZXMgIT0gbnVsbCApIHsKLQkJCQkJCQlFeHRlbmRlZFZhcmlhYmxlW10gZXh0ZW5zaW9ucyA9IG5ldyBFeHRlbmRlZFZhcmlhYmxlW25hbWVzLmxlbmd0aF07Ci0JCQkJCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrICkKLQkJCQkJCQkJZXh0ZW5zaW9uc1tpXSA9IG5ldyBFeHRlbmRlZFZhcmlhYmxlKHAxLmVsZW1lbnQsIHAxLnBhdGhBZnRlckVsZW1lbnQuYXBwZW5kKG5hbWVzW2ldKSk7Ci0JCQkJCQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt9OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlJPT1RfQ09NUE9ORU5UKTsKLQkJU3RyaW5nIHJ1bnRpbWVMb2MgPSAoU3RyaW5nKWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkRFRkFVTFRfTElCUkFSWV9MT0NBVElPTik7Ci0JCWlmIChzZWxlY3RlZCAhPSBudWxsICkgewotCQkJQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiByZWZMaXN0ID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCUlQYXRoIHZhcmlhYmxlUGF0aCA9IGdldFZhcmlhYmxlUGF0aChzZWxlY3RlZCk7Ci0JCQkJSVBhdGggcmVzb2x2ZWRQYXRoID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRWYXJpYWJsZVBhdGgodmFyaWFibGVQYXRoKTsKLQkJCQlqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocmVzb2x2ZWRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJaWYgKGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFCi0JCQkJCQkJKyBJUGF0aC5TRVBBUkFUT1I7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGFyY2hpdmUgPSBDb21wb25lbnRDb3JlCi0JCQkJCQkJLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQocm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCksCi0JCQkJCQkJCQl0eXBlICsgdmFyaWFibGVQYXRoLnRvU3RyaW5nKCkpOwotCQkJCQlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKHJvb3RDb21wb25lbnQsIGFyY2hpdmUpOwotCQkJCQlyZWYuc2V0QXJjaGl2ZU5hbWUocmVzb2x2ZWRQYXRoLmxhc3RTZWdtZW50KCkpOwotCQkJCQlpZiAocnVudGltZUxvYyAhPSBudWxsKSB7Ci0JCQkJCQlyZWYuc2V0UnVudGltZVBhdGgobmV3IFBhdGgocnVudGltZUxvYykubWFrZUFic29sdXRlKCkpOwotCQkJCQl9Ci0JCQkJCXJlZkxpc3QuYWRkKHJlZik7Ci0JCQkJfQotLy8JCQl9Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGZpbmFsUmVmcyA9IHJlZkxpc3QudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVmTGlzdC5zaXplKCldKTsKLQkJCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkZJTkFMX1JFRkVSRU5DRSwgZmluYWxSZWZzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElQYXRoIGdldFZhcmlhYmxlUGF0aChPYmplY3Qgc2VsZWN0ZWQpIHsKLQkJaWYoIHNlbGVjdGVkIGluc3RhbmNlb2YgRXh0ZW5kZWRWYXJpYWJsZSkgewotCQkJRXh0ZW5kZWRWYXJpYWJsZSBzMSA9IChFeHRlbmRlZFZhcmlhYmxlKXNlbGVjdGVkOwotCQkJcmV0dXJuIG5ldyBQYXRoKHMxLmVsZW1lbnQuZ2V0TmFtZSgpKS5hcHBlbmQoczEucGF0aEFmdGVyRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKCgoQ1BWYXJpYWJsZUVsZW1lbnQpc2VsZWN0ZWQpLmdldE5hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkQXJjaGl2ZShJUGF0aCBwYXRoKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSB0cnVlOwotCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIG9zUGF0aCA9IG51bGw7Ci0JCQlpZihwYXRoLnNlZ21lbnRDb3VudCgpID4gMSl7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUlQYXRoIGxvYyA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJCQkJaWYobG9jICE9IG51bGwpIHsgCi0JCQkJCQlvc1BhdGggPSBsb2MudG9PU1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYob3NQYXRoID09IG51bGwpewotCQkJCW9zUGF0aCA9IHBhdGgudG9PU1N0cmluZygpOwotCQkJfQotCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKG5ldyBGaWxlKG9zUGF0aCkpOwotCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZTEpewotCQkJdmFsaWQgPSBmYWxzZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpewotCQkJdmFsaWQgPSBmYWxzZTsKLQkJfWZpbmFsbHkgewotCQkJaWYgKHppcEZpbGUgIT0gbnVsbCl7Ci0JCQkJdHJ5IHsKLQkJCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnN0Q29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzdENvbW1vblVJUGx1Z2luLlBMVUdJTl9JRCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWQ4ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3VpL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1BcmNoaXZlVGl0bGU9QXJjaGl2ZXMgZnJvbSBXb3Jrc3BhY2UKLUFyY2hpdmVEZXNjcmlwdGlvbj1TZWxlY3QgYXJjaGl2ZXMgdG8gaW5jbHVkZSBpbiB0aGUgZGVwbG95bWVudCBhc3NlbWJseS4KLUFyY2hpdmVEaWFsb2dOZXdUaXRsZT1BcmNoaXZlIFNlbGVjdGlvbgotQXJjaGl2ZURpYWxvZ05ld0Rlc2NyaXB0aW9uPSZTZWxlY3QgYXJjaGl2ZXMgdG8gaW5jbHVkZSBpbiB0aGUgZGVwbG95bWVudCBhc3NlbWJseToKLUV4dGVybmFsQXJjaGl2ZVRpdGxlPUFyY2hpdmVzIGZyb20gRmlsZSBTeXN0ZW0KLUV4dGVybmFsQXJjaGl2ZURlc2NyaXB0aW9uPVNlbGVjdCBhcmNoaXZlcyB0byBpbmNsdWRlIGluIHRoZSBkZXBsb3ltZW50IGFzc2VtYmx5LgotQnJvd3NlPUJyJm93c2UuLi4KLVZhcmlhYmxlUmVmZXJlbmNlVGl0bGU9QXJjaGl2ZSB2aWEgUGF0aCBWYXJpYWJsZQotVmFyaWFibGVSZWZlcmVuY2VEZXNjcmlwdGlvbj1TZWxlY3QgYXJjaGl2ZSB0byBpbmNsdWRlIGluIHRoZSBkZXBsb3ltZW50IGFzc2VtYmx5LgotQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmRUaXRsZT1BZGQgTWFuaWZlc3QgRW50cmllcwotQWRkTWFuaWZlc3RFbnRyeVRhc2tXaXphcmREZXNjPUFkZCBtYW5pZmVzdCBlbnRyaWVzIHRoYXQgc2hvdWxkIGJlIGFjY2Vzc2libGUgYXQgcnVudGltZS4KLVBhcmVudFByb2plY3Q9JlBhcmVudCBwcm9qZWN0OiAKLUN1c3RvbUVudHJ5QnV0dG9uPSZBZGQgQ3VzdG9tIEVudHJ5Ci1BZGQ9QSZkZC4uLgotUmVtb3ZlPSZSZW1vdmUKLU1vdmVVcD1Nb3ZlICZVcAotTW92ZURvd249TW92ZSBEbyZ3bgotTWFuaWZlc3RFbnRyeUNvbHVtbj1NYW5pZmVzdCBFbnRyeQotTWFuaWZlc3RFbnRyeVNvdXJjZUNvbHVtbj1Tb3VyY2UKLUNvbmZpZ3VyZVBhcmVudExpbms9Q29uZmlndXJlIGF2YWlsYWJsZSBtYW5pZmVzdCBlbnRyaWVzLi4uCi1JbnZhbGlkQXJjaGl2ZXNXYXJuaW5nPVRoZSBmb2xsb3dpbmcgZmlsZXMgd2VyZSBub3QgYWRkZWQgYmVjYXVzZSB0aGV5IGFyZSBub3QgYXJjaGl2ZSBmaWxlcyBvciBhcmUgY29ycnVwdGVkOiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmMmE1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4NjFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotc3JjLnppcAotQGRvdAotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNWVkMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaC9wZXJmPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMTJlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDZkZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI01vbiBKYW4gMzAgMjM6NDA6NTIgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4Y2ViNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEphbiAzMCAxOTo0NTo0MSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWU2ZTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4sCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzZTkyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy1zZWFyY2gvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5MjM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiAKLSAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIj4KLSAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZjZGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0hIFBsdWctaW4gcHJvcGVydGllcwotcGx1Z2luTmFtZSAgICAgPSBXU1QgQ29tbW9uIENvcmUgUGx1Zy1pbgotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDJhNjIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VhcmNoUGFydGljaXBhbnRzIiBuYW1lPSIlc2VhcmNoUGFydGljaXBhbnRzIiAvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlUZXN0ZXIiIG5hbWU9IlVJIFRlc3RlciIgc2NoZW1hPSJzY2hlbWEvdWlUZXN0ZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG5hbWU9IlVJIENvbnRleHQgU2Vuc2l0aXZlIENsYXNzIiBzY2hlbWE9InNjaGVtYS91aUNvbnRleHRTZW5zaXRpdmVDbGFzcy5leHNkIi8+Ci08L3BsdWdpbj4KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvc2VhcmNoUGFydGljaXBhbnRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvc2VhcmNoUGFydGljaXBhbnRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2M5NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc2NoZW1hL3NlYXJjaFBhcnRpY2lwYW50cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNlYXJjaCIgaWQ9InNlYXJjaFBhcnRpY2lwYW50cyIgbmFtZT0iJXNlYXJjaFBBcnRpY2lwYW50cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4Y2YxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlIiBpZD0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG5hbWU9IlVJIENvbnRleHQgU2Vuc2l0aXZlIENsYXNzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvbXBvbmVudHMgYXJlIG9mdGVuIGRlc2lnbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgJnF1b3Q7SGVhZGxlc3MmcXVvdDsgb3Igbm9uLWdyYXBoaWNhbCBwb3J0aW9ucyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlIChHVUkpIHBvcnRpb25zLiBTb21ldGltZXMgdGhpcyBpcyBkb25lIHRvIGZvbGxvdyBnb29kIGRlc2lnbiBwcmluY2lwbGVzLCBvdGhlciB0aW1lcyB0aGVyZSBpcyBhIHNwZWNpZmljIHVzZSBjYXNlIGZvciBkb2luZyBzby4gV2hlbiBwbHVnaW5zIGZvbGxvdyB0aGlzIHByYWN0aWNlIGJlY2F1c2UgdGhleSBtdXN0IHZhcnkgdGhlaXIgYmVoYXZpb3IgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBydW5uaW5nIGluIGEgaGVhZGxlc3MgZW52aXJvbm1lbnQgb3IgYSBncmFwaGljYWwgZW52aXJvbm1lbnQsIHRoZXkgb2Z0ZW4gbmVlZCB0byBjaG9vc2UgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgYSBwYXJ0aWN1bGFyIHR5cGUuIFRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVkIGJ5IHRoZSBXU1QgY29tcG9uZW50IHNvbHZlcyBleGFjdGx5IHRoaXMgcHJvYmxlbS4KLSZsdDtwJmd0OyAgICAKLVRvIHVzZSB0aGUgZXh0ZW5zaW9uIHBvaW50LCB5b3UgbXVzdCBwcm92aWRlIHR3byBleHRlbnNpb25zIHRoYXQgYXJlIGxpbmtlZCBieSBhIGtleS4gVGhlIGtleSBpcyBhIHVuaXF1ZSBTdHJpbmctYmFzZWQgdmFsdWUgdGhhdCB5b3Ugd2lsbCBsYXRlciB1c2UgdG8gaW5zdGFuaXRhdGUgeW91ciBjbGFzcy4KLSZsdDtwJmd0OwotVGhlIGZpcnN0IHVzYWdlIG9mIHRoZSBleHRlbnNpb24gc3BlY2lmaWVzIHlvdXIga2V5LCBhbmQgdGhlIEhlYWRsZXNzIGNvbnRleHQsIGFuZCB0aGUgY2xhc3MgdGhhdCBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGZvciB0aGlzIChrZXksIGNvbnRleHQpIHBhaXIuIFRoaXMgbWVhbnMgaW4gdGhlIGhlYWRsZXNzIGVudmlyb25tZW50IHRoaXMgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXF1ZXN0ZWQuCi0mbHQ7cCZndDsKLVRoZSBzZWNvbmQgZXh0ZW5zaW9uIHNwZWNpZmllcyB0aGUgVUkgY29udGV4dCBhbmQgdGhlIHNhbWUga2V5LCBidXQgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGVzaWduZWQgZm9yIGdyYXBoaWNhbCBlbnZpcm9ubWVudHMuIFRoaXMgbWVhbnMgaW4gdGhlIFVJIGVudmlyb25tZW50IHRoaXMgb3RoZXIgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXF1ZXN0ZWQuCi0mbHQ7cCZndDsKLVRoZSBhY3R1YWwgcmVxdWVzdCBpcyBkb25lIGluIHlvdXIgY29kZSB2aWE6Ci0mbHQ7cHJlJmd0OwotSU15SW50ZXJmYWNlIGluc3RhbmNlID0gKElNeUludGVyZmFjZSkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgmcXVvdDtteUtleSZxdW90Oyk7Ci0mbHQ7L3ByZSZndDsKLXdoZXJlICZsdDtjb2RlJmd0OyZxdW90O215S2V5JnF1b3Q7Jmx0Oy9jb2RlJmd0OyBpcyB0aGUga2V5IHVzZWQgb24gYm90aCBleHRlbnNpb25zLiBJdCB3aWxsIHRoZW4gY2hvb3NlIGVpdGhlciB0aGUgVUkgb3IgdGhlIEhlYWRsZXNzIGV4dGVuc2lvbiBkZXBlbmRpbmcgdXBvbiB0aGUgY29udGV4dC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQW4gZXh0ZW5zaW9uIHBvaW50IHRoYXQgZGVmaW5lcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGFuZCBpdHMgYXBwcm9wcmlhdGUgY29udGV4dCAoVUkgb3IgSGVhZGxlc3MpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUga2V5IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDb250ZXh0IFNlbnNpdGl2ZSBzdXBlciBjbGFzcy9pbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gZm9yIGVpdGhlciBhIFVJIG9yIEhlYWRsZXNzIGNvbnRleHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGV4dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT25lIG9mICZxdW90O1VJJnF1b3Q7IG9yICZxdW90O0hlYWRsZXNzJnF1b3Q7IFRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuIEl0IG11c3QgbWF0Y2ggZXhhY3RseSBhcyBzaG93biBoZXJlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVUkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZGxlc3MiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgU2VlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24mbHQ7L2NvZGUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDYuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2FnZSBmb3IgdGhlIFVJIGNvbnRleHQ6Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBVSSBDb250ZXh0IENsYXNzJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLkNvbnRleHRTZW5zaXRpdmVDbGFzcyZxdW90OyZndDsKLSAgICAgJmx0O3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgY29udGV4dD0mcXVvdDtVSSZxdW90OwotICAgICAgIGtleT0mcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDsKLSAgICAgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmlibS53dHAuY29tbW9uLnVpLldUUFVJV29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7YnImZ3Q7Ci1Vc2FnZSBmb3IgdGhlIEhlYWRsZXNzIGNvbnRleHQ6Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLkNvbnRleHRTZW5zaXRpdmVDbGFzcyZxdW90OyZndDsKLSAgICAgJmx0O3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICBjb250ZXh0PSZxdW90O0hlYWRsZXNzJnF1b3Q7Ci0gICAgICAgICBrZXk9JnF1b3Q7d29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmlibS53dHAuY29tbW9uLnVpLldUUEhlYWRsZXNzV29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7YnImZ3Q7Ci1BbmQgZmluYWxseSB0aGUgcmV0cmlldmFsIG9mIHRoZSBjbGFzcyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dDoKLQotJmx0O3ByZSZndDsKLUlXb3JraW5nQ29weU1hbmFnZXIgbWFuYWdlciA9IChJV29ya2luZ0NvcHlNYW5hZ2VyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCZxdW90O3dvcmtpbmdDb3B5TWFuYWdlciZxdW90Oyk7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSBJQk0gMjAwMy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zY2hlbWEvdWlUZXN0ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NjaGVtYS91aVRlc3Rlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhiYjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NjaGVtYS91aVRlc3Rlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiIGlkPSJ1aVRlc3RlciIgbmFtZT0iVUkgVGVzdGVyIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaXMgdXNlZCB0byB0ZWxsIFdTVCB0aGF0IGl0IGlzIHJ1bm5pbmcgaW4gYSBub24tSEVBRExFU1MgZW52aXJvbm1lbnQuIFR5cGljYWxseSBVSSBlbnZpcm9ubWVudCBpcyBub24tSEVBRExFU1MuIFRoZSBkZWZhdWx0IGlmIHRoZXJlIGFyZSBubyBpbXBsZW1lbnRlcnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQgdGhhdCByZXR1cm4gdHJ1ZSBpcyBIRUFETEVTUy4KLSZsdDtwJmd0OwotQSBIRUFETEVTUyBlbnZpcm9ubWVudCBpcyB0eXBpY2FsbHkgYSBiYXRjaCBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gVUkgYW5kIHRoZSB3b3Jrc3BhY2UgaXMgdXNlZCBmb3Igb25lIG9wZXJhdGlvbiBhbmQgdGhlbiB0ZXJtaW5hdGVkLiBNb3N0IGhlYWRsZXNzIHRhc2tzIGFyZSBkb25lIHVuZGVyIG9uZSBvcGVyYXRpb24gYW5kIHRoZSBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBtYXkgbm90IGhhdmUgYSBjaGFuY2UgdG8gZmx1c2ggYSBiYWQgcmVmbGVjdGlvbiBiZWZvcmUgdGhlIHJlYWwgdHlwZSBuZWVkcyB0byBiZSBmb3VuZCBhbmQgY2FuIGJlIGZvdW5kLiBTbyB3aGF0IHdvdWxkIGhhcHBlbiBpcyBpZiBhIGNsYXNzIHdhcyBjcmVhdGVkIGR1cmluZyB0aGlzIG9uZSBvcGVyYXRpb24gaXQgd291bGQgbm90IGJlIGZvdW5kIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbnMgaGFkIG5vdCB5ZXQgZ29uZSBvdXQuIAotJmx0O3AmZ3Q7Ci1JbiBhIFVJIGVudmlyb25tZW50IHRoZSBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgc2hvcnQgYW5kIGRvIG9ubHkgYSBmZXcgdGhpbmdzIGFuZCB0aGUgcmVzdWx0cyBhcmVuJmFwb3M7dCBuZWVkZWQgdW50aWwgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiBJbiB0aGF0IGNhc2UgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gbm90IGtlZXAgY2hlY2tpbmcgaWYgYSBjbGFzcyBoYXMgYXBwZWFyZWQgZXZlcnl0aW1lIGEgcmVxdWVzdCBpcyBtYWRlLCBpbnN0ZWFkIGl0IHdpbGwgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYWRkZWQgY2xhc3MgdG8gYXBwZWFyIGJlZm9yZSByZXNldHRpbmcgdGhlIGRlZmluaXRpb24gdG8gYWxsb3cgY2hlY2tpbmcgYWdhaW4gbGF0ZXIuCi0mbHQ7cCZndDsKLUlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgaW1wbGVtZW50ZXIgb2YgdGhpcyBpbnRlcmZhY2UgaW4gdGhlIGFwcGxpY2F0aW9uLCB0aGVuIGl0IHdpbGwgZ28gdGhyb3VnaCBlYWNoIG9mIHRoZW0gb25jZSB1bnRpbCBvbmUgcmV0dXJucyB0cnVlLiBBcyBzb29uIGFzIG9uZSByZXR1cm5zIHRydWUgaXQgd2lsbCBzdG9wIGFuZCBtYXJrIHRoZSBhcHBsaWNhdGlvbiBhcyBiZWluZyBub24tSEVBRExFU1MuIFRoaXMgd2lsbCBiZSBkb25lIG9ubHkgb25jZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBJdCB3aWxsIG5vdCBiZSBhZ2FpbiB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KLSZsdDtwJmd0OwotVGhpcyBpcyB0eXBpY2FsbHkgYW4gaW50ZXJuYWwgZXh0ZW5zaW9uIHBvaW50IG9ubHkuIFRoZSBXU1QgVUkgcGx1Z2luIHdpbGwgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIFBsYXRmb3JtIFVJIGlzIGFjdGl2ZS4gU28gdGhpcyB3aWxsIG5vcm1hbGx5IG5vdCBiZSBuZWVkZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgbW9zdCBjdXN0b21lcnMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aVRlc3RlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idWlUZXN0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSB1aVRlc3RlciBkZWZpbml0aW9uIGVsZW1lbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgVUlUZXN0ZXIgZm9yIHRoaXMgZXh0ZW5zaW9uLiBJdCBtdXN0IGltcGxlbWVudCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSVRlc3RlciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSVRlc3RlciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSAmbHQ7c2FtcCZndDtjbGFzc05hbWUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSBtdXN0IGJlIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlUZXN0ZXImbHQ7L3NhbXAmZ3Q7IGludGVyZmFjZSBmb3IgdGhlIHRlc3Rlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGltcGxlbWVudGVyOiAKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnVpVGVzdGVyJnF1b3Q7Jmd0OwotICAmbHQ7dWlUZXN0ZXIKLSAgIGNsYXNzTmFtZT0mcXVvdDtjb20uZXhhbXBsZS5VSVRlc3RlckltcGxlbWVudGF0aW9uJnF1b3Q7LyZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGVyZSBpcyBubyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGNsYXNzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL0lTZWFyY2hPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvSVNlYXJjaE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzMDVlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvSVNlYXJjaE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgbWFwIG9mIHNlYXJjaCBvcHRpb25zIHBhc3NlZAotICogdG8KLSAqIHtAbGluayBTZWFyY2hFbmdpbmUjc2VhcmNoKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuLCBTZWFyY2hSZXF1ZXN0b3IsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGUsIGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICogU2VhcmNoRW5naW5lLnNlYXJjaCgpfS4KLSAqIDxwPgotICogTm90ZSB0aGF0IG5vdCBhbGwgc2VhcmNoIHBhcnRpY2lwYW50cyB3aWxsIHByb3ZpZGUgc3BlY2lhbGl6ZWQgYmVoYXZpb3IgYmFzZWQgb24KLSAqIHVzZSBvZiB0aGVzZSBzZWFyY2ggb3B0aW9ucy4KLSAqIDxwPgotICogQWxzbyBub3RlIHRoYXQgaW5kaXZpZHVhbCBzZWFyY2ggcGFydGljaXBhbnRzIG1heSBzdXBwb3J0IGFkZGl0aW9uYWwgb3B0aW9ucyBub3QKLSAqIGxpc3RlZCBoZXJlLiBUaGVzZSBzZWFyY2ggb3B0aW9ucyBzaG91bGQgYmUgZm9ybWVkIHNvIHRoYXQgYSBzZWFyY2ggcGFydGljaXBhbnQgY2FuCi0gKiBzYWZlbHkgaWdub3JlIGFueSB0aGF0IGl0IGRvZXMgbm90IHVuZGVyc3RhbmQuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaE9wdGlvbnMgewotCi0JLyoqCi0JICogU2VhcmNoIG9wdGlvbiBzcGVjaWZ5aW5nIGEgdHJhZGUtb2ZmIGNob2ljZSBiZXR3ZWVuIHNlYXJjaCBwZXJmb3JtYW5jZSBhbmQKLQkgKiBjb21wbGV0ZW5lc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfT1BUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guUFJJT1JJVFkiOyAvLyROT05fTkxTXzEkCi0JLyoqCi0JICogQ2hvaWNlIGZvciB0aGUge0BsaW5rICNQUklPUklUWV9PUFRJT059IHNlYXJjaCBvcHRpb24gdGhhdCBlbXBoYXNpemVzCi0JICogcGVyZm9ybWFuY2UgYXQgdGhlIHBvc3NpYmxlIGV4cGVuc2Ugb2YgYWNjdXJhY3kuIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQgZm9yCi0JICogYWxsIHNlYXJjaCBjYWxscyBtYWRlIG9uIHRoZSB1c2VyIGludGVyZmFjZSB0aHJlYWQuIEluIHNvbWUgY2FzZXMsIHNlYXJjaAotCSAqIHJlc3VsdHMgbWF5IG5vdCBiZSBjb21wbGV0ZSBiZWNhdXNlIG9mIGluYWNjdXJhY2llcyBjYXVzZWQgYnkgdGltaW5nIHdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVkFMVUVfVElNRUxJTkVTUyA9ICJGQVNUX1NFQVJDSCI7IC8vJE5PTl9OTFNfMSQKLQkvKioKLQkgKiBDaG9pY2UgZm9yIHRoZSB7QGxpbmsgI1BSSU9SSVRZX09QVElPTn0gc2VhcmNoIG9wdGlvbiB0aGF0IGVtcGhhc2l6ZXMKLQkgKiBhY2N1cmFjeSBhdCB0aGUgcG9zc2libGUgZXhwZW5zZSBvZiB0aW1lbGluZXNzLiBUaGlzIHZhbHVlIHNob3VsZCBuZXZlciBiZSB1c2VkCi0JICogZm9yIHNlYXJjaCBjYWxscyBtYWRlIG9uIHRoZSB1c2VyIGludGVyZmFjZSB0aHJlYWQsIGJlY2F1c2Ugc29tZSBzZWFyY2gKLQkgKiBwYXJ0aWNpcGFudHMgbWF5IGNob29zZSB0byB1c2UgdGltZS1jb25zdW1pbmcgYmFja2dyb3VuZCBwcm9jZXNzaW5nIHRvIHJldHVybiBhCi0JICogY29tcGxldGUgc2V0IG9mIG1hdGNoZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVkFMVUVfQ09NUExFVEVORVNTID0gIkNPTVBMRVRFX1NFQVJDSCI7IC8vJE5PTl9OTFNfMSQKLQkvKioKLQkgKiBEZWZhdWx0IGNob2ljZSBmb3IgdGhlIHtAbGluayAjUFJJT1JJVFlfT1BUSU9OfSBzZWFyY2ggb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1ZBTFVFX0RFRkFVTFQgPSBQUklPUklUWV9WQUxVRV9USU1FTElORVNTOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZWQxMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLlNlYXJjaERvY3VtZW50U2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0vKioKLSAqIFRoZSB7QGxpbmsgU2VhcmNoRW5naW5lfSBjbGFzcyBwcm92aWRlcyBhIGdlbmVyaWMgd2F5IG9mIHNlYXJjaGluZyBmb3IgaW5mb3JtYXRpb24KLSAqIHdpdGhvdXQgdGhlIG5lZWQgb2Yga25vd2luZyBob3cgb3Igd2hlcmUgdGhhdCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuIFRoZSByZXN1bHRzCi0gKiByZXR1cm5lZCBieSBhIHNlYXJjaCBjb3VsZCBiZSBzY2F0dGVyZWQgaW4gYSBudW1iZXIgb2YgZmlsZXMgb3Igc3RvcmVkIGluIGFuIGluZGV4LgotICogRXhhbXBsZXMgb2YgdGhlIGluZm9ybWF0aW9uIHlvdSBjYW4gc2VhcmNoIGZvciBpbmNsdWRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZAotICogcmVmZXJlbmNlcywgcmVmZXJlbmNlcyBiZXR3ZWVuIGZpbGVzLCBhbmQgdXNlIG9mIHF1YWxpZmllcnMuCi0gKiA8cD4KLSAqIFRoZSBzZWFyY2ggY2FuIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpZWQgc2VhcmNoIHNjb3BlLCBvciB0aGUgZW50aXJlIHdvcmtzcGFjZSBjYW4KLSAqIGJlIHNlYXJjaGVkLiBTZWFyY2ggbWF0Y2hlcyBhcmUgcmV0dXJuZWQgdG8gdGhlIHNwZWNpZmllZCB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaEVuZ2luZSBpbXBsZW1lbnRzIElTZWFyY2hPcHRpb25zCi17Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgbWF0Y2hlcyBvZiBhIGdpdmVuIHNlYXJjaCBwYXR0ZXJuIHVzaW5nIGEgc3BlY2lmaWVkIHNldCBvZiBzZWFyY2gKLQkgKiBwYXJ0aWNpcGFudHMgYW5kIHNlYXJjaCBzY29wZS4gU2VhcmNoIHBhdHRlcm5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIGZhY3RvcnkKLQkgKiBtZXRob2RzIGFuZCBlbmNhcHN1bGF0ZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHNlYXJjaGVkIGZvcgotCSAqIChmb3IgZXhhbXBsZSwgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgYSBzcGVjaWZpZWQgdHlwZSwgaW4gYSBjYXNlIHNlbnNpdGl2ZQotCSAqIG1hbm5lcikuCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gcmVxdWVzdG9yCi0JICogICAgICAgICAgICBDYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCAoZWFjaCBtYXRjaAotCSAqICAgICAgICAgICAgaXMgcmVwb3J0ZWQgdG8ge0BsaW5rIFNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9KQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudHMKLQkgKiAgICAgICAgICAgIFRoZSBzZWFyY2ggcGFydGljaXBhbnRzIHRoYXQgd2lsbCBjb25kdWN0IHRoZSBzZWFyY2gKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIHNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgc3BlY2lmeSA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgT3B0aW9uYWwgbWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgaWYgdGhlIHNlYXJjaCBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCQlTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cywgU2VhcmNoU2NvcGUgc2NvcGUsIE1hcCBzZWFyY2hPcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQotCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLQkJLyogaW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yICovCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5lbmdpbmVfc2VhcmNoaW5nLCAxMDApOwotCi0gICAgICAgIFNlYXJjaERvY3VtZW50U2V0IHNldCA9IG5ldyBTZWFyY2hEb2N1bWVudFNldEltcGwoKTsKLQkJdHJ5Ci0JCXsKLQkJCS8vIHJlcXVlc3Rvci5iZWdpblJlcG9ydGluZygpOwotICAgICAgICAgICAgU2VhcmNoU2NvcGVbXSBzY29wZUFycmF5ID0gbmV3IFNlYXJjaFNjb3BlW3BhcnRpY2lwYW50cy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDAsIGwgPSBwYXJ0aWNpcGFudHMgPT0gbnVsbCA/IDAgOiBwYXJ0aWNpcGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKQotCQkJewotCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCi0JCQkJU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudHNbaV07Ci0JCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBudWxsCi0JCQkJCQk6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCk7Ci0JCQkJaWYgKHN1Yk1vbml0b3IgIT0gbnVsbCkKLQkJCQkJc3ViTW9uaXRvci5iZWdpblRhc2soIiIsIDEwMDApOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpZiAoc3ViTW9uaXRvciAhPSBudWxsKQotCQkJCQkJc3ViTW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoCi0JCQkJCQkJCU1lc3NhZ2VzLmVuZ2luZV9zZWFyY2hpbmdfbG9jYXRpbmdEb2N1bWVudHMsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXQotCQkJCQkJCQl7IHBhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCkgfSkpOwotCQkJCQlwYXJ0aWNpcGFudC5iZWdpblNlYXJjaGluZyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQkJCQkJLy8gcmVxdWVzdG9yLmVudGVyUGFydGljaXBhbnQocGFydGljaXBhbnQpOwotCQkJCQkvLyBwYXJ0aWNpcGFudCBjcmVhdGVzIGl0J3Mgb3duIHNlYXJjaCBzY29wZSAKLQkJCQkJU2VhcmNoU2NvcGUgbmV3U2NvcGUgPQotCQkJCQkJcGFydGljaXBhbnQuc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMocGF0dGVybiwgc2NvcGUsIHNlYXJjaE9wdGlvbnMsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBzY29wZUFycmF5W2ldID0gbmV3U2NvcGU7Ci0JCQkJCS8vIHBhcnRpY2lwYW50IGNyZWF0ZXMgc2VhcmNoIGRvY3VtZW50cyBiYXNlZCBvbiBpdCdzIHNlYXJjaCBzY29wZQotCQkJCQlwYXJ0aWNpcGFudC5jcmVhdGVTZWFyY2hEb2N1bWVudHMoc2V0LCBwYXR0ZXJuLCBuZXdTY29wZSwgc2VhcmNoT3B0aW9ucywgc3ViTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbCA9IHBhcnRpY2lwYW50cyA9PSBudWxsID8gMCA6IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkgPCBsOyBpKyspCi0gICAgICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudHNbaV07Ci0gICAgICAgICAgICAgICAgU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKTsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc3ViTW9uaXRvciAhPSBudWxsICYmIHN1Yk1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbG9jYXRlIGluZGV4IG1hdGNoZXMgaWYgYW55IChub3RlIHRoYXQgYWxsIHNlYXJjaCBtYXRjaGVzCi0gICAgICAgICAgICAgICAgLy8gY291bGQgaGF2ZSBiZWVuIGlzc3VlZCBkdXJpbmcgaW5kZXggcXVlcnlpbmcpCi0gICAgICAgICAgICAgICAgaWYgKHN1Yk1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc3ViTW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhcnRpY2lwYW50LmdldERlc2NyaXB0aW9uKCkgfSkpOwotICAgICAgICAgICAgICAgIC8vIGEgc2VhcmNoIGRvY3VtZW50IHNldCBzaG91bGQgY29udGFpbiBlbm91Z2ggaW5mbyB0byByZWR1Y2UgdGhlIHNlYXJjaCBzY29wZSBldmVuIGZ1cnRoZXIgCi0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGZpbmRpbmcgcHJlY2l6ZSBsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGUgc2NvcGUgY291bGQgYmUgbnVsbCBpZiB0aGUgcGFydGNpcGFudCBiYXJmZWQgYW5kIGV4ZXB0aW9uIGluIHRoZSBmaXJzdCBsb29wIAotICAgICAgICAgICAgICAgIGlmIChzY29wZUFycmF5W2ldICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5sb2NhdGVNYXRjaGVzKHNldCwgcGF0dGVybiwgc2NvcGVBcnJheVtpXSwgcmVxdWVzdG9yLCBzZWFyY2hPcHRpb25zLCBzdWJNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdG9yLmV4aXRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7Ci0gICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5kb25lU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAKLSAgICAgICAgICAgIH0gICAgCi0JCX0gZmluYWxseQotCQl7Ci0gICAgICAgICAgICBzZXQuZGlzcG9zZSgpOwotCQkJLy8gcmVxdWVzdG9yLmVuZFJlcG9ydGluZygpOwotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBtYXRjaGVzIG9mIGEgZ2l2ZW4gc2VhcmNoIHBhdHRlcm4uIFNlYXJjaCBwYXR0ZXJucyBjYW4gYmUgY3JlYXRlZAotCSAqIHVzaW5nIGZhY3RvcnkgbWV0aG9kcyBhbmQgZW5jYXBzdWxhdGUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0byBiZQotCSAqIHNlYXJjaGVkIGZvciAoZm9yIGV4YW1wbGUsIGVsZW1lbnQgZGVjbGFyYXRpb25zIG9mIGEgc3BlY2lmaWVkIHR5cGUsIGluIGEgY2FzZQotCSAqIHNlbnNpdGl2ZSBtYW5uZXIpLgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHJlcXVlc3RvcgotCSAqICAgICAgICAgICAgQ2FsbGJhY2sgb2JqZWN0IHRvIG5vdGlmeSB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2ggKGVhY2ggbWF0Y2gKLQkgKiAgICAgICAgICAgIGlzIHJlcG9ydGVkIHRvIHtAbGluayBTZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2gpfSkKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIHNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgc3BlY2lmeSA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgT3B0aW9uYWwgbWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgT3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIHRvIHJlcG9ydCB3b3JrIGNvbXBsZXRlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgaWYgdGhlIHNlYXJjaCBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsCi0JCQlTZWFyY2hTY29wZSBzY29wZSwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9Ci0JCQlnZXRBcHBsaWNhYmxlUGFydGljaXBhbnRzKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicGFydGljaXBhbnRzID0gIiArIHBhcnRpY2lwYW50cy5sZW5ndGgpOwotCQlzZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudHMsIHNjb3BlLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBRdWVyaWVzIHRoZSBzZXQgb2YgcGFydGljaXBhbnRzIHRoYXQgc3VwcG9ydCBzZWFyY2hlcyBkZXNjcmliZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIHNlYXJjaCBwYXR0ZXJuIGFuZCBvcHRpb25zLgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE9wdGlvbmFsIG1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHJldHVybiBBcnJheSBvZiBhcHBsaWNhYmxlIHNlYXJjaCBwYXJ0aWNpcGFudHMKLQkgKi8KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnRbXSBnZXRBcHBsaWNhYmxlUGFydGljaXBhbnRzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCU1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQkJcmV0dXJuIFNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkubG9hZFNlYXJjaFBhcnRpY2lwYW50cyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hNYXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTY5ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaE1hdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBBIHNlYXJjaCBtYXRjaCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBzZWFyY2ggcXVlcnkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2VlIFNlYXJjaEVuZ2luZSNzZWFyY2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm4sIFNlYXJjaFBhcnRpY2lwYW50W10sIElTZWFyY2hTY29wZSwKLSAqICAgICAgU2VhcmNoUmVxdWVzdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaE1hdGNoIGltcGxlbWVudHMgSUFkYXB0YWJsZQotewotCi0JLyoqCi0JICogT3B0aW9uYWwgcmVzb3VyY2Ugb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlJRmlsZSBmaWxlOyAvLyByZXNvdXJjZSB3aGVyZSBtYXRjaCBpcyBmb3VuZAotCi0JLyoqCi0JICogVGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCi0JICovCi0JaW50IG9mZnNldDsKLQotCS8qKgotCSAqIFRoZSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKi8KLQlpbnQgbGVuZ3RoOwotCi0JLyoqCi0JICogT3B0aW9uYWwgZWxlbWVudCB0aGF0IGVuY2xvc2VzIG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRjaAotCSAqLwotCU9iamVjdCBvYmplY3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBtYXRjaC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdGhhdCBlbmNsb3NlcyBvciBjb3JyZXNwb25kcyB0byB0aGUgbWF0Y2gsIG9yCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB0aGUgbWF0Y2ggc3RhcnRzIGF0LCBvciAtMSBpZiB1bmtub3duCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2gsIG9yIC0xIGlmIHVua25vd24KLQkgKiBAcGFyYW0gcGFydGljaXBhbnQKLQkgKiAgICAgICAgICAgIHRoZSBzZWFyY2ggcGFydGljaXBhbnQgdGhhdCBjcmVhdGVkIHRoZSBtYXRjaAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIG9mIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFNlYXJjaE1hdGNoKE9iamVjdCBlbGVtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJRmlsZSByZXNvdXJjZSkKLQl7Ci0JCXRoaXMub2JqZWN0ID0gZWxlbWVudDsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpbGUgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0JewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpCi0JewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLQl7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpCi0JewotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvLyBpc3N1ZSAoY3MvZWIpIGhvbGRpbmcgb2JqZWN0cyBpcyBhIGJpdCBvZGQsIHNpbmNlIGl0IGltcGxpZXMgdGhlIG9iamVjdCdzCi0JLy8gbGlmZSBzcGFuCi0JLy8gaXMgdGhlIHNhbWUgYXMgdGhlIFNlYXJjaE1hdGNoLiBXaGF0IGhhcHBlbnMgd2hlbiBhbiBvYmplY3QgaXMgZGVsZXRlZD8KLQkvLyBkb2VzIHRoZSBTZWFyY2hNYXRjaCBnZXQgZGVsZXRlZD8gQXJlbid0IGNvb3JkaW5hdGVzIGdvb2QgZW5vdWdoPwotCS8vIGF0IHRoZSB2ZXJ5IGxlYXN0IHdlIHNob3VsZCBkb2N1bWVudCB0aGF0IHVzaW5nIHRoaXMgZmllbGQgaGFzIHNvbWUKLQkvLyBjb25zZXF1ZW5jZXMKLQkvKioKLQkgKiAoZWIpIHNlZSBjb21tZW50cyBmb3Ige0BsaW5rICNzZXRPYmplY3QoT2JqZWN0KX0KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpCi0JewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIE9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBzb21lIHBhcnQgb2YgdGhlIG1vZGVsIHRoYXQgcmVwcmVzZW50Ci0JICogICAgICAgICAgICB0aGUgY29udGVudCB0aGF0IHdhcyBzZWFyY2hlZC4gSXQgbWF5IHJlcXVpcmUgdG8gY2FsY3VsYXRlCi0JICogICAgICAgICAgICBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgcmVxdWlyZWQgYnkgdGhlIHRvb2xzCi0JICogICAgICAgICAgICB0aHJvdWdoIHtAbGluayAjZ2V0T2JqZWN0KCkpIChlLmcuIFhNTCBub2RlIG5hbWVzcGFjZSwKLQkgKiAgICAgICAgICAgIG5lc3Nlc2FyeSB0byBvYnRhaW4gdGhlIHByZWZpeCBmb3IgdGhlIHJlZmFjdG9yaW5nIHRvb2wpLgotCSAqICAgICAgICAgICAgPHA+Ci0JICogICAgICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gZGFuZ2VyIGhlcmUgb2YgcHJldmVudGluZyB0aGUgb2JqZWN0IGZyb20KLQkgKiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWNhdXNlIGluc3RhbmNlcyBvZiB0aGUgc2VhcmNoIG1hdGNoZXMKLQkgKiAgICAgICAgICAgIHN1cHBvc2VkIHRvIGJlIHNob3J0IGxpdmVkLiB7QGxpbmsgU2VhcmNoTWF0Y2h9IGlzIHVzdWFsbHkKLQkgKiAgICAgICAgICAgIGNvbGxlY3RlZCBieSB7QGxpbmsgU2VhcmNoUmVxdWVzdG9yfSB3aGljaCBpdHNlbGYgaXMgbGl2ZWQgZm9yCi0JICogICAgICAgICAgICB0aGUgdGltZSBvZiB0aGUgc2VhcmNoIGFuZCB0aGVuIGRpc2NhcmRlZCBvciByZS1pbml0aWFsaXplZC4KLQkgKiAgICAgICAgICAgIFVzdWFsbHkgdGhlIHRvb2wgdGhhdCByZXF1ZXN0ZWQgYSBzZWFyY2ggZXh0cmFjdHMgdGhlCi0JICogICAgICAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb2xsZWN0ZWQge0BsaW5rIFNlYXJjaE1hdGNofSBhbmQgYWZ0ZXIKLQkgKiAgICAgICAgICAgIHRoYXQge0BsaW5rIFNlYXJjaE1hdGNofSBjb3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCwgcmVsZWFzaW5nCi0JICogICAgICAgICAgICBvYmplY3QgdGhhdCB0aGV5IGhvbGQgdG8uCi0JICogICAgICAgICAgICA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvYmplY3QpCi0JewotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpCi0JewotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KQotCXsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpCi0JewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7IAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWEwNDQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9TZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0vKioKLSAqIDxwPgotICogQSBzZWFyY2ggcGFydGljaXBhbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBleHRlbnNpb24gdG8gYSBnZW5lcmljIHNlYXJjaAotICogbWVjaGFuaXNtLCBwZXJtaXR0aW5nIGNvbWJpbmVkIHNlYXJjaCBhY3Rpb25zIHdoaWNoIHdpbGwgaW52b2x2ZSBhbGwgcmVxdWlyZWQKLSAqIHBhcnRpY2lwYW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogV2hlbiB0aGVyZSBpcyBhIG5lZWQgdG8gc2VhcmNoIGEgZG9jdW1lbnQgdGhhdCBoYXMgc29tZSBtaXhlZCBjb250ZW50LCB0aGVuCi0gKiB1c2luZyBhIG9uZSBwYXJ0aWNpcGFudCB3aWxsIG5vdCBiZSBlbm91Z2guIEUuZy4gZm9yIHRoZSBzZWFyY2hpbmcgb2YgdGhlIEpTUAotICogY29udGVudCwgYSBKU1AgcGFydGljaXBhbnQgbmVlZHMgdG8gY3JlYXRlIHtAbGluayBTZWFyY2hEb2N1bWVudH0gdGhhdAotICogY29udGFpbiBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgYW5kIHRoZW4gcGFzcyBpdCB0byB0aGUgZGVmYXVsdCBKYXZhIHNlYXJjaAotICogcGFydGljaXBhbnQgb2YgdGhlIEphdmEgU2VhcmNoIEVuZ2luZS4gVGhlIHNhbWUgd2l0aCBYTUw6IHdoZW4gdGhlcmUgaXMgYW4KLSAqIFhNTCBjb250ZW50IHRoYXQgZGVmYXVsdCBzZWFyY2ggcGFydGljaXBhbnQgY291bGQgbm90IHByb2Nlc3MsIGJ1dCBpdCBpcwotICogcmVxdWlyZWQgdG8gYmUgc2VhcmNoIG9uLCBhIG5ldyBzZWFyY2ggcGFydGljaXBhbnQgbmVlZHMgdG8gYmUgZGVmaW5lZC4gVGhhdAotICogc2VhcmNoIHBhcnRpY2lwYW50IHdvdWxkIGtub3cgaG93IGNyZWF0ZSBzZWFyY2ggZG9jdW1lbnQgZnJvbSB0aGUgY29udGVudCBhbmQKLSAqIHRoZW4gaXQgY2FuIGNhbGwgZGVmYXVsdCBYTUwgc2VhcmNoIHBhcnRpY2lwYW50LgotICogPC9wPgotICogPHA+Ci0gKiBQYXNzaW5nIGl0cyBvd24ge0BsaW5rIFNlYXJjaFJlcXVlc3Rvcn0gdGhpcyBwYXJ0aWNpcGFudCBjYW4gdGhlbiBtYXAgdGhlCi0gKiBtYXRjaCBwb3NpdGlvbnMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudHMsIGNyZWF0ZSBpdHMgb3duIG1hdGNoZXMgYW5kCi0gKiByZXBvcnQgdGhlbSB0byB0aGUgb3JpZ2luYWwgcmVxdWVzdG9yLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUGFydGljaXBhbnQgaW1wbGVtZW50cyBJU2VhcmNoT3B0aW9ucyAKLXsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1BlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3BlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VhcmNoUGFydGljaXBhbnQoKQotCXsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxiYWNrIG1ldGhvZCBhbGxvd2luZyBhIHNlYXJjaCBwYXJ0aWNpcGFudCB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0IHN1cHBvcnRzCi0JICogdGhlIHNwZWNpZmllZCBzZWFyY2ggcGF0dGVybiBhbmQgb3B0aW9ucy4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcGFydGljaXBhbnQgd2lsbCBwYXJ0aWNpcGF0ZSBpbgotCSAqIGZpbmRpbmcgbWF0Y2hlcyBmb3IgdGhlIHNlYXJjaCBkZWZpbmVkIGJ5IHRoZSBzZWFyY2ggcGF0dGVybi4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgKiBzZWFyY2ggcGF0dGVybiBhbmQgb3B0aW9ucyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb2YgdGhlCi0JICogc2VhcmNoIHBhcnRpY2lwYW50OgotCSAqIDxvbD4KLQkgKiA8bGk+e0BsaW5rICNiZWdpblNlYXJjaGluZyhTZWFyY2hQYXR0ZXJuLCBNYXApfQotCSAqIDxsaT57QGxpbmsgI3NlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4sIFNlYXJjaFNjb3BlLCBNYXAsIElQcm9ncmVzc01vbml0b3IpfQotCSAqIDxsaT57QGxpbmsgI2NyZWF0ZVNlYXJjaERvY3VtZW50cyhTZWFyY2hEb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiwgU2VhcmNoU2NvcGUsIE1hcCwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogPGxpPntAbGluayAjbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiwgU2VhcmNoU2NvcGUsIFNlYXJjaFJlcXVlc3RvciwgTWFwLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiA8bGk+e0BsaW5rICNkb25lU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4sIE1hcCl9Ci0JICogPC9vbD4KLQkgKiA8cD4KLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgbm9uZSBvZiB0aGUgYWJvdmUgbWV0aG9kcyB3aWxsIGJlCi0JICogY2FsbGVkLCBhbmQgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCBjb250cmlidXRlcyBubyBtYXRjaGVzIGZvciB0aGUgc2VhcmNoCi0JICogcmVxdXJlc3QuCi0JICogPHA+Ci0JICogQSBzZWFyY2ggcGFydGljaXBhbnQgc2hvdWxkIG9ubHkgcGFydGljaXBhdGUgaW4gYSBzZWFyY2ggd2hlbiBpbiB1bmRlcnN0YW5kcwotCSAqIHRoZSBzZWFyY2ggcGF0dGVybi4gVW5yZWNvZ25pemVkIHNlYXJjaCBvcHRpb25zLCBob3dldmVyLCBjYW4gYmUgaWdub3JlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LiBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyBtdXN0Ci0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGFydGljaXBhdGUgaW4gYW55IHNlYXJjaGVzLgotCSAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBwYXJ0aWNpcGFudCB3aWxsIHBhcnRpY2lwYXRlIGluIHRoZQotCSAqICAgICAgICAgc2VhcmNoIHJlcXVlc3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQkgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBcHBsaWNhYmxlKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhpcyBwYXJ0aWNpcGFudCdzIGhlbHAgaXMgbmVlZGVkIGluIGEgc2VhcmNoLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkbwotCSAqIHNvbWV0aGluZyB3aGVuIHRoZSBwYXJ0aWNpcGFudCBpcyBuZWVkZWQgaW4gYSBzZWFyY2guCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhpcyBwYXJ0aWNpcGFudCdzIGhlbHAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmUtaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gZG8KLQkgKiBzb21ldGhpbmcgd2hlbiB0aGUgcGFydGljaXBhbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpbiBhIHNlYXJjaC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgTWFwIG9mIG9wdGlvbnMgYW5kIHZhbHVlcyBkZWZpbmluZyBiZWhhdmlvciBvZiB0aGUgc2VhcmNoOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb3B0aW9ucyBhcmUgc3BlY2lmaWVkOwotCSAqICAgICAgICAgICAgc29tZSBvcHRpb25zIGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHtAbGluayBJU2VhcmNoT3B0aW9uc30KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb25lU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBkaXNwbGF5YWJsZSBuYW1lIG9mIHRoaXMgc2VhcmNoIHBhcnRpY2lwYW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkaXNwbGF5IGEKLQkgKiBtZWFuaW5nZnVsbCBuYW1lLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5YWJsZSBuYW1lIG9mIHRoaXMgc2VhcmNoIHBhcnRpY2lwYW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gIlNlYXJjaCBwYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2VhcmNoIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gcGF0aC4gVGhlIGdpdmVuIGRvY3VtZW50IHBhdGggaXMKLQkgKiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGRvY3VtZW50LiBNb3N0IG9mIHRoZSB0aW1lIGl0IGlzIGEKLQkgKiB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCwgYnV0IGl0IGNhbiBhbHNvIGJlIGEgZmlsZSBzeXN0ZW0gcGF0aCwgb3IgYSBwYXRoCi0JICogaW5zaWRlIGEgemlwIGZpbGUuCi0JICogPHA+Ci0JICogSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIGNhbiBlaXRoZXIgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZWlyIG93bgotCSAqIHN1YmNsYXNzIG9mIHtAbGluayBTZWFyY2hEb2N1bWVudH0gb3IgcmV0dXJuIGFuIGV4aXN0aW5nIGluc3RhbmNlIG9mIHN1Y2gKLQkgKiBhIHN1YmNsYXNzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBhIHNlYXJjaCBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKTsKLQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIG1hdGNoZXMgaW4gdGhlIGdpdmVuIGRvY3VtZW50cy4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZAotCSAqIGJ5IHRoZSBvdGhlciBzZWFyY2ggcGFydGljaXBhbnQgb3Igc2VhcmNoIGNsaWVudCBvbmNlIGl0IGhhcwotCSAqIHByZS1wcm9jZXNzZWQgZG9jdW1lbnRzIGFuZCBkZWxlZ2F0aW5nIHNlYXJjaCB0byB0aGlzIHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKiBAcGFyYW0gZG9jdW1lbnRTZXQKLQkgKiAgICAgICAgICAgIFRoZSBkb2N1bWVudHMgdG8gbG9jYXRlIG1hdGNoZXMgaW4KLQkgKiBAcGFyYW0gcGF0dGVybgotCSAqICAgICAgICAgICAgVGhlIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgaW5mb3JtYXRpb24gdG8gc2VhcmNoIGZvcgotCSAqIEBwYXJhbSBzY29wZQotCSAqICAgICAgICAgICAgU2VhcmNoIHNjb3BlIHRvIGxpbWl0IHRoZSBzb3VyY2Ugb2Ygc2VhcmNoIGNhbmRpZGF0ZXM7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIHdvcmtzcGFjZSBpcyB0byBiZQotCSAqICAgICAgICAgICAgc2VhcmNoZWQKLQkgKiBAcGFyYW0gcmVxdWVzdG9yCi0JICogICAgICAgICAgICBDYWxsYmFjayBvYmplY3QgdG8gbm90aWZ5IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaCAoZWFjaCBtYXRjaAotCSAqICAgICAgICAgICAgaXMgcmVwb3J0ZWQgdG8ge0BsaW5rIFNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9KQotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgbm8gcHJvZ3Jlc3MgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0b3IgaGFkIHByb2JsZW0gYWNjZXB0aW5nIG9uZSBvZiB0aGUgbWF0Y2hlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRTZXQgZG9jdW1lbnRTZXQsCi0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLAotCQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIHBhdHRlcm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LAotCQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgZG9jdW1lbnQgbG9jYXRpb25zIHRvIGNvbnNpZGVyIHdoZW4gcGVyZm9ybWluZwotCSAqIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnkgaW4gdGhlIGdpdmVuIHNjb3BlLiBUaGUgc2VhcmNoIGVuZ2luZSBjYWxscyB0aGlzCi0JICogbWV0aG9kIGJlZm9yZSBsb2NhdGluZyBtYXRjaGVzLgotCSAqIDxwPgotCSAqIEFuIGRvY3VtZW50IGxvY2F0aW9uIHJlcHJlc2VudHMgYSBwYXRoIHdvcmtzcGFjZSB0byB0aGUgZmlsZSB3aXRoIHRoZQotCSAqIGNvbnRlbnQgdGhhdCBoYXMgcG90ZW50aWFsIG1hdGNoZXMKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgbm90IGV4cGVjdGVkIHRvIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogICAgICAgICAgICBUaGUgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBzZWFyY2ggZm9yCi0JICogQHBhcmFtIHNjb3BlCi0JICogICAgICAgICAgICBTZWFyY2ggc2NvcGUgdG8gbGltaXQgdGhlIHNvdXJjZSBvZiBzZWFyY2ggY2FuZGlkYXRlczsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgd29ya3NwYWNlIGlzIHRvIGJlCi0JICogICAgICAgICAgICBzZWFyY2hlZAotCSAqIEBwYXJhbSBzZWFyY2hPcHRpb25zCi0JICogICAgICAgICAgICBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yIHVzZWQgdG8gcmVwb3J0IHdvcmsgY29tcGxldGVkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgbm8gcHJvZ3Jlc3MgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIGRvY3VtZW50IHBhdGhzIHRvIGNvbnNpZGVyCi0JICovCi0JcHVibGljIFNlYXJjaFNjb3BlIHNlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCVNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsJCi0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgZm9yIGVhY2ggZmlsZSBpbiB0aGUgc2VhcmNoIHNjb3BlOgotCSAqIDxvbD4KLQkgKiA8bGk+e0BsaW5rICNjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcpfQotCSAqIDxsaT57QGxpbmsgI3BvcHVsYXRlU2VhcmNoRG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQsIFNlYXJjaFBhdHRlcm4pfQotCSAqIDwvb2w+Ci0JICogQHBhcmFtIGRvY3VtZW50U2V0Ci0JICogICAgICAgICAgICBUaGUgZG9jdW1lbnRzIHRvIGxvY2F0ZSBtYXRjaGVzIGluCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIHRvIHNlYXJjaCBmb3IKLQkgKiBAcGFyYW0gc2NvcGUKLQkgKiAgICAgICAgICAgIFNlYXJjaCBzY29wZSB0byBsaW1pdCB0aGUgc291cmNlIG9mIHNlYXJjaCBjYW5kaWRhdGVzOwotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSB3b3Jrc3BhY2UgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIHNlYXJjaGVkCi0JICogQHBhcmFtIHNlYXJjaE9wdGlvbnMKLQkgKiAgICAgICAgICAgIE1hcCBvZiBvcHRpb25zIGFuZCB2YWx1ZXMgZGVmaW5pbmcgYmVoYXZpb3Igb2YgdGhlIHNlYXJjaDsKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9wdGlvbnMgYXJlIHNwZWNpZmllZDsKLQkgKiAgICAgICAgICAgIHNvbWUgb3B0aW9ucyBhbmQgdmFsdWVzIGFyZSBwcm92aWRlZCBieSB7QGxpbmsgSVNlYXJjaE9wdGlvbnN9Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgd29yayBjb21wbGV0ZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICBpZiBubyBwcm9ncmVzcyBuZWVkcyB0byBiZSByZXBvcnRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlYXJjaERvY3VtZW50cyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwKLQkJCVNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoU2NvcGUgc2NvcGUsIE1hcCBzZWFyY2hPcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgIlRoZSBTZWFyY2hQYXJ0aXBhbnRzIGlkIGhhcyBub3QgYmVlbiBpbml0YWxpemVkIik7Ci0JCUlGaWxlW10gZmlsZXMgPSBzY29wZS5lbmNsb3NpbmdGaWxlcygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIGxvY2F0aW9uID0gZmlsZXNbaV0uZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudFNldC5nZXRTZWFyY2hEb2N1bWVudChsb2NhdGlvbiwgaWQpOwotCQkJaWYoZG9jdW1lbnQgPT0gbnVsbCAmJiBpZCAhPSBudWxsKXsKLQkJCQlkb2N1bWVudFNldC5wdXRTZWFyY2hEb2N1bWVudChpZCwgZG9jdW1lbnQgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChsb2NhdGlvbikpOwotCQkJfQotCQkJcG9wdWxhdGVTZWFyY2hEb2N1bWVudChkb2N1bWVudCwgcGF0dGVybik7IAotCQkJCi0JCX0KLQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOGMzMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5TZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWwuU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJU2VhcmNoT3B0aW9ucwotewotCS8vdGhlIElEIGZvciB0aGlzIHBsdWdpbiAoYWRkZWQgYXV0b21hdGljYWxseSBieSBsb2dnaW5nIHF1aWNrZml4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVSSBDb250ZXh0IGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX0VYVEVOU0lPTl9QT0lOVCA9ICJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBVSVRlc3RlciBlbGVtZW50IG5hbWUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0VYVEVOU0lPTl9QT0lOVCA9ICJ1aVRlc3RlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSBzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5OwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZWFyY2hQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZWFyY2hQbHVnaW4oKQotCXsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hQbHVnaW4gZ2V0RGVmYXVsdCgpCi0JewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSBnZXRTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KCkKLQl7Ci0JCWlmIChzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5ID09IG51bGwpCi0JCXsKLQkJCXNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgPSBuZXcgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSgpOwotCQkJbmV3IFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnlSZWFkZXIoc2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSkKLQkJCQkJLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBzZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5OwotCX0KLQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KFN0cmluZyBpZCkKLQl7Ci0JCXJldHVybiBnZXRTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KCkuZ2V0U2VhcmNoUGFydGljaXBhbnQoaWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgc2VhcmNoIHBhcnRpY2lwYW50cyB0aGF0IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBzZWFyY2gKLQkgKiBwYXR0ZXJuIGFuZCBvcHRpb25zLCBsb2FkaW5nIGFuZCBjcmVhdGluZyB0aGUgc2VhcmNoIHBhcnRpY2lwYW50cyBpZiBuZWNlc3NhcnkuCi0JICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gcmVwcmVzZW50aW5nIGEgc2VhcmNoIHJlcXVlc3QKLQkgKiBAcGFyYW0gc2VhcmNoT3B0aW9ucyBNYXAgb2Ygb3B0aW9ucyBhbmQgdmFsdWVzIGRlZmluaW5nIGJlaGF2aW9yIG9mIHRoZSBzZWFyY2g7Ci0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvcHRpb25zIGFyZSBzcGVjaWZpZWQ7Ci0JICogICAgICAgICBzb21lIG9wdGlvbnMgYW5kIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIElTZWFyY2hPcHRpb25zfQotCSAqIEByZXR1cm4gQXJyYXkgb2Ygc2VhcmNoIHBhcnRpY2lwYW50cyB0aGF0IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBzZWFyY2ggcmVxdWVzdCAKLQkgKi8KLQlTZWFyY2hQYXJ0aWNpcGFudFtdIGxvYWRTZWFyY2hQYXJ0aWNpcGFudHMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucykKLQl7Ci0JCXJldHVybiBnZXRTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5KCkuZ2V0UGFydGljaXBhbnRzKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggZXhjZXB0aW9uLmdldFN0YXR1cygpICk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MGI1ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL1NlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb2xsZWN0cyB0aGUgcmVzdWx0cyBmcm9tIGEgc2VhcmNoIGVuZ2luZSBxdWVyeS4gQ2xpZW50cyBpbXBsZW1lbnQgYSBzdWJjbGFzcwotICogdG8gcGFzcyB0byA8Y29kZT5TZWFyY2hFbmdpbmUuc2VhcmNoPC9jb2RlPiBhbmQgaW1wbGVtZW50IHRoZQotICoge0BsaW5rICNhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCl9IG1ldGhvZC4KLSAqIDxwPgotICogVGhlIHN1YmNsYXNzZXMgb2YgdGhlIFNlYXJjaFJlcXVlc3RvciBjb3VsZCBjb2xsZWN0ZWQgc2VhcmNoIG1hdGNoZXMsIGZpbHRlciwKLSAqIHNvcnQgYW5kIGdyb3VwIHRoZW0uIEl0J3MgdXAgdG8gdGhlIGNsaWVudCB0byBwYXNzIHRoZSByZXF1aXJlZCBleHRlbnNpb24gb2YKLSAqIHRoZSBTZWFyY2hSZXF1ZXN0b3IgdG8gdGhlIHNlYXJjaCBlbmdpbmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogCi0gKiBAc2VlIFNlYXJjaEVuZ2luZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoUmVxdWVzdG9yCi17Ci0KLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiBzZWFyY2ggbWF0Y2guCi0JICogCi0JICogQHBhcmFtIG1hdGNoCi0JICogICAgICAgICAgICB0aGUgZm91bmQgbWF0Y2gKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0NvbXBvbmVudERlY2xhcmF0aW9uRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MzkzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBleHRlbmRzIEVudHJ5Ci17Ci0JUXVhbGlmaWVkTmFtZSBtZXRhTmFtZTsKLSAgICBRdWFsaWZpZWROYW1lIG5hbWU7Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUXVhbGlmaWVkTmFtZSBuYW1lKQotCXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLSAgcHVibGljIFF1YWxpZmllZE5hbWUgZ2V0TWV0YU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG1ldGFOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWV0YU5hbWUoUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSkKLSAgewotICAgIHRoaXMubWV0YU5hbWUgPSBtZXRhTmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L0NvbXBvbmVudFJlZmVyZW5jZUVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50UmVmZXJlbmNlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzMmYyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvQ29tcG9uZW50UmVmZXJlbmNlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFJlZmVyZW5jZUVudHJ5IGV4dGVuZHMgRW50cnkKLXsKLQlRdWFsaWZpZWROYW1lIG5hbWU7Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUXVhbGlmaWVkTmFtZSBuYW1lKQotCXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QxMGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIEVudHJ5Ci17Ci0gIFN0cmluZyBrZXk7Ci0gIFN0cmluZyBjYXRlZ29yeTsKLQotCXB1YmxpYyBFbnRyeSgpCi17Ci0Jc3VwZXIoKTsKLQkKLX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKQotCXsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKQotCXsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpCi0JewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpCi0JewotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9GaWxlUmVmZXJlbmNlRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9GaWxlUmVmZXJlbmNlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4OTUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvRmlsZVJlZmVyZW5jZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudDsKLQotLyoqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVSZWZlcmVuY2VFbnRyeSBleHRlbmRzIEVudHJ5Ci17Ci0JU3RyaW5nIHJlbGF0aXZlRmlsZVBhdGg7Ci0gICAgU3RyaW5nIHJlc29sdmVkVVJJOwotCVN0cmluZyBwdWJsaWNJZGVudGlmaWVyOwotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZGVudGlmaWVyKCkKLQl7Ci0JCXJldHVybiBwdWJsaWNJZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkZW50aWZpZXIoU3RyaW5nIHB1YmxpY0lkZW50aWZpZXIpCi0JewotCQl0aGlzLnB1YmxpY0lkZW50aWZpZXIgPSBwdWJsaWNJZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVGaWxlUGF0aCgpCi0JewotCQlyZXR1cm4gcmVsYXRpdmVGaWxlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZUZpbGVQYXRoKFN0cmluZyByZWxhdGl2ZUZpbGVQYXRoKQotCXsKLQkJdGhpcy5yZWxhdGl2ZUZpbGVQYXRoID0gcmVsYXRpdmVGaWxlUGF0aDsKLQl9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvbHZlZFVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZWRVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZFVSSShTdHJpbmcgcmVzb2x2ZWRVUkkpCi0gIHsKLSAgICB0aGlzLnJlc29sdmVkVVJJID0gcmVzb2x2ZWRVUkk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9kb2N1bWVudC9TZWFyY2hEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmZjYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotCi0vKioKLSAqIEEgc2VhcmNoIGRvY3VtZW50IGVuY2Fwc3VsYXRlcyBhIGNvbnRlbnQgdG8gYmUgc2VhcmNoZWQgaW4uIEEgc2VhcmNoCi0gKiBwYXJ0aWNpcGFudCBjcmVhdGVzIGEgc2VhcmNoIGRvY3VtZW50IGJhc2VkIG9uIHRoZSBmaWxlIGxvY2F0aW9ucyB0byBsb2NhdGUKLSAqIG1hdGNoZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogaXNzdWUgKGNzL2ViKSBkb2VzIGEgc2VhcmNoIHBhcnRpY2lwYW50IGFsd2F5cyBjcmVhdGUgYSBTZWFyY2hEb2N1bWVudD8KLSAqIAotICogPHA+Ci0gKiBTZWFyY2hQYXJ0aWNpcGFudCBvciBzZWFyY2ggY2xpZW50IGNyZWF0ZSBzZWFyY2ggZG9jdW1lbnRzIGZvciB0aGUgc2VhcmNoCi0gKiBwYXNzIHdoZXJlIHByZWNpc2UgbG9jYXRpb25zIG9mIHRoZSBtYXRjaGVzIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBjYWxsaW5nCi0gKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbiNsb2NhdGVNYXRjaGVzfQotICogPC9wPgotICogPHA+Ci0gKiBTZWFyY2hQYXJ0aWNpcGFudCBrbm93cyBob3cgdG8gY3JlYXRlIHNlYXJjaCBkb2N1bWVudCB0aGF0IGl0IGNhbiBwcm9jZXNzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgaW50ZW50IG9mIHRoZSBzZXBhcmF0aW9uIG9mIHRoZSB7QGxpbmsgU2VhcmNoRG9jdW1lbnR9IGZyb20gdGhlCi0gKiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnR9IGlzIHRvIGVuYWJsZSB0aGUgb3RoZXIgc2VhcmNoIHBhcnRpY2lwYW50cyB0bwotICogcHJvY2VzcyBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQuIEZvciBleGFtcGxlLCBpZiBYTUwgZG9jdW1lbnQgaGFzIGEgZnJhZ21lbnQKLSAqIHRoYXQgaXQgY2FuIG5vdCBwcm9jZXNzLCBlLmcuIEphdmEsIHRoZW4gWE1MIHBhcnRpY2lwYW50IHdvdWxkIGNyZWF0ZQotICogU2VhcmNoRG9jdW1lbnQgZm9yIHRoYXQgZnJhZ21lbnQgd2hpY2ggY29udGFpbnMgSmF2YSBjb21waWxhdGlvbiB1bml0LCBhbmQKLSAqIHBhc3MgaXQgdG8gdGhlIEphdmEgc2VhcmNoIHBhcnRpY2lwYW50LiBQYXNzaW5nIGl0cyBvd24KLSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3Rvcn0gdGhpcyBwYXJ0aWNpcGFudCBjYW4gdGhlbiBtYXAgdGhlIG1hdGNoIHBvc2l0aW9ucwotICogYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudHMsIGNyZWF0ZSBpdHMgb3duIG1hdGNoZXMgYW5kIHJlcG9ydCB0aGVtIHRvIHRoZQotICogb3JpZ2luYWwgcmVxdWVzdG9yLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBTZWFyY2hQYXJ0aWNpcGFudAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoRG9jdW1lbnQKLXsKLQotCXByaXZhdGUgU3RyaW5nIGRvY3VtZW50UGF0aDsKLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50OyAKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIGRvY3VtZW50LiBUaGUgZ2l2ZW4gZG9jdW1lbnQgcGF0aCBpcyBhIHN0cmluZyB0aGF0Ci0JICogdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnQuIE1vc3Qgb2YgdGhlIHRpbWUgaXQgaXMgYQotCSAqIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLCBidXQgaXQgY2FuIGFsc28gYmUgYSBmaWxlIHN5c3RlbSBwYXRoLCBvciBhIHBhdGgKLQkgKiBpbnNpZGUgYSB6aXAgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgZG9jdW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwcm90ZWN0ZWQgU2VhcmNoRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpCi0JewotCQl0aGlzLmRvY3VtZW50UGF0aCA9IGRvY3VtZW50UGF0aDsKLQkJdGhpcy5wYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBFbnRyeVtdIGdldEVudHJpZXMoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcga2V5LCBpbnQgbWF0Y2hSdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIG9mIHRoaXMgZG9jdW1lbnQuIE1vZGVsIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBhY3R1YWwKLQkgKiByZXNvdXJjZSBhdCBjb3JyZXNwb25kaW5nIGRvY3VtZW50IHBhdGggZHVlIHRvIHByZXByb2Nlc3NpbmcuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCBvZiB0aGlzIGRvY3VtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRNb2RlbCgpOwotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcnRpY2lwYW50IHRoYXQgY3JlYXRlZCB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGZpbmFsIFNlYXJjaFBhcnRpY2lwYW50IGdldFBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudDsKLQl9Ci0JCi0JCi0vLwkgdGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbgotLy8JIHRoYXQgaGFzIGJlZW4gcHJvZHVjZWQgYnkgYSBzZWFyY2ggcGFydGljaXBhbnQKLS8vCSB0eXBpY2FsbHkgYWZ0ZXIgYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZAotLy8JIGFuIEVudHJ5IGlzIHR5cGljYWxseSBjb3Vyc2UgZ3JhaW5lZCBpbmZvIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSBTZWFyY2hQYXJ0aWNpcGFudHMKLS8vCSBmaXJzdCBzdGVwIC4uLiBhbmQgaXMgdXNlZCB0byBjb21wdXRlIG1vcmUgYWNjdXJhdGUgU2VhcmNoTWF0Y2hlcyBkdXJpbmcgYSBTZWFyY2hQYXJ0aWNpcGFudHMgMm5kIHN0ZXAKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXRoKCkKLQl7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50UGF0aDsKLQl9IAotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dEVudHJ5KEVudHJ5IGVudHJ5KTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7ICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2RvY3VtZW50L1NlYXJjaERvY3VtZW50U2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmYjM0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvZG9jdW1lbnQvU2VhcmNoRG9jdW1lbnRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50OwotCi0vKioKLSAqIFRoZSBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSBhIHNldCBvZiBzZWFyY2ggZG9jdW1lbnRzCi0gKiB0aGF0IGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBieSB2YXJpb3VzIHBhcnRpY2lwYW50cwotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaERvY3VtZW50U2V0Ci17Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBnZXRTZWFyY2hEb2N1bWVudChTdHJpbmcgcmVzb3VyY2VQYXRoLCBTdHJpbmcgcGFydGljaXBhbnRJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudFtdIGdldFNlYXJjaERvY3VtZW50cyhTdHJpbmcgcGFydGljaXBhbnRJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1dFNlYXJjaERvY3VtZW50KFN0cmluZyBwYXJ0aWNpcGFudElkLCBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hEb2N1bWVudCBfdGVtcEdldFNlYXJjaERvY3VtZXRuKFN0cmluZyByZXNvdXJjZVBhdGgpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxZTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vLyBpc3N1ZSAoY3MpIGlzIHRoaXMgYSBVSSBpc3N1ZT8gIHdoZXJlIGRvZXMgdGhlIGZyYW1ld29yayBuZWVkIHRvIGV4cG9zZSBzdGluZ3M/Ci1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmdpbmVfc2VhcmNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5naW5lX3NlYXJjaGluZ19sb2NhdGluZ0RvY3VtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuZ2luZV9zZWFyY2hpbmdfbWF0Y2hpbmc7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkKLQl7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXN0YXRpYwotCXsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hEb2N1bWVudFNldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hEb2N1bWVudFNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmNmMzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoRG9jdW1lbnRTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50U2V0OwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoRG9jdW1lbnRTZXRJbXBsIGV4dGVuZHMgU2VhcmNoRG9jdW1lbnRTZXQKLXsKLSAgICBwdWJsaWMgTWFwIGRvY3VtZW50UGF0aE1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vcGF0aCAtLT4gZG9jdW1ldG4KLQlNYXAgZG9jdW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOyAgLy8gcGFydGljaXBhbnRJZCAtID4gbGlzdCAoZG9jdW1lbnQpCi0JCi0JcHVibGljIFNlYXJjaERvY3VtZW50U2V0SW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgX3RlbXBHZXRTZWFyY2hEb2N1bWV0bihTdHJpbmcgcmVzb3VyY2VQYXRoKQotICAgIHsgICAgICAKLSAgICAgICByZXR1cm4gKFNlYXJjaERvY3VtZW50KWRvY3VtZW50UGF0aE1hcC5nZXQocmVzb3VyY2VQYXRoKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGdldFNlYXJjaERvY3VtZW50KFN0cmluZyByZXNvdXJjZVBhdGgsIFN0cmluZyBwYXJ0aWNpcGFudElkKQotCXsKLQkJaWYocmVzb3VyY2VQYXRoID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU2VhcmNoRG9jdW1lbnRbXSBkb2N1bWVudHMgPSBnZXRTZWFyY2hEb2N1bWVudHMocGFydGljaXBhbnRJZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50c1tpXTsKLQkJCWlmKHJlc291cmNlUGF0aC5lcXVhbHMoZG9jdW1lbnQuZ2V0UGF0aCgpKSl7Ci0JCQkJcmV0dXJuIGRvY3VtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTZWFyY2hEb2N1bWVudFtdIGdldFNlYXJjaERvY3VtZW50cyhTdHJpbmcgcGFydGljaXBhbnRJZCkKLQl7Ci0JCQotCQlPYmplY3Qgb2JqZWN0ID0gZG9jdW1lbnRNYXAuZ2V0KHBhcnRpY2lwYW50SWQpOwotCQlMaXN0IGRvY3VtZW50TGlzdCA9IG51bGw7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpewotCQkJZG9jdW1lbnRMaXN0ID0gKExpc3Qpb2JqZWN0OwotCQl9Ci0JCWVsc2V7Ci0JCQlkb2N1bWVudE1hcC5wdXQocGFydGljaXBhbnRJZCwgZG9jdW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpKTsKLQkJfQotCQlyZXR1cm4gKFNlYXJjaERvY3VtZW50W10pIGRvY3VtZW50TGlzdC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtkb2N1bWVudExpc3Quc2l6ZSgpXSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHB1dFNlYXJjaERvY3VtZW50KFN0cmluZyBwYXJ0aWNpcGFudElkLCBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCkKLQl7Ci0JCU9iamVjdCBvYmplY3QgPSBkb2N1bWVudE1hcC5nZXQocGFydGljaXBhbnRJZCk7Ci0JCUxpc3QgZG9jdW1lbnRMaXN0ID0gbnVsbDsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTGlzdCl7Ci0JCQlkb2N1bWVudExpc3QgPSAoTGlzdClvYmplY3Q7Ci0JCX0KLQkJZWxzZXsKLQkJCWRvY3VtZW50TWFwLnB1dChwYXJ0aWNpcGFudElkLCBkb2N1bWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCkpOwotCQl9Ci0JCWRvY3VtZW50TGlzdC5hZGQoZG9jdW1lbnQpOwotICAgICAgICBkb2N1bWVudFBhdGhNYXAucHV0KGRvY3VtZW50LmdldFBhdGgoKSwgZG9jdW1lbnQpOwotCX0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZG9jdW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICB7ICAKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSAoKExpc3QpbykuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbzIgPSBqLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvMiBpbnN0YW5jZW9mIFNlYXJjaERvY3VtZW50KQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICBTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2N1bWVudCA9IChTZWFyY2hEb2N1bWVudClvMjsKLSAgICAgICAgICAgICAgIHNlYXJjaERvY3VtZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9ICAgICAgIAotICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTM5ZTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9TZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uVGFnTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsgCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yCi17Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmRWxlbWVudDsKLQotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQ7Ci0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkKLQl7Ci0JCWlmIChwYXJ0aWNpcGFudCA9PSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlwYXJ0aWNpcGFudCA9IChTZWFyY2hQYXJ0aWNpcGFudCkgZkVsZW1lbnQKLQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJ0aWNpcGFudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBmRWxlbWVudAotCQkJCS5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQXNzZXJ0LmlzVHJ1ZShlbGVtZW50cy5sZW5ndGggPT0gMSk7Ci0JCUV4cHJlc3Npb24gZXhwID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbGVtZW50c1swXSk7Ci0JCXJldHVybiBjb252ZXJ0KGV4cC5ldmFsdWF0ZShjb250ZXh0KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnQoRXZhbHVhdGlvblJlc3VsdCBldmFsKQotCXsKLQkJaWYgKGV2YWwgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgTm8gcmVwbGFjZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCkKLQl7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkU3VwcG9ydGVkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkKLQl7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKCl7Ci0JCXJldHVybiBmRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE2OWU5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkKLXsKLQotCXByb3RlY3RlZCBNYXAgaWRNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBtYXBzIHNlYXJjaFBhcnRpY2lwYW50IGlkIHRvIGEKLQkJCQkJCQkJCQkJLy8gc2VhcmNoUGFydGljaXBhbnQgZGVzY3JpcHRvcgotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRTZWFyY2hQYXJ0aWNpcGFudChTdHJpbmcgaWQsCi0JCQlTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3Igc2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKQotCXsKLQkJaWRNYXAucHV0KGlkLCBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTZWFyY2hQYXJ0aWNpcGFudElkcygpCi0JewotCQlTZXQgaWRzID0gaWRNYXAua2V5U2V0KCk7Ci0JCXJldHVybiAoU3RyaW5nW10pIGlkcy50b0FycmF5KG5ldyBTdHJpbmdbaWRzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlYXJjaFBhcnRpY2lwYW50cygpCi0JewotCQlyZXR1cm4gaWRNYXAudmFsdWVzKCk7Ci0JfQotCi0KLQlwdWJsaWMgU2VhcmNoUGFydGljaXBhbnQgZ2V0U2VhcmNoUGFydGljaXBhbnQoU3RyaW5nIGlkKQotCXsKLQkJU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yIHNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChpZCAhPSBudWxsKQotCQl7Ci0JCQlzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IgPSAoU2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yKSBpZE1hcAotCQkJCQkuZ2V0KGlkKTsKLQkJfQotCQlyZXR1cm4gc2VhcmNoUGFydGljaXBhbnREZXNjcmlwdG9yICE9IG51bGwgPyBzZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IKLQkJCQkuZ2V0U2VhcmNoUGFydGljaXBhbnQoKQotCQkJCTogbnVsbDsKLQotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudFtdIGdldFBhcnRpY2lwYW50cyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQotCQlFdmFsdWF0aW9uQ29udGV4dCBldmFsQ29udGV4dCA9IGNyZWF0ZUV2YWx1YXRpb25Db250ZXh0KHBhdHRlcm4pOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VhcmNoUGFydGljaXBhbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChTZWFyY2hQYXJ0aWNpcGFudERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJLm5leHQoKTsKLQkJCXRyeQotCQkJewotCQkJCWlmIChkZXNjcmlwdG9yLm1hdGNoZXMoZXZhbENvbnRleHQpKQotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCVNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50ID0gZGVzY3JpcHRvcgotCQkJCQkJCQkuZ2V0U2VhcmNoUGFydGljaXBhbnQoKTsKLQkJCQkJCWlmICghU2VhcmNoUGFydGljaXBhbnQuY2xhc3MuaXNJbnN0YW5jZShwYXJ0aWNpcGFudCkpCi0JCQkJCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigpOwotCQkJCQkJaWYgKHBhcnRpY2lwYW50LmlzQXBwbGljYWJsZShwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKSkKLQkJCQkJCXsKLQkJCQkJCQlyZXN1bHQuYWRkKHBhcnRpY2lwYW50KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gKFNlYXJjaFBhcnRpY2lwYW50W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBTZWFyY2hQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZhbHVhdGlvbkNvbnRleHQgY3JlYXRlRXZhbHVhdGlvbkNvbnRleHQoCi0JCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlFdmFsdWF0aW9uQ29udGV4dCByZXN1bHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgcGF0dGVybik7Ci0JCXJlc3VsdC5hZGRWYXJpYWJsZSgicGF0dGVybiIsIHBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL1NlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1N2NlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvaW50ZXJuYWwvU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeVJlYWRlcgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJzZWFyY2hQYXJ0aWNpcGFudHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJzZWFyY2hQYXJ0aWNpcGFudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQ7Ci0KLQlwcm90ZWN0ZWQgU2VhcmNoUGFydGljaXBhbnRSZWdpc3RyeSByZWdpc3RyeTsKLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudFJlZ2lzdHJ5UmVhZGVyKFNlYXJjaFBhcnRpY2lwYW50UmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLQl7Ci0JCVN0cmluZyBidW5kbGVpZCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoYnVuZGxlaWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKQotCQl7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotCQl7Ci0JCQlTdHJpbmcgY29udHJpYnV0b3JDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9yQ2xhc3MgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCVNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFNlYXJjaFBhcnRpY2lwYW50RGVzY3JpcHRvcigKLQkJCQkJCQllbGVtZW50KTsKLQkJCQkJcmVnaXN0cnkucHV0U2VhcmNoUGFydGljaXBhbnQoaWQsIGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTAxYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL2ludGVybmFsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgU2VhcmNoIG1lc3NhZ2VzLgotCi1lbmdpbmVfc2VhcmNoaW5nID0gU2VhcmNoaW5nLi4uCi1lbmdpbmVfc2VhcmNoaW5nX2xvY2F0aW5nRG9jdW1lbnRzID0gezB9OiBsb2NhdGUgc2VhcmNoIGRvY3VtZW50cy4uLgotZW5naW5lX3NlYXJjaGluZ19tYXRjaGluZyA9IHswfTogbG9jYXRlIG1hdGNoZXMuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjNmZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuOwotCi0vKioKLSAqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4KLXsKLQotCXB1YmxpYyBDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBuYW1lLAotCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSwgaW50IG1hdGNoUnVsZSkKLQl7Ci0JCXN1cGVyKG51bGwsIG5hbWUsIG1ldGFOYW1lLCBtYXRjaFJ1bGUpOwotCi0JfQotCi0JcHVibGljIENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIG5hbWUsCi0JCQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotCXsKLQkJc3VwZXIobnVsbCwgbmFtZSwgbWV0YU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjFlMTAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4KLXsKLQotCXB1YmxpYyBDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpCi0JewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLAotCQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpCi0JewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0NvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MWExMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9Db21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIGdlbmVyaWMgY29tcG9uZW50IHBhdHRlcm4uIFVzdWFsbHkgdGhlcmUgYXJlIHR3byB0eXBlcyBvZgotICogY29tcG9uZW50IHNlYXJjaCBwYXR0ZXJuczogcGF0dGVybiBmb3IgY29tcG9uZW50IGRlY2xhcmF0aW9uIGFuZCBmb3IKLSAqIGNvbXBvbmVudCBkZWZpbml0aW9uLgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50U2VhcmNoUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4KLXsKLQotCVF1YWxpZmllZE5hbWUgbmFtZTsKLQotCVF1YWxpZmllZE5hbWUgbWV0YU5hbWU7Ci0KLQlJRmlsZSBmaWxlOyAvLyAob3B0aW9uYWwpIGxvY2F0aW9uIHdoZXJlIGNvbXBvbmVudCBpcyBkZWZpbmVkCi0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwKLQkJCVF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJbmFtZSA9IGVsZW1lbnRRTmFtZTsKLQkJbWV0YU5hbWUgPSB0eXBlUU5hbWU7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwKLQkJCVF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKQotCXsKLQotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQluYW1lID0gZWxlbWVudFFOYW1lOwotCQltZXRhTmFtZSA9IHR5cGVRTmFtZTsKLQotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLQl7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldE1ldGFOYW1lKCkKLQl7Ci0JCXJldHVybiBtZXRhTmFtZTsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vRmlsZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL0ZpbGVSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzExNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vRmlsZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuCi17Ci0KLQlJRmlsZSBmaWxlOwotCi0JcHVibGljIEZpbGVSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUpCi0JewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBGaWxlUmVmZXJlbmNlUGF0dGVybihJRmlsZSBmaWxlLCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1F1YWxpZmllZE5hbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1F1YWxpZmllZE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3YWIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvcGF0dGVybi9RdWFsaWZpZWROYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybjsKLQotLyoqCi0gKiBUaGlzIGRhdGEgY2xhc3MgcmVwcmVzZW50cyBhIHF1YWxpZmllZCBuYW1lLCBjb25zaXN0aW5nIG9mIGEgbG9jYWwgbmFtZSBhbmQgYQotICogcXVhbGlmaWVyCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLS8vIGlzc3VlIChjcykgc2hvdWxkIHRoaXMgZ28gaW4gdGhlICdtYXRjaGluZycgcGFja2FnZSAoQlRXLi4uIHJlbmFtZQotLy8gbWF0Y2hpbmctPnBhdHRlcm4pCi1wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZQotewotCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOU19ERUxJTV8xID0gInsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfREVMSU1fMiA9ICJ9IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgQ3JlYXRlcyBhIHF1YWxpZmllZCBuYW1lIGZyb20gYSBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWVzcGFjZQotCSAqIEBwYXJhbSBsb2NhbE5hbWUKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMucXVhbGlmaWVyID0gbmFtZXNwYWNlOwotCQlpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXRoaXMucXVhbGlmaWVyID0gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5xdWFsaWZpZXIgIT0gbnVsbCAmJiB0aGlzLnF1YWxpZmllci5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQl0aGlzLnF1YWxpZmllciA9IG51bGw7Ci0JCX0KLQotCQl0aGlzLm5hbWUgPSBsb2NhbE5hbWU7Ci0JCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJdGhpcy5uYW1lID0gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIGNvbXBvbmVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZXNwYWNlOyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLQl7Ci0JCXJldHVybiB0aGlzLnF1YWxpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCBuYW1lIGNvbXBvbmVudCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgbG9jYWwgbmFtZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBzcGVjaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpCi0JewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLQl7Ci0JCWJvb2xlYW4gaXNFcXVhbCA9IGZhbHNlOwotCQlpZiAodGhpcyA9PSBvYmopCi0JCXsKLQkJICBpc0VxdWFsID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsJCi0JCSAgaWYgKG9iaiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0JCSAgewotCQkJUXVhbGlmaWVkTmFtZSB0aGF0ID0gKFF1YWxpZmllZE5hbWUpIG9iajsKLQkJICAgIGlzRXF1YWwgPSBpc01hdGNoKHRoaXMuZ2V0TmFtZXNwYWNlKCksIHRoYXQuZ2V0TmFtZXNwYWNlKCkpICYmCi0JCSAgICAgICAgICAgICAgaXNNYXRjaCh0aGlzLmdldExvY2FsTmFtZSgpLCB0aGF0LmdldExvY2FsTmFtZSgpKTsJCi0JCSAgfSAgCi0JCX0KLQkJcmV0dXJuIGlzRXF1YWw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2goU3RyaW5nIGEsIFN0cmluZyBiKQotCXsKLQkgIHJldHVybiBhICE9IG51bGwgPyBhLmVxdWFscyhiKSA6IGEgPT0gYjsKLQl9CQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkKLQl7Ci0JCWludCBoYXNoID0gMDsKLQkJaWYgKHRoaXMucXVhbGlmaWVyICE9IG51bGwpCi0JCXsKLQkJCWhhc2ggKz0gdGhpcy5xdWFsaWZpZXIuaGFzaENvZGUoKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lICE9IG51bGwpCi0JCXsKLQkJCWhhc2ggKz0gdGhpcy5uYW1lLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVhbGlmaWVkIG5hbWUsIG9mIHRoZSBmb3JtOgotCSAqIHtuYW1lc3BhY2V9bG9jYWxuYW1lLiBJZiBubyBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCB0aGUgc3RyaW5nIGhhcyB0aGUKLQkgKiBmb3JtOiB7fWxvY2FsbmFtZS4gTm90ZSB0aGF0IHRoZSBzdHJpbmcgZm9ybWF0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0KLQkJcmV0dXJuIGFwcGVuZFN0cmluZ3MobmV3IFN0cmluZ1tdCi0JCXsgTlNfREVMSU1fMSwgLy8gewotCQkJCXRoaXMucXVhbGlmaWVyLCBOU19ERUxJTV8yLCAvLyB9Ci0JCQkJdGhpcy5uYW1lIH0pOwotCi0JfQotCi0JLyoqCi0JICogRmFjdG9yeS1saWtlIG1ldGhvZCB0byBjcmVhdGUgYSBRTmFtZSBvYmplY3QgZnJvbSB0aGUgc3RyaW5nIGZvcm0gb2YgYQotCSAqIFFOYW1lLiBUaGUgc3RyaW5nIG11c3QgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKLQkgKiBRTmFtZS50b1N0cmluZygpLgotCSAqIAotCSAqIEBwYXJhbSBxbmFtZVN0cmluZyAtCi0JICogICAgICAgICAgICBTdHJpbmcgZm9ybSBvZiBhIFFOYW1lCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBRTmFtZSBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLQotCSAqICAgICAgICAgICAgIE1pc3NpbmcgbmFtZXNwYWNlIGRlbGltaXRlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFF1YWxpZmllZE5hbWUgdmFsdWVPZihTdHJpbmcgcW5hbWVTdHJpbmcpCi0JCQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JewotCi0JCVN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gbnVsbDsKLQkJaWYgKHFuYW1lU3RyaW5nID09IG51bGwgfHwgcW5hbWVTdHJpbmcubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJLy8gQm90aCBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUgYXJlIG51bGwuCi0JCX0gZWxzZSBpZiAocW5hbWVTdHJpbmcuc3RhcnRzV2l0aChOU19ERUxJTV8xKSkKLQkJewotCQkJLy8gVGhlIFFOYW1lIGhhcyB0aGUgbm90YXRpb24gc3BlY2lmeWluZyBhIG5hbWVzcGFjZS4KLQkJCWludCBpbmRleCA9IHFuYW1lU3RyaW5nLmluZGV4T2YoTlNfREVMSU1fMik7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJLy8gVGhlIGVuZCBkZWxpbWl0ZXIgZm9yIHRoZSBuYW1lc3BhY2Ugd2FzIG5vdCBmb3VuZC4gVGhlIFFOYW1lCi0JCQkJLy8gc3RyaW5nCi0JCQkJLy8gaXMgbWFsZm9ybWVkLgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkicW5hbWVTdHJpbmcgPSAiICsgcW5hbWVTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lc3BhY2UgPSBxbmFtZVN0cmluZy5zdWJzdHJpbmcoMSwgaW5kZXgpOwotCQkJbG9jYWxOYW1lID0gcW5hbWVTdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCX0gZWxzZQotCQl7Ci0JCQkvLyBBc3N1bWUgbm8gbmFtZXNwYWNlIGlzIHNwZWNpZmllZCBhbmQgdGhlIHN0cmluZyBpcyBhIGxvY2FsIG5hbWUuCi0JCQlsb2NhbE5hbWUgPSBxbmFtZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBzdHJpbmcgYnkgYXBwZW5kaW5nIHRvZ2V0aGVyIGFuIGFycmF5IG9mIHN0cmluZ3MsCi0JICogc2tpcHBpbmcgbnVsbCBzdHJpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdzIC0KLQkgKiAgICAgICAgICAgIFN0cmluZ3MgdG8gYmUgYXBwZW5kZWQgdG9nZXRoZXIKLQkgKiBAcmV0dXJuIFJlc3VsdGluZyBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTdHJpbmdzKFN0cmluZ1tdIHN0cmluZ3MpCi0JewotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5ncyAhPSBudWxsKQotCQl7Ci0JCQlTdHJpbmdCdWZmZXIgdG9rZW5CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgbWF4Q291bnQgPSBzdHJpbmdzLmxlbmd0aDsKLQkJCVN0cmluZyBzdHJpbmc7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heENvdW50OyBpKyspCi0JCQl7Ci0JCQkJc3RyaW5nID0gc3RyaW5nc1tpXTsKLQkJCQlpZiAoc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCQl7Ci0JCQkJCXRva2VuQnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQkJCX0vLyBpZgotCQkJfS8vIGZvcgotCQkJcmVzdWx0ID0gdG9rZW5CdWZmZXIudG9TdHJpbmcoKTsKLQkJfS8vIGlmCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ly8gYXBwZW5kU3RyaW5ncygpCi0KLX0vLyBjbGFzcyBRTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vU2VhcmNoUGF0dGVybi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3BhdHRlcm4vU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBhYWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9wYXR0ZXJuL1NlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQSBzZWFyY2ggZGVmaW5lcyBob3cgc2VhcmNoIHJlc3VsdHMgYXJlIGZvdW5kLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlYXJjaFBhdHRlcm4gaW1wbGVtZW50cyBJQWRhcHRhYmxlCi17Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc2VhcmNoIHJlc3VsdCBvbmx5IGlmIGNhc2VzCi0JICogYXJlIHRoZSBzYW1lLiBDYW4gYmUgY29tYmluZWQgdG8gcHJldmlvdXMgcnVsZXMsIGUuZy4KLQkgKiB7QGxpbmsgI1JfRVhBQ1RfTUFUQ0h9IHwge0BsaW5rICNSX0NBU0VfU0VOU0lUSVZFfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfQ0FTRV9TRU5TSVRJVkUgPSA4OwotCi0JLy8gUnVsZXMgZm9yIHBhdHRlcm4gbWF0Y2hpbmc6IChleGFjdCwgcHJlZml4LCBwYXR0ZXJuKSBbIHwgY2FzZSBzZW5zaXRpdmVdCi0JLyoqCi0JICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIG1hdGNoZXMgZXhhY3RseSB0aGUgc2VhcmNoIHJlc3VsdCwgdGhhdAotCSAqIGlzLCB0aGUgc291cmNlIG9mIHRoZSBzZWFyY2ggcmVzdWx0IGVxdWFscyB0aGUgc2VhcmNoIHBhdHRlcm4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9FWEFDVF9NQVRDSCA9IDA7Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gY29udGFpbnMgb25lIG9yIG1vcmUgd2lsZCBjYXJkcyAoJyonKQotCSAqIHdoZXJlIGEgd2lsZC1jYXJkIGNhbiByZXBsYWNlIDAgb3IgbW9yZSBjaGFyYWN0ZXJzIGluIHRoZSBzZWFyY2ggcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfUEFUVEVSTl9NQVRDSCA9IDI7Ci0KLQkvKioKLQkgKiBNYXRjaCBydWxlOiBUaGUgc2VhcmNoIHBhdHRlcm4gaXMgYSBwcmVmaXggb2YgdGhlIHNlYXJjaCByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUl9QUkVGSVhfTUFUQ0ggPSAxOwotCi0JLyoqCi0JICogTWF0Y2ggcnVsZTogVGhlIHNlYXJjaCBwYXR0ZXJuIGNvbnRhaW5zIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfUkVHRVhQX01BVENIID0gNDsKLQotCXByaXZhdGUgaW50IG1hdGNoUnVsZTsKLQotCXB1YmxpYyBTZWFyY2hQYXR0ZXJuKCkKLQl7Ci0JCXRoaXMubWF0Y2hSdWxlID0gUl9FWEFDVF9NQVRDSCB8IFJfQ0FTRV9TRU5TSVRJVkU7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhdHRlcm4oaW50IG1hdGNoUnVsZSkKLQl7Ci0JCXRoaXMubWF0Y2hSdWxlID0gbWF0Y2hSdWxlOwotCi0JfQotCi0JcHVibGljIGZpbmFsIGludCBnZXRNYXRjaFJ1bGUoKQotCXsKLQkJcmV0dXJuIHRoaXMubWF0Y2hSdWxlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotCXsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Db250ZW50VHlwZVNlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvQ29udGVudFR5cGVTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdhZjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Db250ZW50VHlwZVNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotCi0vKioKLSAqIFNjb3BlIHRoYXQgaGFzIGZpbHRlcmVycyBmaWxlcyBiYXNlZCBvbiBjb250ZW50IHR5cGVzLiBJdCBjYW4gbGltaXQgb3RoZXIKLSAqIHNjb3BlcyB3aXRoIHRoZSBnaXZlbiBmaWxlIGNvbnRlbnQgdHlwZXMuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZVNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQlwcml2YXRlIExpc3QgdmFsaWRDb250ZW50SWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIENvbnRlbnRUeXBlU2VhcmNoU2NvcGUoU2VhcmNoU2NvcGUgc2NvcGUsIFN0cmluZ1tdIHZhbGlkQ29udGVudFR5cGVzKQotCXsKLQkJaWYgKHZhbGlkQ29udGVudFR5cGVzICE9IG51bGwpCi0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJdGhpcy52YWxpZENvbnRlbnRJZHMuYWRkKHZhbGlkQ29udGVudFR5cGVzW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAoc2NvcGUuZW5jbG9zaW5nRmlsZXMoKSAhPSBudWxsKQotCQl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCkubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgc2NvcGUuZW5jbG9zaW5nRmlsZXMoKVtpXTsKLQkJCQlhY2NlcHRGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGaWxlKElGaWxlIGZpbGUpCi0JewotCi0JCWlmIChmaWxlID09IG51bGwpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCXsKLQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCS8vIFRPRE8gdXNlIElDb250ZW50VHlwZS5pc0tpbmRPZgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsaWRDb250ZW50SWRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspCi0JCQkJCQl7Ci0JCQkJCQkJU3RyaW5nIGNvbnRlbnRJZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJCQkJSUNvbnRlbnRUeXBlIHN1cHBvcnRlZENvbnRlbnRUeXBlID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRJZCk7Ci0JCQkJCQkJaWYgKHN1cHBvcnRlZENvbnRlbnRUeXBlICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoY29udGVudFR5cGUuaXNLaW5kT2Yoc3VwcG9ydGVkQ29udGVudFR5cGUpKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQkJCQlwcm9qZWN0cy5hZGQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJewotCQkJCS8vIGlnbm9yZSB0aGUgZmlsZQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Qcm9qZWN0U2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Qcm9qZWN0U2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhY2U3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvUHJvamVjdFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2NvcGUgdGhhdCBlY2xvc2VzIHdvcmtzcGFjZSBwYXRoIGFuZCBlY2xvc2luZyBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHdvcmtzcGFjZVBhdGggLQotCSAqICAgICAgICAgICAgcGF0aCB0byB0aGUgcmVzb3VyY2UgaW4gdGhlIHdvcmtzcGFjZSwgZS5nLgotCSAqICAgICAgICAgICAgL015UHJvamVjdC9NeUZpbGUueG1sCi0JICovCi0JcHVibGljIFByb2plY3RTZWFyY2hTY29wZShJUGF0aCB3b3Jrc3BhY2VQYXRoKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSh3b3Jrc3BhY2VQYXRoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSVBhdGggd29ya3NwYWNlUGF0aCkKLQl7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkuZmluZE1lbWJlcih3b3Jrc3BhY2VQYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQl0cmF2ZXJzZUNvbnRhaW5lcihwcm9qZWN0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlYXJjaFNjb3BlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRkM2VmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQSA8Y29kZT5TZWFyY2hTY29wZTwvY29kZT4gZGVmaW5lcyB3aGVyZSBzZWFyY2ggcmVzdWx0IHNob3VsZCBiZSBmb3VuZCBieSBhCi0gKiA8Y29kZT5TZWFyY2hFbmdpbmU8L2NvZGU+IChlLmcuIHByb2plY3QsIHdvcmtzcGFjZSkuCi0gKiAKLSAqIENsaWVudHMgbXVzdCBwYXNzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8gdGhlIDxjb2RlPnNlYXJjaCguLi4pPC9jb2RlPgotICogbWV0aG9kcy4gU3VjaCBhbiBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZhY3RvcnkgbWV0aG9kcwotICogb24gPGNvZGU+U2VhcmNoU2NvcGU8L2NvZGU+OiA8Y29kZT5uZXdTZWFyY2hTY29wZShJUmVzb3VyY2VbXSk8L2NvZGU+LAotICogPGNvZGU+bmV3V29ya3NwYWNlU2NvcGUoKTwvY29kZT4KLSAqIAotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YWlvbiBvZiB0aGUgc2VhcmNoIHNjb3BlIGhhcyBubyBmaWx0ZXIsIGFuZCBhdCBjcmVhdGlvbgotICogZG9lcyBub3QgY29udGFpbiBhbnkgZmlsZXMsIEl0IGNvdWxkIGFjY2VwdCBhbnkgd29ya3NwYWNlIGZpbGUuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWFyY2hTY29wZQotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBmaWxlcyB0aGF0IGJlbG9uZyBpbiB0aGlzIHNlYXJjaCBzY29wZS4KLQkgKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLAotCSAqIC9NeVByb2plY3QvTXlGaWxlLnR4dAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGJlbG9uZyB0byB0aGlzIHNjb3BlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRmlsZVtdIGVuY2xvc2luZ0ZpbGVzKCk7Ci0KLQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWFyY2hTY29wZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNGM2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvU2VhcmNoU2NvcGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICoKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTY29wZUltcGwgZXh0ZW5kcyBTZWFyY2hTY29wZQotewotCi0JcHJvdGVjdGVkIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgSGFzaFNldCBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgU2VhcmNoU2NvcGVJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJlc291cmNlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGJlbG9uZ3MgdG8gdGhpcyBzY29wZS4KLQkgKiBSZXNvdXJjZSBwYXRoIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBzY29wZSwgaWYgc2NvcGUgY29uZGl0aW9ucyBhcmUgbWV0LgotCSAqIGlmIHtAbGluayBJU2VhcmNoU2NvcGUuZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aCl9IHJldHVybnMgZmFsc2UgYW5kCi0JICogdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYW5kIHJldHVybnMgdHJ1ZSwgbmV4dCBjYWxsIHRvCi0JICoge0BsaW5rIElTZWFyY2hTY29wZS5lY2xpcHNlcyhTdHJpbmcgcmVzb3VyY2VQYXRoKX0gc2hvdWxkIHJldHVybiB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIC0KLQkgKiAgICAgICAgICAgIHdvcmtzcGFjZSBmaWxlCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSB0aGlzIHNjb3BlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmlsZShJRmlsZSBmaWxlKQotCXsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbGVzLmFkZChmaWxlKTsKLQkJcHJvamVjdHMuYWRkKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVzb3VyY2UgYXQgdGhlIGdpdmVuIHBhdGggaXMgZW5jbG9zZWQgYnkgdGhpcyBzY29wZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHdvcmtzcGFjZSByZWxhdGl2ZSByZXNvdXJjZSBwYXRoCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBlbmNsb3NlZCBieSB0aGlzIHNjb3BlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aCkKLQl7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCQkuZmluZE1lbWJlcihyZXNvdXJjZVBhdGgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChmaWxlcy5jb250YWlucyhyZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBmaWxlcyB0aGF0IGJlbG9uZyBpbiB0aGlzIHNlYXJjaCBzY29wZS4KLQkgKiAoc2VlIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLAotCSAqIC9NeVByb2plY3QvTXlGaWxlLnR4dAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGJlbG9uZyB0byB0aGlzIHNjb3BlLgotCSAqLwotCXB1YmxpYyBJRmlsZVtdIGVuY2xvc2luZ0ZpbGVzKCkKLQl7Ci0JCWlmIChmaWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKLQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmaWxlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRocyB0byB0aGUgZW5jbG9zaW5nIHByb2plY3RzIGZvciB0aGlzIHNlYXJjaCBzY29wZS4gKHNlZQotCSAqIDxjb2RlPklSZXNvdXJjZS5nZXRGdWxsUGF0aCgpPC9jb2RlPikuIEZvciBleGFtcGxlLCAvTXlQcm9qZWN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwYXRocyB0byB0aGUgZW5jbG9zaW5nIHByb2plY3RzLgotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdFtdIGVuY2xvc2luZ1Byb2plY3RzKCkKLQl7Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBwcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZUNvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lcikKLQl7Ci0KLQkJSVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKQotCQl7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpCi0JCQl7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJYWNjZXB0RmlsZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJdHJ5Ci0JCXsKLQkJCWNvbnRhaW5lci5hY2NlcHQodmlzaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gaWdub3JlIHJlc291cmNlCi0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9TZWxlY3Rpb25TZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlbGVjdGlvblNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmNkM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1NlbGVjdGlvblNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25TZWFyY2hTY29wZSBleHRlbmRzIFNlYXJjaFNjb3BlSW1wbAotewotCi0JcHJvdGVjdGVkIElSZXNvdXJjZVtdIHJlc291cmNlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY29wZSB0aGF0IGVjbG9zZXMgd29ya3NwYWNlIHBhdGggYW5kIGVjbG9zaW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLCBlLmcuCi0JICogICAgICAgICAgICAvTXlQcm9qZWN0L015RmlsZS54bWwKLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uU2VhcmNoU2NvcGUoSVJlc291cmNlW10gcmVzb3VyY2VzKQotCXsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCWluaXRpYWxpemUoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKQotCXsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcmVzb3VyY2VzLmxlbmd0aDsgaW5kZXgrKykKLQkJewotCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2luZGV4XTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJewotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQl7Ci0JCQkJCXRyYXZlcnNlQ29udGFpbmVyKChJRm9sZGVyKSByZXNvdXJjZSk7Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJewotCQkJCQlhY2NlcHRGaWxlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3JraW5nU2V0U2VhcmNoU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3JraW5nU2V0U2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMWExOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvc2NvcGUvV29ya2luZ1NldFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gd3JhcCB0aGUgY29udGVudCBvZiBhbiBJV29ya2luZ1NldC4KLSAqIFdlIGNhbid0IHVzZSBJV29ya2luZ1NldCBkaXJlY3RseSBiZWNhdXNlIGl0J3MgcGFydCBvZiBhbiBlY2xpcHNlLnVpCi0gKiBjb21wb25lbnQuIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QgYXMgYSBzdXJyb2dhdGUuCi0gKiA8YnI+Ci0gKiBVc2FnZTogV2UgZ2V0IHRoZSBhcnJheSBJQWRhcHRhYmxlW10gb2YgdGhlIElXb3JraW5nU2V0IG9iamVjdCBhbmQgdXNlIHRoaXMKLSAqIGFycmF5IGFzIGFyZ3VtZW50IGZvciBhbGwgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGluY2x1ZGluZyB0aGUgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nU2V0U2VhcmNoU2NvcGUgZXh0ZW5kcyBTZWFyY2hTY29wZUltcGx7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBzY29wZSB3aGVuIG5vIHJlc291cmNlcyBpcyBnaXZlbi4KLQkgKi8KLQlwdWJsaWMgV29ya2luZ1NldFNlYXJjaFNjb3BlKCl7Ci0JCXN1cGVyKCk7Ci0JfQotICAKLQkvKioKLQkgKiBJbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggYW4gSVdvcmtpbmdTZXQKLQkgKiA8YnI+Ci0JICogRm9yIGV4YW1wbGU6Ci0JICogPHByZT4KLQkgKiBJV29ya2luZ1NldCBvbmVXb3JraW5nU2V0OwotCSAqIC4uLgotCSAqIElBZGFwdGFibGVbXSBlbGVtZW50cyA9IG9uZVdvcmtpbmdTZXQuZ2V0RWxlbWVudHMoKTsKLQkgKiBXb3JraW5nU2V0U2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgV29ya2luZ1NldFNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgV29ya2luZ1NldFNlYXJjaFNjb3BlKElBZGFwdGFibGVbXSBlbGVtZW50cykKLQl7Ci0JCXN1cGVyKCk7Ci0JCWFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KGVsZW1lbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogSW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIGFuIElXb3JraW5nU2V0Ci0JICogPGJyPgotCSAqIEZvciBleGFtcGxlOgotCSAqIDxwcmU+Ci0JICogV29ya2luZ1NldFNlYXJjaFNjb3BlIHNjb3BlID0gLi47IAotCSAqIC4uLgotCSAqIElXb3JraW5nU2V0IGFub3RoZXJXb3JraW5nU2V0OyAKLQkgKiBJQWRhcHRhYmxlW10gZWxlbWVudHMgPSBhbm90aGVyV29ya2luZ1NldC5nZXRFbGVtZW50cygpOwotCSAqIHNjb3BlLmFkZEFXb3JraW5nU2V0VG9TY29wZShlbGVtZW50cyk7Ci0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQVdvcmtpbmdTZXRUb1Njb3BlKElBZGFwdGFibGVbXSBlbGVtZW50cyl7Ci0JCWFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRzT2ZXb3JraW5nU2V0KElBZGFwdGFibGVbXSBlbGVtZW50cyl7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgZWxlbWVudHNbal0uZ2V0QWRhcHRlcihJQ29udGFpbmVyLmNsYXNzKTsKLQkJCWlmICggY29udGFpbmVyICE9IG51bGwgKXsKLQkJCQl0cmF2ZXJzZUNvbnRhaW5lcihjb250YWluZXIpOwotCQkJfQotCQkJZWxzZXsKLQkJCQlJRmlsZSBhRmlsZSA9IChJRmlsZSkgZWxlbWVudHNbal0uZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQkJaWYgKCBhRmlsZSAhPSBudWxsKQotCQkJCQlhY2NlcHRGaWxlKGFGaWxlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC9zY29wZS9Xb3Jrc3BhY2VTZWFyY2hTY29wZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtzcGFjZVNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMWMyMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvc2VhcmNoL3Njb3BlL1dvcmtzcGFjZVNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLS8qKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZVNlYXJjaFNjb3BlIGV4dGVuZHMgU2VhcmNoU2NvcGVJbXBsCi17Ci0KLQlwcm90ZWN0ZWQgSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzY29wZSB0aGF0IGVjbG9zZXMgd29ya3NwYWNlIHBhdGggYW5kIGVjbG9zaW5nIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gd29ya3NwYWNlUGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIHRvIHRoZSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLCBlLmcuCi0JICogICAgICAgICAgICAvTXlQcm9qZWN0L015RmlsZS54bWwKLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlU2VhcmNoU2NvcGUoKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpCi0JewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJdHJhdmVyc2VDb250YWluZXIocm9vdCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC91dGlsL0NvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3NlYXJjaC91dGlsL0NvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyN2Y5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS9zZWFyY2gvdXRpbC9Db2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogQ29sbGVjdHMgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkgYSA8Y29kZT5JU2VhcmNoRW5naW5lPC9jb2RlPi4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotLy8gaXNzdWUgc2hvdWxkIHlvdSBtb3ZlIHRoaXMgdG8gYSB1dGlsIHBhY2thZ2U/IHdoYXQgZG9lcyBqZHQgZG8/Ci1wdWJsaWMgY2xhc3MgQ29sbGVjdGluZ1NlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvcgotewotCXByaXZhdGUgQXJyYXlMaXN0IGZGb3VuZDsKLQotCXB1YmxpYyBDb2xsZWN0aW5nU2VhcmNoUmVxdWVzdG9yKCkKLQl7Ci0JCWZGb3VuZCA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiB7QGxpbmsgU2VhcmNoTWF0Y2h9ZXMgKG5vdCBzb3J0ZWQpCi0JICovCi0JcHVibGljIExpc3QvKiA8U2VhcmNoTWF0Y2g+ICovZ2V0UmVzdWx0cygpCi0JewotCQlyZXR1cm4gZkZvdW5kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5wcm92aXNpb25hbC5TZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zZWFyY2guaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VhcmNoTWF0Y2gpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmRm91bmQuYWRkKG1hdGNoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmM2UyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBDbGFzcyB0byByZWFkIGEgcmVnaXN0cnkuIEl0IGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSBzcGVjaWZpYyBmdW5jdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVNX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgcGx1Z2luSWQ7Ci0KLQlTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZDsKLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZSBzeXN0ZW1CdW5kbGU7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHBsdWdpbiBpZCBvZiBhIGNvbmZpZ3VhdGlvbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25FbGVtZW50Ci0JICogQHJldHVybiBwbHVnaW4gaWQgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IG51bGw7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0KLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkKLQkJCQlwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVnaXN0cnlSZWFkZXIgdGFraW5nIGEgcmVnaXN0cnksIHBsdWdpbiBpZCwgYW5kIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2UgUmVnaXN0cnlSZWFkZXIocGx1Z2luLCBleHRlbnNpb25Qb2ludCkgaW5zdGVhZC4gVGhlIHJlZ2lzdHJ5IHBhc3NlZCBpbiBpcyBpZ25vcmVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcihJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwbHVnaW5JRCwgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRoaXMocGx1Z2luSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVnaXN0cnlSZWFkZXIgdGFraW5nIHRoZSBwbHVnaW4gaWQgYW5kIGV4dGVuc2lvbiBwb2ludCBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luSUQKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoU3RyaW5nIHBsdWdpbklELCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklEOwotCQlleHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiByZWNvZ25pemVkID0gdGhpcy5yZWFkRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKCFyZWNvZ25pemVkKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiRXJyb3IgcHJvY2Vzc2luZyBleHRlbnNpb246ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgZGVza3RvcCBsb2cgdXNpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJU2VhcmNoUGx1Z2luLmxvZ0Vycm9yKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZWFkIGVsZW1lbnQgYXR0cmlidXRlcy4gSWYgdGhpcyBlbGVtZW50IGhhcyBzdWJlbGVtZW50cywgdGhlIHJlYWRlciB3aWxsIHJlY3Vyc2l2ZWx5IGN5Y2xlIHRocm91Z2ggdGhlbSBhbmQgY2FsbCB0aGlzCi0JICogbWV0aG9kIHNvIGRvbid0IGRvIGl0IGhlcmUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogUmVhZCB0aGUgZXh0ZW5zaW9uIHBvaW50IGFuZCBwYXJzZSBpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkKLQkJewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQkvLyB0aGUgZm9sbG93aW5nIGNvZGUgaXMgdG8gaGFuZGxlIHRoZSBjb250cmlidXRpb25zIHRvIHRoZSBkZXByZWNhdGVkIG9yZy5lY2xpcHNlLmplbS51dGlsIGV4dGVuc2lvbnMKLQkJaWYgKCFKRU1fUExVR0lOX0lELmVxdWFscyhwbHVnaW5JZCkpCi0JCXsKLQkJCXBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChKRU1fUExVR0lOX0lELCBleHRlbnNpb25Qb2ludElkKTsKLQkJCWlmIChwb2ludCAhPSBudWxsKQotCQkJewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0byBzZWUgaWYgaXQgaXMgdmFsaWQgYXQgdGhpcyBwb2ludCBpbiB0aW1lIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4gQSB2YWxpZCByZWFzb24gbm90IHRvIHdvdWxkIGJlIHRoYXQgdGhlIHdvcmtzcGFjZSBpcwotCSAqIHNodXR0aW5nIGRvbncuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHZhbGlkIHBvaW50IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoUGxhdGZvcm0uaXNSdW5uaW5nKCkgJiYgZ2V0U3lzdGVtQnVuZGxlKCkuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuU1RPUFBJTkcpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3lzdGVtIGJ1bmRsZQotCSAqIAotCSAqIEByZXR1cm4gc3lzdGVtIGJ1bmRsZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1bmRsZSBnZXRTeXN0ZW1CdW5kbGUoKSB7Ci0JCWlmIChzeXN0ZW1CdW5kbGUgPT0gbnVsbCkKLQkJCXN5c3RlbUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uub3NnaSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzeXN0ZW1CdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljMGJiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29yZS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQbHVnaW47Ci0KLQotLyoqCi0gKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3IgVUlDb250ZXh0IGRldGVybWluYXRpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDEwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURMRVNTX0NPTlRFWFRfTElURVJBTCA9ICJIZWFkbGVzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfTElURVJBTCA9ICJVSSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURMRVNTX0NPTlRFWFQgPSAxMDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSV9DT05URVhUID0gMTAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNhY2hlZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGN1cnJlbnRDb250ZXh0ID0gVU5LTk9XTjsKLQotCS8qKgotCSAqIERvIG5vdCB1c2UtIHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBzaG91bGQgYmUgYWNjZXNzZWQgdmlhIGl0cyBzdGF0aWMgbWV0aG9kcyBvbmx5LgotCSAqLwotCXByb3RlY3RlZCBVSUNvbnRleHREZXRlcm1pbmF0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiBjbGFzcyBiYXNlZCBvbiB0aGUgVUkgb3IgSGVhZGxlc3MgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBuZXcgY2xhc3MgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBrZXkuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGlzIGludmFsaWQgKGUuZy4gbm8gZXh0ZW5zaW9uIGlzIGZvdW5kIGZvciB0aGUga2V5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUluc3RhbmNlKFN0cmluZyBrZXkpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjYWNoZWRFeHRlbnNpb25zID09IG51bGwpCi0JCQlpbml0RXh0ZW5zaW9ucygpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29udGV4dFNlbnNpdGl2ZUNsYXNzID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY2FjaGVkRXh0ZW5zaW9ucy5nZXQoa2V5KTsKLQkJdHJ5IHsKLQkJCWlmIChjb250ZXh0U2Vuc2l0aXZlQ2xhc3MgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlci5VSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NMQVNTTkFNRV9BVFRSKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTZWFyY2hQbHVnaW4ubG9nRXJyb3IoIlByb2JsZW0gbG9hZGluZyBleHRlbnNpb24gbm90IGZvdW5kIGZvciBrZXkgXCIiICsga2V5ICsgIlwiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVNlYXJjaFBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlTZWFyY2hQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbiBub3QgZm91bmQgZm9yIGtleSBcIiIgKyBrZXkgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGV4dCAtLSBkZXRlcm1pbmVzIHRoZSB2YWx1ZSBpZiBuZWNlc3NhcnkuCi0JICogCi0JICogQHJldHVybiBjdXJyZW50IGNvbnRleHQKLQkgKiBAc2VlICNIRUFETEVTU19DT05URVhUCi0JICogQHNlZSAjVUlfQ09OVEVYVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEN1cnJlbnRDb250ZXh0KCkgewotCQlpZiAoY3VycmVudENvbnRleHQgPT0gVU5LTk9XTikgewotCQkJY3VycmVudENvbnRleHQgPSBIRUFETEVTU19DT05URVhUOwotCQkJbmV3IFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudENvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiBJbnZva2VzIHRoZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIgdG8gY2FjaGUgYWxsIG9mIHRoZSBleHRlbnNpb25zLCBpZiBuZWNlc3NhcnkuCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChjYWNoZWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCWNhY2hlZEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbmV3IFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gb25lIG9mIFVJX0NPTlRFWFQgb3IgSEVBRExFU1NfQ09OVEVYVC4gRGVmYXVsdHMgdG8gSEVBRExFU1Mgb24gaW52YWxpZCBpbnB1dAotCSAqIAotCSAqIEBwYXJhbSBsaXRlcmFsIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgY29udmVydExpdGVyYWwoU3RyaW5nIGxpdGVyYWwpIHsKLQkJcmV0dXJuIChVSV9DT05URVhUX0xJVEVSQUwuZXF1YWxzKGxpdGVyYWwpKSA/IFVJX0NPTlRFWFQgOiBIRUFETEVTU19DT05URVhUOwotCX0KLQotCS8qCi0JICogUmVhZHMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBVSSBDb250ZXh0LXNlbnNpdGl2ZSBjbGFzcyBleHRlbnNpb25zIGFuZCBpbml0aWFsaXplcyB0aGUgY2FjaGUgb2YgdGhlIFVJQ29udGV4dERldGVybWluYXRpb24gb2JqZWN0LgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0VMRU1FTlQgPSAidWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19LRVlfQVRUUiA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DTEFTU05BTUVfQVRUUiA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DT05URVhUX0FUVFIgPSAiY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyKCkgewotCQkJc3VwZXIoU2VhcmNoUGx1Z2luLlBMVUdJTl9JRCwgU2VhcmNoUGx1Z2luLlVJX0NPTlRFWFRfRVhURU5TSU9OX1BPSU5UKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0VMRU1FTlQpKSB7Ci0KLQkJCQlTdHJpbmcga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19LRVlfQVRUUik7Ci0JCQkJU3RyaW5nIGNvbnRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NPTlRFWFRfQVRUUik7Ci0KLQkJCQlpZiAoIWNhY2hlZEV4dGVuc2lvbnMuY29udGFpbnNLZXkoa2V5KSB8fCBnZXRDdXJyZW50Q29udGV4dCgpID09IGNvbnZlcnRMaXRlcmFsKGNvbnRleHQpKQotCQkJCQljYWNoZWRFeHRlbnNpb25zLnB1dChrZXksIGVsZW1lbnQpOwotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZWFkcyB0aGUgdWlUZXN0ZXIgZXh0ZW5zaW9uIGFuZCBpbnN0YW50aWF0ZSB0aGUgYW55IG9mIHRoZSBVSVRlc3RlciBjbGFzc2VzIGl0IGZpbmRzLgotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQgaWYgbXVsdGlwbGUgVUlUZXN0ZXJzIGFyZSByZWdpc3RlcmVkLCBhbnkgb2YgdGhlbSBjYW4gdHJpcCB0aGUgY3VycmVudENvbnRleHQgaW50byB0aGUgVUlfQ09OVEVYVAotCSAqIHN0YXRlLgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0VMRU1FTlQgPSAidWlUZXN0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0NMQVNTTkFNRV9BVFRSID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVUlUZXN0ZXJSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKFNlYXJjaFBsdWdpbi5QTFVHSU5fSUQsIFNlYXJjaFBsdWdpbi5VSV9URVNURVJfRVhURU5TSU9OX1BPSU5UKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFVJX1RFU1RFUl9FTEVNRU5UKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRG9uJ3QgYm90aGVyIHJ1bm5pbmcgdGVzdGVyIGl0IGlmIHdlIGFscmVhZHkgcHJvY2Vzc2VkIG9uZSBleHRlbnNpb24gdGhhdCByZXR1cm5lZCB0cnVlLgotCQkJCQlpZiAoY3VycmVudENvbnRleHQgIT0gVUlfQ09OVEVYVCAmJiBjYW5DcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQpKSB7Ci0JCQkJCQlVSVRlc3RlciB0ZXN0ZXIgPSAoVUlUZXN0ZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihVSV9URVNURVJfQ0xBU1NOQU1FX0FUVFIpOwotCQkJCQkJaWYgKHRlc3Rlci5pc0N1cnJlbnRDb250ZXh0VUkoKSkKLQkJCQkJCQljdXJyZW50Q29udGV4dCA9IFVJX0NPTlRFWFQ7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJCQlTZWFyY2hQbHVnaW4ubG9nV2FybmluZygiVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiBpcyBwcm9jZWVkaW5nIGluIEhFQURMRVNTIG1vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCQlzdXBlci5yZWFkUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLmplbS51dGlsIiwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gcmVjb2duaXplZCA9IHRoaXMucmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCWlmICghcmVjb2duaXplZCkgewotCQkJCQlsb2dFcnJvcihlbGVtZW50c1tpXSwgIkVycm9yIHByb2Nlc3NpbmcgZXh0ZW5zaW9uOiAiICsgZWxlbWVudHNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvdXRpbC9VSVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvcmUvdXRpbC9VSVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhlZDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb3JlL3V0aWwvVUlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWw7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBVSVRlc3Rlci4gVGhlICJjbGFzc25hbWUiIGF0dHJpYnV0ZSBvbiB0aGUgInVpVGVzdGVyIiBleHRlbnNpb24gcG9pbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIGNsYXNzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBVSVRlc3RlciB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBhbiBVSSBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gVUkgY29udGV4dC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRDb250ZXh0VUkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyYTc4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3dHBlbWYvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id29ya2JlbmNoLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ1OGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1ydW50aW1lCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZl8xLjAuMC56aXAKLXNyYy56aXAKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjVmMGZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk2YzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI1dlZCBKdW4gMjQgMTA6MTM6MTYgRURUIDIwMDkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdiOTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4zLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM3Y2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHd0cGVtZi8sXAotICAgICAgICAgICB3b3JrYmVuY2gvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzBkMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzgzZDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYWNrYWdlVVJJTWFwPVBhY2thZ2VVUklNYXAKLXBsdWdpbk5hbWU9RU1GIFV0aWxpdGllcwotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYzEzYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icGFja2FnZVVSSU1hcCIgbmFtZT0iJVBhY2thZ2VVUklNYXAiIHNjaGVtYT0ic2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZCIvPgotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIiBuYW1lPSJ0cmFuc2xhdG9yRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QiLz4KLQotPCEtLSBOZWVkIHRvIHJlZ2lzdGVyIHRoZSBFY29yZSBzcGVjaWZpYyBwYWNrYWdlIG1hcHBpbmdzIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLnBhY2thZ2VVUklNYXAiPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgICAgICAgICAgcHJlZml4PSJlY29yZSI+Ci0gICAgICA8L21hcD4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9NYXBwaW5nIgotICAgICAgICAgICAgcHJlZml4PSJtYXBwaW5nIj4KLSAgICAgIDwvbWFwPgotPCEtLSBUcmljayB0byBnZXQgTWFwcGluZy54bWkgZm9yIE1PRjUgc2VyaWFsaXphdGlvbiAtLT4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9NYXBwaW5nIgotICAgICAgICAgICAgcHJlZml4PSJNYXBwaW5nIj4KLSAgICAgIDwvbWFwPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGtleT0icmVuZGVyZXJGYWN0b3J5IgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5Ij4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwNzYwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuZW1mIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vd3RwZW1mIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vd3RwZW1mIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjlkOTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiIGlkPSJwYWNrYWdlVVJJTWFwIiBuYW1lPSIlUGFja2FnZVVSSU1hcCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHJlZ2lzdGVyIHBhY2thZ2UgbWFwcGluZ3MuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hcCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtYXAiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhOTY2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIiBpZD0idHJhbnNsYXRvckV4dGVuc2lvbiIgbmFtZT0idHJhbnNsYXRvckV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIHVzZWQgdG8gY29udHJpYnV0ZSBjaGlsZCB0cmFuc2xhdG9ycyB0byB0aGUgZGVmYXVsdCB0cmFuc2xhdG9ycyBpbiBFTUYyRE9NQWRhcHRlckltcGwuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRyYW5zbGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idHJhbnNsYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBjaGlsZCB0cmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNjkxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoZSBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIgaXMgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgbG9hZGluZwotICogb2YgRU1GIHJlc291cmNlcy4gVGhpcyBpcyB0aGUgRWNsaXBzZSB2ZXJzaW9uIG9mIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciwKLSAqIGFuZCB1c2VzIHRoZSBFY2xpcHNlIElMb2NrIHRlY2hub2xvZ3kgdG8gYWNxdWlyZSBhIHNlbWFwaG9yZSB1bnRpbCB0aGUKLSAqIFJlc291cmNlIGlzIGxvYWRlZC4gdGhlIHdhaXRGb3JSZXNvdXJjZVRvTG9hZCgpIG1ldGhvZCB3aWxsIHBhdXNlIHVudGlsCi0gKiBlaXRoZXIgKGEpIHRoZSBSZXNvdXJjZSBoYXMgbG9hZGVkLCB0aGUgQWRhcHRlciBpcyBub3RpZmllZCwgYW5kIHRoZQotICogc2VtYXBob3JlIGlzIHJlbGVhc2VkIG9yIChiKSB0aGUgREVMQVkgdGltZW91dCBpcyBleGNlZWRlZCwgd2hpY2ggcHJldmVudHMKLSAqIGZ1bGwgZGVhZGxvY2suCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyIGV4dGVuZHMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIHsKLQotCXByaXZhdGUgZmluYWwgSUxvY2sgbG9hZGluZ0xvY2s7Ci0KLQkvKioKLQkgKiBUaGUgZGVsYXkgaXMgZGVmYXVsdCB0byA1IG1pbnV0ZXMuIFRoaXMgaXMgdGhlIHVwd2FyZCB0aHJlc2hob2xkLiBUaGUKLQkgKiBsb2NrIHdpbGwgd2FpdCB1cCB0byBERUxBWSBtaWxsaXNlY29uZHMgdG8gYWNxdWlyZSB0aGUgbG9jaywgYW5kIGJhaWwKLQkgKiBpZiBub3QuIEl0IGRvZXMgbm90IG1lYW4gdGhhdCBpdCB3aWxsIHdhaXQgREVMQVkgbWlsbGlzZWNvbmRzIGFsd2F5cy4KLQkgKiBJbiBnZW5lcmFsLCB0aGUgd2FpdCBzaG91bGQgYmUgYWxtb3N0IGluc3RhbnRhbmVvdXMgLS0ganVzdCBhcyBsb25nIGFzCi0JICogZG9jdW1lbnQgbG9hZGluZyByZW1haW5zIHNwZWVkeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMzAwMDAwOwotCi0JcHVibGljIFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlcigpIHsKLQkJbG9hZGluZ0xvY2sgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQkJaWYgKGxvYWRpbmdMb2NrICE9IG51bGwpCi0JCQlsb2FkaW5nTG9jay5hY3F1aXJlKCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI3dhaXRGb3JSZXNvdXJjZVRvTG9hZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd2FpdEZvclJlc291cmNlVG9Mb2FkKCkgewotCi0JCWlmIChsb2FkaW5nTG9jayA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJvb2xlYW4gbG9ja0FjcXVpcmVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCkKLQkJCQlpZiAoIShsb2NrQWNxdWlyZWQgPSBsb2FkaW5nTG9jay5hY3F1aXJlKERFTEFZKSkpCi0JCQkJCWxvZ1dhcm5pbmcoKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBqdXN0IGNvbnRpbnVlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobG9ja0FjcXVpcmVkKQotCQkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nV2FybmluZygpIHsKLQkJTm90aWZpZXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIFJlc291cmNlKSkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRhcmdldDsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJbV0FSTklOR10gQ291bGQgbm90IGFjcXVpcmUgU2VtYXBob3JlIExvY2sgZm9yIFJlc291cmNlOiBcIiIgKyByZXNvdXJjZS5nZXRVUkkoKSArICJcIiBpbiAiICsgZ2V0Q2xhc3MoKSk7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0JCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSAhPSBudWxsKSB7Ci0JCQkvLyBsaXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgotCQkJaWYgKGlzU2V0TG9hZGVkUmVzb3VyY2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChsb2FkaW5nTG9jayAhPSBudWxsKQotCQkJCQlsb2FkaW5nTG9jay5yZWxlYXNlKCk7Ci0JCQkJcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI2ZvcmNlUmVsZWFzZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZm9yY2VSZWxlYXNlKCkgewotCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCAmJiBsb2FkaW5nTG9jay5nZXREZXB0aCgpID4gMCkKLQkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxYjNiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkgewotCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgY29tLmlibS53dHAuaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBjcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSB7IAotICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9FY29yZVV0aWxpdGllc1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTk0MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLlJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVjb3JlVXRpbGl0aWVzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL3RoZSBJRCBmb3IgdGhpcyBwbHVnaW4gKGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9nZ2luZyBxdWlja2ZpeCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNMQVRPUl9FWFRFTlNUSU9OX1BPSU5UID0gInRyYW5zbGF0b3JFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBFY29yZVV0aWxpdGllc1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0SGFuZGxlcihQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5JTlNUQU5DRSk7Ci0JCVBhY2thZ2VVUklNYXBSZWFkZXIgcmVhZGVyID0gbmV3IFBhY2thZ2VVUklNYXBSZWFkZXIoKTsKLQkJcmVhZGVyLnByb2Nlc3NFeHRlbnNpb25zKCk7Ci0JCS8vdXNlIGEgc3luY2hyb25pemVkIGxvYWRpbmcgYWRhcHRlciBmYWN0b3J5Ci0JCVJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UgPSBuZXcgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggZXhjZXB0aW9uLmdldFN0YXR1cygpICk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BhY2thZ2VVUklNYXBSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjMzliMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeTsKLQotLyoqCi0gKiBUaGlzIHJlYWRlciB3aWxsIHJlYWQgdGhlIHBhY2thZ2VVUklNYXAgZXh0ZW5zaW9uIHBvaW50IGFuZCBwb3B1bGF0ZSB0aGUKLSAqIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LgotICogCi0gKiBUaGUgcGFja2FnZVVSSU1hcCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0gKiAKLSAqIDxtYXAgcHJlZml4PSJzb21lUGFja2FnZVByZWZpeCIgdXJpPSJzb21lUGFja2FnZVVSSSIvPgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVVSSU1hcFJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9BVFRfTkFNRSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9BVFRfTkFNRSA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gInBhY2thZ2VVUklNYXAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFBhY2thZ2VVUklNYXBSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KEVjb3JlVXRpbGl0aWVzUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCB0aGlzIG1ldGhvZCB0byByZWFkIGFuZCBwcm9jZXNzIGFsbCBvZiB0aGUgcGFja2FnZVVSSU1hcCBleHRlbnNpb25zLiAqCi0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc0V4dGVuc2lvbnMoKSB7Ci0JCUNvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHJlZyA9IENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvblBvaW50KCkuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0JCQlwcm9jZXNzRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0sIHJlZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uLCBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSByZWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlncyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKQotCQkJcHJvY2Vzc0NvbmZpZ3VyYXRpb24oY29uZmlnc1tpXSwgcmVnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29uZmlndXJhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgcmVnKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQUkVGSVhfQVRUX05BTUUpOwotCQlTdHJpbmcgdXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVVJJX0FUVF9OQU1FKTsKLQkJcmVnLnJlZ2lzdGVyUHJlZml4VG9QYWNrYWdlVVJJKHByZWZpeCwgdXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ5ZGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgZXh0ZW5kcyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgewotCi0Jc3RhdGljIGZpbmFsIFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIElOU1RBTkNFID0gbmV3IFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfUE9JTlRfTkFNRSA9ICJyZW5kZXJlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLkVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciNnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSB7Ci0JCVJlbmRlcmVyRmFjdG9yeSBhRmFjdG9yeSA9IChSZW5kZXJlckZhY3RvcnkpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoRVhUX1BPSU5UX05BTUUpOwotCQlyZXR1cm4gYUZhY3RvcnkgPT0gbnVsbCA/IHN1cGVyLmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSA6IGFGYWN0b3J5OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQWJzdHJhY3RSZW5kZXJlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5NTQ1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZW5kZXJlckltcGwgaW1wbGVtZW50cyBSZW5kZXJlciB7Ci0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBpbnQgdmVyc2lvbklkOwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW5nID0gdHJ1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBYnN0cmFjdFJlbmRlcmVySW1wbC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZW5kZXJlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3NldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShUcmFuc2xhdG9yUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJlc291cmNlID0gYVJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNnZXRSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklkKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklkKGludCB2ZXJzaW9uSWQpIHsKLQkJdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgewotCQl2YWxpZGF0aW5nID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjYWNjZXNzRm9yUmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjYWNjZXNzRm9yV3JpdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc01vZGlmaWVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2lzU2hhcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc1NoYXJlZEZvcldyaXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZURlbGV0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVVbmxvYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVVubG9hZCgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcmVsZWFzZUZyb21SZWFkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3JlbGVhc2VGcm9tV3JpdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3NldEJhdGNoTW9kZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VTdHJlYW1zRm9ySU8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQmF0Y2hNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXZlcnRpbmcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGViYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIxLCAyMDAzCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIgZXh0ZW5kcyBUcmFuc2xhdG9yRmlsdGVyIHsKLQotCXB1YmxpYyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKCkgewotCQlzdXBlcihudWxsLCAtMSk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIoVHJhbnNsYXRvciB0cmFucywgaW50IHZlcnNpb24pIHsKLQkJc3VwZXIodHJhbnMsIHZlcnNpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBpbnQgc2Nhbk5leHRUcmFuc2xhdG9yKFRyYW5zbGF0b3JbXSBjaGlsZHJlbiwgaW50IHN0YXJ0KSB7Ci0JCWludCBmb3VuZCA9IHN0YXJ0ICsgMTsKLQkJZm9yICg7IGZvdW5kIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2ZvdW5kKSB7Ci0JCQlpZiAoY2hpbGRyZW5bZm91bmRdLmlzRE9NQXR0cmlidXRlKCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZm91bmQgPSAoZm91bmQgPCBjaGlsZHJlbi5sZW5ndGgpID8gZm91bmQgOiAtMTsKLQkJcmV0dXJuIGZvdW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50Tm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhZWJjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLQotLyoqCi0gKiBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSBzdG9yZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBTQVggRXZlbnRzLiBUaGlzIGluZm9ybWF0aW9uIGNhbiB0aGVuIGJlCi0gKiB1c2VkIG9uY2UgYWxsIG5lY2Vzc2FyeSBTQVggRXZlbnRzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgdG8gY3JlYXRlIGFuZC9vciBzZXQgdmFsdWVzIG9uIEVNRiBtb2RlbAotICogb2JqZWN0cy4KLSAqIAotICogQ2FjaGVFdmVudE5vZGVzIChDRU5PcykgaGF2ZSBhIHNpbXBsZSBsaWZlY3ljbGU6IGluaXRpYWxpemUsIGNvbGxlY3QgZGF0YSwgY29tbWl0LCBkaXNjYXJkLiBXaGVuCi0gKiBpbml0aWFsaXplZCwgQ0VOT3Mgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHRyYW5zbGF0b3IgZm9yIGEgZ2l2ZW4gWE1MIGVsZW1lbnQgbmFtZSwKLSAqIGFuZCBhbHNvIGNyZWF0ZS9zZXQgYW55IG5lY2Vzc2FyeSBFTUYgbW9kZWwgdmFsdWVzLiBEYXRhIGlzIGNvbGxlY3RlZCBhcyBTQVggY2hhcmFjdGVyKCkgZXZlbnRzCi0gKiBhcmUgZ2VuZXJhdGVkLiBPbiB0aGUgU0FYIGVuZEVsZW1lbnQgZXZlbnQsIHRoZSBDRU5PIGlzIGNvbW1pdHRlZCgpLCB3aGljaCBpcyB3aGVyZSBpdCB3aWxsCi0gKiBjb21wbGV0ZSBpdHMgcHJvY2Vzc2luZyB0byBjcmVhdGUgRU1GIG1vZGVsIGZlYXR1cmVzLiBJbiB0aG9zZSBjYXNlcyB3aGVyZSBpdCBjYW5ub3QgY29tcGxldGUgaXRzCi0gKiBwcm9jZXNzaW5nLCBpdCB3aWxsIGRlZmVyIGl0cyBwcm9jZXNzaW5nIHRvIHRoZSB1cGRhdGVFTUYoKSBtZXRob2Qgb2YgaXRzIHBhcmVudC4gRGVmZXJlZAotICogcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIEVNRiBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgcmVhZCBhaGVhZCBjdWVzIGZyb20gdGhlIFhNTC4gQ0VOT3MKLSAqIHdpbGwgYWRkIHRoZW1zZWx2ZXMgdG8gdGhlaXIgcGFyZW50cyBhcyBjaGlsZHJlbiBpbiBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gYW4gQ0VOTwotICogZGV0ZXJtaW5lcyBpdCBpcyB0aGUgZ29sZGVuIHBpZWNlIG9mIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbnRpYXRlIGl0cyBwYXJlbnQgZmVhdHVyZSwgaXQKLSAqIHdpbGwgdHJpZ2dlciBpdHMgcGFyZW50IENFTk8gdG8gcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgY2FjaGVkIENFTk8gdHJlZS4gQXMgbWVudGlvbmVkLCB0aGUKLSAqIGJ1aWxkaW5nIG9mIGEgQ0VOTyB0cmVlIHdpbGwgb25seSBvY2N1ciBmb3Igbm9kZXMgd2l0aCByZWFkIGFoZWFkIGN1ZXMuCi0gKiAKLSAqIGRpc2NhcmQoKSBpcyBpbnZva2VkIGJ5IGluaXQoKSB0byBlbnN1cmUgdGhhdCBubyBqdW5rIHN0YXRlIGlzIGxlZnQgZnJvbSBhIHByZXZpb3VzIHVzZSBvZiB0aGUKLSAqIENFTk8uIGNvbW1pdCgpIHdpbGwgY2FsbCBkaXNjYXJkIGFzIG5lZWRlZC4gQmVjYXVzZSBvZiB0aGUgdXNlIG9mIGRpc2NhcmQsIENFTk9zIGNhbiBiZSBwb29sZWQKLSAqIGFuZCByZXVzZWQuIElmIGEgQ0VOTyBkZXRlcm1pbmVzIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIGEgcG9vbCwgaXQgd2lsbCBtYW5hZ2UgaXRzIG93biByZWxlYXNlCi0gKiBmcm9tIHRoYXQgcG9vbC4gU2VsZi0gbWFuYWdlbWVudCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgd2F5IGluIHdoaWNoIENFTk9zIG1pZ2h0IGNhY2hlCi0gKiBjZXJ0YWluIGNoaWxkcmVuIHdoaWxlIHdhaXRpbmcgdG8gY3JlYXRlIHRoZSBwYXJlbnQgRU1GIGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVFdmVudE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9OT0RFID0gIkVNRl9ST09UX05PREUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBub2RlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBudWxsOwotCXByaXZhdGUgTm90aWZpZXIgZW1mT3duZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQlwcml2YXRlIGludCB2ZXJzaW9uSUQ7Ci0KLQkvKgotCSAqIFRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHRoZSBhdHRyaWJ1dGVzIGlzIGEgU3RyaW5nW10uIFRoZSBjaG9pY2Ugd2FzIG1hZGUKLQkgKiB0byB1c2UgYW4gYXJyYXkgdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGFub3RoZXIgb2JqZWN0IChwcm9iYWJseSBhIEhhc2h0YWJsZSkgYW5kIHRvIGV4cGxvaXQKLQkgKiBhcnJheS1hY2Nlc3MgdGltZXMgdG8gZ2V0IHRoZSBuYW1lIGFuZCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlcyAob3Bwb3NlZCB0byBmdWxsIGZsZWRnZWQKLQkgKiBtZXRob2QgaW52b2NhdGlvbnMpLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByaXZhdGUgQ2FjaGVFdmVudE5vZGUgcGFyZW50ID0gbnVsbDsKLQlwcml2YXRlIENhY2hlRXZlbnRQb29sIGNvbnRhaW5pbmdQb29sID0gbnVsbDsKLQlwcml2YXRlIEJvb2xlYW4gaWdub3JhYmxlID0gbnVsbDsKLQotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZShDYWNoZUV2ZW50UG9vbCBjb250YWluaW5nUG9vbCkgewotCQl0aGlzLmNvbnRhaW5pbmdQb29sID0gY29udGFpbmluZ1Bvb2w7Ci0JfQotCi0JLyoqCi0JICogTGlmZWN5Y2xlIG1ldGhvZC4gaW5pdChUcmFuc2xhdG9yUmVzb3VyY2UpIHdpbGwgY29uZmlndXJlIHRoaXMgQWRhcHRlciBhcyBhIFJPT1Qgbm9kZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgYmVmb3JlIGNvbXBsZXRpbmcgaXRzIHRhc2tzLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMuZGlzY2FyZCgpOwotCQl0aGlzLnNldEVtZk93bmVyKHJlc291cmNlKTsKLQkJdGhpcy5zZXRUcmFuc2xhdG9yKHJlc291cmNlLmdldFJvb3RUcmFuc2xhdG9yKCkpOwotCQl0aGlzLnNldFZlcnNpb25JRChyZXNvdXJjZS5nZXRWZXJzaW9uSUQoKSk7Ci0JCXRoaXMubm9kZU5hbWUgPSBDYWNoZUV2ZW50Tm9kZS5ST09UX05PREU7Ci0JfQotCi0JLyoqCi0JICogTGlmZWN5Y2xlIG1ldGhvZC4gaW5pdChDYWNoZUV2ZW50Tm9kZSwgU3RyaW5nLCBBdHRyaWJ1dGVzKSB3aWxsIGNvbmZpZ3VyZSB0aGlzIEFkYXB0ZXIgdG8gYmUKLQkgKiBhIG5vbi1ST09UIG5vZGUgb2YgdGhlIEFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgYmVmb3JlIGNvbXBsZXRpbmcgaXRzIHRhc2tzLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ2FjaGVFdmVudE5vZGUgcGFyZW50QXJnLCBTdHJpbmcgbm9kZU5hbWVBcmcsIEF0dHJpYnV0ZXMgYXR0cmlidXRlc0FyZykgewotCQl0aGlzLmRpc2NhcmQoKTsKLQkJdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lQXJnOwotCQlpbml0KHBhcmVudEFyZywgYXR0cmlidXRlc0FyZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoQ2FjaGVFdmVudE5vZGUgcGFyZW50UmVjb3JkLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNBcmcpIHsKLQkJc2V0UGFyZW50KHBhcmVudFJlY29yZCk7Ci0KLQkJc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzQXJnKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkvKiBJIGFtIG5vdCB0aGUgcm9vdCAqLwotCi0JCQkvKgotCQkJICogSWYgdGhlIHBhcmVudCBpcyBwYXJ0IG9mIHRoZSBET00gUGF0aCwgdGhlbiB3ZSBpZ25vcmUgaXQgYW5kIGludGVyYWN0IHdpdGggdGhlIGdyYW5kCi0JCQkgKiBwYXJlbnQKLQkJCSAqLwotCQkJaWYgKHBhcmVudC50cmFuc2xhdG9yICE9IG51bGwgJiYgcGFyZW50LmlzSW5ET01QYXRoKCkpIHsKLQkJCQlzZXRQYXJlbnQocGFyZW50LmdldFBhcmVudCgpKTsKLQkJCX0KLQotCQkJc2V0VmVyc2lvbklEKHBhcmVudC5nZXRWZXJzaW9uSUQoKSk7Ci0JCQlpZiAocGFyZW50LmdldEVtZk93bmVyKCkgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0VHJhbnNsYXRvcigpICE9IG51bGwpIHsKLQotCQkJCS8qIE15IHBhcmVudCBoYWQgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGVtc2VsZiAqLwotCi0JCQkJaWYgKHBhcmVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0JCQkJCXNldFRyYW5zbGF0b3IocGFyZW50LmdldFRyYW5zbGF0b3IoKS5maW5kQ2hpbGQobm9kZU5hbWUsIHBhcmVudC5nZXRFbWZPd25lcigpLCBnZXRWZXJzaW9uSUQoKSkpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0VHJhbnNsYXRvcihwYXJlbnQuZ2V0VHJhbnNsYXRvcigpKTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy50cmFuc2xhdG9yID09IG51bGwpIHsKLQkJCQkJLyogT3VyIHRyYW5zbGF0b3IgaXMgbnVsbCEgQWhoISBSdW4hICovCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmVudCBUcmFuc2xhdG9yICgiICsgcGFyZW50LmdldFRyYW5zbGF0b3IoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIikgZGlkIG5vdCBmaW5kIGEgQ2hpbGQgVHJhbnNsYXRvciBmb3IgXCIiICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJbm9kZU5hbWUgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy50cmFuc2xhdG9yLmdldFJlYWRBaGVhZEhlbHBlcihub2RlTmFtZSkgPT0gbnVsbCAmJiAhdGhpcy50cmFuc2xhdG9yLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQkJLyoKLQkJCQkJICogSSBkbyBub3QgcmVxdWlyZSBhIHJlYWQgYWhlYWQgY3VlLCBhbmQgSSBhbSBub3QgbWFuYWdlZCBieSBteSBwYXJlbnQgc28gSSBjYW4KLQkJCQkJICogY3JlYXRlIGFuIGluc3RhbmNlIG9mIG15IEVNRiBvYmplY3QKLQkJCQkJICovCi0KLQkJCQkJTm90aWZpZXIgbXlFbWZPd25lciA9IHRoaXMudHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZ2V0Tm9kZU5hbWUoKSwgbnVsbCk7Ci0JCQkJCXNldEVtZk93bmVyKG15RW1mT3duZXIpOwotCQkJCQl0aGlzLnRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUocGFyZW50LmdldEVtZk93bmVyKCksIG15RW1mT3duZXIpOwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIEVsc2UgSSByZXF1aXJlIGEgcmVhZCBhaGVhZCB2YWx1ZSBvciBJIGFtIGJlaW5nIG1hbmFnZWQgYnkgbXkgcGFyZW50LCBzbyBJIGhhdmUKLQkJCQkgKiBubyBuZWVkIHRvIGNyZWF0ZSBhbiBFTUYgb2JqZWN0Ci0JCQkJICovCi0JCQl9Ci0JCQkvKgotCQkJICogRWxzZSBJIGFtIG5vdCBtYXBwZWQgdG8gdGhlIEVNRiBzdGFjayAoWE1MIEVsZW1lbnRzIGZvdW5kIGluIHRoZSBET01QYXRoIGFyZSBpZ25vcmVkKQotCQkJICovCi0JCX0KLQkJLyogcHJvY2Vzc0F0dHJpYnV0ZXMgaXMgZ3VhcmRlZCBhbmQgd2lsbCBub3QgZXhlY3V0ZSB1bmxlc3MgcmVhZHkgKi8KLQkJcHJvY2Vzc0F0dHJpYnV0ZXMoKTsKLQotCX0KLQotCS8qKgotCSAqIGNvbW1pdCgpIGlzIGludm9rZWQgb25seSBpZiB0aGUgQ2FjaGVFdmVudE5vZGUgKENFTk8pIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRoZXkgbmVlZCBhbmQKLQkgKiBzaG91bGQgYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0byBkbyB0byB0aGUgRU1GIGZlYXR1cmUuCi0JICogCi0JICogVGhlIGNvbW1pdCgpIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgd2hlbiBpdCBoYXMgY29tcGxldGVkIGl0cyB0YXNrcywgaWYgbmVlZGVkLiBUaHVzLAotCSAqIGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLCB0aGUgQ0VOTyBtYXkgaGF2ZSBubyBtZWFuaW5nZnVsIHN0YXRlLiBJZiBkaXNjYXJkKCkgaXMgaW52b2tlZCwKLQkgKiBhbGwgcHJldmlvdXNseSBoZWxkIHJlZmVyZW5jZSB3aWxsIGJlIHJlbGVhc2VkIGluIG9yZGVyIHRvIGJlIG1hZGUgZWxpZ2libGUgZm9yIEdhcmJhZ2UKLQkgKiBDb2xsZWN0aW9uLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0KLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHRoaXMuaXNJZ25vcmFibGUoKSkgewotCQkJZGlzY2FyZCgpOwotCQkJcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUmVhZEFoZWFkSGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgYWN0aXZlVHJhbnNsYXRvciA9IGdldFRyYW5zbGF0b3IoKTsKLQkJVHJhbnNsYXRvciBwYXJlbnRUcmFuc2xhdG9yID0gZ2V0UGFyZW50KCkuZ2V0VHJhbnNsYXRvcigpOwotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0RW1mT3duZXIoKSA9PSBudWxsKSB7Ci0KLQkJCS8qCi0JCQkgKiBOb3QgZW5vdWdoIGluZm9ybWF0aW9uIHlldCwgYWRkIHRoZSBDYWNoZUV2ZW50Tm9kZSB0byB0aGUgRE9NIENhY2hlIHRyZWUKLQkJCSAqLwotCi0JCQlwYXJlbnQuYXBwZW5kVG9CdWZmZXIodGhpcyk7Ci0JCQlpZiAoKGhlbHBlciA9IGdldFBhcmVudCgpLmdldFJlYWRBaGVhZEhlbHBlcigpKSAhPSBudWxsKSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiB0aGUgcGFyZW50UmVjb3JkJ3MgZW1mT3duZXIgaXMgbnVsbCwgdGhlbiBpdCBtdXN0IG5vdCBiZSBpbml0aWFsaXplZCB0aGVyZWZvcmUKLQkJCQkgKiBpdCBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycyBtdXN0IHJlcXVpcmUgcmVhZCBhaGVhZCBjbHVlcwotCQkJCSAqIAotCQkJCSAqIFRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGNoZWNrcyBpZiB0aGUgcGFyZW50IGlzIHRoZSBub2RlIHdhaXRpbmcgZm9yIGEKLQkJCQkgKiByZWFkQWhlYWQgY3VlCi0JCQkJICovCi0JCQkJRU9iamVjdCBwYXJlbnRPd25lciA9IG51bGw7Ci0JCQkJaWYgKGhlbHBlci5ub2RlVmFsdWVJc1JlYWRBaGVhZE5hbWUoZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJLyogVGhlIHJlYWRBaGVhZE5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZSBxTmFtZSBjaGlsZCBub2RlICovCi0KLQkJCQkJLyogV2UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSBFbWZPd25lciBpbiB0aGUgcGFyZW50ISAqLwotCQkJCQlwYXJlbnRPd25lciA9IHBhcmVudFRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGdldFBhcmVudCgpLmdldE5vZGVOYW1lKCksIGdldEJ1ZmZlcigpKTsKLQotCQkJCQkvKgotCQkJCQkgKiBOb3cgd2UgbmVlZCB0byBwYXJzZSB0aGUgY2FjaGVkIERPTSB0cmVlIGFuZCB1cGRhdGUgdGhlIGVtZk93bmVyIG9mIHRoZQotCQkJCQkgKiBwYXJlbnQKLQkJCQkJICovCi0JCQkJCWdldFBhcmVudCgpLnVwZGF0ZUVNRihwYXJlbnRPd25lcik7Ci0KLQkJCQl9IGVsc2UgaWYgKGhlbHBlci5ub2RlTmFtZUlzUmVhZEFoZWFkTmFtZShnZXROb2RlTmFtZSgpKSkgewotCQkJCQkvKiBUaGUgcmVhZEFoZWFkTmFtZSBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGNoaWxkIG5vZGUgKHFOYW1lKSAqLwotCi0JCQkJCS8qIFdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgRW1mT3duZXIgaW4gdGhlIHBhcmVudCEgKi8KLQkJCQkJcGFyZW50T3duZXIgPSBwYXJlbnRUcmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChnZXRQYXJlbnQoKS5nZXROb2RlTmFtZSgpLCBnZXROb2RlTmFtZSgpKTsKLQotCQkJCQkvKgotCQkJCQkgKiBOb3cgd2UgbmVlZCB0byBwYXJzZSB0aGUgY2FjaGVkIERPTSB0cmVlIGFuZCB1cGRhdGUgdGhlIGVtZk93bmVyIG9mIHRoZQotCQkJCQkgKiBwYXJlbnQKLQkJCQkJICovCi0JCQkJCWdldFBhcmVudCgpLnVwZGF0ZUVNRihwYXJlbnRPd25lcik7Ci0JCQkJfQotCi0JCQl9IC8qIEVsc2UgYW4gYW5jZXN0b3Igb2YgdGhlIHBhcmVudCBpcyB3YWl0aW5nICovCi0KLQkJfSBlbHNlIHsKLQkJCWlmIChhY3RpdmVUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCQlpZiAoYWN0aXZlVHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0KLQkJCQkJT2JqZWN0IHZhbHVlID0gYWN0aXZlVHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShnZXROb2RlTmFtZSgpLCBudWxsLCBnZXRCdWZmZXIoKSwgZ2V0UGFyZW50KCkuZ2V0RW1mT3duZXIoKSk7Ci0JCQkJCWFjdGl2ZVRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUoZ2V0UGFyZW50KCkuZ2V0RW1mT3duZXIoKSwgdmFsdWUpOwotCQkJCQlwcm9jZXNzQXR0cmlidXRlcygpOwotCQkJCX0gZWxzZSB7Ci0KLQkJCQkJYWN0aXZlVHJhbnNsYXRvci5zZXRUZXh0VmFsdWVJZk5lY2Vzc2FyeShnZXRCdWZmZXIoKSwgZ2V0RW1mT3duZXIoKSwgZ2V0VmVyc2lvbklEKCkpOwotCQkJCX0KLQotCQkJfQotCQkJZGlzY2FyZCgpOwotCQkJcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zdHJ1Y3QgdGhlIENhY2hlRXZlbnROb2RlIHRvIGRpc2NhcmQgYWxsIHJlZmVyZW5jZXMgdG8gbWFrZSBldmVyeXRoaW5nIGVsaWdpYmxlIGZvciBnYXJiYWdlCi0JICogY29sbGVjdGlvbi4gVGhpcyBzaG91bGQgT05MWSBiZSBjYWxsZWQgYWZ0ZXIgY29tbWl0IGhhcyBzdWNjZWVkZWQuIEluIHRoZSBjYXNlIG9mIEVNRgotCSAqIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSBhIHJlYWRBaGVhZE5hbWUsIHByb2Nlc3Mgbm90IGJlIGNvbXBsZXRlZCBpbiBjb21taXQoKSwgYnV0IHJhdGhlciB3aWxsCi0JICogYmUgZGVmZXJlZCB0byB0aGUgdXBkYXRlRU1GKCkgbWV0aG9kLiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwcml2YXRlIHNwZWNpZmljYWxseSBiZWNhdXNlIGl0Ci0JICogY291bGQgZXJhc2UgYWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgQ2FjaGVFdmVudE5vZGUgYmVmb3JlIGl0IGhhcyBiZWVuIHByb2Nlc3NlZC4KLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc2NhcmQoKSB7Ci0JCXRyYW5zbGF0b3IgPSBudWxsOwotCQllbWZPd25lciA9IG51bGw7Ci0JCWJ1ZmZlciA9IG51bGw7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKQotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJY2hpbGRyZW4gPSBudWxsOwotCQlhdHRyaWJ1dGVzID0gbnVsbDsKLQkJcGFyZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpIHsKLQkJaWYgKGNvbnRhaW5pbmdQb29sICE9IG51bGwpCi0JCQljb250YWluaW5nUG9vbC5yZWxlYXNlTm9kZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZSgpIHsKLQkJaWYgKGlnbm9yYWJsZSA9PSBudWxsKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKHRoaXMudHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMudHJhbnNsYXRvci5pc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCkpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIGRvbVBhdGggPSB0aGlzLnRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpOwotCQkJCQlyZXN1bHQgPSAoZG9tUGF0aCAhPSBudWxsKSA/IGRvbVBhdGguaW5kZXhPZih0aGlzLm5vZGVOYW1lKSA+PSAwIDogZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWdub3JhYmxlID0gcmVzdWx0ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gaWdub3JhYmxlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgYSBnaXZlbiBjaGlsZCBoYXMgYSB0cmFuc2xhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZE5vZGVOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBYTUwgY2hpbGQgbm9kZQotCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjaGlsZE5vZGVOYW1lIGNhbiBiZSBpZ25vcmVkIChlLmcuIGl0IGlzIHBhcnQgb2YgdGhlIERPTSBQYXRoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRJZ25vcmFibGUoU3RyaW5nIGNoaWxkTm9kZU5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlUcmFuc2xhdG9yIGNoaWxkVHJhbnNsYXRvciA9IG51bGw7Ci0JCWlmICh0aGlzLmdldFRyYW5zbGF0b3IoKSAhPSBudWxsKSB7Ci0JCQljaGlsZFRyYW5zbGF0b3IgPSB0aGlzLmdldFRyYW5zbGF0b3IoKS5maW5kQ2hpbGQoY2hpbGROb2RlTmFtZSwgdGhpcy5nZXRFbWZPd25lcigpLCB0aGlzLmdldFZlcnNpb25JRCgpKTsKLQotCQkJaWYgKGNoaWxkVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkVHJhbnNsYXRvci5pc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCkpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIHRlbXAgPSBudWxsOwotCQkJCQlyZXN1bHQgPSAoKHRlbXAgPSBjaGlsZFRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpKSAhPSBudWxsKSA/IHRlbXAuaW5kZXhPZihjaGlsZE5vZGVOYW1lKSA+PSAwIDogZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luRE9NUGF0aCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAodGhpcy5nZXRUcmFuc2xhdG9yKCkgIT0gbnVsbCkgewotCi0JCQlyZXN1bHQgPSB0aGlzLmdldE5vZGVOYW1lKCkuZXF1YWxzKHRoaXMuZ2V0VHJhbnNsYXRvcigpLmdldERPTVBhdGgoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCJDYWNoZUV2ZW50Tm9kZVsiKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQoIm5vZGVOYW1lPSIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZChub2RlTmFtZSk7Ci0JCW91dHB1dC5hcHBlbmQoIjsgdHJhbnNsYXRvcj0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQodHJhbnNsYXRvcik7Ci0JCW91dHB1dC5hcHBlbmQoIjsgZW1mT3duZXI9Iik7Ly8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJb3V0cHV0LmFwcGVuZChlbWZPd25lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCW91dHB1dC5hcHBlbmQoIkNvdWxkIG5vdCByZW5kZXIgYXMgc3RyaW5nISIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlvdXRwdXQuYXBwZW5kKCI7IGJ1ZmZlcj0iKTsvLyROT04tTkxTLTEkCi0JCW91dHB1dC5hcHBlbmQodGhpcy5idWZmZXIpOwotCQlvdXRwdXQuYXBwZW5kKCI7IGhhc0NoaWxkcmVuPSIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZCgoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKSk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQlvdXRwdXQuYXBwZW5kKCJcblx0Y2hpbGRyZW4oIik7Ly8kTk9OLU5MUy0xJAotCQkJCW91dHB1dC5hcHBlbmQoaSk7Ci0JCQkJb3V0cHV0LmFwcGVuZCgiKTogIik7Ly8kTk9OLU5MUy0xJAotCQkJCW91dHB1dC5hcHBlbmQodGhpcy5jaGlsZHJlbi5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCW91dHB1dC5hcHBlbmQoIl0iKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBFTUYgbW9kZWwgYnkgY3JlYXRpbmcgRU1GIEZlYXR1cmVzIGFzIG5lY2Vzc2FyeSBmcm9tIHRoZSBET00gVHJlZSBDYWNoZQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUVNRihFT2JqZWN0IG93bmVyKSB7Ci0JCXRoaXMuc2V0RW1mT3duZXIob3duZXIpOwotCQlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgewotCQkJdGhpcy50cmFuc2xhdG9yLnNldE1PRlZhbHVlKChFT2JqZWN0KSB0aGlzLnBhcmVudC5nZXRFbWZPd25lcigpLCBvd25lcik7Ci0JCQl0aGlzLnByb2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQotCQl0aGlzLnVwZGF0ZUVNRigpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0cmFuc2xhdG9yIGFuZCB0aGUgb3duZXIgb2YgdGhlIHBhcmVudCBDRU5PIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBzaG91bGQgYmUgbm9ubnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUVNRigpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDYWNoZUV2ZW50Tm9kZSBjaGlsZCA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgY2hpbGRUcmFuc2xhdG9yID0gbnVsbDsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKHRoaXMuZ2V0RW1mT3duZXIoKSAhPSBudWxsKSB7Ci0JCQlOb3RpZmllciBwYXJlbnRPd25lciA9IHRoaXMuZ2V0RW1mT3duZXIoKTsKLQkJCVRyYW5zbGF0b3IgcGFyZW50VHJhbnNsYXRvciA9IHRoaXMuZ2V0VHJhbnNsYXRvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0KLQkJCQljaGlsZCA9IChDYWNoZUV2ZW50Tm9kZSkgdGhpcy5jaGlsZHJlbi5nZXQoaSk7IC8qIENyZWF0ZSB0aGUgRU1GIGZlYXR1cmUgKi8KLQkJCQlpZiAodGhpcy5pc0NoaWxkSWdub3JhYmxlKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCXRoaXMuYWRkQ2hpbGRyZW4oY2hpbGQuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2hpbGRUcmFuc2xhdG9yID0gcGFyZW50VHJhbnNsYXRvci5maW5kQ2hpbGQoY2hpbGQuZ2V0Tm9kZU5hbWUoKSwgcGFyZW50T3duZXIsIGNoaWxkLmdldFZlcnNpb25JRCgpKTsKLQkJCQkJY2hpbGQuc2V0VHJhbnNsYXRvcihjaGlsZFRyYW5zbGF0b3IpOwotCi0JCQkJCXZhbHVlID0gY2hpbGRUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGNoaWxkLmdldE5vZGVOYW1lKCksIG51bGwsIGNoaWxkLmdldEJ1ZmZlcigpLCBwYXJlbnRPd25lcik7Ci0JCQkJCWNoaWxkVHJhbnNsYXRvci5zZXRNT0ZWYWx1ZShwYXJlbnRPd25lciwgdmFsdWUpOwotCi0JCQkJCWlmIChjaGlsZFRyYW5zbGF0b3IuaXNPYmplY3RNYXAoKSkgewotCQkJCQkJY2hpbGQuc2V0RW1mT3duZXIoKE5vdGlmaWVyKSB2YWx1ZSk7Ci0JCQkJCQljaGlsZFRyYW5zbGF0b3Iuc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoY2hpbGQuZ2V0QnVmZmVyKCksIGNoaWxkLmdldEVtZk93bmVyKCksIGdldFZlcnNpb25JRCgpKTsKLQkJCQkJfQotCi0JCQkJCWNoaWxkLnByb2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCQkJCWNoaWxkLnVwZGF0ZUVNRigpOyAvKiB1cGRhdGUgdGhlIEVNRiBvZiB0aGUgY2hpbGQgKi8KLQotCQkJCX0KLQkJCQljaGlsZC5kaXNjYXJkKCk7Ci0JCQkJY2hpbGQucmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChDYWNoZUV2ZW50Tm9kZSBjaGlsZCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiB0aGlzLmlzSWdub3JhYmxlKCkpIHsKLQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbihMaXN0IGNoaWxkcmVuQXJnKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJdGhpcy5jaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW5BcmcpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUNoaWxkKENhY2hlRXZlbnROb2RlIGNoaWxkKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgUmVhZEFoZWFkSGVscGVyIGdldFJlYWRBaGVhZEhlbHBlcigpIHsKLQkJaWYgKHRoaXMudHJhbnNsYXRvciAhPSBudWxsICYmIHRoaXMudHJhbnNsYXRvci5oYXNSZWFkQWhlYWROYW1lcygpKSB7Ci0JCQlyZXR1cm4gdHJhbnNsYXRvci5nZXRSZWFkQWhlYWRIZWxwZXIobm9kZU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXR0cmlidXRlcyBmaWVsZCBmb3IgaW5mbyBvbiBob3cgaXQgaXMgc3RydWN0dXJlZCAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyKSB7Ci0KLQkJLyoKLQkJICogVGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgZnJvbSB0aGUgcGFyc2VyIG1heSBiZSBzdG9yZWQgYnkgcmVmZXJlbmNlLCBzbyB3ZSBtdXN0IGNvcHkgdGhlbQotCQkgKiBvdmVyIHRvIGEgbG9jYWwgZGF0YSBzdG9yZQotCQkgKi8KLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmdldExlbmd0aCgpID4gMCkgewotCi0JCQlpZiAodGhpcy5hdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nW2F0dHIuZ2V0TGVuZ3RoKCkgKiAyXTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ci5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzW2ldID0gYXR0ci5nZXRRTmFtZShpKTsKLQkJCQl0aGlzLmF0dHJpYnV0ZXNbaSArIGF0dHIuZ2V0TGVuZ3RoKCldID0gYXR0ci5nZXRWYWx1ZShpKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJvY2Vzc0F0dHJpYnV0ZXMgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXMuIEl0IGlzIGNvbmZpZ3VyZWQgdG8gb25seSBjYXJyeSBvdXQgdGhlCi0JICogcHJvY2Vzc2luZyBvbmUgdGltZS4gQWZ0ZXIgaXQgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlcyB0aGUgY29uc3RydWN0aW9uIG9mIFRyYW5zbGF0b3JzIGFuZAotCSAqIHZhbHVlcyBpdCB3aWxsIGRpc2NhcmQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGJ5IHNldHRpbmcgaXQgdG8gbnVsbC4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCS8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZXMgZmllbGQgZm9yIGluZm8gb24gaG93IGl0IGlzIHN0cnVjdHVyZWQgKi8KLQkJaWYgKHRoaXMuYXR0cmlidXRlcyAhPSBudWxsICYmIHRoaXMuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7Ci0KLQkJCWlmICh0aGlzLmVtZk93bmVyICE9IG51bGwgJiYgdGhpcy50cmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCQlUcmFuc2xhdG9yIGF0dHJUcmFuc2xhdG9yID0gbnVsbDsKLQkJCQlmaW5hbCBpbnQgbGltaXQgPSB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoIC8gMjsKLQkJCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewotCi0JCQkJCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSB0cmFuc2xhdG9yIGJ5IHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZSAoYXR0cmlidXRlc1tpXSkgKi8KLQkJCQkJYXR0clRyYW5zbGF0b3IgPSB0aGlzLnRyYW5zbGF0b3IuZmluZENoaWxkKHRoaXMuYXR0cmlidXRlc1tpXSwgdGhpcy5lbWZPd25lciwgdGhpcy52ZXJzaW9uSUQpOwotCi0JCQkJCWlmIChhdHRyVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBDb252ZXJ0IHRoZSB2YWx1ZSBvZiBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZSAoYXR0cmlidXRlc1tpK2xpbWl0XSkKLQkJCQkJCSAqIHRvIGEgbWVhbmluZ2Z1bCB2YWx1ZQotCQkJCQkJICovCi0JCQkJCQl2YWx1ZSA9IGF0dHJUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHRoaXMuYXR0cmlidXRlc1tpICsgbGltaXRdLCAoRU9iamVjdCkgdGhpcy5lbWZPd25lcik7Ci0JCQkJCQlhdHRyVHJhbnNsYXRvci5zZXRNT0ZWYWx1ZSgoRU9iamVjdCkgdGhpcy5lbWZPd25lciwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLyogRm9yZ2V0IHRoZSBhdHRyaWJ1dGVzIHNvIHdlIGRvIG5vdCBwcm9jZXNzIHRoZW0gYWdhaW4gKi8KLQkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kcyBkYXRhIHRvIHRoZSBidWZmZXIgc3RvcmVkIGJ5IHRoaXMgQ0VOTy4gVGV4dCB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBkYXRhIGFycmF5Ci0JICogYmVnaW5pbmcgYXQgcG9zaXRpb25nIDxpPnN0YXJ0IDwvaT4gYW5kIGVuZGluZyBhdCBwb3NpdGlvbiA8aT5zdGFydCtsZW5ndGggPC9pPi4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YQotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUb0J1ZmZlcihjaGFyW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHRoaXMuaXNJZ25vcmFibGUoKSkgewotCQkJcGFyZW50LmFwcGVuZFRvQnVmZmVyKGRhdGEsIHN0YXJ0LCBsZW5ndGgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIGFjdHMgYXMgYSBtb3JlIGVmZmljaWVudCBmb3JtIG9mICJhcHBlbmQiLiBVc2luZyB0aGlzIG1ldGhvZCBhdm9pZHMgdGhlIG5lZWQgdG8gY29weSB0aGUKLQkJICogZGF0YSBpbnRvIGl0cyBvd24gZGF0YSBzdHJ1Y3R1cmUgKGUuZy4gU3RyaW5nKSBiZWZvcmUgYmVpbmcgYWRkZWQgdG8gdGhlIGJ1ZmZlcgotCQkgKi8KLQkJdGhpcy5idWZmZXIuaW5zZXJ0KGJ1ZmZlci5sZW5ndGgoKSwgZGF0YSwgc3RhcnQsIGxlbmd0aCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGdpdmVuIENFTk8gYXMgYSBjaGlsZCBvZiB0aGlzIENFTk8uCi0JICogCi0JICogQHBhcmFtIHJlY29yZAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFRvQnVmZmVyKENhY2hlRXZlbnROb2RlIHJlY29yZCkgewotCi0JCXRoaXMuYWRkQ2hpbGQocmVjb3JkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlcigpIHsKLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBOb3RpZmllciBnZXRFbWZPd25lcigpIHsKLQkJcmV0dXJuIGVtZk93bmVyOwotCX0KLQotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhcmVudChDYWNoZUV2ZW50Tm9kZSByZWNvcmQpIHsKLQkJdGhpcy5wYXJlbnQgPSByZWNvcmQ7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNsYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbWZPd25lcihOb3RpZmllciBub3RpZmllcikgewotCi0JCXRoaXMuZW1mT3duZXIgPSBub3RpZmllcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdG9yKFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQl0aGlzLnRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBub2RlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQotCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChUcmFuc2xhdG9yUmVzb3VyY2UpIHRoaXMuZ2V0RW1mT3duZXIoKSkuZ2V0VmVyc2lvbklEKCk7Ci0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy52ZXJzaW9uSUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklEKGludCBpKSB7Ci0JCXZlcnNpb25JRCA9IGk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50UG9vbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3OTllMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogUHJvdmlkZXMgYW4gaW5zdGFuY2UgcG9vbCBvZiByZXVzYWJsZSBDYWNoZUV2ZW50Tm9kZXMuIFRoZSBwb29sIHdpbGwgZGVmYXVsdCB0byAxMCBsaXZlCi0gKiBpbnN0YW5jZXMuIFdoZW4gaXRzIGF2YWlsYWJsZSBpbnN0YW5jZXMgcmVhY2ggZml2ZSB0aW1lcyBpdHMgaW5pdGlhbCBjYXBhY2l0eSwgaXQgd2lsbCBzaHJpbmsKLSAqIGl0c2VsZiBkb3duIHRvIHRoZSBpbml0aWFsIGNhcGFjaXR5LgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRXZlbnRQb29sIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkgPSAxMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZX0lOQ1JFTUVOVCA9IDI1OwotCi0JcHJpdmF0ZSBpbnQgcG9vbENhcGFjaXR5ID0gREVGQVVMVF9DQVBBQ0lUWTsKLQlwcml2YXRlIENhY2hlRXZlbnRTdGFjayBhdmFpbGFibGVQb29sID0gbnVsbDsKLQlwcml2YXRlIENvbGxlY3Rpb24gaW51c2VQb29sID0gbnVsbDsKLQotCXB1YmxpYyBDYWNoZUV2ZW50UG9vbCgpIHsKLQkJdGhpcyhERUZBVUxUX0NBUEFDSVRZKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBDYWNoZUV2ZW50UE9vbCB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5Ci0JICogCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eQotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBhdmFpbGFibGUgaW5zdGFuY2VzIHRvIGNyZWF0ZS4KLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudFBvb2woaW50IGluaXRpYWxDYXBhY2l0eSkgewotCQlwb29sQ2FwYWNpdHkgPSAoaW5pdGlhbENhcGFjaXR5ID4gMCkgPyBpbml0aWFsQ2FwYWNpdHkgOiBERUZBVUxUX0NBUEFDSVRZOwotCQlhdmFpbGFibGVQb29sID0gbmV3IENhY2hlRXZlbnRTdGFjaygpOwotCQlpbnVzZVBvb2wgPSBuZXcgQXJyYXlMaXN0KHBvb2xDYXBhY2l0eSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgQ2FjaGVFdmVudE5vZGUgKENFTk8pIGluaXRpYWxpemVkIHRvIHVzZSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYXMgaXRzIEVNRiBPd25lci4KLQkgKiAKLQkgKiBUSElTIE1FVEhPRCBTSE9VTEQgT05MWSBCRSBVU0VEIFRPIENSRUFURSBST09UIE5PREVTLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQKLQkgKiBAcmV0dXJuIGEgQ2FjaGVFdmVudE5vZGUgdG8gc2VydmUgYXMgdGhlIHJvb3QuCi0JICovCi0JcHVibGljIENhY2hlRXZlbnROb2RlIGNyZWF0ZUNhY2hlRXZlbnROb2RlKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgewotCQlDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyID0gZmV0Y2hGcmVlTm9kZSgpOwotCQlhZGFwdGVyLmluaXQocmVzb3VyY2UpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY2hpbGQgQ2FjaGVFdmVudE5vZGVzIChDRU5PcykgdGhhdCB3aWxsIGJyYW5jaCBmcm9tIHRoZSBnaXZlbiBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5pbmcgQ0VOTwotCSAqIEBwYXJhbSBub2RlTmFtZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBYTUwgZWxlbWVudCBub2RlIG5hbWUKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGdpdmVuIFhNTCBlbGVtZW50Ci0JICogQHJldHVybiBBIENFTk8gdGhhdCBoYXMgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgY3JlYXRlQ2FjaGVFdmVudE5vZGUoQ2FjaGVFdmVudE5vZGUgcGFyZW50LCBTdHJpbmcgbm9kZU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyID0gZmV0Y2hGcmVlTm9kZSgpOwotCQlhZGFwdGVyLmluaXQocGFyZW50LCBub2RlTmFtZSwgYXR0cmlidXRlcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIENhY2hlRXZlbnROb2RlIENFTk8gYmFjayB0byB0aGUgcG9vbCBvZiBhdmFpbGFiZSBpbnN0YW5jZXMuIFRoaXMgbWV0aG9kIHNob3VsZAotCSAqIG5vdCBiZSBpbnZva2VkIGRpcmVjdGx5LiBDRU5PcyB3aGljaCBhcmUgYWNxdWlyZWQgZnJvbSBhIGdpdmVuIHBvb2wgd2lsbCBhdXRvbWF0aWNhbGx5Ci0JICogcmVsZWFzZSB0aGVtc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZU5vZGUoQ2FjaGVFdmVudE5vZGUgYWRhcHRlcikgewotCQlmcmVlTm9kZShhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBmcmVlemVQb29sKCkgc2hvdWxkIGJlIGludm9rZWQgdG8gZnJlZSBhbnkgdW51c2VkIHJlc291cmNlcy4gQWZ0ZXIgZnJlZXplUG9vbCBoYXMgYmVlbgotCSAqIGludm9rZWQsIHdhcm1Qb29sKCkgd2lsbCBuZWVkIHRvIGJlIGludm9rZWQgYmVmb3JlIHRoZSBwb29sIGNhbiBiZSB1c2VkIGFnYWluLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmcmVlemVQb29sKCkgewotCQlhdmFpbGFibGVQb29sLmNsZWFyKCk7Ci0JCWF2YWlsYWJsZVBvb2wgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHdhcm1Qb29sKCkgbXVzdCBiZSBpbnZva2VkIHRvIG5vdGlmeSB0aGUgcG9vbCBpdCBpcyBhYm91dCB0byBiZSB1c2VkLiBUaGlzIHNob3VsZCBvY2N1ciBvbmx5Ci0JICogb25jZSBwZXIgZG9jdW1lbnQgcmVuZGVyaW5nLiBVbnRpbCB0aGUgcG9vbCBpcyBpbiB1c2UsIGl0IGNvbnRhaW5zIG5vIGF2YWlsYWJsZQotCSAqIENhY2hlRXZlbnROb2RlcyAoQ0VOT3MpIGluIG9yZGVyIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBpbi1tZW1vcnkgZm9vdHByaW50IG9mIHRoZQotCSAqIEVNRjJTQVhXcml0ZXIuCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIHdhcm1Qb29sKCkgewotCQllbnN1cmVNaW5pbXVtQ2FwYWNpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlRXZlbnROb2RlIGZldGNoRnJlZU5vZGUoKSB7Ci0JCUNhY2hlRXZlbnROb2RlIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGF2YWlsYWJsZVBvb2wgPT0gbnVsbCB8fCBhdmFpbGFibGVQb29sLmlzRW1wdHkoKSkKLQkJCXdhcm1Qb29sKCk7Ci0KLQkJcmVzdWx0ID0gYXZhaWxhYmxlUG9vbC5wb3AoKTsKLQkJaW51c2VQb29sLmFkZChyZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZyZWVOb2RlKENhY2hlRXZlbnROb2RlIGFkYXB0ZXIpIHsKLQkJaWYgKGludXNlUG9vbC5yZW1vdmUoYWRhcHRlcikpCi0JCQlhdmFpbGFibGVQb29sLnB1c2goYWRhcHRlcik7Ci0JCS8vZWxzZQotCQkvLwl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBZGFwdGVyIG5vdCBjb250YWluZWQgaW4gcG9vbCEiKTsKLQkJaWYgKGF2YWlsYWJsZVBvb2wuc2l6ZSgpID4gKDUgKiBwb29sQ2FwYWNpdHkpKSB7Ci0JCQlhdmFpbGFibGVQb29sLmNsZWFyKCk7Ci0JCQllbnN1cmVNaW5pbXVtQ2FwYWNpdHkoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVNaW5pbXVtQ2FwYWNpdHkoKSB7Ci0JCWlmIChhdmFpbGFibGVQb29sID09IG51bGwpIHsKLQkJCWF2YWlsYWJsZVBvb2wgPSBuZXcgQ2FjaGVFdmVudFN0YWNrKCk7Ci0JCX0KLQkJaWYgKGF2YWlsYWJsZVBvb2wuc2l6ZSgpIDwgcG9vbENhcGFjaXR5KSB7Ci0JCQlmaW5hbCBpbnQgbWluaW11bUNhcGFjaXR5ID0gcG9vbENhcGFjaXR5IC0gYXZhaWxhYmxlUG9vbC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbmltdW1DYXBhY2l0eTsgaSsrKQotCQkJCWF2YWlsYWJsZVBvb2wucHVzaChuZXcgQ2FjaGVFdmVudE5vZGUodGhpcykpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlOGM4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDI0LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiB1bnN5bmNocm9uaXplZCBpbXBsZW1lbnRhdGlvbiBvZiBhIFN0YWNrIChMSUZPKSBkYXRhIHN0cnVjdHVyZS4gTm8gY2FzdGluZyBpcyByZXF1aXJlZCB3aGVuCi0gKiB1c2luZyB0aGlzIGRhdGEgc3RydWN0dXJlLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRXZlbnRTdGFjayBleHRlbmRzIEFycmF5TGlzdCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMjA4ODk1MzIwMTQ5MDU0MTAzTDsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBwZWVrKCkgewotCQlpZiAoc2l6ZSgpID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCi0JCXJldHVybiAoQ2FjaGVFdmVudE5vZGUpIGdldChzaXplKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCByZW1vdmluZyBpdAotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBwb3AoKSB7Ci0JCWlmIChzaXplKCkgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0KLQkJcmV0dXJuIChDYWNoZUV2ZW50Tm9kZSkgcmVtb3ZlKHNpemUoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogICAgICAgICAgICBBIENFTk8gdG8gcHVzaCBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgcHVzaChDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyKSB7Ci0JCWFkZChhZGFwdGVyKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzNjdjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgbWFwcGluZ3MgZm9yIGEgcGFja2FnZSBwcmVmaXggdG8gaXRzIGN1cnJlbnQgbmFtZXNwYWNlIFVSSS4gQWxzbywKLSAqIHRoaXMgcmVnaXN0cnkgaXMgdXNlZCB0byBtYXAgdGhlIHBhY2thZ2UKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHsKLQlwdWJsaWMgc3RhdGljIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBNYXAgcHJlZml4VG9QYWNrYWdlVVJJcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpIHsKLQkJcmV0dXJuIHBhY2thZ2VVUklzVG9QcmVmaXhlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkgewotCQlyZXR1cm4gcHJlZml4VG9QYWNrYWdlVVJJczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlclByZWZpeFRvUGFja2FnZVVSSShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCkgewotCQkJcHJlZml4VG9QYWNrYWdlVVJJcy5wdXQocHJlZml4LCB1cmkpOwotCQkJcGFja2FnZVVSSXNUb1ByZWZpeGVzLnB1dCh1cmksIHByZWZpeCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzRiYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSBleHRlbmRzIFhNSVJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIHByZWZpeFRvUGFja2FnZVVSSXM7Ci0KLQlwcm90ZWN0ZWQgTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlczsKLQotCXB1YmxpYyBNYXAgZ2V0UHJlZml4VG9QYWNrYWdlVVJJKCkgewotCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgewotCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNmNhOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuU0FYWE1JSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIgZXh0ZW5kcyBTQVhYTUlIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBOVUxMX0FUVFJJQiA9IFhNTFJlc291cmNlLlhTSV9OUyArICI6bnVsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSB4bWlSZXNvdXJjZQotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlcihYTUxSZXNvdXJjZSB4bWlSZXNvdXJjZSwgWE1MSGVscGVyIGhlbHBlciwgTWFwIG9wdGlvbnMpIHsKLQkJc3VwZXIoeG1pUmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGFuZGxlciNpc051bGwoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbCgpIHsKLQkJYm9vbGVhbiBpc251bGwgPSBzdXBlci5pc051bGwoKTsKLQkJaWYgKCFpc251bGwpCi0JCQlpc251bGwgPSBhdHRyaWJzLmdldFZhbHVlKE5VTExfQVRUUklCKSAhPSBudWxsOwotCQlyZXR1cm4gaXNudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMzVmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXIgewotCVVSSSBkZU5vcm1hbGl6ZShVUkkgdXJpKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlMb2FkSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWJmZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUxvYWRJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlMb2FkSW1wbCBleHRlbmRzIFhNSUxvYWRJbXBsIHsKLQotCS8qKgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxMb2FkSW1wbCNtYWtlRGVmYXVsdEhhbmRsZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgU0FYV3JhcHBlcihuZXcgQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucykpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTRmNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZSB7Ci0JaW50IEZPUk1BVF9FTUYxID0gMDsKLQkvKioKLQkgKiBmb3JtYXQgZm9yIE1PRjUgY29tcGF0aWJpbGl0eTsgbm90ZSB0aGF0IHRoaXMgY2FuIE5PVCBiZSB1c2VkIHdpdGggcmVzb3VyY2VzIHVzaW5ncyB0aGUKLQkgKiAicGxhdGZvcm06L3BsdWdpbiIgcHJvdG9jb2wiCi0JICovCi0JaW50IEZPUk1BVF9NT0Y1ID0gMTsKLQotCXZvaWQgYWRkT3JpZ2luYWxQYWNrYWdlVVJJKFN0cmluZyBwYWNrYWdlVXJpLCBTdHJpbmcgb3JpZ2luYWxVcmkpOwotCi0JaW50IGdldEZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdC4gQnkgZGVmYXVsdCBpdCBpcyBGT1JNQVRfRU1GMS4KLQkgKiAKLQkgKiBAc2VlIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSNGT1JNQVRfRU1GMQotCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlI0ZPUk1BVF9NT0Y1Ci0JICovCi0Jdm9pZCBzZXRGb3JtYXQoaW50IGZvcm1hdCk7Ci0KLQlib29sZWFuIHVzZXNEZWZhdWx0Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9vdE9iamVjdAotCSAqLwotCXZvaWQgcmVtb3ZlUHJlc2VydmluZ0lkcyhFT2JqZWN0IHJvb3RPYmplY3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjk1Zjk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxMb2FkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCBleHRlbmRzIFhNSVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdCA9IEZPUk1BVF9FTUYxOwotCXByb3RlY3RlZCBNYXAgb3JpZ2luYWxQYWNrYWdlVVJJcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlSURzID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUFJPVE9DT0wgPSAicGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFwcGFibGVYTUlSZXNvdXJjZUltcGwuCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCWluaXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGwjY3JlYXRlWE1MSGVscGVyKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJTWFwcGVkWE1JSGVscGVyIGhlbHBlciA9IGRvQ3JlYXRlWE1MSGVscGVyKCk7Ci0JCWhlbHBlci5zZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkpOwotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXByb3RlY3RlZCBNYXBwZWRYTUlIZWxwZXIgZG9DcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGVkWE1JSGVscGVyKHRoaXMsIGdldFByZWZpeFRvUGFja2FnZVVSSXMoKSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgbm90IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHNlZSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSNnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFByZWZpeFRvUGFja2FnZVVSSXMoKSB7Ci0JCXJldHVybiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQcmVmaXhUb1BhY2thZ2VVUklzKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgbm90IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHNlZSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSNnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpIHsKLQkJcmV0dXJuIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE9yaWdpbmFsUGFja2FnZVVSSShTdHJpbmcgcGFja2FnZVVyaSwgU3RyaW5nIG9yaWdpbmFsVXJpKSB7Ci0JCW9yaWdpbmFsUGFja2FnZVVSSXMucHV0KHBhY2thZ2VVcmksIG9yaWdpbmFsVXJpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZvcm1hdCgpIHsKLQkJcmV0dXJuIGZvcm1hdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXQoaW50IGZvcm1hdCkgewotCQlpZiAoIWlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSSgpKQotCQkJdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSSgpIHsKLQkJVVJJIGFVUkkgPSBnZXRVUkkoKTsKLQotCQlyZXR1cm4gYVVSSSAhPSBudWxsICYmIFBMQVRGT1JNX1BST1RPQ09MLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmIFBMQVRGT1JNX1BMVUdJTi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI2dldFVSSUZyYWdtZW50KEVPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRVUklGcmFnbWVudChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKHVzZXNEZWZhdWx0Rm9ybWF0KCkpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VVJJRnJhZ21lbnQoZU9iamVjdCk7Ci0JCXJldHVybiBJRFV0aWwuZ2V0T3JBc3NpZ25JRChlT2JqZWN0LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzRGVmYXVsdEZvcm1hdCgpIHsKLQkJcmV0dXJuIGZvcm1hdCA9PSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX0VNRjE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTFNhdmUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCWlmICh1c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVhNTFNhdmUoKTsKLQkJcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb1NhdmUoT3V0cHV0U3RyZWFtLCBNYXApCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5kb1NhdmUob3V0cHV0U3RyZWFtLCBvcHRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdERlZmF1bHRPcHRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChkZWZhdWx0U2F2ZU9wdGlvbnMgPT0gbnVsbCkgewotCQkJZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNnZXRFT2JqZWN0QnlJRChTdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEJ5SUQoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSBpZFRvRU9iamVjdE1hcC5nZXQoaWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBlT2JqZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgdW5sb2FkZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KLQkgKiB7QGxpbmsgSW50ZXJuYWxFT2JqZWN0I2VTZXRQcm94eVVSSSBzZXRzfXRoZSBvYmplY3QgdG8gYmUgYSBwcm94eSBhbmQgY2xlYXJzIHRoZQotCSAqIHtAbGluayAjZUFkYXB0ZXJzIGFkYXB0ZXJzfS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1bmxvYWRlZChJbnRlcm5hbEVPYmplY3QgaW50ZXJuYWxFT2JqZWN0KSB7Ci0JCS8vb3ZlcnJpZGRlbiBmcm9tIHRoZSBzdXBlciBjbGFzczsgY2FsbCBzdXBlci5nZXRVUklGcmFnbWVudCBpbnN0ZWFkIG9mIHRoZSBpbXBsZW1lbnRhdGlvbgotCQkvL2F0IHRoaXMgbGV2ZWwsIHRvIGF2b2lkIElEIGdlbmVyYXRpb24gZHVyaW5nIHVubG9hZAotCQkvL2ludGVybmFsRU9iamVjdC5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KGdldFVSSUZyYWdtZW50KGludGVybmFsRU9iamVjdCkpKTsKLQkJaW50ZXJuYWxFT2JqZWN0LmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQoc3VwZXIuZ2V0VVJJRnJhZ21lbnQoaW50ZXJuYWxFT2JqZWN0KSkpOwotCQlpbnRlcm5hbEVPYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9Mb2FkKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JICogICAgICBqYXZhLnV0aWwuTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJhc2ljRG9Mb2FkKGlucHV0U3RyZWFtLCBvcHRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNkb0xvYWQoSW5wdXRTdHJlYW0sIE1hcCl9IGluc3RlYWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNEb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5kb0xvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNpbml0KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCXNldEVuY29kaW5nKERFRkFVTFRfRU5DT0RJTkcpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSNyZW1vdmVQcmVzZXJ2aW5nSWRzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByZXNlcnZpbmdJZHMoRU9iamVjdCByb290T2JqZWN0KSB7Ci0JCXNldFByZXNlcnZlSURzKHRydWUpOwotCQlnZXRDb250ZW50cygpLnJlbW92ZShyb290T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZXNlcnZlSURzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJlc2VydmVJRHMoKSB7Ci0JCXJldHVybiBwcmVzZXJ2ZUlEczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJlc2VydmVJRHMKLQkgKiAgICAgICAgICAgIFRoZSBwcmVzZXJ2ZUlEcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VydmVJRHMoYm9vbGVhbiBwcmVzZXJ2ZUlEcykgewotCQl0aGlzLnByZXNlcnZlSURzID0gcHJlc2VydmVJRHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RldGFjaGVkSGVscGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRldGFjaGVkSGVscGVyKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAobW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCWVPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCX0KLQotCQlpZiAodXNlVVVJRHMoKSkgewotCQkJREVUQUNIRURfRU9CSkVDVF9UT19JRF9NQVAucHV0KGVPYmplY3QsIGdldElEKGVPYmplY3QpKTsKLQkJfQotCi0JCWlmICghaXNQcmVzZXJ2ZUlEcygpICYmIGlkVG9FT2JqZWN0TWFwICE9IG51bGwgJiYgZU9iamVjdFRvSURNYXAgIT0gbnVsbCkgewotCQkJaWRUb0VPYmplY3RNYXAucmVtb3ZlKGVPYmplY3RUb0lETWFwLnJlbW92ZShlT2JqZWN0KSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgICAgIGlmIChpc0xvYWRlZCkgewotICAgICAgICAgICAgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIAotICAgICAgICAgICAgICAgIGFkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCAmJiAhaXNMb2FkZWQpIAotICAgICAgICAgICAgICAgIGFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgYWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN1cGVyLmxvYWQob3B0aW9ucyk7Ci0gICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICAgICAgfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXJyb3IgZSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQlwdWJsaWMgdm9pZCBsb2FkRXhpc3RpbmcoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJCi0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICAgICAgaWYgKGlzTG9hZGVkKSB7Ci0gICAgICAgICAgICBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgYWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIGFkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlciA9PSBudWxsICYmICFpc0xvYWRlZCkgCi0gICAgICAgICAgICAgICAgYWRkU3luY2hyb25pemF0aW9uTG9hZGluZ0FkYXB0ZXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZihhZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICBhZGFwdGVyLndhaXRGb3JSZXNvdXJjZVRvTG9hZCgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9hZCgoSW5wdXRTdHJlYW0pIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgICAgIH0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgICAgICB9IGNhdGNoKEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTeW5jaHJvbml6YXRpb25Mb2FkaW5nQWRhcHRlcigpIHsKLSAgICAJc3luY2hyb25pemVkIChlQWRhcHRlcnMoKSkgewotICAgICAgICBpZiAoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgICAgICAgICBlQWRhcHRlcnMoKS5hZGQoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSk7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGFkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkYXB0ZXIuZm9yY2VSZWxlYXNlKCk7Ci0gICAgICAgICAgICBlQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYXNlIDE6IExPQUQgUkVTT1VSQ0UgRlJPTSBESVNLIHRoaXMuaXNMb2FkZWQgPT0gZmFsc2UgQU5EIGlzTG9hZGVkID09Ci0gICAgICogdHJ1ZSAod2hpY2ggbWVhbnMgd2UgZW50ZXJlZCB0aGUgbG9hZCgpIG1ldGhvZCwgYnV0IGhhdmUgbm90IGNvbXBsZXRlZAotICAgICAqIHRoZSBsb2FkKSwgYW5kIHdlJ3JlIGxvYWRpbmcgZnJvbSBhIHJlc291cmNlIG9uIGRpc2ssIHRoZW4gd2UgYWRkIHRoZQotICAgICAqIGFkYXB0ZXIgQ2FzZSAyOiBSRVNPVVJDRSBDUkVBVElPTiAoTk9UIEEgTE9BRCkgQ2FzZSA0OiBSRVNPVVJDRSBDUkVBVElPTiwKLSAgICAgKiBVTkxPQURFRCwgTkVXIENPTlRFTlRTIChOT1QgQSBMT0FEKSBSZXNvdXJjZSBpcyBjcmVhdGVkIGJ1dCBub3QgZnJvbSBhCi0gICAgICogcmVzb3VyY2Ugb24gZGlzaywgc28gY29udGVudHMgaXMgbnVsbCBBTkQgbm90IGVtcHR5LCBzbyBubyBhZGFwdGVyOiBUSElTCi0gICAgICogSVMgTk9UIEEgTE9BRCBDYXNlIDM6IFJFU09VUkNFIEhBUyBCRUVOIFVOTE9BREVELCBCRUlORyBSRUxPQURFRCBGUk9NCi0gICAgICogRElTSyBDb250ZW50cyBpcyBOT1QgbnVsbCwgYnV0IGl0IGlzIEVtcHR5IGFuZCB0aGUgcmVzb3VyY2UgaXMgYmVpbmcKLSAgICAgKiBsb2FkZWQgZnJvbSBkaXNrLiBXZSBtdXN0IGFkZCB0aGUgYWRhcHRlci4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlQmVpbmdMb2FkZWQoYm9vbGVhbiBpc0xvYWRlZCkgewotICAgICAgICByZXR1cm4gKCF0aGlzLmlzTG9hZGVkICYmIGlzTG9hZGVkKSAmJiAoY29udGVudHMgPT0gbnVsbCB8fCBjb250ZW50cy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI2dldENvbnRlbnRzKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7Ci0gICAgICAgIHdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50cygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsI2lzTG9hZGVkKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZCgpIHsKLSAgICAgICAgd2FpdEZvclJlc291cmNlVG9Mb2FkSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzTG9hZGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgd2FpdEZvclJlc291cmNlVG9Mb2FkSWZOZWNlc3NhcnkoKSB7Ci0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBsb2FkaW5nQWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKLSAgICAgICAgaWYgKGxvYWRpbmdBZGFwdGVyICE9IG51bGwpIGxvYWRpbmdBZGFwdGVyLndhaXRGb3JSZXNvdXJjZVRvTG9hZCgpOwotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjc0YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsOwotCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsIGV4dGVuZHMgWE1JU2F2ZUltcGwgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC4KLQkgKiAKLQkgKiBAcGFyYW0gaGVscGVyCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsKE1hcCBvcHRpb25zLCBYTUxIZWxwZXIgaGVscGVyLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJc3VwZXIob3B0aW9ucywgaGVscGVyLCBlbmNvZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGwjaW5pdChYTUxSZXNvdXJjZSwgTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBvcHRpb25zKSB7Ci0JCXN1cGVyLmluaXQocmVzb3VyY2UsIG9wdGlvbnMpOwotCQl4bWlUeXBlID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbCNhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpIHsKLQkJZG9jLmFkZEF0dHJpYnV0ZShYTUlfVkVSX05TLCBYTUlSZXNvdXJjZS5WRVJTSU9OX1ZBTFVFKTsKLQkJZG9jLmFkZEF0dHJpYnV0ZShYTUlfWE1MTlMsIFhNSVJlc291cmNlLlhNSV9VUkkpOwotCQlFUGFja2FnZVtdIHBhY2thZ2VzID0gaGVscGVyLnBhY2thZ2VzKCk7Ci0JCVN0cmluZ0J1ZmZlciB4c2lTY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0JCWlmIChkZWNsYXJlU2NoZW1hTG9jYXRpb24pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlFUGFja2FnZSBlUGFja2FnZSA9IHBhY2thZ2VzW2ldOwotCi0JCQkJRU9iamVjdCByb290ID0gRWNvcmVVdGlsLmdldFJvb3RDb250YWluZXIoZVBhY2thZ2UpOwotCQkJCWlmIChyb290IGluc3RhbmNlb2YgRVBhY2thZ2UpIHsKLQkJCQkJRVBhY2thZ2Ugcm9vdEVQYWNrYWdlID0gKEVQYWNrYWdlKSByb290OwotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3RFUGFja2FnZS5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQkJCVN0cmluZyByb290TnNVUkkgPSByb290RVBhY2thZ2UuZ2V0TnNVUkkoKTsKLQkJCQkJCWlmICh1cmkgPT0gbnVsbCA/IHJvb3ROc1VSSSAhPSBudWxsIDogIXVyaS50b1N0cmluZygpLmVxdWFscyhyb290TnNVUkkpKSB7Ci0JCQkJCQkJZGVjbGFyZVhTSSA9IHRydWU7Ci0JCQkJCQkJaWYgKHhzaVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJCQkJeHNpU2NoZW1hTG9jYXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJeHNpU2NoZW1hTG9jYXRpb24uYXBwZW5kKCcgJyk7Ci0JCQkJCQkJfQotCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uLmFwcGVuZChyb290TnNVUkkpOwotCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uLmFwcGVuZCgnICcpOwotCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uLmFwcGVuZChoZWxwZXIuZ2V0SFJFRihyb290RVBhY2thZ2UpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkZWNsYXJlWFNJKSB7Ci0JCQlkb2MuYWRkQXR0cmlidXRlKFhTSV9YTUxOUywgWE1MUmVzb3VyY2UuWFNJX1VSSSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFUGFja2FnZSBlUGFja2FnZSA9IHBhY2thZ2VzW2ldOwotCQkJLy9Nb2RpZmllZCBmcm9tIHN1cGVyY2xhc3MgLSBkaXNwYXRjaCBiYWNrIHRvIGhlbHBlciBmb3IgY29tcGF0aWJpbGl0eQotCQkJLy9TdHJpbmcgbnNVUkkgPSBlUGFja2FnZS5nZXROc1VSSSgpOwotCQkJLy9TdHJpbmcgbnNQcmVmaXggPSBlUGFja2FnZS5nZXROc1ByZWZpeCgpOwotCQkJU3RyaW5nW10gbnNJbmZvID0gKChNYXBwZWRYTUlIZWxwZXIpIGhlbHBlcikuZ2V0TlNJbmZvKGVQYWNrYWdlKTsKLQkJCWRvYy5hZGRBdHRyaWJ1dGVOUyhYTUxSZXNvdXJjZS5YTUxfTlMsIG5zSW5mb1swXSwgbnNJbmZvWzFdKTsKLQkJfQotCi0JCWlmICh4c2lTY2hlbWFMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlkb2MuYWRkQXR0cmlidXRlKFhTSV9TQ0hFTUFfTE9DQVRJT04sIHhzaVNjaGVtYUxvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUhyZWYoRU9iamVjdCByZW1vdGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCVN0cmluZyBuYW1lID0gaGVscGVyLmdldFFOYW1lKGYpOwotCQlTdHJpbmcgaHJlZiA9IGhlbHBlci5nZXRIUkVGKHJlbW90ZSk7Ci0JCWlmIChocmVmICE9IG51bGwpIHsKLQkJCWRvYy5zdGFydEVsZW1lbnQobmFtZSk7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gcmVtb3RlLmVDbGFzcygpOwotCi0JCQlFQ2xhc3MgZXhwZWN0ZWRUeXBlID0gKEVDbGFzcykgZi5nZXRFVHlwZSgpOwotCQkJLy9DaGFuZ2VkIG5leHQgbGluZSB0byBhbHdheXMgd3JpdGUgdHlwZSBpZiBleHBlY3RlZFR5cGUKLQkJCS8vaXMgZGlmZmVyZW50IGZyb20gZUNsYXNzCi0JCQlpZiAoZUNsYXNzICE9IGV4cGVjdGVkVHlwZSkgewotCQkJCXNhdmVUeXBlQXR0cmlidXRlKGVDbGFzcyk7Ci0JCQl9Ci0KLQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQlkb2MuZW5kRW1wdHlFbGVtZW50KCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFhOWY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTUsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgbnVsbCwgRE9NX0FUVFJJQlVURSk7Ci0JCXRoaXMuYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNTZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhYmNlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5OYW1lc3BhY2VBZGFwdGVyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5IGltcGxlbWVudHMgVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkjYWNjZXB0cyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdHMoU3RyaW5nIGRvbU5hbWUpIHsKLQkJcmV0dXJuIGRvbU5hbWUgIT0gbnVsbCAmJiBkb21OYW1lLnN0YXJ0c1dpdGgoWE1MTlMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkjYWNjZXB0cyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0cyhOb3RpZmljYXRpb24gbm90aWYpIHsKLQkJcmV0dXJuIG5vdGlmLmdldEZlYXR1cmUoKSA9PSBOYW1lc3BhY2VBZGFwdGVyLk5PVElGSUNBVElPTl9GRUFUVVJFOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNjcmVhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUoU3RyaW5nIGRvbU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBOYW1lc3BhY2VUcmFuc2xhdG9yKGRvbU5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkjY3JlYXRlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZShOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBuYW1lc3BhY2VzID0gTmFtZXNwYWNlQWRhcHRlci5nZXROYW1lc3BhY2VzKChFT2JqZWN0KSB0YXJnZXQpOwotCQlpZiAobmFtZXNwYWNlcyA9PSBudWxsIHx8IG5hbWVzcGFjZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChuYW1lc3BhY2VzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzdWx0LmFkZChjcmVhdGUoKE5hbWVzcGFjZSkgbmFtZXNwYWNlcy5nZXQoaSkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkjY3JlYXRlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUoTm90aWZpY2F0aW9uIG5vdGlmKSB7Ci0JCU5hbWVzcGFjZSBucyA9IChOYW1lc3BhY2UpIG5vdGlmLmdldE5ld1ZhbHVlKCk7Ci0JCXJldHVybiBjcmVhdGUobnMpOwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGUoTmFtZXNwYWNlIG5zKSB7Ci0JCXJldHVybiBuZXcgTmFtZXNwYWNlVHJhbnNsYXRvcihYTUxOUyArIG5zLmdldFByZWZpeCgpKTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZXBlbmRlbmN5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVwZW5kZW5jeVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0ODIyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZXBlbmRlbmN5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRGVwZW5kZW50RmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCQlkZXBlbmRlbmN5RmVhdHVyZSA9IGFEZXBlbmRlbnRGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENoaWxkKEVPYmplY3QgcGFyZW50KSB7Ci0JCUVPYmplY3QgY2hpbGQgPSBiYXNpY0dldERlcGVuZGVuY3lPYmplY3QocGFyZW50KTsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gY3JlYXRlQ2hpbGQocGFyZW50KTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCi0JcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlQ2hpbGQoRU9iamVjdCBwYXJlbnQpIHsKLQkJRU9iamVjdCBjaGlsZCA9IGNyZWF0ZUVNRk9iamVjdChkZXBlbmRlbmN5RmVhdHVyZSk7Ci0JCXBhcmVudC5lU2V0KGRlcGVuZGVuY3lGZWF0dXJlLCBjaGlsZCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQkvL3JldHVybiBzdXBlci5nZXRNT0ZDaGlsZHJlbihnZXRDaGlsZChtb2ZPYmplY3QpKTsKLQkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TU9GVmFsdWUoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkvL3N1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCksIHZhbHVlKTsKLQkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoZW1mT2JqZWN0KSwgdmFsdWUsIC0xKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoKEVPYmplY3QpIG93bmVyKSwgdmFsdWUsIG5ld0luZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXN1cGVyLnJlbW92ZU1PRlZhbHVlKGdldENoaWxkKChFT2JqZWN0KSBvd25lciksIHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5pc1NldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJc3VwZXIudW5TZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeUNoaWxkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5mZWF0dXJlRXhpc3RzKGdldENoaWxkKGVtZk9iamVjdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgewotCQlzdXBlci5jbGVhckxpc3QoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4MmVhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVNRjJET01BZGFwdGVyIGV4dGVuZHMgQWRhcHRlciB7Ci0KLQotCUNsYXNzIEFEQVBURVJfQ0xBU1MgPSBFTUYyRE9NQWRhcHRlci5jbGFzczsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG5vZGUgdGhhdCB0aGUgdGFyZ2V0IG9mIHRoaXMgYWRhcHRlciBtYXBzIHRvLiBJZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgbWFwcyB0bwotCSAqIG1vcmUgdGhhbiBvbmUgRE9NIG5vZGUsIHRoaXMgbm9kZSBpcyB0aGUgdG9wLW1vc3Qgbm9kZS4KLQkgKi8KLQlOb2RlIGdldE5vZGUoKTsKLQotCXZvaWQgc2V0Tm9kZShOb2RlIGFOb2RlKTsKLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0JYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0Jdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIERPTSB0cmVlIGZvciB0aGlzIGFkYXB0ZXIgZnJvbSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIE1PRiBPYmplY3QuIFRoaXMgbWV0aG9kCi0JICogdXBkYXRlcyBBTEwgdGhlIERPTSBub2RlcyBmcm9tIGFsbCB0aGUgTU9GIGF0dHJpYnV0ZXMuCi0JICovCi0Jdm9pZCB1cGRhdGVET00oKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIE1PRiBPYmplY3QgZnJvbSB0aGUgRE9NIHRyZWUuIEFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIERPTSB0cmVlIGFyZSB1cGRhdGVkIGludG8KLQkgKiB0aGUgTU9GIG9iamVjdC4KLQkgKi8KLQl2b2lkIHVwZGF0ZU1PRigpOwotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCk7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0ZGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KTsKLQotCUVPYmplY3QgZ2V0RU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgTU9GIG9iamVjdCBpcyBhIHByb3h5LgotCSAqLwotCWJvb2xlYW4gaXNNT0ZQcm94eSgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBET00gYWRhcHRlcnMgZnJvbSB0aGUgbm9kZSBBTkQgYWxsIGl0cyBjaGlsZCBub2RlcywgcmVjdXJzaXZlbHkuCi0JICovCi0Jdm9pZCByZW1vdmVBZGFwdGVycyhOb2RlIG5vZGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTczNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuVHJhbnNsYXRvclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLldGVFV0aWxzUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTUFkYXB0ZXJJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBFTUYyRE9NQWRhcHRlciB7Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZkRlYnVnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmTm9kZTsKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGZUcmFuc2xhdG9yOwotCi0JcHJvdGVjdGVkIEVNRjJET01SZW5kZXJlciBmUmVuZGVyZXI7Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkVHJhbnNsYXRvcnM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jvb3QgPSBmYWxzZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk0gPSAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU1JVTk5JTkcgPSAiaXNSdW5uaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBEZXBlbmRlbmN5QWRhcHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwgewotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gIkVNRjJET01EZXBlbmRlbmN5QWRhcHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlFTUYyRE9NQWRhcHRlckltcGwudGhpcy5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBLRVkuZXF1YWxzKHR5cGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHJvb3QgYWRhcHRlcnMuCi0JICovCi0JcHVibGljIEVNRjJET01BZGFwdGVySW1wbChUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UsIERvY3VtZW50IGRvY3VtZW50LCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQl0aGlzKChOb3RpZmllcikgcmVzb3VyY2UsIChOb2RlKSBkb2N1bWVudCwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCQlpc1Jvb3QgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBBZGFwdGVyIGdpdmVuIGFuIEVPYmplY3QgYW5kIGEgbm9kZQotCSAqLwotCXB1YmxpYyBFTUYyRE9NQWRhcHRlckltcGwoTm90aWZpZXIgb2JqZWN0LCBOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhcmdldChvYmplY3QpOwotCQlmTm9kZSA9IG5vZGU7Ci0JCWZSZW5kZXJlciA9IHJlbmRlcmVyOwotCQlmVHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JCWluaXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWFkZEVNRkFkYXB0ZXIoKTsKLQkJYWRkRE9NQWRhcHRlcigpOwotCQlhZGREZXBlbmRlbmN5QWRhcHRlcklmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZnJvbSBhIERPTSBOb2RlLiBUaGUgRU9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXJJbXBsKE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJZk5vZGUgPSBub2RlOwotCQlmUmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCQlzZXRUYXJnZXRGcm9tTm9kZSgpOwotCQlpbml0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQlhZGRFTUZBZGFwdGVyKCk7Ci0JCWFkZERPTUFkYXB0ZXIoKTsKLQkJYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKCFmVHJhbnNsYXRvci5pc0RlcGVuZGVuY3lQYXJlbnQoKSkKLQkJCXJldHVybjsKLQkJRU9iamVjdCBjaGlsZCA9IGZUcmFuc2xhdG9yLmJhc2ljR2V0RGVwZW5kZW5jeU9iamVjdChnZXRFT2JqZWN0KCkpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCWFkZERlcGVuZGVuY3lBZGFwdGVyKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2hpbGRUcmFuc2xhdG9ycygpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYm9vbGVhbiBpc1J1bm5pbmcgPSBmYWxzZTsgLy9pcyB0aGUgT1NHSSBwbGF0Zm9ybSBydW5uaW5nID8KLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBQbGF0Zm9ybSBjbGFzcyBjYW4gYmUgZm91bmQsIHRoZW4gY29udGludWUgdG8gY2hlY2sgaWYgdGhlIE9TR0kgcGxhdGZvcm0gaXMgcnVubmluZwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKFBMQVRGT1JNKTsKLQkJCU1ldGhvZCBtID0gY2xhenouZ2V0TWV0aG9kKElTUlVOTklORyk7Ci0JCQlpc1J1bm5pbmcgPSAoKEJvb2xlYW4pbS5pbnZva2UoY2xhenopKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9CQotCQkvL0NoZWNrIGZvciBleHRlbmRlZCBjaGlsZCB0cmFuc2xhdG9ycyBiZWNhdXNlIHdlIGFyZSBpbiBPU0dJIG1vZGUKLQkJaWYgKGlzUnVubmluZykgewotCQkJVHJhbnNsYXRvcltdIGV4dGVuZGVkQ2hpbGRyZW4gPSBUcmFuc2xhdG9yU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFRyYW5zbGF0b3JzKCk7Ci0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkgICAgICAgIAlpZiAoZXh0ZW5kZWRDaGlsZHJlbltpXSAhPSBudWxsKQotCSAgICAgICAgICAgIAljaGlsZHJlbi5hZGQoZXh0ZW5kZWRDaGlsZHJlbltpXSk7Ci0JICAgICAgICB9Ci0JCX0KLQkJCi0JCQotCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChmVHJhbnNsYXRvci5nZXRDaGlsZHJlbihnZXRUYXJnZXQoKSwgZlJlbmRlcmVyLmdldFZlcnNpb25JRCgpKSkpOwotCi0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdG9yeSA9IGZUcmFuc2xhdG9yLmdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGRvbU5hbWUgPSBudWxsOwotCQkJTmFtZWROb2RlTWFwIG1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCU5vZGUgYXR0ck5vZGUgPSBtYXAuaXRlbShpKTsKLQkJCQkJZG9tTmFtZSA9IGF0dHJOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCS8vSGFuZGxlIHZhcmlhYmxlIHRyYW5zbGF0b3JzCi0JCQkJCVRyYW5zbGF0b3IgdCA9IGZUcmFuc2xhdG9yLmZpbmRDaGlsZChkb21OYW1lLCBnZXRUYXJnZXQoKSwgZlJlbmRlcmVyLmdldFZlcnNpb25JRCgpKTsKLQkJCQkJaWYgKHQgIT0gbnVsbCAmJiAhY2hpbGRyZW4uY29udGFpbnModCkpCi0JCQkJCQljaGlsZHJlbi5hZGQodCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCBjaGlsZHJlbkZyb21FTUYgPSBmYWN0b3J5LmNyZWF0ZShnZXRUYXJnZXQoKSk7Ci0JCQlpZiAoY2hpbGRyZW5Gcm9tRU1GICE9IG51bGwpCi0JCQkJY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuRnJvbUVNRik7Ci0JCX0KLQotCQljaGlsZFRyYW5zbGF0b3JzID0gKFRyYW5zbGF0b3JbXSkgY2hpbGRyZW4udG9BcnJheShuZXcgVHJhbnNsYXRvcltjaGlsZHJlbi5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZOb3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlmTm90aWZpY2F0aW9uRW5hYmxlZCA9IGlzRW5hYmxlZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTID09IHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRU1GQWRhcHRlcigpIHsKLQkJdGFyZ2V0LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChzaG9ydENsYXNzTmFtZSh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQoZ2V0Tm9kZSgpLmdldE5vZGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoJywnKTsKLQkJc2IuYXBwZW5kKHNob3J0Q2xhc3NOYW1lKGdldFRhcmdldCgpKSk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNob3J0Q2xhc3NOYW1lKE9iamVjdCBvKSB7Ci0JCWlmIChvICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbiA9IG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlyZXR1cm4gY24uc3Vic3RyaW5nKGkgKyAxLCBjbi5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBQcmludHMgb3V0IGEgTU9GIG5vdGlmaWNhdGlvbiBmb3IgZGVidWdnaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVidWdNT0ZOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlTdHJpbmcgbm90aWZUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJCQlub3RpZlR5cGUgPSAiQUREX01BTlkiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRV9NQU5ZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOiB7Ci0JCQkJCWlmIChtc2cuZ2V0UG9zaXRpb24oKSA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpCi0JCQkJCQlub3RpZlR5cGUgPSAiUkVQTEFDRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJbm90aWZUeXBlID0gIlNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLQkJCQkJbm90aWZUeXBlID0gIlVOU0VUIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIk1PRiBDaGFuZ2U6ICIgKyBub3RpZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRub3RpZmllciAgICAgIDogIiArIG1zZy5nZXROb3RpZmllcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0Y2hhbmdlZEZlYXR1cmU6ICIgKyBtc2cuZ2V0RmVhdHVyZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0b2xkVmFsdWUgICAgICA6ICIgKyBtc2cuZ2V0T2xkVmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdG5ld1ZhbHVlICAgICAgOiAiICsgbXNnLmdldE5ld1ZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgZmVhdHVyZSBtYXBzIGZvciB0aGUgYWRhcHRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldENoaWxkVHJhbnNsYXRvcnMoKSB7Ci0JCXJldHVybiBjaGlsZFRyYW5zbGF0b3JzOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGZpbmRUcmFuc2xhdG9yKE5vdGlmaWNhdGlvbiBub3QpIHsKLQkJaWYgKG5vdC5nZXRGZWF0dXJlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWFwc1tpXS5pc01hcEZvcihub3QuZ2V0RmVhdHVyZSgpLCBub3QuZ2V0T2xkVmFsdWUoKSwgbm90LmdldE5ld1ZhbHVlKCkpKQotCQkJCXJldHVybiBtYXBzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgTU9GIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgd2lsbCByZW1vdmUgdGhlIGRvbSBlcXVpdmFsZW50LgotCSAqIElmIG11bHRpcGxlIGRpZmZlcmVuY2VzIGFyZSBmb3VuZCwgd2lsbCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkaWZmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gbW9mQ2hpbGRyZW4KLQkgKiBAcGFyYW0gZG9tQ2hpbGRyZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgdXBkYXRlRE9NU2luZ2xlUmVtb3ZlKE5vZGUgcGFyZW50LCBMaXN0IG1vZkNoaWxkcmVuLCBMaXN0IGRvbUNoaWxkcmVuKXsKLQkJaW50IGRvbUluZGV4ID0gMDsKLQkJaW50IGZpcnN0RGlmZmVyZW5jZSA9IC0xOwotCQlmb3IgKE9iamVjdCBtb2ZDaGlsZCA6IG1vZkNoaWxkcmVuKXsKLQkJCWlmIChtb2ZDaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQl7Ci0JCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGdldEV4aXN0aW5nQWRhcHRlcigoRU9iamVjdCltb2ZDaGlsZCk7Ci0JCQkJaWYoYWRhcHRlci5nZXROb2RlKCkgIT0gZG9tQ2hpbGRyZW4uZ2V0KGRvbUluZGV4KSl7Ci0JCQkJCWlmKGZpcnN0RGlmZmVyZW5jZSAhPSAtMSl7Ci0JCQkJCQkvL3NlY29uZCBkaWZmZXJlbmNlOyByZXR1cm4KLQkJCQkJCXJldHVybiBmaXJzdERpZmZlcmVuY2U7Ci0JCQkJCX0KLQkJCQkJLy93ZSBmb3VuZCBzb21ldGhpbmcgdGhhdCBpcyBkaWZmZXJlbnQKLQkJCQkJZmlyc3REaWZmZXJlbmNlID0gZG9tSW5kZXg7Ci0JCQkJCS8vc2tpcCBvdmVyIG9uZSBpbmRleCBhbmQgY2hlY2sgYWdhaW5zdCBuZXh0Ci0JCQkJCWRvbUluZGV4ICsrOwotCQkJCQlpZihhZGFwdGVyLmdldE5vZGUoKSAhPSBkb21DaGlsZHJlbi5nZXQoZG9tSW5kZXgpKXsKLQkJCQkJCS8vaWYgdGhlc2UgYXJlIGRpZmZlcmVudCB0aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBjaGFuZ2VzCi0JCQkJCQlyZXR1cm4gZmlyc3REaWZmZXJlbmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRvbUluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJaWYoZmlyc3REaWZmZXJlbmNlICE9IC0xKXsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudCwgKEVsZW1lbnQpIGRvbUNoaWxkcmVuLmdldChmaXJzdERpZmZlcmVuY2UpKTsKLQkJCS8vaWYgd2UgYXJlIGhlcmUsIGFuZCBmaXJzdERpZmZlcmVuY2UgaXMgbm90IC0xLCB0aGF0IG1lYW5zIHdlIGhhdmUgaXRlcmF0ZWQKLQkJCS8vdGhyb3VnaCB0aGUgZW50aXJlIG1vZiBsaXN0LCBhbmQgYWxsIGVsZW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuIFJldHVybgotCQkJLy9kb21jaGlsZHJlbi5zaXplLCBzbyB0aGF0IG5vIG1vcmUgcHJvY2Vzc2luZyBpcyBkb25lIGluIGNhbGxpbmcgbWV0aG9kLgotCQkJcmV0dXJuIGRvbUNoaWxkcmVuLnNpemUoKTsKLQkJfQotCQkvL2lmIHdlIGFyZSBoZXJlLCB0aGVuIGZpcnN0RGlmZmVyZW5jZSB3YXMgLTEuIE91ciBhbGdvIGhhcyBmYWlsZWQuIExldCBvcmlnaW5hbCBhbGdvIHJ1bi4KLQkJcmV0dXJuIDA7Ci0JfQotCi0JCi0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgTGlzdCBtb2ZDaGlsZHJlbiwgTGlzdCBkb21DaGlsZHJlbiwgTm90aWZpZXIgb3duZXIpIHsKLQotCQlpbnQgaSA9IDA7Ci0JCU5vZGUgcGFyZW50ID0gZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSk7Ci0JCWlmKGRvbUNoaWxkcmVuLnNpemUoKSAtIG1vZkNoaWxkcmVuLnNpemUoKSA9PSAxKXsKLQkJCS8vYW4gZW1mIG9iamVjdCBoYXMgYmVlbiBkZWxldGVkLiBSZW1vdmUgaXQgZnJvbSB0aGUgZG9tIGFzIHdlbGwKLQkJCWkgPSB1cGRhdGVET01TaW5nbGVSZW1vdmUocGFyZW50LCBtb2ZDaGlsZHJlbiwgZG9tQ2hpbGRyZW4pOwotCQl9Ci0JCS8vVXNlZCBmb3IgaW5zZXJ0aW5nIHByaW1pdGl2ZXMKLQkJTGlzdCBpbm9yZGVyRE9NQ2hpbGRyZW4gPSBudWxsOwotCQlpZihpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpKXsKLQkJCWlmICghbWFwLmlzT2JqZWN0TWFwKCkgfHwgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQlpbm9yZGVyRE9NQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW5vcmRlckRPTUNoaWxkcmVuLmFkZEFsbChkb21DaGlsZHJlbik7Ci0JCQl9Ci0JCX0KLQkJLy8gR28gdGhvdWdoIHRoZSBNT0YgY2hpbGRyZW4gY2hlY2tpbmcgdG8gc2VlIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0JCS8vIE1PRiBBZGFwdGVyIGNoaWxkcmVuIGV4aXN0cy4gSWYgbm90LCBjcmVhdGUgdGhlIGFkYXB0ZXIuCi0JCS8vIEFsc28gaGFuZGxlcyByZW9yZGVyaW5nIGNoaWxkcmVuIHRoYXQgaGF2ZSBtb3ZlZC4KLQkJZm9yICg7IGkgPCBtb2ZDaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IGNoaWxkID0gbW9mQ2hpbGRyZW4uZ2V0KGkpOwotCQkJRU9iamVjdCBtb2ZDaGlsZCA9IG51bGw7Ci0KLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCi0JCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGNoaWxkIGlzIGEgTU9GIE9iamVjdC4KLQkJCWlmICghbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkgJiYgY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJbW9mQ2hpbGQgPSAoRU9iamVjdCkgbW9mQ2hpbGRyZW4uZ2V0KGkpOwotCQkJCWFkYXB0ZXIgPSBnZXRFeGlzdGluZ0FkYXB0ZXIobW9mQ2hpbGQpOwotCQkJfQotCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGkgPCBkb21DaGlsZHJlbi5zaXplKCkgJiYgZG9tQ2hpbGRyZW4uZ2V0KGkpID09IGFkYXB0ZXIuZ2V0Tm9kZSgpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWlmIChkb21DaGlsZHJlbi5pc0VtcHR5KCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8vIEEgbm9kZSBoYXMgYmVlbiByZW9yZGVyZWQgaW4gdGhlIGxpc3QKLQkJCQlOb2RlIHJlb3JkZXJOb2RlID0gYWRhcHRlci5nZXROb2RlKCk7Ci0JCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gcmVvcmRlck5vZGU7Ci0JCQkJaWYgKGkgPCBkb21DaGlsZHJlbi5zaXplKCkgJiYgZG9tQ2hpbGRyZW4uZ2V0KGkpICE9IHJlb3JkZXJOb2RlKSB7Ci0JCQkJCWluc2VydEJlZm9yZU5vZGUgPSAoTm9kZSkgZG9tQ2hpbGRyZW4uZ2V0KGkpOwotCQkJCX0KLQkJCQlkb21DaGlsZHJlbi5yZW1vdmUocmVvcmRlck5vZGUpOwotCQkJCWRvbUNoaWxkcmVuLmFkZChpLCByZW9yZGVyTm9kZSk7Ci0JCQkJaWYgKHJlb3JkZXJOb2RlICE9IGluc2VydEJlZm9yZU5vZGUpIHsKLQkJCQkJcmVvcmRlckRPTUNoaWxkKHBhcmVudCwgcmVvcmRlck5vZGUsIGluc2VydEJlZm9yZU5vZGUsIG1hcCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBBIG5ldyBub2RlIGhhcyBiZWVuIGFkZGVkLCBjcmVhdGUgaXQKLQkJCQlwYXJlbnQgPSBjcmVhdGVET01QYXRoKG5vZGUsIG1hcCk7Ci0JCQkJaWYgKG1vZkNoaWxkICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIobW9mQ2hpbGQsIG1hcCk7Ci0JCQkJCU5vZGUgbmV3Tm9kZSA9IGFkYXB0ZXIuZ2V0Tm9kZSgpOwotCQkJCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBmaW5kSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG1hcCwgbW9mQ2hpbGRyZW4sIGksIGRvbUNoaWxkcmVuKTsKLQkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCwgbmV3Tm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSk7Ci0JCQkJCWRvbUNoaWxkcmVuLmFkZChpLCBuZXdOb2RlKTsKLQkJCQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gYWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluZGVudChuZXdOb2RlLCBtYXApOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQkJCQl9Ci0JCQkJCWFkYXB0ZXIudXBkYXRlRE9NKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gVGhlIG1vZiBmZWF0dXJlIGlzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmVzLgotCQkJCQkvLyBjcmVhdGUgYSBuZXcgZG9tIG5vZGUgYW5kIGxpc3RlbiB0byBpdC4KLQkJCQkJRWxlbWVudCBuZXdOb2RlID0gY3JlYXRlTmV3Tm9kZShudWxsLCBtYXApOwotCQkJCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBmaW5kSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG1hcCwgbW9mQ2hpbGRyZW4sIGksIGlub3JkZXJET01DaGlsZHJlbik7Ci0JCQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIG5ld05vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCQkJCQlpbmRlbnQobmV3Tm9kZSwgbWFwKTsKLQkJCQkJYWRkRE9NQWRhcHRlcihuZXdOb2RlKTsgLy8gSG9vayB1cCBsaXN0ZW5lcnMKLQkJCQkJZG9tQ2hpbGRyZW4uYWRkKGksIG5ld05vZGUpOwotCQkJCQlpZihpbm9yZGVyRE9NQ2hpbGRyZW4gIT0gbnVsbCl7Ci0JCQkJCQlpbm9yZGVyRE9NQ2hpbGRyZW4uYWRkKG5ld05vZGUpOwotCQkJCQl9Ci0JCQkJCVRleHQgbmV3VGV4dCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobWFwLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGNoaWxkLCAoRU9iamVjdCkgb3duZXIpKTsKLQkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUobmV3Tm9kZSwgbmV3VGV4dCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgYWRhcHRlcnMuCi0JCWZvciAoOyBpIDwgZG9tQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudCwgKEVsZW1lbnQpIGRvbUNoaWxkcmVuLmdldChpKSk7Ci0JCX0KLQotCQkvLyBJZiB0aGVyZSBhcmUgbm8gTU9GIGNoaWxkcmVuLCByZW1vdmUgYW55IHVubmVjZXNzYXJ5IERPTSBub2RlIHBhdGhzCi0JCWlmIChtb2ZDaGlsZHJlbi5zaXplKCkgPT0gMCAmJiBtYXAuaGFzRE9NUGF0aCgpKSB7Ci0JCQlpZiAobWFwLnNob3VsZFJlbmRlckVtcHR5RE9NUGF0aCgoRU9iamVjdCkgb3duZXIpKQotCQkJCWNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCWVsc2UKLQkJCQlyZW1vdmVET01QYXRoKG5vZGUsIG1hcCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBMaXN0IG1vZkNoaWxkcmVuLCBMaXN0IGRvbUNoaWxyZW4pIHsKLQotCQlIYXNodGFibGUgbm9kZVRvQWRhcHRlciA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSkpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlub2RlVG9BZGFwdGVyLnB1dChhZGFwdGVyLmdldE5vZGUoKSwgYWRhcHRlcik7Ci0JCX0KLQotCQkvLyBHbyB0aG91Z2ggdGhlIERPTSBjaGlsZHJlbiBjaGVja2luZyB0byBzZWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLQkJLy8gTU9GIEFkYXB0ZXIgY2hpbGRyZW4gZXhpc3RzLiBJZiBub3QsIGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJLy8gQWxzbyBoYW5kbGVzIHJlb3JkZXJpbmcgY2hpbGRyZW4gdGhhdCBoYXZlIG1vdmVkLgotCQlpbnQgaSA9IDA7Ci0JCWludCBtb2ZJbmRleCA9IDA7Ci0JCUxpc3QgYWRhcHRlcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yICg7IGkgPCBkb21DaGlscmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IGNoaWxkTm9kZSA9IChFbGVtZW50KSBkb21DaGlscmVuLmdldChpKTsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpID8gZ2V0RXhpc3RpbmdBZGFwdGVyKChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSkpIDogbnVsbDsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgIWFkYXB0ZXIuaXNNT0ZQcm94eSgpICYmIGFkYXB0ZXIuZ2V0Tm9kZSgpID09IGNoaWxkTm9kZSkgewotCQkJCS8vIEJlY2F1c2UgdGhlIGFkYXB0ZXIgaXMgcHJvY2Vzc2luZyBTVFJVQ1RVUkVfQ0hBTkdFRCBmcm9tIHRoZQotCQkJCS8vIERPTSwgd2UKLQkJCQkvLyBtdXN0IHVwZGF0ZSBhbGwgdGhlIHdheSBkb3duIHRoZSB0cmVlIHNpbmNlIGFueXRoaW5nIHVuZGVyCi0JCQkJLy8gdGhlIG5vdGlmeWluZwotCQkJCS8vIERPTSBub2RlIGNvdWxkIGhhdmUgY2hhbmdlZC4KLQkJCQlhZGFwdGVyLnVwZGF0ZU1PRigpOwotCQkJCW1vZkluZGV4Kys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIG5vZGVUb0FkYXB0ZXIuZ2V0KGNoaWxkTm9kZSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmVvcmRlcklmTmVjZXNzYXJ5KChFTGlzdCkgbW9mQ2hpbGRyZW4sIGFkYXB0ZXIuZ2V0RU9iamVjdCgpLCBtb2ZJbmRleCk7Ci0JCQkJbW9mSW5kZXgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoY2hpbGROb2RlLCBtYXApOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vV2UgZG9uJ3Qgd2FudCB0byBwdXNoIGFueXRoaW5nIGJhY2sgdG8gdGhlIGNoaWxkIGRvbQotCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQkJCW1hcC5zZXRNT0ZWYWx1ZShnZXRUYXJnZXQoKSwgYWRhcHRlci5nZXRUYXJnZXQoKSwgbW9mSW5kZXgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJYWRhcHRlcnNUb1VwZGF0ZS5hZGQoYWRhcHRlcik7Ci0JCQkJCW1vZkluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgYWRhcHRlcnMuCi0JCS8vbWFrZSBhIGNvcHkgc28gd2UgcmVtb3ZlIGFsbCBpdGVtcyAtIGJ1ZyAxOTI0NjggCi0JCQkJT2JqZWN0W10gY2hpbGRyZW5BcnJheSA9IG1vZkNoaWxkcmVuLnRvQXJyYXkoKTsKLQkJCQlmb3IgKDsgaSA8IGNoaWxkcmVuQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVtb3ZlTU9GVmFsdWUoKEVPYmplY3QpIGNoaWxkcmVuQXJyYXlbaV0sIG1hcCk7Ci0JCSAJCX0KLQotCQkvLyBUaGUgYWRhcHRlcnMgY2Fubm90IGJlIHVwZGF0ZWQgYXMgdGhleSBjcmVhdGVkLiBXZSBtdXN0IHdhaXQgdW50aWwKLQkJLy8gYWxsIG9mIHRoZSBhZGFwdGVycyBhcmUgY3JlYXRlZCBhbmQgcmVtb3ZlZCBiZWZvcmUgdXBkYXRpbmcsCi0JCS8vIG90aGVyd2lzZQotCQkvLyB3ZSBjYW4gZ2V0IGluIGEgc3RhdGUgd2hlcmUgdGhlcmUgYXJlIGFkYXB0ZXJzIGZpZ2h0aW5nIHdpdGgKLQkJLy8gZWFjaG90aGVyCi0JCS8vIChvbmUgZm9yIHRoZSBvbGQgbm9kZSBhbmQgb25lIGZvciB0aGUgbmV3IG5vZGUpLgotCQlmb3IgKGludCBqID0gMDsgaiA8IGFkYXB0ZXJzVG9VcGRhdGUuc2l6ZSgpOyBqKyspIHsKLQkJCSgoRU1GMkRPTUFkYXB0ZXIpIGFkYXB0ZXJzVG9VcGRhdGUuZ2V0KGopKS51cGRhdGVNT0YoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBmZWF0dXJlJ3MgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNoaWxkQWRhcHRlcgotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5FTUYyRE9NQWRhcHRlciBUaGUgY2hpbGQgdG8gcmVtb3ZlCi0JICogQHBhcmFtIG1vZkF0dHJpYnV0ZU5hbWUKLQkgKiAgICAgICAgICAgIFN0cmluZyBUaGUgbmFtZSBvZiB0aGUgbW9mQXR0cmlidXRlIHRvIHJlbW92ZSB0aGUgY2hpbGQgZnJvbS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNT0ZWYWx1ZShFT2JqZWN0IHZhbHVlLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHZhbHVlLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJLy8gUmVtb3ZlIHRoZSBhZGFwdGVyIGZyb20gQk9USCB0aGUgTU9GIE9iamVjdCBhbmQgdGhlIERPTSBOb2RlcwotCQkJcmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQkJdmFsdWUuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQl9Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSB0cmFuc2xhdG9yLmdldEZlYXR1cmUoKTsKLQkJYm9vbGVhbiBkb1VubG9hZCA9IGZlYXR1cmUgPT0gbnVsbCB8fCAodHJhbnNsYXRvci5pc09iamVjdE1hcCgpICYmICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpKTsKLQotCQkvLyB0cmFuc2xhdG9yLnJlbW92ZU1PRlZhbHVlKCkgd2FzIGhlcmUgb3JpZ2luYWxseQotCi0JCS8vIFVubG9hZCB0aGUgb2JqZWN0cy4KLQkJaWYgKGRvVW5sb2FkKQotCQkJRXh0ZW5kZWRFY29yZVV0aWwudW5sb2FkKHZhbHVlKTsKLQotCQkvLyBSZW1vdmUgdGhlIE1PRiB2YWx1ZQotCQl0cmFuc2xhdG9yLnJlbW92ZU1PRlZhbHVlKGdldFRhcmdldCgpLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVvcmRlcklmTmVjZXNzYXJ5KEVMaXN0IGVtZkNoaWxkcmVuLCBFT2JqZWN0IGVPYmosIGludCBlbWZJbmRleCkgewotCQlpbnQgY3VyckluZGV4ID0gZW1mQ2hpbGRyZW4uaW5kZXhPZihlT2JqKTsKLQkJaWYgKGN1cnJJbmRleCA+IC0xICYmIGN1cnJJbmRleCAhPSBlbWZJbmRleCkKLQkJCWVtZkNoaWxkcmVuLm1vdmUoZW1mSW5kZXgsIGVPYmopOwotCX0KLQotCS8qKgotCSAqIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZzsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnQoTm9kZSBuZXdOb2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCi0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZmluZEluc2VydEJlZm9yZU5vZGUoTm9kZSBwYXJlbnROb2RlLCBUcmFuc2xhdG9yIG1hcCwgTGlzdCBtb2ZMaXN0LCBpbnQgbW9mSW54LCBMaXN0IGRvbUxpc3QpIHsKLQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gbnVsbDsKLQotCQkvLyBJZiB0aGVyZSBhcmUgbm8gY3VycmVudCBkb20gY2hpbGRyZW4gZm9yIHRoaXMgbWFwLCBmaW5kIHRoZSBpbml0aWFsCi0JCS8vIGluc2VydCBwb3MuCi0JCWlmIChkb21MaXN0LnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZpbmRJbml0aWFsSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnROb2RlLCBtYXApOwotCi0JCS8vIElmIHNvbWUgZG9tIG5vZGVzIHRoZW4gZmluZCB0aGUgY29ycmVjdCBvbmUgdG8gaW5zZXJ0IGJlZm9yZS4KLQkJaW50IGkgPSBtb2ZJbnggKyAxOwotCQl3aGlsZSAoaSA8IG1vZkxpc3Quc2l6ZSgpICYmIGluc2VydEJlZm9yZU5vZGUgPT0gbnVsbCkgewotCQkJLy8gU3RhcnQgYXQgdGhlIG1vZklueCBwYXNzZWQgaW4gYW5kIGxvb2sgZm9yd2FyZCBmb3IgdGhlIGZpcnN0Ci0JCQkvLyBhZGFwdGVkCi0JCQkvLyBNT0Ygb2JqZWN0LiBVc2UgdGhhdCBub2RlIGFzIHRoZSBpbnNlcnQgYmVmb3JlIG5vZGUuCi0JCQlPYmplY3QgbyA9IG1vZkxpc3QuZ2V0KGkpOwotCQkJaWYgKCFtYXAuaXNPYmplY3RNYXAoKSB8fCBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkKLQkJCQlicmVhazsKLQkJCUVPYmplY3QgdE1PRk9iamVjdCA9IChFT2JqZWN0KSBvOwotCQkJRU1GMkRPTUFkYXB0ZXIgdEFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIodE1PRk9iamVjdCwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCQlpZiAodEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWluc2VydEJlZm9yZU5vZGUgPSB0QWRhcHRlci5nZXROb2RlKCk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQotCQkvLyBIYW5kbGUgaW5zZXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKLQkJaWYgKGluc2VydEJlZm9yZU5vZGUgPT0gbnVsbCkKLQkJCWluc2VydEJlZm9yZU5vZGUgPSBET01VdGlsaXRpZXMuZ2V0TmV4dE5vZGVTaWJsaW5nKChOb2RlKSBkb21MaXN0LmdldChkb21MaXN0LnNpemUoKSAtIDEpKTsKLQkJaWYgKGluc2VydEJlZm9yZU5vZGUgPT0gbnVsbCkKLQkJCWluc2VydEJlZm9yZU5vZGUgPSAoKE5vZGUpIGRvbUxpc3QuZ2V0KGRvbUxpc3Quc2l6ZSgpIC0gMSkpLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJcmV0dXJuIGluc2VydEJlZm9yZU5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKE5vZGUgcGFyZW50Tm9kZSwgVHJhbnNsYXRvciBtYXBOb2RlKSB7Ci0JCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOwotCi0JCS8vIEZpcnN0LCBza2lwIHBhc3QgYWxsIHRoZSBtYXBzIGluIHRoZSBvcmRlcmVkIGNvbGxlY3Rpb24KLQkJLy8gb2YgbWFwcy4gV2Ugd2FudCB0byBiZWdpbiB0aGUgc2VhcmNoIHdpdGggdGhpcyBub2RlLgotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hcHNbaV0gPT0gbWFwTm9kZSkKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIE5vdyBzZWFyY2ggZ28gdGhyb3VnaCBlYWNoIG1hcCBub2RlIHVudGlsIGEgY2hpbGQgbm9kZSBtYXRjaGluZwotCQkvLyBpdHMgRE9NIG5hbWUgaXMgZm91bmQuCi0JCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IG51bGw7Ci0JCWZvciAoaW50IGogPSBpOyBqIDwgbWFwcy5sZW5ndGggJiYgaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsOyBqKyspIHsKLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCVRyYW5zbGF0b3Igbm9kZVRvRmluZE1hcCA9IG1hcHNbal07Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGsrKykgewotCQkJCU5vZGUgbm9kZSA9IGNoaWxkTm9kZXMuaXRlbShrKTsKLQkJCQlpZiAobm9kZVRvRmluZE1hcC5pc01hcEZvcihub2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCWluc2VydEJlZm9yZU5vZGUgPSBub2RlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc2VydEJlZm9yZU5vZGU7Ci0JfQotCi0JLyoKLQkgKiBUcmF2ZXJzZXMgdGhlIHBhdGggdGhhdCA8bWFwPiBzcGVjaWZpZXMuIFJldHVybnMgdGhlIGxhc3Qgbm9kZSBvZiB0aGUgcGF0aCB0aGF0IHdhcyBhYmxlIHRvCi0JICogYmUgdHJhdmVyc2VkIG9yIG51bGwgaWYgdGhlIHBhdGggY291bGQgbm90IGJlIHRyYXZlcnNlZC4gVGhlIDxhZGRBZGFwdGVycz4gYm9vbGVhbiBpcyB1c2VkIHRvCi0JICogZGV0ZXJtaW5lIGlmIHRoZSByZWNlaXZlciBpcyBhZGRlZCBhcyBhbiBhZGFwdGVyIHRvIGV2ZXJ5IG5vZGUgZm91bmQgb24gdGhlIHBhdGguCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZmluZERPTVBhdGgoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBib29sZWFuIGFkZEFkYXB0ZXJzKSB7Ci0KLQkJU3RyaW5nIHBhdGggPSBtYXAuZ2V0RE9NUGF0aCgpOwotCQlOb2RlIGN1ck5vZGUgPSBwYXJlbnQ7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBET01VdGlsaXRpZXMuY3JlYXRlUGF0aEl0ZXJhdG9yKHBhdGgpOwotCi0JCXdoaWxlIChjdXJOb2RlICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBub2RlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJY3VyTm9kZSA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoY3VyTm9kZSwgbm9kZU5hbWUpOwotCQkJaWYgKGFkZEFkYXB0ZXJzICYmIGN1ck5vZGUgIT0gbnVsbCkgewotCQkJCWFkZERPTUFkYXB0ZXIoY3VyTm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGN1ck5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIERPTSBub2RlIGNoaWxkcmVuIHRoYXQgY3VycmVudGx5IGV4aXN0IHdpdGggdGhlIHNwZWNpZmllZCB0YWduYW1lLgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERPTUNoaWxkcmVuKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJTm9kZSBwYXJlbnQgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIHRydWUpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZHJlbihwYXJlbnQsIG1hcC5nZXRET01OYW1lcygpKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocmVmT2JqZWN0LCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzTU9GUHJveHkoKSkgewotCQkJcmVtb3ZlRE9NQWRhcHRlcihhZGFwdGVyLmdldE5vZGUoKSwgYWRhcHRlcik7Ci0JCQlyZWZPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJYWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUFkZERPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCWZSZW5kZXJlci5yZWdpc3RlckRPTUFkYXB0ZXIoYU5vZGUsIGFuQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIoTm9kZSBhTm9kZSkgewotCQlyZXR1cm4gZlJlbmRlcmVyLmdldEV4aXN0aW5nRE9NQWRhcHRlcihhTm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJZlJlbmRlcmVyLnJlbW92ZURPTUFkYXB0ZXIoYU5vZGUsIGFuQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRE9NQWRhcHRlcihOb2RlIGNoaWxkTm9kZSkgewotCi0JCS8vIE9ubHkgYWRkIHRoZSBhZGFwdGVyIGlmIHRoaXMgaXMgYW4gY2hpbGQgbm9kZSB0aGF0IHdpbGwgbm90IGJlCi0JCS8vIGFkYXB0ZWQuIEZvciBpbnN0YW5jZSBhIHN1YnRyZWUgdGhhdCBtYXBzIHRvIGEgTU9GIGF0dHJpYnV0ZQotCQkvLyBzZXR0aW5nLgotCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVNRjJET01BZGFwdGVyIGF0dHJBZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihjaGlsZE5vZGUpOwotCi0JCQlpZiAoYXR0ckFkYXB0ZXIgPT0gbnVsbCB8fCBhdHRyQWRhcHRlci5nZXROb2RlKCkgIT0gZ2V0Tm9kZSgpKSB7Ci0JCQkJLy8gSWYgdGhlIG5vZGUgaXMgYWRhcHRlZCwgYnV0IG5vdCBieSB0aGlzIGFkYXB0ZXIgdGhlbiByZW1vdmUKLQkJCQkvLyBpdC4gVGhpcyBoYXBwZW5zIHRvIG5vbi1vYmplY3QgY2hpbGRyZW4gd2hlbiB0aGUgcGFyZW50IHRhZwotCQkJCS8vIG5hbWUgaXMgY2hhbmdlZC4KLQkJCQlyZW1vdmVET01BZGFwdGVyKGNoaWxkTm9kZSwgYXR0ckFkYXB0ZXIpOwotCi0JCQkJaWYgKGZEZWJ1ZykgewotCQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRDSElMRDogQWRkaW5nIERPTSBhZGFwdGVyOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0XHR0bzogIiArIGNoaWxkTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJpbUFkZERPTUFkYXB0ZXIoY2hpbGROb2RlLCB0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlb3JkZXIgYSBjaGlsZCBiZWZvcmUgYSBnaXZlbiBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVvcmRlckRPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUsIE5vZGUgaW5zZXJ0QmVmb3JlTm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJdHJ5IHsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdsaW5lU3RyaW5nKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHJpbUdldEluZGVudFN0cmluZyhOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIERPTVV0aWxpdGllcy5nZXRJbmRlbnRTdHJpbmcobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgY2hpbGQgbm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUpIHsKLQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjaGlsZCBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSwgYm9vbGVhbiByZW1vdmVBZGFwdGVyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY2hpbGROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJLy8gTG9vayBmb3IgYW55IHdoaXRlc3BhY2UgcHJlY2VlZGluZyB0aGUgbm9kZSBiZWluZwotCQkJLy8gcmVtb3ZlZCBhbmQgcmVtb3ZlIGl0IGFzIHdlbGwuCi0JCQlUZXh0IHByZXZUZXh0ID0gRE9NVXRpbGl0aWVzLmdldFByZXZpb3VzVGV4dFNpYmxpbmcoY2hpbGROb2RlKTsKLQkJCWlmIChwcmV2VGV4dCAhPSBudWxsICYmIERPTVV0aWxpdGllcy5pc1doaXRlc3BhY2UocHJldlRleHQpKSB7Ci0JCQkJcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwcmV2VGV4dCk7Ci0JCQl9Ci0JCQkvLyBSZW1vdmUgdGhlIG5vZGUuCi0JCQlpZiAocmVtb3ZlQWRhcHRlcikKLQkJCQlyZW1vdmVBZGFwdGVycyhjaGlsZE5vZGUpOwotCQkJcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZE5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBET00gYWRhcHRlcnMgZnJvbSB0aGUgbm9kZSBBTkQgYWxsIGl0cyBjaGlsZCBub2RlcywgcmVjdXJzaXZlbHkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWRhcHRlcnMoTm9kZSBub2RlKSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKG5vZGUpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBPYmplY3QuCi0JCQlyZW1vdmVET01BZGFwdGVyKG5vZGUsIGFkYXB0ZXIpOwotCQkJaWYgKGFkYXB0ZXIuZ2V0Tm9kZSgpID09IG5vZGUpIHsKLQkJCQlOb3RpZmllciBsb2NhbFRhcmdldCA9IGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKGxvY2FsVGFyZ2V0ICE9IG51bGwpCi0JCQkJCWxvY2FsVGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlOb2RlTGlzdCBubCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IG5sLml0ZW0oaSk7Ci0JCQlyZW1vdmVBZGFwdGVycyhuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+dW5kZXIgPG5vZGU+LiBPbmx5IHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHRoYXQgZG9lcyBub3QKLQkgKiBleGlzdCAoaWYgYW55KSBpcyBjcmVhdGVkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLlRyYW5zbGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBjcmVhdGVET01QYXRoKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJSXRlcmF0b3IgaSA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IobWFwLmdldERPTVBhdGgoKSk7Ci0JCU5vZGUgY3VyTm9kZSA9IG5vZGU7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQljdXJOb2RlID0gZmluZE9yQ3JlYXRlTm9kZShub2RlLCBtYXAsIG5vZGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gY3VyTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBmaW5kT3JDcmVhdGVOb2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgU3RyaW5nIHNlZ21lbnQpIHsKLQkJTm9kZSBub2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChwYXJlbnQsIHNlZ21lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgbm9kZSBkaWQgbm90IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBpdC4KLQkJCURvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoc2VnbWVudCk7Ci0JCQlpZiAobWFwLmlzRW1wdHlUYWcoKSkKLQkJCQlzZXRFbXB0eVRhZygoRWxlbWVudCkgbm9kZSk7Ci0KLQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbml0aWFsSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG1hcCk7Ci0JCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBub2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCWluZGVudChub2RlLCBtYXApOwotCQkJYWRkRE9NQWRhcHRlcihub2RlKTsgLy8gSG9vayB1cCBsaXN0ZW5lcnMKLQkJfQotCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBub2RlIHBhc3NlZCBpbiBpZiBpdCBoYXMgb25seSB3aGl0ZXNwYWNlIG5vZGVzIGFzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJZkVtcHR5KE5vZGUgbm9kZSkgewotCQlOb2RlTGlzdCBubCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCi0JCS8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgY2hpbGRyZW4uIElmIGEgbm9uLXdoaXRlc3BhY2Ugbm9kZQotCQkvLyBwaXMgZm91bmQsIGJhaWwuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBubC5pdGVtKGkpOwotCQkJaWYgKCFET01VdGlsaXRpZXMuaXNXaGl0ZXNwYWNlKGNoaWxkTm9kZSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gV2Ugb25seSBnZXQgaGVyZSBpZiB0aGVyZSBhcmUgbm8gbm9uLXdoaXRlc3BhY2UgY2hhcnMsIHNvCi0JCS8vIHNpbXBseSByZW1vdmUgdGhlIG5vZGUuCi0JCXJlbW92ZURPTUNoaWxkKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIERPTSBwYXRoIHNwZWNpZmllZCBieSA8bWFwPmZyb20gPG5vZGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NUGF0aChOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCU5vZGUgY2hpbGROb2RlID0gZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSk7Ci0JCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCAmJiBjaGlsZE5vZGUgIT0gbm9kZSkgewotCQkJcmVtb3ZlSWZFbXB0eShjaGlsZE5vZGUpOwotCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhZGFwdGVyIGZvciBhIGNoaWxkIERPTSBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIGZvci4KLQkgKi8KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQkvLwlBc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZk9iamVjdCk7Ci0KLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIobW9mT2JqZWN0LmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQlyZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCQltb2ZPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJYWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCWFkYXB0ZXIgPSBwcmltQ3JlYXRlQWRhcHRlcihtb2ZPYmplY3QsIGNoaWxkTWFwKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCi0JCUVsZW1lbnQgbmV3Tm9kZSA9IGNyZWF0ZU5ld05vZGUobW9mT2JqZWN0LCBjaGlsZE1hcCk7Ci0JCXJldHVybiBuZXcgRU1GMkRPTUFkYXB0ZXJJbXBsKG1vZk9iamVjdCwgbmV3Tm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NQWRhcHRlckltcGwobm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCi0JCS8vQXNzZXJ0LmlzTm90TnVsbChjaGlsZE1hcC5nZXRDaGlsZEFkYXB0ZXJDbGFzcygpKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihub2RlKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc01PRlByb3h5KCkgfHwgYWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlRE9NQWRhcHRlcihub2RlLCBhZGFwdGVyKTsKLQkJCQlpZiAoYWRhcHRlci5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJCX0KLQkJCQlhZGFwdGVyID0gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXIgPSBwcmltQ3JlYXRlQWRhcHRlcihub2RlLCBjaGlsZE1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlTmV3Tm9kZShFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCURvY3VtZW50IGRvYyA9IChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoY2hpbGRNYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQkJaWYgKGNoaWxkTWFwLmlzRW1wdHlUYWcoKSkKLQkJCXNldEVtcHR5VGFnKGVsZW1lbnQpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVtcHR5VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlSZXZpc2l0LnRvRG8oKTsKLQkJLy9OZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaXMgd2l0aCBwdXJlIERPTSBhcGlzLCBpZiBpdCBpcwotCQkvLyBwb3NzaWJsZQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgTU9GIG9iamVjdCBpcyBhIHByb3h5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTU9GUHJveHkoKSB7Ci0JCWlmIChpc1Jvb3QgfHwgdGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEludGVybmFsRU9iamVjdCkgdGFyZ2V0KS5lSXNQcm94eSgpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoKSB7Ci0JCWlmIChpc1Jvb3QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbm9kZSB0aGF0IHRoZSB0YXJnZXQgb2YgdGhpcyBhZGFwdGVyIG1hcHMgdG8uIElmIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBtYXBzIHRvCi0JICogbW9yZSB0aGFuIG9uZSBET00gbm9kZSwgdGhpcyBub2RlIGlzIHRoZSB0b3AtbW9zdCBub2RlLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgYU5vZGUpIHsKLQkJZk5vZGUgPSBhTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVET00oKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXByaW1VcGRhdGVET00oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0YoKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXByaW1VcGRhdGVNT0YoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NKCkgewotCQlpZiAoaXNSb290KQotCQkJdXBkYXRlRE9NUm9vdEZlYXR1cmUoKTsKLQkJZWxzZSB7Ci0JCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCXVwZGF0ZURPTUZlYXR1cmUobWFwc1tpXSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbVVwZGF0ZU1PRigpIHsKLQkJaWYgKGlzUm9vdCkKLQkJCXVwZGF0ZU1PRlJvb3RGZWF0dXJlKCk7Ci0JCWVsc2UgewotCQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcHNbaV0sIGdldE5vZGUoKSwgZ2V0RU9iamVjdCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTVJvb3RGZWF0dXJlKCkgewotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShmVHJhbnNsYXRvciwgZk5vZGUsIGdldFJlc291cmNlQ29udGVudHMoKSwgZ2V0RE9NQ2hpbGRyZW4oZk5vZGUsIGZUcmFuc2xhdG9yKSwgbnVsbCk7Ci0JCQl1cGRhdGVET01Eb2N1bWVudFR5cGUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZSb290RmVhdHVyZSgpIHsKLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXVwZGF0ZU1PRkRvY3VtZW50VHlwZSgpOwotCQkJcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShmVHJhbnNsYXRvciwgZk5vZGUsIGdldFJlc291cmNlQ29udGVudHMoKSwgZ2V0RE9NQ2hpbGRyZW4oZk5vZGUsIGZUcmFuc2xhdG9yKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCXJldHVybiAoKERvY3VtZW50KSBmTm9kZSkuZ2V0RG9jdHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoVHJhbnNsYXRvclJlc291cmNlKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUxpc3QgZ2V0UmVzb3VyY2VDb250ZW50cygpIHsKLQkJaWYgKCFpc1Jvb3QpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCXJldHVybiAoKFJlc291cmNlKSBnZXRUYXJnZXQoKSkuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01Eb2N1bWVudFR5cGUoKSB7Ci0KLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbCwgc3lzdGVtSWQgPSBudWxsLCBvbGRQdWJsaWNJZCwgb2xkU3lzdGVtSWQ7Ci0JCW9sZFB1YmxpY0lkID0gZG9jVHlwZSA9PSBudWxsID8gbnVsbCA6IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJb2xkU3lzdGVtSWQgPSBkb2NUeXBlID09IG51bGwgPyBudWxsIDogZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSByZXNvdXJjZS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotCQkJaWYgKCEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIG9sZFB1YmxpY0lkKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChzeXN0ZW1JZCwgb2xkU3lzdGVtSWQpKSkKLQkJCQlmUmVuZGVyZXIucmVwbGFjZURvY3VtZW50VHlwZShyZXNvdXJjZS5nZXREb2N0eXBlKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01Eb2N1bWVudFR5cGUoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBUcmFuc2xhdG9yUmVzb3VyY2UuRE9DX1RZUEVfRkVBVFVSRSkKLQkJCXVwZGF0ZURPTURvY3VtZW50VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRkRvY3VtZW50VHlwZSgpIHsKLQotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsLCBzeXN0ZW1JZCA9IG51bGw7Ci0JCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZ2V0RG9jdW1lbnRUeXBlKCk7Ci0KLQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQlpZiAoKCEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIHJlc291cmNlLmdldFB1YmxpY0lkKCkpICYmIFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHN5c3RlbUlkLCByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpKSkpIHx8IAotCQkJCSgocmVzb3VyY2UuZ2V0UHVibGljSWQoKSA9PSBudWxsKSB8fCByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpID09IG51bGwpKQotCQkJcmVzb3VyY2Uuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCi0JCWlmIChpc1Jvb3QpIHsKLQkJCW5vdGlmeUNoYW5nZWRGb3JSb290KG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGlzRGVwZW5kZW5jeUZlYXR1cmUobXNnKSkKLQkJCWhhbmRsZURlcGVuZGVuY3lGZWF0dXJlKG1zZyk7Ci0KLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQotCQlkZWJ1Z01PRk5vdGlmeShtc2cpOwotCi0JCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFIDoKLQkJCQlUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBmaW5kVHJhbnNsYXRvcihtc2cpOwotCQkJCWlmICh0cmFuc2xhdG9yID09IG51bGwpCi0JCQkJCXRyYW5zbGF0b3IgPSBhZGRWYXJpYWJsZVRyYW5zbGF0b3JJZk5lY2Vzc2FyeShtc2cpOwotCQkJCWlmICh0cmFuc2xhdG9yICE9IG51bGwpCi0JCQkJCXVwZGF0ZURPTUZlYXR1cmUodHJhbnNsYXRvciwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hhbmdlZEZvclJvb3QoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnTU9GTm90aWZ5KG1zZyk7Ci0KLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgotCQkJCXByaW1VcGRhdGVET00oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0JCQkJdXBkYXRlRE9NRG9jdW1lbnRUeXBlKG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEV0b29sc0NvcHlTZXNzaW9uLlJFU09VUkNFX0NPUElFRCA6Ci0JCQkJdXBkYXRlRE9NKCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXBlbmRlbmN5QWRhcHRlcihFT2JqZWN0IGNoaWxkKSB7Ci0JCUFkYXB0ZXIgZXhpc3RpbmcgPSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkLCBEZXBlbmRlbmN5QWRhcHRlci5LRVkpOwotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRGVwZW5kZW5jeUFkYXB0ZXIgZm9yd2FyZGVyID0gbmV3IERlcGVuZGVuY3lBZGFwdGVyKCk7Ci0JCWNoaWxkLmVBZGFwdGVycygpLmFkZChmb3J3YXJkZXIpOwotCQlmb3J3YXJkZXIuc2V0VGFyZ2V0KGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKCkgewotCi0JCXByaW1BZGRET01BZGFwdGVyKGZOb2RlLCB0aGlzKTsKLQkJaWYgKGZEZWJ1ZykgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIkFkZGluZyBET00gYWRhcHRlcjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHR0bzogIiArIGZOb2RlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gR28gdGhyb3VnaCB0aGUgbWFwcy4gQWxsIG9mIHRoZSBET00gbm9kZXMgdGhhdCBhcmUgbm90IGxpc3RlbmVkCi0JCS8vIHRvIGJ5IGFub3RoZXIgRE9NIE5vZGUgYWRhcHRlciwgbXVzdCBiZSBsaXN0ZW5lZCB0byBieSB0aGlzIGFkYXB0ZXIuCi0JCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBmTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXMuaXRlbShqKTsKLQkJCWludCBub2RlVHlwZSA9IGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKCFET01VdGlsaXRpZXMuaXNUZXh0Tm9kZShjaGlsZE5vZGUpICYmIG5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJVHJhbnNsYXRvciBtYXAgPSBmaW5kVHJhbnNsYXRvcihjaGlsZE5vZGUuZ2V0Tm9kZU5hbWUoKSwgZmFsc2UpOwotCQkJCWlmIChtYXAgIT0gbnVsbCAmJiBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkKLQkJCQkJYWRkRE9NQWRhcHRlcihjaGlsZE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgYWRkVmFyaWFibGVUcmFuc2xhdG9ySWZOZWNlc3NhcnkoTm90aWZpY2F0aW9uIG1zZykgewotCQlWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGZhY3QgPSBmVHJhbnNsYXRvci5nZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCk7Ci0JCVRyYW5zbGF0b3IgdHJhbnMgPSBudWxsOwotCQlpZiAoZmFjdCAhPSBudWxsICYmIGZhY3QuYWNjZXB0cyhtc2cpKSB7Ci0JCQl0cmFucyA9IGZhY3QuY3JlYXRlKG1zZyk7Ci0JCQlpZiAodHJhbnMgIT0gbnVsbCkKLQkJCQljaGlsZFRyYW5zbGF0b3JzID0gKFRyYW5zbGF0b3JbXSkgVHJhbnNsYXRvci5jb25jYXQoY2hpbGRUcmFuc2xhdG9ycywgdHJhbnMpOwotCQl9Ci0JCXJldHVybiB0cmFuczsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0Tm9kZShEb2N1bWVudCBkb2MsIFRyYW5zbGF0b3IgbWFwLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgbm9ubnVsbHRleHQgPSAodGV4dCAhPSBudWxsKSA/IHRleHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbWFwLmlzQ0RBVEFDb250ZW50KCkgPyBkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKG5vbm51bGx0ZXh0KSA6IGRvYy5jcmVhdGVUZXh0Tm9kZShub25udWxsdGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0UmVhZEFoZWFkTmFtZSgpIHsKLQkJaWYgKCFmVHJhbnNsYXRvci5oYXNSZWFkQWhlYWROYW1lcygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZWFkQWhlYWROYW1lID0gbnVsbDsKLQotCQlSZWFkQWhlYWRIZWxwZXIgaGVscGVyID0gZlRyYW5zbGF0b3IuZ2V0UmVhZEFoZWFkSGVscGVyKGZOb2RlLmdldE5vZGVOYW1lKCkpOwotCQlpZiAoaGVscGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGNoaWxkID0gbnVsbDsKLQkJU3RyaW5nW10gbmFtZXMgPSBoZWxwZXIuZ2V0VmFsdWVzKCk7Ci0JCWlmIChoZWxwZXIuZ2V0Q2hpbGRET01OYW1lKCkgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWNoaWxkID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChmTm9kZSwgbmFtZXNbaV0pOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXJlYWRBaGVhZE5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJY2hpbGQgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKGZOb2RlLCBoZWxwZXIuZ2V0Q2hpbGRET01OYW1lKCkpOwotCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJcmVhZEFoZWFkTmFtZSA9IERPTVV0aWxpdGllcy5nZXRDaGlsZFRleHQoY2hpbGQpOwotCQl9Ci0JCWlmIChyZWFkQWhlYWROYW1lID09IG51bGwpCi0JCQlyZWFkQWhlYWROYW1lID0gbmFtZXNbMF07Ci0JCXJldHVybiByZWFkQWhlYWROYW1lOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSB0ZXh0IGZyb20gPG5vZGU+YW5kIGNvbnZlcnRzIGl0IHRvIGFuIG9iamVjdCBzdWl0YWJsZSBmb3Igc2V0dGluZyBpbnRvIDxmZWF0dXJlPgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZXh0cmFjdFZhbHVlKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXAsIEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0KLQkJLy8gRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgdGV4dCBjaGlsZAotCQlOb2RlIHRleHROb2RlID0gRE9NVXRpbGl0aWVzLmdldENoaWxkVGV4dE5vZGUobm9kZSk7Ci0JCVN0cmluZyB0cmltbWVkVmFsdWUgPSBudWxsOwotCQlpZiAodGV4dE5vZGUgIT0gbnVsbCkKLQkJCXRyaW1tZWRWYWx1ZSA9IHRleHROb2RlLmdldE5vZGVWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG1hcC5jb252ZXJ0U3RyaW5nVG9WYWx1ZSh0cmltbWVkVmFsdWUsIGVtZk9iamVjdCk7Ci0JCX0gY2F0Y2ggKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJCWhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJdGhyb3cgZXg7Ci0KLQl9Ci0KLQkvKgotCSAqIEZpbmRzIHRoZSBjaGlsZCBub2RlIHRoYXQgPG1hcD4gc3BlY2lmaWVzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNoaWxkIHRoYXQgc2F0aXNmaWVzCi0JICogPG1hcD4gdGhlbiB0aGUgZmlyc3Qgb25lIGlzIHJldHVybmVkLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHRyYXZlcnNlcyBwYXN0IHRoZSBkb21QYXRoIGlmIG9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxtYXA+LgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGZpbmRET01Ob2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCkgewotCQlyZXR1cm4gZmluZERPTU5vZGUocGFyZW50LCBtYXAsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIEZpbmRzIHRoZSBjaGlsZCBub2RlIHRoYXQgPG1hcD4gc3BlY2lmaWVzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNoaWxkIHRoYXQgc2F0aXNmaWVzCi0JICogPG1hcD4gdGhlbiB0aGUgZmlyc3Qgb25lIGlzIHJldHVybmVkLiBUaGUgPGFkZEFkYXB0ZXJzPiBib29sZWFuIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZQotCSAqIHJlY2VpdmVyIGlzIGFkZGVkIGFzIGFuIGFkYXB0ZXIgdG8gZXZlcnkgbm9kZSBmb3VuZCBvbiB0aGUgcGF0aC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB0cmF2ZXJzZXMgcGFzdCB0aGUgZG9tUGF0aCBpZiBvbmUgaXMgc3BlY2lmaWVkIGluIHRoZSA8bWFwPi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kRE9NTm9kZShOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIGJvb2xlYW4gYWRkQWRhcHRlcnMpIHsKLQotCQkvLyBGaXJzdCwgdHJhY2UgZG93biB0aGUgcGF0aAotCQlOb2RlIGN1ck5vZGUgPSBmaW5kRE9NUGF0aChwYXJlbnQsIG1hcCwgYWRkQWRhcHRlcnMpOwotCQlpZiAobWFwLmlzRE9NVGV4dFZhbHVlKCkgfHwgbWFwLmlzRE9NQXR0cmlidXRlKCkgfHwgY3VyTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGN1ck5vZGU7Ci0KLQkJLy8gTm93IGxvb2sgZm9yIHRoZSBmaXJzdCBET00gbmFtZSB3ZSBjYW4gZmluZAotCQlTdHJpbmdbXSBkb21OYW1lcyA9IG1hcC5nZXRET01OYW1lcygpOwotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRvbU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBkb21OYW1lc1tpXTsKLQkJCUxpc3Qgbm9kZXMgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkcmVuKGN1ck5vZGUsIG5vZGVOYW1lKTsKLQkJCWlmIChub2RlcyAhPSBudWxsICYmICFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlpZiAobm9kZXMuc2l6ZSgpID4gMSkKLQkJCQkJaGFuZGxlSW52YWxpZE11bHRpTm9kZXMobm9kZU5hbWUpOwotCQkJCW5vZGUgPSAoTm9kZSkgbm9kZXMuZ2V0KDApOwotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKGFkZEFkYXB0ZXJzKQotCQkJCQkJYWRkRE9NQWRhcHRlcihjdXJOb2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludmFsaWRNdWx0aU5vZGVzKFN0cmluZyBub2RlTmFtZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMCwgbmV3IE9iamVjdFtde25vZGVOYW1lfSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+dW5kZXIgPG5vZGU+LiBPbmx5IHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHRoYXQgZG9lcyBub3QKLQkgKiBleGlzdCAoaWYgYW55KSBpcyBjcmVhdGVkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLlRyYW5zbGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dCBmaW5kT3JDcmVhdGVUZXh0Tm9kZShOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIFN0cmluZyB0ZXh0KSB7Ci0JCVRleHQgdGV4dE5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Q2hpbGRUZXh0Tm9kZShwYXJlbnQpOwotCQlpZiAodGV4dE5vZGUgIT0gbnVsbCkgewotCQkJdGV4dE5vZGUuc2V0RGF0YSh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCXRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSwgbWFwLCB0ZXh0KTsKLQkJCWlmICghaXNFbXB0eVRhZygoRWxlbWVudCkgcGFyZW50KSkgewotCQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgdGV4dE5vZGUsIG51bGwpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHROb2RlOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGZpbmRUcmFuc2xhdG9yKFN0cmluZyB0YWdOYW1lLCBib29sZWFuIGF0dHJpYnV0ZU1hcCkgewotCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmFuc2xhdG9yIG1hcCA9IG1hcHNbaV07Ci0JCQlpZiAobWFwLmlzTWFwRm9yKHRhZ05hbWUpICYmIGF0dHJpYnV0ZU1hcCA9PSBtYXAuaXNET01BdHRyaWJ1dGUoKSkKLQkJCQlyZXR1cm4gbWFwc1tpXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoTm9kZSBhTm9kZSkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihhTm9kZSk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc01PRlByb3h5KCkpIHsKLQkJCXJlbW92ZURPTUFkYXB0ZXIoYU5vZGUsIGFkYXB0ZXIpOwotCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlhZGFwdGVyID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEZXBlbmRlbmN5RmVhdHVyZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0T2xkVmFsdWUoKSAhPSBudWxsKQotCQkJcmVtb3ZlRGVwZW5kZW5jeUFkYXB0ZXIoKEVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJaWYgKG1zZy5nZXROZXdWYWx1ZSgpICE9IG51bGwpCi0JCQlhZGREZXBlbmRlbmN5QWRhcHRlcigoRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVwZW5kZW5jeUZlYXR1cmUoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLQkJCQlyZXR1cm4gZlRyYW5zbGF0b3IuaXNEZXBlbmRlbmN5UGFyZW50KCkgJiYgZlRyYW5zbGF0b3IuZ2V0RGVwZW5kZW5jeUZlYXR1cmUoKSA9PSBtc2cuZ2V0RmVhdHVyZSgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eVRhZyhFbGVtZW50IHBhcmVudCkgewotCQlSZXZpc2l0LnRvRG8oKTsKLQkJLy9EZXRlcm1pbmUgaG93IHRvIGltcGxlbWVudCB0aGlzIHdpdGggcHVyZSBET00gYXBpcywgaWYgcG9zc2libGUuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0VXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZVVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHdpdGggdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCU9iamVjdCBhdHRyVmFsdWUgPSBudWxsOwotCQlib29sZWFuIGlzU2V0ID0gZmFsc2U7Ci0JCWlmIChtYXAuaXNJRE1hcCgpKSB7Ci0JCQl0cnkgewotCQkJCWF0dHJWYWx1ZSA9IG1hcC5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJfSBjYXRjaCAoSURUcmFuc2xhdG9yLk5vUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJCQkvL0lmIHRoZSBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSwKLQkJCQkvL05vIG5lZWQgdG8gdXBkYXRlCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJaXNTZXQgPSBhdHRyVmFsdWUgIT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWF0dHJWYWx1ZSA9IG1hcC5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJaXNTZXQgPSBtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQl9Ci0KLQkJaWYgKG1hcC5pc0RPTUF0dHJpYnV0ZSgpKSB7Ci0JCQkvLyBBbiBhdHRyaWJ1dGUgb2YgdGhlIE1PRiBvYmplY3QgbWFwcyB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCi0JCQkvLyBET00gbm9kZS4gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSBhbmQgc2V0IGl0Ci0JCQkvLyBpbnRvIERPTSBub2RlLgotCQkJRWxlbWVudCBlID0gKEVsZW1lbnQpIGNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiBpc1NldCkKLQkJCQllLnNldEF0dHJpYnV0ZShtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpLCBtYXAuY29udmVydFZhbHVlVG9TdHJpbmcoYXR0clZhbHVlLCBtb2ZPYmplY3QpKTsKLQkJCWVsc2UKLQkJCQllLnJlbW92ZUF0dHJpYnV0ZShtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZURPTVN1YnRyZWUobWFwLCBub2RlLCBtb2ZPYmplY3QsIGF0dHJWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHdpdGggdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01MaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlMaW5rVXBkYXRlclRhcmdldC5JTlNUQU5DRS51cGRhdGVET00obWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0KLQkJTGlzdCBtb2ZDaGlsZHJlbiA9IG1hcC5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCQlMaXN0IGRvbUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4obm9kZSwgbWFwKTsKLQotCQlwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mQ2hpbGRyZW4sIGRvbUNoaWxkcmVuLCBtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGZyb20gdGhlIERPTSBub2RlIHN1YnRyZWUuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1VcGRhdGVNT0ZGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmICghbWFwLmZlYXR1cmVFeGlzdHMobW9mT2JqZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJT2JqZWN0IGRvbVZhbHVlID0gbnVsbDsKLQkJYm9vbGVhbiB1cGRhdGVNT0ZBdHRBZGFwdGVyID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNVbnNldCA9IGZhbHNlOwotCQlFTUYyRE9NQWRhcHRlciBhdHRyQWRhcHRlciA9IG51bGw7Ci0KLQkJTm9kZSBjaGlsZCA9IGZpbmRET01Ob2RlKG5vZGUsIG1hcCwgdHJ1ZSk7Ci0KLQkJaWYgKG1hcC5pc0RPTUF0dHJpYnV0ZSgpICYmIGNoaWxkICE9IG51bGwpIHsKLQkJCS8vIEFuIGF0dHJpYnV0ZSBvZiB0aGUgTU9GIG9iamVjdCBtYXBzIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUKLQkJCS8vIERPTSBub2RlLiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBET00gYXR0cmlidXRlIGFuZCBzZXQgaXQKLQkJCS8vIGludG8gdGhlIE1PRiBvYmplY3QuCi0KLQkJCUF0dHIgZG9tQXR0ciA9IChBdHRyKSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOwotCQkJaWYgKGRvbUF0dHIgIT0gbnVsbCkgewotCQkJCWRvbVZhbHVlID0gZG9tQXR0ci5nZXRWYWx1ZSgpOwotCQkJCXRyeSB7Ci0JCQkJCWRvbVZhbHVlID0gbWFwLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKChTdHJpbmcpIGRvbVZhbHVlLCBtb2ZPYmplY3QpOwotCQkJCX0gY2F0Y2ggKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZSkgewotCQkJCQloYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGUpOwotCQkJCQlkb21WYWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQl9IGVsc2UKLQkJCQlpc1Vuc2V0ID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIEFuIGF0dHJpYnV0ZSBvZiB0aGUgTU9GIG9iamVjdCBpcyBhY3R1YWxseSBhIHN1Yi1lbGVtZW50Ci0JCQkvLyBvZiB0aGUgRE9NIG5vZGUuIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN1Yi1lbGVtZW50IHdpdGgKLQkJCS8vIHRoZSBjb3JyZWN0IG5hbWUgdG8gdXNlIGFzIGFuIGF0dHJpYnV0ZS4KLQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBzaW5nbGUgdmFsdWVkIGF0dHJpYnV0ZSB0aGF0IGhhcwotCQkJCS8vIGEgTU9GIG9iamVjdCBhcyBpdHMgdmFsdWUKLQkJCQlpZiAoIW1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJCWF0dHJBZGFwdGVyID0gY3JlYXRlQWRhcHRlcihjaGlsZCwgbWFwKTsKLQkJCQkJdXBkYXRlTU9GQXR0QWRhcHRlciA9IHRydWU7Ci0JCQkJCWRvbVZhbHVlID0gYXR0ckFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjaGlsZCBpcyBhZGFwdGVkLiBJZiBub3QsIGFkYXB0Ci0JCQkJCS8vIGl0LgotCQkJCQlhZGRET01BZGFwdGVyKGNoaWxkKTsKLQotCQkJCQkvLyBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSB0ZXh0IGNoaWxkCi0JCQkJCWRvbVZhbHVlID0gZXh0cmFjdFZhbHVlKGNoaWxkLCBtYXAsIG1vZk9iamVjdCk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJaXNVbnNldCA9IHRydWU7Ci0JCX0KLQotCQkvLyBTZXQgdGhlIGF0dHJpYnV0ZSBleHRyYWN0ZWQgZnJvbSB0aGUgRE9NIHRvIHRoZSBNT0Ygb2JqZWN0LgotCQlib29sZWFuIGhhc0NoYW5nZWQgPSB0cnVlOwotCQl0cnkgewotCQkJaWYgKG1hcC5pc0lETWFwKCkpCi0JCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgZG9tVmFsdWUpOwotCQkJZWxzZSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKLQkJCQlvbGRWYWx1ZSA9IG1hcC5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJCWJvb2xlYW4gaXNTZXQgPSBtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJCS8vSW4gdGhlIGNhc2Ugb2YgZW51bXMgd2l0aCBkZWZhdWx0IHZhbHVlcywgd2UgbmVlZCB0byB0cmlwCi0JCQkJLy8gdGhlIGF0dHJpYnV0ZSBmcm9tCi0JCQkJLy9kZWZhdWx0IHRvIGEgc2V0IHZhbHVlCi0JCQkJaWYgKG9sZFZhbHVlID09IGRvbVZhbHVlKSB7Ci0JCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsIHx8IGlzU2V0KQotCQkJCQkJaGFzQ2hhbmdlZCA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoZG9tVmFsdWUgPT0gbnVsbCAmJiAhaXNTZXQpCi0JCQkJCS8vSWYgdGhlIGRvbVZhbHVlIGlzIG51bGwgYW5kIHRoZSBmZWF0dXJlIGlzIG5vdCBzZXQsIHRoZW4KLQkJCQkJLy8gd2UgZG9uJ3QgbmVlZAotCQkJCQkvL3RvIGRvIGFueXRoaW5nCi0JCQkJCWhhc0NoYW5nZWQgPSBmYWxzZTsKLQkJCQllbHNlIGlmIChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhkb21WYWx1ZSkgJiYgaXNTZXQpCi0JCQkJCWhhc0NoYW5nZWQgPSBmYWxzZTsKLQkJCQlpZiAob2xkVmFsdWUgPT0gbnVsbCAmJiBkb21WYWx1ZSA9PSBudWxsICYmIG1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCkgPT0gaXNVbnNldCkKLQkJCQkJaGFzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJaWYgKGhhc0NoYW5nZWQpIHsKLQkJCQkJaWYgKCEobWFwLmlzRGF0YVR5cGUoKSkgJiYgIW1hcC5pc1NoYXJlZCgpKQotCQkJCQkJcmVtb3ZlTU9GVmFsdWUoKEVPYmplY3QpIG9sZFZhbHVlLCBtYXApOwotCQkJCQlpZiAoZG9tVmFsdWUgPT0gbnVsbCkKLQkJCQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCQkJCWVsc2UKLQkJCQkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGRvbVZhbHVlKTsKLQotCQkJCQlpZiAoKGRvbVZhbHVlID09IG51bGwgJiYgIShtYXAuaXNFbnVtRmVhdHVyZSgpKSkgfHwgaXNVbnNldCkKLQkJCQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7IC8vdW5zZXQKLQkJCQkJLy8gbnVsbAotCQkJCQkvLyBmb3IKLQkJCQkJLy8gbm9uCi0JCQkJCS8vIGVudW0KLQkJCQkJLy8gZmVhdHVyZXMKLQotCQkJCQlpZiAodXBkYXRlTU9GQXR0QWRhcHRlciAmJiBhdHRyQWRhcHRlciAhPSBudWxsKQotCQkJCQkJYXR0ckFkYXB0ZXIudXBkYXRlTU9GKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQloYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGV4KTsKLQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGhhc0NoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgZnJvbSB0aGUgRE9NIG5vZGUgc3VidHJlZS4gVGhpcyBtZXRob2QgaXMgb25seQotCSAqIGNhbGxlZCBpZiB0aGUgRE9NIG5vZGUgY2hhbmdlcyBhbmQgdGhlIG1hcCBpcyBhbiBvYmplY3QgbGluayBtYXAuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqIEByZXR1cm4gUmV0dXJuIHRydWUgaWYgdGhlIE1PRiBmZWF0dXJlIHdhcyB1cGRhdGVkLCBmYWxzZSBpZiBubyB1cGRhdGUgd2FzIGRvbmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRkxpbmtGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCUxpbmtVcGRhdGVyVGFyZ2V0LklOU1RBTkNFLnVwZGF0ZU1PRihtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCS8vIElmIHRoZSBmZWF0dXJlIGlzIGEgY29sbGVjdGlvbiBvZiBzdHJpbmdzIG9yIGludHMsIGNhbGwgYSBzcGVjaWFsCi0JCS8vIG1ldGhvZAotCQkvLyB0aGF0IGhhbmRsZXMgdGhpcy4KLQkJaWYgKG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQl1cGRhdGVNT0ZNdWx0aVByaW1pdGl2ZUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBub2RlQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihub2RlLCBtYXApOwotCQlMaXN0IG1vZkNoaWxkcmVuID0gbWFwLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0KLQkJcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZkNoaWxkcmVuLCBub2RlQ2hpbGRyZW4pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlcGVuZGVuY3lBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCUFkYXB0ZXIgZXhpc3RpbmcgPSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKG9iaiwgRGVwZW5kZW5jeUFkYXB0ZXIuS0VZKTsKLQkJaWYgKGV4aXN0aW5nICE9IG51bGwpCi0JCQlvYmouZUFkYXB0ZXJzKCkucmVtb3ZlKGV4aXN0aW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCB0aGUgRE9NIGNoaWxkcmVuIGZyb20gPHBhcmVudD50aGF0IGFyZSByZXByZXNlbnRlZCBieSA8bWFwPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01DaGlsZHJlbihOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXApIHsKLQkJU3RyaW5nW10gZG9tTmFtZXMgPSBtYXAuZ2V0RE9NTmFtZXMoKTsKLQkJSGFzaFNldCBkb21OYW1lc1NldCA9IG5ldyBIYXNoU2V0KGRvbU5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZG9tTmFtZXMubGVuZ3RoOyBpKyspCi0JCQlkb21OYW1lc1NldC5hZGQoZG9tTmFtZXNbaV0pOwotCi0JCS8vIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGNoaWxkcmVuIGFuZCBmaW5kIGFueSB0aGF0IG1hdGNoIHRoZSBtYXAuCi0JCU5vZGVMaXN0IG5sID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJTGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAoZG9tTmFtZXNTZXQuY29udGFpbnMoY2hpbGROb2RlLmdldE5vZGVOYW1lKCkpKQotCQkJCXRvUmVtb3ZlLmFkZChjaGlsZE5vZGUpOwotCQl9Ci0KLQkJLy8gUmVtb3ZlIGFueSBjaGlsZHJlbiB0aGF0IHdlcmUgZm91bmQuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gKE5vZGUpIHRvUmVtb3ZlLmdldChpKTsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudCwgY2hpbGROb2RlLCB0cnVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldEZyb21Ob2RlKCkgewotCQlzZXRUYXJnZXQoZlRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGZOb2RlLmdldE5vZGVOYW1lKCksIGV4dHJhY3RSZWFkQWhlYWROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHdpdGggdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCXByZVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJaWYgKG1hcC5pc011bHRpVmFsdWVkKCkpIHsKLQkJCQl1cGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGZEZWJ1ZykgewotCQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0ZnJvbTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQl0cnkgewotCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCXByaW1VcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJCX0KLQotCQkJaWYgKG1hcC5pc1RhcmdldExpbmtNYXAoKSkgewotCQkJCXVwZGF0ZURPTUxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXBvc3RVcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTUxpbmtGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZSAobGluayk6ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0ZnJvbTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpbVVwZGF0ZURPTUxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTU11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiVXBkYXRpbmcgRE9NIE5vZGUgKG11bHRpKTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGEgRE9NIHN1YnRyZWUgdG8gcmVmbGVjdCB0aGUgbW9mT2JqZWN0IGFuZCBtYXAgcGFzc2VkIGluLiBUaGUgc3VidHJlZSBpcyBvZiA8bm9kZT5pcwotCSAqIHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NU3VidHJlZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCwgT2JqZWN0IGF0dHJWYWx1ZSkgewotCQlPYmplY3QgaW5uZXJBdHRyVmFsdWUgPSBhdHRyVmFsdWU7Ci0JCWlmIChtYXAuZmVhdHVyZUV4aXN0cyhtb2ZPYmplY3QpKSB7Ci0JCQlpZiAoKG1hcC5pc0VudW1GZWF0dXJlKCkgfHwgbWFwLmlzQm9vbGVhbkZlYXR1cmUoKSkgJiYgKG1hcC5pc1Vuc2V0dGFibGUoKSAmJiAhbWFwLmlzU2V0TU9GVmFsdWUobW9mT2JqZWN0KSkpCi0JCQkJaW5uZXJBdHRyVmFsdWUgPSBudWxsOwotCQl9IGVsc2UKLQkJCWlubmVyQXR0clZhbHVlID0gbWFwLmV4dHJhY3RTdHJpbmdWYWx1ZShtb2ZPYmplY3QpOwotCi0JCS8vIENyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSBET00gc3VidHJlZQotCQlpZiAoaW5uZXJBdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJTm9kZSBwYXJlbnQgPSBjcmVhdGVET01QYXRoKG5vZGUsIG1hcCk7Ci0JCQlpZiAobWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIG1vZiB2YWx1ZSBpcyBub3QgYW5vdGhlcgotCQkJCS8vIG1vZiBvYmplY3QgKHByaW1pdGl2ZSkKLQkJCQlpZiAobWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSAhPSBudWxsICYmIG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkuc3RhcnRzV2l0aCgiIyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybjsKLQotCQkJCUVsZW1lbnQgY2hpbGQgPSBtYXAuaXNET01UZXh0VmFsdWUoKSA/IChFbGVtZW50KSBwYXJlbnQgOiBmaW5kT3JDcmVhdGVOb2RlKHBhcmVudCwgbWFwLCBtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQotCQkJCWZpbmRPckNyZWF0ZVRleHROb2RlKGNoaWxkLCBtYXAsIG1hcC5jb252ZXJ0VmFsdWVUb1N0cmluZyhpbm5lckF0dHJWYWx1ZSwgbW9mT2JqZWN0KSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3ZXJlIHRoZSBtb2YgdmFsdWUgaXMgYSBtb2Ygb2JqZWN0LgotCQkJCUVPYmplY3QgbW9mVmFsdWUgPSAoRU9iamVjdCkgaW5uZXJBdHRyVmFsdWU7Ci0JCQkJRU1GMkRPTUFkYXB0ZXIgdmFsdWVBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKG1vZlZhbHVlLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJCQlpZiAodmFsdWVBZGFwdGVyICE9IG51bGwpCi0JCQkJCXZhbHVlQWRhcHRlci51cGRhdGVET00oKTsKLQkJCQllbHNlIHsKLQkJCQkJcmVtb3ZlRE9NQ2hpbGRyZW4ocGFyZW50LCBtYXApOwotCQkJCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihtb2ZWYWx1ZSwgbWFwKTsKLQkJCQkJTGlzdCBtb2ZDaGlsZHJlbiA9IG1hcC5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCQkJCQlMaXN0IGRvbUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4ocGFyZW50LCBtYXApOwotCi0JCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgMCwgZG9tQ2hpbGRyZW4pOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBhZGFwdGVyLmdldE5vZGUoKSwgaW5zZXJ0QmVmb3JlTm9kZSk7Ci0JCQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGFkYXB0ZXIuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmRlbnQoYWRhcHRlci5nZXROb2RlKCksIG1hcCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCQkJCX0KLQkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUaGUgYXR0cmlidXRlIHZhbHVlIHdhcyBzZXQgdG8gbnVsbCBvciB1bnNldC4gUmVtb3ZlIGFueQotCQkJLy8gZXhpc3RpbmcgRE9NIG5vZGVzLgotCQkJTm9kZSBjaGlsZCA9IGZpbmRET01Ob2RlKG5vZGUsIG1hcCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQlyZW1vdmVET01DaGlsZChjaGlsZC5nZXRQYXJlbnROb2RlKCksIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhIGZlYXR1cmUgdGhhdCBpcyBzZXQgYnkgbGlua2luZyB0byBhbm90aGVyIGV4aXN0aW5nIG9iamVjdC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkCi0JICogd2hlbiB0aGUgTU9GIG9iamVjdCBpcyB1cGRhdGVkIGluIG9yZGVyIHRvIHVwZGF0ZSBET00gbm9kZXMuCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTU9GTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlVwZGF0aW5nIE1PRk9iamVjdCAobGluayk6ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRmcm9tOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXByaW1VcGRhdGVNT0ZMaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZNdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlVwZGF0aW5nIE1PRk9iamVjdCAobXVsdGkpOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0ZnJvbTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLiBUaGUgcmVsYXRpb25zaGlwIE1VU1QgQkUgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBmb3IgdGhpcyBtZXRob2QgdG8gd29yay4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZNdWx0aVByaW1pdGl2ZUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJTGlzdCBub2RlQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihub2RlLCBtYXApOwotCi0JCW1hcC5jbGVhckxpc3QobW9mT2JqZWN0KTsKLQotCQkvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIG5vZGVzIGFuZCB1cGRhdGUgdGhlIE1PRiBjb2xsZWN0aW9uCi0JCWludCBhZGRJbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gKE5vZGUpIG5vZGVDaGlsZHJlbi5nZXQoaSk7Ci0JCQlPYmplY3QgYXR0cmlidXRlVmFsdWUgPSBleHRyYWN0VmFsdWUoY2hpbGQsIG1hcCwgbW9mT2JqZWN0KTsKLQkJCWJvb2xlYW4gYWR2YW5jZUFkZEluZGV4ID0gdHJ1ZTsKLQkJCWlmIChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKXsKLQkJCQlpZihtYXAuZ2V0RmVhdHVyZSgpICE9IG51bGwgJiYgbWFwLmdldEZlYXR1cmUoKS5pc1VuaXF1ZSgpICYmIG1vZk9iamVjdC5lR2V0KG1hcC5nZXRGZWF0dXJlKCkpICE9IG51bGwgJiYgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkgaW5zdGFuY2VvZiBMaXN0ICYmICgoTGlzdCkgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkpLmNvbnRhaW5zKGF0dHJpYnV0ZVZhbHVlKSl7Ci0JCQkJCWFkdmFuY2VBZGRJbmRleCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgZG9tTmFtZSA9IG1hcC5kb21OYW1lQW5kUGF0aCAhPSBudWxsID8gbWFwLmRvbU5hbWVBbmRQYXRoIDogImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICdubyBkdXBsaWNhdGVzJyBjb25zdHJhaW50IGlzIHZpb2xhdGVkIGJ5ICIrZG9tTmFtZSsiID0gIithdHRyaWJ1dGVWYWx1ZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaGFuZGxlSW52YWxpZE11bHRpTm9kZXMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgYXR0cmlidXRlVmFsdWUsIGFkZEluZGV4KTsKLQkJCQl9Ci0JCQkJaWYoYWR2YW5jZUFkZEluZGV4KXsKLQkJCQkJYWRkSW5kZXggKys7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBBZGFwdCB0aGUgbm9kZSBzbyB1cGRhdGUgd2lsbCBvY2N1ci4KLQkJCWFkZERPTUFkYXB0ZXIoY2hpbGQpOwotCQl9Ci0JCWlmIChtYXAuaGFzRE9NUGF0aCgpICYmIG5vZGVDaGlsZHJlbi5pc0VtcHR5KCkgJiYgZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSkgIT0gbnVsbCkKLQkJCW1hcC5zZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgobW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBmcm9tIHRoZSBET00gbm9kZSBzdWJ0cmVlLiBUaGUKLQkgKiAKLQkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0ZGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChtYXAuaXNNdWx0aVZhbHVlZCgpKSB7Ci0JCQl1cGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKG1hcC5pc0NvbW1lbnQoKSkgewotCQkJdXBkYXRlTU9GQ29tbWVudEZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVE9ETyBNREUgQWRkIGEgbWFwLmlzQ29tbWVudCgpIGFuZCB1cGRhdGVNT0ZDb21tZW50RmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0KLQkJaWYgKGZEZWJ1ZykgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlVwZGF0aW5nIE1PRk9iamVjdDogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJYm9vbGVhbiBoYXNDaGFuZ2VkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCWhhc0NoYW5nZWQgPSBwcmltVXBkYXRlTU9GRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0KLQkJaWYgKG1hcC5pc1RhcmdldExpbmtNYXAoKSAmJiBoYXNDaGFuZ2VkKQotCQkJdXBkYXRlTU9GTGlua0ZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYXAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBtb2ZPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0ZDb21tZW50RmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlOb2RlIGNvbW1lbnROb2RlID0gbm9kZTsKLQkJLyogc2NhbiB1cCB0aGUgZG9tIHRvIGZpbmQgdGhlIGZpcnN0IGNvbW1lbnQgbm9kZSBiZWZvcmUgdGhpcyBub2RlICovCi0JCXdoaWxlICgoY29tbWVudE5vZGUgPSBjb21tZW50Tm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgIT0gbnVsbCAmJiBjb21tZW50Tm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkvKiBubyBjb21tZW50IGF2YWlsYWJsZSAqLwotCQkJaWYgKGNvbW1lbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb21tZW50Tm9kZSAhPSBudWxsKQotCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgY29tbWVudE5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDdlM2M0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01Mb2FkT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIEVNRjJET01SZW5kZXJlciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbXBsIHsKLQotCXByb3RlY3RlZCBNYXAgZG9tQWRhcHRlclJlZ2lzdHJ5OwotCXByb3RlY3RlZCBib29sZWFuIG5lZWRzVG9DcmVhdGVET00gPSB0cnVlOwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBET01SZW5kZXJlckltcGwuCi0JICovCi0JcHVibGljIEVNRjJET01SZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG1hbmFnZXNET01BZGFwdGVycygpKQotCQkJaW5pdERPTUFkYXB0ZXJSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb0xvYWQoSW5wdXRTdHJlYW0sIE1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoKGluICE9IG51bGwpIHx8ICF1c2VTdHJlYW1zRm9ySU8oKSkgewotCQkJbG9hZERvY3VtZW50KGluLCBvcHRpb25zKTsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVSb290RE9NQWRhcHRlcigpOwotCQkJYWRhcHRlci51cGRhdGVNT0YoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWREb2N1bWVudChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlET01Mb2FkT3B0aW9ucyBkb21PcHRzID0gbmV3IERPTUxvYWRPcHRpb25zKCk7Ci0JCQlkb21PcHRzLnNldEFsbG93SmF2YUVuY29kaW5ncyh0cnVlKTsKLQkJCWRvbU9wdHMuc2V0RXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKHRydWUpOwotCQkJZG9tT3B0cy5zZXRWYWxpZGF0ZShpc1ZhbGlkYXRpbmcoKSk7Ci0JCQlkb2N1bWVudCA9IERPTVV0aWxpdGllcy5sb2FkRG9jdW1lbnQoaW4sIGRvbU9wdHMsIGdldFJlc291cmNlKCkuZ2V0RW50aXR5UmVzb2x2ZXIoKSk7Ci0JCQluZWVkc1RvQ3JlYXRlRE9NID0gZmFsc2U7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdF9yZXgpIHsKLQkJCXRocm93IHRfcmV4OwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLQkJCXRocm93IGlveDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb1NhdmUoT3V0cHV0U3RyZWFtLCBNYXApCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKTsKLQkJc2VyaWFsaXplRG9jdW1lbnQob3V0cHV0U3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiBhZGFwdGVycyBhcmUgbm90IGNhY2hlZCB3aXRoaW4gdGhpcyByZW5kZXJlciwgZS5nLiwgdGhleSBhcmUKLQkgKiBzdG9yZWQgaW4gbm90aWZ5aW5nIE5vZGVzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFuYWdlc0RPTUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RE9NQWRhcHRlclJlZ2lzdHJ5KCkgewotCQlpZiAoZG9tQWRhcHRlclJlZ2lzdHJ5ID09IG51bGwpCi0JCQlkb21BZGFwdGVyUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRE9NQWRhcHRlcihOb2RlIG5vZGUsIEVNRjJET01BZGFwdGVyIGFkYXB0ZXIpIHsKLQkJZG9tQWRhcHRlclJlZ2lzdHJ5LnB1dChub2RlLCBhZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKEVNRjJET01BZGFwdGVyKSBkb21BZGFwdGVyUmVnaXN0cnkuZ2V0KG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCWRvbUFkYXB0ZXJSZWdpc3RyeS5yZW1vdmUoYU5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVwYXJlVG9BZGRDb250ZW50cygpCi0JICovCi0JcHVibGljIHZvaWQgcHJlcGFyZVRvQWRkQ29udGVudHMoKSB7Ci0JCS8vIGNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGNyZWF0ZURPTVRyZWUoKSB7Ci0JCWNyZWF0ZURvY3VtZW50KCk7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVSb290RE9NQWRhcHRlcigpOwotCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQluZWVkc1RvQ3JlYXRlRE9NID0gZmFsc2U7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVSb290RE9NQWRhcHRlcigpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgcm9vdCA9IG5ldyBFTUYyRE9NQWRhcHRlckltcGwoZ2V0UmVzb3VyY2UoKSwgZG9jdW1lbnQsIHRoaXMsIGdldFJlc291cmNlKCkuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7Ci0JCXJlZ2lzdGVyRE9NQWRhcHRlcihkb2N1bWVudCwgcm9vdCk7Ci0JCXJldHVybiByb290OwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCkgewotCQlpZiAobmVlZHNUb0NyZWF0ZURPTSkKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnQgZ2l2ZW4KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50KCkgewotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2UoKTsKLQkJcmVzLnNldERlZmF1bHRzKCk7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERPTVV0aWxpdGllcy5jcmVhdGVOZXdEb2N1bWVudChyZXMuZ2V0RG9jdHlwZSgpLCByZXMuZ2V0UHVibGljSWQoKSwgcmVzLmdldFN5c3RlbUlkKCkpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VyaWFsaXplRG9jdW1lbnQoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IGNyZWF0ZU91dHB1dEZvcm1hdCgpOyBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPQotCQkgKiBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcihvdXQsIGZvcm1hdCk7Ci0JCSAqIHNlcmlhbGl6ZXIuYXNET01TZXJpYWxpemVyKCkuc2VyaWFsaXplKGRvY3VtZW50KTsKLQkJICovCi0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJLyoKLQkJCSAqIHRyeSB7IGZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX0xBTkdVQUdFLCBXM0NfWE1MX1NDSEVNQSk7IH0gY2F0Y2gKLQkJCSAqIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgeyB9Ci0JCQkgKi8KLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBnZXRSZXNvdXJjZSgpLmdldEVuY29kaW5nKCkpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5WRVJTSU9OLCBnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAibm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSAhPSBudWxsKQotCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSk7Ci0JCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1NZU1RFTSwgZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCQkJLyogc291cmNlLnNldFN5c3RlbUlkKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSk7ICovCi0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG91dCkpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByb3RlY3RlZCBPdXRwdXRGb3JtYXQgY3JlYXRlT3V0cHV0Rm9ybWF0KCkgeyBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOwotCSAqIGZvcm1hdC5zZXRJbmRlbnRpbmcodHJ1ZSk7IGZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORyk7Ci0JICogLy8kTk9OLU5MUy0xJCBmb3JtYXQuc2V0RW5jb2RpbmcoZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkgKiBmb3JtYXQuc2V0VmVyc2lvbihnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7IHJldHVybiBmb3JtYXQ7IH0KLQkgKi8KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VEb2N1bWVudFR5cGUoU3RyaW5nIGRvY1R5cGVOYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlSZXZpc2l0LnJldmlzaXQoKTsKLQkJRG9jdW1lbnQgbmV3RG9jID0gbnVsbDsKLQkJLy8gTmVlZCBiZSBhYmxlIHRvIHVwZGF0ZSB0aGUgZG9jdHlwZSBkaXJlY3RseSBvbiB0aGUgZXhpc3RpbmcgZG9jdW1lbnQ7IHJpZ2h0IG5vdyBjYW4ndAotCQkvLyBiZWNhdXNlCi0JCS8vIG9mIGxpbWl0YXRpb25zIG9uIHBhcnNlciBuZXV0cmFsIGFwaXMKLQotCQl0cnkgewotCQkJbmV3RG9jID0gRE9NVXRpbGl0aWVzLmNyZWF0ZU5ld0RvY3VtZW50KGRvY1R5cGVOYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQotCQlyZXBsYWNlTm9kZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwgbmV3RG9jLCBuZXdEb2MpOwotCQlyZWFkYXB0KGRvY3VtZW50LCBuZXdEb2MpOwotCQlkb2N1bWVudCA9IG5ld0RvYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShOb2RlIG9sZENoaWxkLCBOb2RlIG5ld1BhcmVudCwgRG9jdW1lbnQgbmV3RG9jKSB7Ci0JCU5vZGUgbmV3Q2hpbGQgPSBuZXdEb2MuaW1wb3J0Tm9kZShvbGRDaGlsZCwgZmFsc2UpOwotCQluZXdQYXJlbnQuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOwotCQlyZWFkYXB0KG9sZENoaWxkLCBuZXdDaGlsZCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gb2xkQ2hpbGQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuZ3RoID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlcGxhY2VOb2RlKGNoaWxkcmVuLml0ZW0oaSksIG5ld0NoaWxkLCBuZXdEb2MpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJlVW5sb2FkKCkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihyZXNvdXJjZS5lQWRhcHRlcnMoKSwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIucmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVhZGFwdChOb2RlIG9sZENoaWxkLCBOb2RlIG5ld0NoaWxkKSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBnZXRFeGlzdGluZ0RPTUFkYXB0ZXIob2xkQ2hpbGQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZWdpc3RlckRPTUFkYXB0ZXIobmV3Q2hpbGQsIGFkYXB0ZXIpOwotCQkJLy8gU29tZSBub2RlcyBhcmUgbWFuYWdlZCBieSB0aGUgcGFyZW50IGFuZCB0aHVzIHRoZQotCQkJLy8gbm9kZSBzaG91bGQgbm90IGJlIHNldCBvbiB0aGUgcGFyZW50IGFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyLmdldE5vZGUoKSA9PSBvbGRDaGlsZCkKLQkJCQlhZGFwdGVyLnNldE5vZGUobmV3Q2hpbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSgpLmdldFZlcnNpb25JRCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRmYmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotcHVibGljIGNsYXNzIEVNRjJET01SZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJET01SZW5kZXJlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkjY3JlYXRlUmVuZGVyZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpIHsKLQkJRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IEVNRjJET01SZW5kZXJlcigpOwotCQlyZW5kZXJlci5zZXRWYWxpZGF0aW5nKGlzVmFsaWRhdGluZygpKTsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTdhMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBJTlNUQU5DRSA9IG5ldyBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciNnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhEb2N1bWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhEb2N1bWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwYzJhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYRG9jdW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGUgRU1GMlNBWERvY3VtZW50SGFuZGxlciBpcyB1dGlsaXplZCBieSB0aGUgU0FYIHBhcnNlciB0byBhbm5vdW5jZSBYTUwgRXZlbnRzLCBzdWNoIGFzCi0gKiBiZWdpbm5pbmcgYW5kIGVuZCBvZiBYTUwgZWxlbWVudHMgYW5kIHRoZSBjb250ZW50cyBvZiB0aG9zZSBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgZmluYWwgQ2FjaGVFdmVudFN0YWNrIGV2ZW50U3RhY2sgPSBuZXcgQ2FjaGVFdmVudFN0YWNrKCk7Ci0JcHJpdmF0ZSBDYWNoZUV2ZW50UG9vbCBhdmFpbGFibGVFdmVudFBvb2wgPSBuZXcgQ2FjaGVFdmVudFBvb2woKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIHRvIHBvcHVsYXRlIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAgCi0JICovCi0JcHVibGljIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJSW5wdXRTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJdGhpcy5yZXNvdXJjZS5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0KLQkJdHJ5IHsKLQkJCUVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gdGhpcy5yZXNvdXJjZS5nZXRFbnRpdHlSZXNvbHZlcigpOwotCi0JCQlpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBlbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oaW9lKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydERvY3VtZW50KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIFRoZSBlbmREb2N1bWVudCgpIG1ldGhvZCBzaG91bGQgaGF2ZSBmcm96ZW4gdGhlIHBvb2wsIG9yIGl0IG1heSBub3QgYmUgd2FybWVkIHlldC4gSW4KLQkJICogZWl0aGVyIGNhc2UsIHRoaXMgbWV0aG9kIGNhbGwgd2lsbCBkbyBhcyBsaXR0bGUgd29yayBhcyBuZWNlc3NhcnkKLQkJICovCi0JCWF2YWlsYWJsZUV2ZW50UG9vbC53YXJtUG9vbCgpOwotCi0JCS8qIFRoaXMgbGluZSBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSwgYnV0IGlzIGxlZnQgZm9yIHNhZnR5ICovCi0JCWV2ZW50U3RhY2suY2xlYXIoKTsKLQkJdGhpcy5jcmVhdGVSb290KHRoaXMucmVzb3VyY2UpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJYWRkVG9TdGFjayhxTmFtZSwgYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlDYWNoZUV2ZW50Tm9kZSBjdXJyZW50UmVjb3JkID0gZ2V0Q3VycmVudFJlY29yZCgpOwotCQlpZiAoY3VycmVudFJlY29yZCAhPSBudWxsKSB7Ci0JCQljdXJyZW50UmVjb3JkLmFwcGVuZFRvQnVmZmVyKGRhdGEsIHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlDYWNoZUV2ZW50Tm9kZSBjdXJyZW50UmVjb3JkID0gbnVsbDsKLQotCQkvKgotCQkgKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgRE9NUGF0aCB3YXMgaWdub3JlZCBzbyB0aGUgc3RhY2sgZG9lcyBub3QKLQkJICogcXVpdGUgbWF0Y2ggd2l0aCB0aGUgWE1MIGRhdGEgc3RydWN0dXJlLiBJbiB0aGlzIGNhc2Ugd2UgZG8gbm90aGluZwotCQkgKi8KLQkJaWYgKHFOYW1lLmVxdWFscyh0aGlzLmdldEN1cnJlbnRSZWNvcmQoKS5nZXROb2RlTmFtZSgpKSkgewotCQkJY3VycmVudFJlY29yZCA9IHRoaXMucmVtb3ZlQ3VycmVudFJlY29yZCgpOwotCQkJaWYgKGN1cnJlbnRSZWNvcmQgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRSZWNvcmQuY29tbWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZERvY3VtZW50KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlDYWNoZUV2ZW50Tm9kZSBsYXN0UmVjb3JkID0gdGhpcy5yZW1vdmVDdXJyZW50UmVjb3JkKCk7Ci0JCWxhc3RSZWNvcmQuY29tbWl0KCk7Ci0JCWF2YWlsYWJsZUV2ZW50UG9vbC5mcmVlemVQb29sKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQl0aHJvdyBleDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQl0aHJvdyBleDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dXYXJuaW5nKGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJvb3QoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlQXJnKSB7Ci0JCXRoaXMuZXZlbnRTdGFjay5wdXNoKGF2YWlsYWJsZUV2ZW50UG9vbC5jcmVhdGVDYWNoZUV2ZW50Tm9kZShyZXNvdXJjZUFyZykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvU3RhY2soU3RyaW5nIG5vZGVOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJQ2FjaGVFdmVudE5vZGUgcGFyZW50ID0gdGhpcy5nZXRDdXJyZW50UmVjb3JkKCk7Ci0JCWlmICghcGFyZW50LmlzQ2hpbGRJZ25vcmFibGUobm9kZU5hbWUpKSB7Ci0JCQl0aGlzLmV2ZW50U3RhY2sucHVzaChhdmFpbGFibGVFdmVudFBvb2wuY3JlYXRlQ2FjaGVFdmVudE5vZGUocGFyZW50LCBub2RlTmFtZSwgYXR0cmlidXRlcykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IENFTk8gd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBldmVudCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IENFTk8gd2l0aG91dCByZW1vdmluZyBpdAotCSAqLwotCXByb3RlY3RlZCBDYWNoZUV2ZW50Tm9kZSBnZXRDdXJyZW50UmVjb3JkKCkgewotCQlDYWNoZUV2ZW50Tm9kZSByZXN1bHQgPSBudWxsOwotCQlpZiAoIXRoaXMuZXZlbnRTdGFjay5pc0VtcHR5KCkpIHsKLQkJCXJlc3VsdCA9IHRoaXMuZXZlbnRTdGFjay5wZWVrKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGV2ZW50IHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyBhbmQgcmVtb3ZlIGl0Ci0JICovCi0JcHJvdGVjdGVkIENhY2hlRXZlbnROb2RlIHJlbW92ZUN1cnJlbnRSZWNvcmQoKSB7Ci0JCUNhY2hlRXZlbnROb2RlIHJlc3VsdCA9IG51bGw7Ci0JCWlmICghdGhpcy5ldmVudFN0YWNrLmlzRW1wdHkoKSkgewotCQkJcmVzdWx0ID0gdGhpcy5ldmVudFN0YWNrLnBvcCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8JcHJpdmF0ZSBmaW5hbCB2b2lkIHByaW50U3RhY2soKSB7Ci0JLy8JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbnRpbmcgc3RhY2sgLi4uIik7Ci0JLy8JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5ldmVudFN0YWNrLnNpemUoKTsgaSsrKSB7Ci0JLy8JCS8vIGRlYnVnKCJzdGFja1siICsgaSArICJdOiAiICsgZXZlbnRTdGFjay5nZXQoaSkpOwotCS8vCQkvLyB9Ci0JLy8JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLi4uIFByaW50ZWQgc3RhY2siKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGRlYnVnKE9iamVjdCBvYmopIHsKLQkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKG9iaik7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCB3YXJuKE9iamVjdCBvYmopIHsKLQkvLwkJLy9TeXN0ZW0uZXJyLnByaW50bG4ob2JqKTsKLQkvLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTNjMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRyYW5zZm9ybWVySGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRU1GMlNBWFJlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckltcGwgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBFTUYyU0FYUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvTG9hZChqYXZhLmlvLklucHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoaXNWYWxpZGF0aW5nKCkpOwotCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCS8qCi0JCQkgKiBDYXVzZXMgZXJyb3JzIGluIElCTSBKREsgdHJ5IHsgZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsCi0JCQkgKiBXM0NfWE1MX1NDSEVNQSk7IH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7IH0KLQkJCSAqLwotCQkJU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCQlYTUxSZWFkZXIgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQkJRU1GMlNBWERvY3VtZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IEVNRjJTQVhEb2N1bWVudEhhbmRsZXIodGhpcy5nZXRSZXNvdXJjZSgpKTsKLQkJCXRyeSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgaXNWYWxpZGF0aW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXhjZXB0aW9uCi0JCQl9Ci0JCQl0cnkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBleGNlcHRpb24KLSAgICAgICAgICAgIH0KLQkJCXRyeSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsIGlzVmFsaWRhdGluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWFcIi4gVmFsaWRhdGlvbiB3aWxsIGJlIGRpc2FibGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0cnkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3NcIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLyoKLQkJCSAqIHRyeSB7IHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgaGFuZGxlcik7IH0KLQkJCSAqIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsgfQotCQkJICovCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOwotCQkJLy9yZWFkZXIuc2V0RFRESGFuZGxlcihoYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihoYW5kbGVyKTsKLQkJCUlucHV0U291cmNlIHRlc3Rzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW4pOwotCQkJcmVhZGVyLnBhcnNlKHRlc3Rzb3VyY2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHRfcmV4KSB7Ci0JCQl0aHJvdyB0X3JleDsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0JCSAgICB0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZG9TYXZlKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQkvKgotCQkgKiB0cnkgeyBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPQotCQkgKiBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcihvdXRwdXRTdHJlYW0sCi0JCSAqIGNyZWF0ZU91dHB1dEZvcm1hdCgpKTsgc2VyaWFsaXplci5zZXRPdXRwdXRCeXRlU3RyZWFtKG91dHB1dFN0cmVhbSk7IENvbnRlbnRIYW5kbGVyCi0JCSAqIGhhbmRsZXIgPSBzZXJpYWxpemVyLmFzQ29udGVudEhhbmRsZXIoKTsKLQkJICovCi0KLQkJVHJhbnNmb3JtZXJIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlTQVhUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJCWhhbmRsZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcigpOwotCi0JCQkJaGFuZGxlci5zZXRSZXN1bHQobmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGhhbmRsZXIuZ2V0VHJhbnNmb3JtZXIoKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlZFUlNJT04sIGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgIm5vIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAgICAgCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSk7Ci0JCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotCQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLCBnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkpOwotCi0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiU0FYIFdyaXRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlFTUYyU0FYV3JpdGVyIHdyaXRlciA9IG5ldyBFTUYyU0FYV3JpdGVyKCk7Ci0JCQl3cml0ZXIuc2VyaWFsaXplKHRoaXMucmVzb3VyY2UsIGhhbmRsZXIpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gc2F4ZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oc2F4ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByb3RlY3RlZCBPdXRwdXRGb3JtYXQgY3JlYXRlT3V0cHV0Rm9ybWF0KCkgeyBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOwotCSAqIGZvcm1hdC5zZXRJbmRlbnRpbmcodHJ1ZSk7IGZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORyk7Ci0JICogLy8kTk9OLU5MUy0xJCBmb3JtYXQuc2V0RW5jb2RpbmcoZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkgKiBmb3JtYXQuc2V0VmVyc2lvbihnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7IGlmICh0aGlzLnJlc291cmNlICE9IG51bGwpCi0JICogZm9ybWF0LnNldERvY3R5cGUodGhpcy5yZXNvdXJjZS5nZXRQdWJsaWNJZCgpLCB0aGlzLnJlc291cmNlLmdldFN5c3RlbUlkKCkpOyByZXR1cm4gZm9ybWF0OyB9Ci0JICovCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcHJlcGFyZVRvQWRkQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZXBhcmVUb0FkZENvbnRlbnRzKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNnZXRWZXJzaW9uSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXRWZXJzaW9uSUQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTQ0ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTksIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBVc2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEVNRjJTQVhSZW5kZXJlcgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJTQVhSZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJTQVhSZW5kZXJlckZhY3RvcnkoKTsKLQotCXByb3RlY3RlZCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkjY3JlYXRlUmVuZGVyZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpIHsKLQkJRU1GMlNBWFJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IEVNRjJTQVhSZW5kZXJlcigpOwotCQlyZW5kZXJlci5zZXRWYWxpZGF0aW5nKGlzVmFsaWRhdGluZygpKTsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1NTczNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKLQotLyoqCi0gKiBUaGUgRU1GMlNBWFdyaXRlciBoYW5kbGVzIHRoZSBzZXJpYWxpemF0aW9uIG9mIEVNRiBSZXNvdXJjZXMgdXNpbmcgU0FYIGV2ZW50cy4gU0FYIGV2ZW50cyBhcmUKLSAqIHRyaWdnZXJlZCB0byB0aGUgY29udGVudCBoYW5kbGVyIGFzIHRoZSB0cmVlIGlzIGJlaW5nIHBhcnNlZC4gVGhlc2UgZXZlbnRzIGNhbiB0aGVuIGJlIHdyaXR0ZW4KLSAqIGludG8gYW55IHN0cmVhbSB3cmFwcGVkIGJ5IHRoZSBDb250ZW50SGFuZGxlci4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyU0FYV3JpdGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICIiOy8vImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBVc2VkIGluIHRob3NlIGNhc2VzIHdoZXJlIG5vIEF0dHJpYnV0ZXMgYXJlIG5lY2Vzc2FyeSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMgRU1QVFlfQVRUUklCVVRFUyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOwotCi0JLyoqCi0JICogU2VyaWFsaXplIGFuIEVNRiByZXNvdXJjZSBpbnRvIGFuIFhNTCBTdHJlYW0gdXNpbmcgdGhlIGdpdmVuIENvbnRlbnRIYW5kbGVyLiBOb3RlIHRoYXQgdGhpcwotCSAqIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvcHkgYSBnaXZlbiBFTUYgUmVzb3VyY2UgaWYgdGhlIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgaXMgdXNlZCBhcwotCSAqIHRoZSBnaXZlbiBDb250ZW50SGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcmlhbGl6ZShUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UsIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCVRyYW5zbGF0b3Igcm9vdFRyYW5zbGF0b3IgPSByZXNvdXJjZS5nZXRSb290VHJhbnNsYXRvcigpOwotCQlFTGlzdCBjb250ZW50cyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0KLQkJaWYgKGNvbnRlbnRzLnNpemUoKSAhPSAxKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgY29udGVudHMgb2YgYSByZXNvdXJjZSBtYXkgb25seSBjb250YWluIG9uZSBFTUYgTW9kZWwgT2JqZWN0LiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaGFuZGxlci5zdGFydERvY3VtZW50KCk7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCXNlcmlhbGl6ZShoYW5kbGVyLCBlbGVtZW50LCByb290VHJhbnNsYXRvciwgbmV3IFdyaXRlckhpbnRzKHJlc291cmNlKSk7Ci0JCWhhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXJpYWxpemUoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgRU9iamVjdCB0YXJnZXQsIFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgV3JpdGVySGludHMgaGludHMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCUxpc3QgbW9mQ2hpbGRyZW4gPSBudWxsOwotCQlPYmplY3QgcmF3VmFsdWUgPSBudWxsOwotCQlFT2JqZWN0IG5ld1RhcmdldCA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgbmV4dFRyYW5zbGF0b3IgPSBudWxsOwotCQljaGFyW10gY2hhcmFjdGVyRGF0YSA9IG51bGw7Ci0JCVN0cmluZyBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG51bGw7Ci0JCVN0cmluZyBjaGlsZERvbU5hbWUgPSBudWxsOwotCQlmaW5hbCBpbnQgdmVyc2lvbiA9IGhpbnRzLmdldFZlcnNpb24oKTsKLQotCQkvKgotCQkgKiBQcm9jZXNzaW5nIGhpbnRzIGFyZSB1c2VkIHRvIHJlbWVtYmVyIHdoZXJlIGFyZSBpbiB0aGUgaXRlcmF0aW9uIG9mIHRoZSB0cmFuc2xhdG9yJ3MKLQkJICogY2hpbGRyZW4uIHNlZSB0aGUgVHJhbnNsYXRvckZpbHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdGhpcyBhcnJheSBpcyB1c2VkLgotCQkgKi8KLQkJaW50W10gcHJvY2Vzc2luZ0hpbnRzID0gVHJhbnNsYXRvckZpbHRlci5jcmVhdGVQcm9jZXNzaW5nSGludHMoKTsKLQotCQlTdHJpbmcgdGFyZ2V0RG9tTmFtZSA9IHRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOwotCi0JCWF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKHRyYW5zbGF0b3IsIHRhcmdldCwgaGludHMpOwotCi0JCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgdGFyZ2V0RG9tTmFtZSwgdGFyZ2V0RG9tTmFtZSwgYXR0cmlidXRlcyk7Ci0KLQkJY3VycmVudENoaWxkVHJhbnNsYXRvciA9IFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IodHJhbnNsYXRvciwgcHJvY2Vzc2luZ0hpbnRzW1RyYW5zbGF0b3JGaWx0ZXIuTkVYVF9TVEFSVF9ISU5UX0lORFhdLCBwcm9jZXNzaW5nSGludHMsIHRhcmdldCwgdmVyc2lvbik7Ci0JCXdoaWxlIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCS8qIEZvciBlYWNoIENoaWxkIFRyYW5zbGF0b3Igb2YgdGhlIFRyYW5zbGF0b3IgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIHRoZSBtZXRob2QgKi8KLQotCQkJLyogRG9lcyB0aGUgVHJhbnNsYXRvciBoYXZlIGFueSBNT0YgQ2hpbGRyZW4/ICovCi0JCQltb2ZDaGlsZHJlbiA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuZ2V0TU9GQ2hpbGRyZW4odGFyZ2V0KTsKLQkJCW9wZW5Eb21QYXRoSWZOZWNlc3NhcnkoaGFuZGxlciwgaGludHMsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIHRhcmdldCwgbW9mQ2hpbGRyZW4pOwotCi0JCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJLyoKLQkJCQkgKiBUcmFuc2xhdG9ycyB3aGljaCBhcmUgbWFuYWdlZCBieSB0aGVpciBwYXJlbnRzIHJlcXVpcmUgbGVzcyBwcm9jZXNzaW5nIC0tIGp1c3QKLQkJCQkgKiBjb252ZXJ0IHRoZWlyIHZhbHVlIHRvIGEgc3RyaW5nIGFuZCB3cml0ZSBpdCBvdXQgYXMgdGhlIGNvbnRlbnQgb2YgYW4gWE1MIGVsZW1lbnQKLQkJCQkgKi8KLQkJCQljaGlsZERvbU5hbWUgPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQkJCQlpZiAoIWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNFbXB0eVRhZygpKSB7Ci0JCQkJCS8qIFRoZSBUcmFuc2xhdG9yIGlzIG5vdCBhbiBFbXB0eSB0YWcuIEl0cyB0ZXh0IGNvbnRlbnQgaXMgc2lnbmlmaWNhbnQgKi8KLQotCQkJCQlpZiAobW9mQ2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtb2ZDaGlsZHJlbi5zaXplKCk7IGorKykgewotCi0JCQkJCQkJLyogVGV4dCBvbmx5IHRyYW5zbGF0b3JzIHdpbGwgbm90IGhhdmUgb3BlbiBhbmQgY2xvc2UgWE1MIGVsZW1lbnRzICovCi0JCQkJCQkJaWYgKCFjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzRE9NVGV4dFZhbHVlKCkpCi0JCQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCi0JCQkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoaik7Ci0JCQkJCQkJLyogY29udmVydFZhbHVlVG9TdHJpbmcgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSBub24tbnVsbCBTdHJpbmcgKi8KLQkJCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuY29udmVydFZhbHVlVG9TdHJpbmcocmF3VmFsdWUsIHRhcmdldCk7Ci0JCQkJCQkJY2hhcmFjdGVyRGF0YSA9IFhNTEVuY29kZXJEZWNvZGVyLmVzY2FwZShjb252ZXJ0ZWRWYWx1ZSkudG9DaGFyQXJyYXkoKTsKLQkJCQkJCQloYW5kbGVyLmNoYXJhY3RlcnMoY2hhcmFjdGVyRGF0YSwgMCwgY2hhcmFjdGVyRGF0YS5sZW5ndGgpOwotCi0JCQkJCQkJaWYgKCFjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzRE9NVGV4dFZhbHVlKCkpCi0JCQkJCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZSBUcmFuc2xhdG9yIGlzIGFuIEVtcHR5IEVsZW1lbnQgKGl0cyBtZXJlIHByZXNlbmNlIGhhcyBzaWduaWZpY2FuY2UpIChlLmcuCi0JCQkJCSAqIDxjYXNjYWRlLWRlbGV0ZS8+Ci0JCQkJCSAqLwotCi0JCQkJCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzQm9vbGVhbkZlYXR1cmUoKSkgewotCQkJCQkJLyogQm9vbGVhbiBmZWF0dXJlcyBtYXkgb3IgbWF5IG5vdCBiZSByZW5kZXJlZCAqLwotCQkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoMCk7Ci0JCQkJCQlpZiAocmF3VmFsdWUgIT0gbnVsbCAmJiAoKEJvb2xlYW4pIHJhd1ZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCQkJCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lKTsKLQkJCQkJCX0KLQotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogQWx3YXlzIHJlbmRlciBhbnkgb3RoZXIgRW1wdHkgZWxlbWVudHMgKi8KLQkJCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsIEVNUFRZX0FUVFJJQlVURVMpOwotCQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCS8qIFRoZSBUcmFuc2xhdG9yIGlzIGEgbW9yZSBjb21wbGV4IGZlYXR1cmUsIGhhbmRsZSBpdHMgcHJvY2Vzc2luZyByZWN1cnNpdmVseSAqLwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKLQkJCQkJbmV3VGFyZ2V0ID0gKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChqKTsKLQkJCQkJc2VyaWFsaXplKGhhbmRsZXIsIG5ld1RhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgaGludHMpOwotCQkJCX0KLQkJCX0KLQotCQkJLyogRmV0Y2ggdGhlIG5leHQgcGVlciB0cmFuc2xhdG9yICovCi0JCQluZXh0VHJhbnNsYXRvciA9IFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IodHJhbnNsYXRvciwgcHJvY2Vzc2luZ0hpbnRzW1RyYW5zbGF0b3JGaWx0ZXIuTkVYVF9TVEFSVF9ISU5UX0lORFhdLCBwcm9jZXNzaW5nSGludHMsIHRhcmdldCwgdmVyc2lvbik7Ci0KLQkJCWNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5KGhhbmRsZXIsIGhpbnRzLCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBuZXh0VHJhbnNsYXRvciwgdGFyZ2V0LCBtb2ZDaGlsZHJlbik7Ci0KLQkJCS8qCi0JCQkgKiBXZSBuZWVkZWQgdG8gaW52b2tlIGNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5KCkgd2l0aCB0aGUgcGVlciwgbm93IHdlIG1vdmUgb24gdG8KLQkJCSAqIHByb2Nlc3MgdGhhdCBwZWVyCi0JCQkgKi8KLQkJCWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IgPSBuZXh0VHJhbnNsYXRvcjsKLQotCQl9Ci0JCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIHRhcmdldERvbU5hbWUsIHRhcmdldERvbU5hbWUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBET00gUGF0aCBzaG91bGQgYmUgcmVuZGVyZWQuIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwKLQkgKiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBFbXB0eSBYTUwgZWxlbWVudHMgYXJlIHJlbGV2YW50IGFuZCBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgWE1MCi0JICogc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIFRoZSBFTUYgVGFyZ2V0IG9mIHRoZSBUcmFuc2xhdGlvbgotCSAqIEBwYXJhbSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBUcmFuc2xhdG9yCi0JICogQHBhcmFtIG1vZkNoaWxkcmVuCi0JICogICAgICAgICAgICBUaGUgbW9mQ2hpbGRyZW4gdGhhdCB3ZXJlIGZvdW5kIGZvciB0aGUgVHJhbnNsYXRvciBvbiB0aGUgVGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRSZW5kZXJEb21QYXRoKEVPYmplY3QgdGFyZ2V0LCBUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIExpc3QgbW9mQ2hpbGRyZW4pIHsKLQkJcmV0dXJuICAoY3VycmVudENoaWxkVHJhbnNsYXRvci5zaG91bGRSZW5kZXJFbXB0eURPTVBhdGgodGFyZ2V0KSB8fCBtb2ZDaGlsZHJlbi5zaXplKCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBvcGVuRG9tUGF0aElmTmVjZXNzYXJ5IHdpbGwgd3JpdGUgdGhlIGN1cnJlbnQgRE9NIFBhdGggdG8gdGhlIHNlcmlhbGl6YXRpb24gc3RyZWFtIGlmIGl0IGhhcwotCSAqIG5vdCBiZWVuIHdyaXR0ZW4gYnkgYSBwcmV2aW91cyBwZWVyIHRyYW5zbGF0b3IuIFRoZSBwcm9jZXNzaW5nIHJlc3VsdHMgaW4gdGhlIGNvbGxhcHNlIG9mCi0JICogUGVlciBUcmFuc2xhdG9ycyB3aXRoIG1hdGNoaW5nIERPTSBQYXRocyBpbnRvIGEgc2luZ2xlIFhNTCBwYXJlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIENvbnRlbnRIYW5kbGVyIHdoaWNoIGlzIHdyaXRpbmcgdGhlIFhNTCByZXN1bHQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIEEgR2xvYmFsIGNvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBzaW5nbGUgWE1MIGRvY3VtZW50Ci0JICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgVHJhbnNsYXRvciBiZWluZyBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBUaGUgRU1GIFRhcmdldCBvZiB0aGUgVHJhbnNsYXRpb24KLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRG9tUGF0aElmTmVjZXNzYXJ5KENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIFdyaXRlckhpbnRzIGhpbnRzLCBUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIEVPYmplY3QgdGFyZ2V0LCBMaXN0IG1vZkNoaWxkcmVuKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkvKiBJZiB0aGUgdHJhbnNsYXRvciBkb2VzIG5vdCBoYXZlIGEgRE9NIFBhdGgsIHRoZW4gd2UgZG8gbm90aGluZyAqLwotCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5oYXNET01QYXRoKCkgJiYgc2hvdWxkUmVuZGVyRG9tUGF0aCh0YXJnZXQsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIG1vZkNoaWxkcmVuKSkgewotCi0JCQlTdHJpbmcgY2hpbGREb21QYXRoID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0KLQkJCS8qCi0JCQkgKiBJc0RvbVBhdGhBY3RpdmUoKSB3aWxsIHZlcmlmeSB3aGV0aGVyIHRoaXMgRE9NIFBhdGggaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZQotCQkJICogWE1MIHN0cmVhbQotCQkJICovCi0JCQlpZiAoIWhpbnRzLmlzRG9tUGF0aEFjdGl2ZShjaGlsZERvbVBhdGgpKSB7Ci0KLQkJCQkvKgotCQkJCSAqIFdyaXRlIGFuIG9wZW4gZWxlbWVudCBmb3IgdGhlIERPTSBQYXRoIGFuZCAicmVtZW1iZXIiIHRoYXQgd2UgaGF2ZSB3cml0dGVuIGl0Ci0JCQkJICovCi0JCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbVBhdGgsIGNoaWxkRG9tUGF0aCwgRU1QVFlfQVRUUklCVVRFUyk7Ci0JCQkJaGludHMucHVzaERvbVBhdGgoY2hpbGREb21QYXRoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvc2VEb21QYXRoSWZOZWNlc3Nhcnkgd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUgbmV4dCBwZWVyIFRyYW5zbGF0b3Igc2hhcmVzIHRoZSBhY3RpdmUgRE9NCi0JICogUGF0aCBvZiB0aGUgY3VycmVudCBUcmFuc2xhdG9yLiBJZiB0aGUgbmV4dCBwZWVyIFRyYW5zbGF0b3IgaGFzIHRoZSBzYW1lIERPTSBQYXRoLCBubyBhY3Rpb24KLQkgKiB3aWxsIGJlIHRha2VuIChoZW5jZSBjb25kZW5zaW5nIHRoZSBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIFhNTCBwYXJlbnQpLiBIb3dldmVyLCBpZiB0aGUgRE9NCi0JICogUGF0aCBkaWZmZXJzIChpbmNsdWRpbmcgdGhlIE5leHQgUGVlciBUcmFuc2xhdG9yIGhhcyBubyBET00gUGF0aCkgdGhlbiB0aGUgY3VycmVudCBET00gUGF0aAotCSAqIHdpbGwgYmUgY2xvc2VkIChhIGNsb3NlIFhNTCBlbGVtZW50IGlzIGdlbmVyYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaGFuZGxlcgotCSAqICAgICAgICAgICAgVGhlIENvbnRlbnRIYW5kbGVyIHdoaWNoIGlzIHdyaXRpbmcgdGhlIFhNTCByZXN1bHQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIEEgR2xvYmFsIGNvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBzaW5nbGUgWE1MIGRvY3VtZW50Ci0JICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBsYXN0IFRyYW5zbGF0b3IgdG8gaGF2ZSBjb21wbGV0ZWQgcHJvY2Vzc2luZwotCSAqIEBwYXJhbSBuZXh0VHJhbnNsYXRvcgotCSAqICAgICAgICAgICAgVGhlIG5leHQgcGVlciBUcmFuc2xhdG9yIHRoYXQgd2lsbCBiZWNvbWUgYWN0aXZlCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgVGhlIEVNRiBUYXJnZXQgb2YgdGhlIFRyYW5zbGF0aW9uCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VEb21QYXRoSWZOZWNlc3NhcnkoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgV3JpdGVySGludHMgaGludHMsIFRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciwgVHJhbnNsYXRvciBuZXh0VHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIExpc3QgbW9mQ2hpbGRyZW4pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmhhc0RPTVBhdGgoKSAmJiBzaG91bGRSZW5kZXJEb21QYXRoKHRhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgbW9mQ2hpbGRyZW4pKSB7Ci0JCQlTdHJpbmcgY2hpbGREb21QYXRoID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0JCQlpZiAobmV4dFRyYW5zbGF0b3IgIT0gbnVsbCkgeyAvKgotCQkJCQkJCQkJCSAgICogVGhlcmUgYXJlIG1vcmUgcGVlcnMgYWZ0ZXIgdGhpcyBlbGVtZW50LCB3ZSBjYW4gcGVlawotCQkJCQkJCQkJCSAgICogYWhlYWQKLQkJCQkJCQkJCQkgICAqLwotCQkJCVN0cmluZyBuZXh0UGVlckRvbVBhdGggPSBuZXh0VHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0JCQkJaWYgKG5leHRQZWVyRG9tUGF0aCA9PSBudWxsIHx8ICFuZXh0UGVlckRvbVBhdGguZXF1YWxzKGNoaWxkRG9tUGF0aCkpIHsKLQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21QYXRoLCBjaGlsZERvbVBhdGgpOwotCQkJCQloaW50cy5wb3BEb21QYXRoKCk7Ci0JCQkJfQotCi0JCQl9IGVsc2UgeyAvKiBUaGlzIHdhcyB0aGUgbGFzdCBjaGlsZCBlbGVtZW50LCB3ZSBtdXN0IGNsb3NlIHRoZSBkb21wYXRoICovCi0JCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21QYXRoLCBjaGlsZERvbVBhdGgpOwotCQkJCWhpbnRzLnBvcERvbVBhdGgoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFnZ3JlZ2F0ZSB0aGUgQXR0cmlidXRlIHRyYW5zbGF0b3IgY2hpbGRyZW4gZnJvbSBhIGdpdmVuIHRyYW5zbGF0b3IuIFRoaXMgbWV0aG9kIHdpbGwgcmVxdWVzdAotCSAqIHRoZSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgZnJvbSB0aGUgV3JpdGVySGludHMgb2JqZWN0LiBUaGUgV3JpdGVySGludHMgbWFpbnRhaW5zIHRoaXMKLQkgKiByZXVzYWJsZSBjb2xsZWN0aW9uIHRvIGxpbWl0IHRoZSByZXF1aXJlbWVudCBmb3IgbmV3IG9iamVjdCBjcmVhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvcgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiBAcmV0dXJuIGFuIGluaXRpYWxpemVkIHNldCBvZiBBdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gVHJhbnNsYXRvciBhbmQgRU1GIFRhcmdldAotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIFdyaXRlckhpbnRzIGhpbnRzKSB7Ci0KLQkJQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlcyA9IGhpbnRzLmdldEF0dHJpYnV0ZUhvbGRlcigpOwotCQlpbnQgdmVyc2lvbiA9IGhpbnRzLmdldFZlcnNpb24oKTsKLQkJT2JqZWN0IHJhd1ZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGNoaWxkRG9tTmFtZSA9IG51bGw7Ci0JCVRyYW5zbGF0b3IgYXR0cmlidXRlVHJhbnNsYXRvciA9IG51bGw7Ci0JCWludFtdIHByb2Nlc3NpbmdIaW50cyA9IFRyYW5zbGF0b3JGaWx0ZXIuY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCk7Ci0KLQkJd2hpbGUgKChhdHRyaWJ1dGVUcmFuc2xhdG9yID0gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0QXR0cmlidXRlVHJhbnNsYXRvcih0cmFuc2xhdG9yLCBwcm9jZXNzaW5nSGludHNbVHJhbnNsYXRvckZpbHRlci5ORVhUX1NUQVJUX0hJTlRfSU5EWF0sIHByb2Nlc3NpbmdIaW50cywgdGFyZ2V0LCB2ZXJzaW9uKSkgIT0gbnVsbCkgewotCi0JCQlMaXN0IG1vZkNoaWxkcmVuID0gYXR0cmlidXRlVHJhbnNsYXRvci5nZXRNT0ZDaGlsZHJlbih0YXJnZXQpOwotCQkJaWYgKG1vZkNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaisrKSB7Ci0KLQkJCQkJY2hpbGREb21OYW1lID0gYXR0cmlidXRlVHJhbnNsYXRvci5nZXRET01OYW1lKHRhcmdldCk7Ci0JCQkJCXJhd1ZhbHVlID0gbW9mQ2hpbGRyZW4uZ2V0KGopOwotCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IGF0dHJpYnV0ZVRyYW5zbGF0b3IuY29udmVydFZhbHVlVG9TdHJpbmcocmF3VmFsdWUsIHRhcmdldCk7Ci0JCQkJCWNvbnZlcnRlZFZhbHVlID0gWE1MRW5jb2RlckRlY29kZXIuZXNjYXBlKGNvbnZlcnRlZFZhbHVlKTsKLQkJCQkJYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgIlN0cmluZyIsIGNvbnZlcnRlZFZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQljaGlsZERvbU5hbWUgPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQkJCQljb252ZXJ0ZWRWYWx1ZSA9IChTdHJpbmcpIGF0dHJpYnV0ZVRyYW5zbGF0b3IuZ2V0TU9GVmFsdWUodGFyZ2V0KTsKLQkJCQlpZiAoY29udmVydGVkVmFsdWUgIT0gbnVsbCkKLQkJCQkJYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgIlN0cmluZyIsIGNvbnZlcnRlZFZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIFdyaXRlckhpbnRzIGlzIHVzZWQgdG8gInJlbWVtYmVyIiBjZXJ0YWluIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB3aGlsZSB0aGUgd3JpdGVyIGlzCi0JICogcHJvY2Vzc2luZy4gT2YgcGFydGljdWxhciBpbnRlcmVzdCBhcmUgdGhlIHZlcnNpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgRE9NIFBhdGggb3V0cHV0LgotCSAqIENvbnNlY3V0aXZlIGVsZW1lbnRzIHdpdGggY29uc2lzdGVudCAoaWRlbnRpY2FsKSBET00gUGF0aHMgYXJlIGNvbGxhcHNlZCB1bmRlciBhIHNpbmdsZSBYTUwKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIFRoZSBXcml0ZXJIaW50cyBwcm92aWRlcyBnbG9iYWwgc3RhdGUgYmV0d2VlbiByZWN1cnNpdmUgaW52b2NhdGlvbnMgb2Ygc2VyaWFsaXplKCkuIEl0IHNob3VsZAotCSAqIGJlIG5vdCBiZSB1c2VkIHRvIHN0b3JlIGxvY2FsIGRhdGEgKGUuZy4gZGF0YSB0aGF0IGlzIG9ubHkgcmVsZXZhbnQgdG8gYSBzaW5nbGUgVHJhbnNsYXRvciBpbgotCSAqIGEgZ2l2ZW4gY29udGV4dCkuCi0JICogCi0JICogVGhlIFdyaXRlckhpbnRzIGFsc28gc3RvcmVzIGFuIEF0dHJpYnV0ZXNJbXBsIG9iamVjdCB0aGF0IGlzIHJlLXVzZWQgdG8gc3RvcmUgYXR0cmlidXRlcy4gVGhlCi0JICogZ2V0QXR0cmlidXRlcygpIG1ldGhvZCB3aWxsIHJlcXVlc3QgdGhlIEF0dHJpYnV0ZXMgSG9sZGVyLgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZXJIaW50cyB7Ci0JCXByaXZhdGUgZmluYWwgVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlOwotCQlwcml2YXRlIGZpbmFsIFN0YWNrIGRvbVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCXByaXZhdGUgZmluYWwgQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlc0ltcGwgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLQotCQlwdWJsaWMgV3JpdGVySGludHMoVHJhbnNsYXRvclJlc291cmNlIHJlcykgewotCQkJdGhpcy5yZXNvdXJjZSA9IHJlczsKLQkJfQotCi0JCS8qKgotCQkgKiBQdXNoIGEgbmV3IGRvbVBhdGggb250byB0aGUgc3RhY2sKLQkJICogCi0JCSAqIEBwYXJhbSBkb21QYXRoCi0JCSAqICAgICAgICAgICAgYSBET01QYXRoIHdoaWNoIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICovCi0JCXB1YmxpYyB2b2lkIHB1c2hEb21QYXRoKFN0cmluZyBkb21QYXRoKSB7Ci0KLQkJCWlmIChkb21QYXRoICE9IG51bGwgJiYgZG9tUGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJZG9tU3RhY2sucHVzaChkb21QYXRoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQb3AgdGhlIGN1cnJlbnQgZG9tUGF0aCBmcm9tIHRoZSBBcnJheQotCQkgKi8KLQkJcHVibGljIHZvaWQgcG9wRG9tUGF0aCgpIHsKLQotCQkJaWYgKCFkb21TdGFjay5pc0VtcHR5KCkpCi0JCQkJZG9tU3RhY2sucG9wKCk7Ci0JCX0KLQotCQkvKioKLQkJICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gRE9NUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICogCi0JCSAqIEBwYXJhbSBkb21QYXRoCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gRE9NUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIFhNTCBzdHJlYW0KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRG9tUGF0aEFjdGl2ZShTdHJpbmcgZG9tUGF0aCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmICghZG9tU3RhY2suaXNFbXB0eSgpKSB7Ci0KLQkJCQlTdHJpbmcgY3VycmVudERvbVBhdGggPSAoU3RyaW5nKSBkb21TdGFjay5wZWVrKCk7Ci0JCQkJaWYgKGN1cnJlbnREb21QYXRoICE9IG51bGwgJiYgZG9tUGF0aCAhPSBudWxsKQotCQkJCQlyZXN1bHQgPSBjdXJyZW50RG9tUGF0aC5lcXVhbHMoZG9tUGF0aCk7Ci0JCQkJZWxzZSBpZiAoIShjdXJyZW50RG9tUGF0aCA9PSBudWxsIF4gZG9tUGF0aCA9PSBudWxsKSkKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBFTUYgUmVzb3VyY2UKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLQkJCXJldHVybiB0aGlzLnJlc291cmNlLmdldFZlcnNpb25JRCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgYW4gZW1wdHkgQXR0cmlidXRlc0ltcGwgb2JqZWN0IHRvIHN0b3JlIGF0dHJpYnV0ZXMuIFdpdGhpbiB0aGUgY29udGV4dCBvZiBhIGdpdmVuCi0JCSAqIFdyaXRlckhpbnRzIG9iamVjdCAoYW5kIGhlbmNlIHNpbmdsZSBYTUwgZG9jdW1lbnQpLCB0aGUgb2JqZWN0IHJldHVybmVkIGlzIGEgc2luZ2xldG9uLgotCQkgKiBUaGUgc2FtZSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgaXMgY2xlYXJlZCBhbmQgcmV1c2VkIGZvciBlYWNoIGludm9jYXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIGFuIGVtcHR5IEF0dHJpYnV0ZXNJbXBsIG9iamVjdCB0byBzdG9yZSBhdHRyaWJ1dGVzCi0JCSAqLwotCQlwdWJsaWMgQXR0cmlidXRlc0ltcGwgZ2V0QXR0cmlidXRlSG9sZGVyKCkgewotCQkJdGhpcy5hdHRyaWJ1dGVzSW1wbC5jbGVhcigpOwotCQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc0ltcGw7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2IzYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIERlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgTWFwLyo8U3RyaW5nIHNob3J0TmFtZSwgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcj4qLyBkZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7IAotCXByaXZhdGUgTWFwLyo8UmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciwgUmVzb3VyY2UuRmFjdG9yeT4qLyBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlLkZhY3RvcnkgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgVVJJJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsI2dldEZhY3RvcnkoVVJJKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RmlsZU5hbWVGYWN0b3J5KFVSSSB1cmkpIHsKLQotCQlpZih1cmkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih1cmkpOwotCQkJCi0JCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RmFjdG9yeShkZXNjcmlwdG9yKTsJCi0JCQl9CQotCQl9Ci0JCXJldHVybiBudWxsOwotCQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KHVyaSwgbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpLCBTdHJpbmcgY29udGVudFR5cGUpCi0JewotCQlSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IG51bGw7Ci0JCWlmKHVyaSAhPSBudWxsICYmIHVyaS5sYXN0U2VnbWVudCgpICE9IG51bGwpIHsKLQkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpKTsKLQkJCQotCQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VGYWN0b3J5ID0gZ2V0RmFjdG9yeShkZXNjcmlwdG9yKTsJCi0JCQl9CQotCQl9Ci0JCWlmKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKQotCQkJcmVzb3VyY2VGYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeSh1cmksIGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIHJlc291cmNlRmFjdG9yeTsgCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBmaWxlIG5hbWUgcmVwcmVzZW50aW5nIHRoZSBsYXN0IHNlZ21lbnQgb2YgYSBVUkkgd2l0aCB0aGUgY29ycmVzcG9uZGluZwotCSAqIFJlc291cmNlLkZhY3RvcnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KFN0cmluZyBhU2ltcGxlRmlsZU5hbWUsIFJlc291cmNlLkZhY3RvcnkgYUZhY3RvcnkpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoYVNpbXBsZUZpbGVOYW1lKTsKLQkJU3RyaW5nIGxhc3RTZWdtZW50ID0gdXJpLmxhc3RTZWdtZW50KCk7IAotCQlhZGREZXNjcmlwdG9yKG5ldyBTdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKGxhc3RTZWdtZW50LCBhRmFjdG9yeSkpOwkJCi0JfSAKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFVSSSB1cmkpIHsKLQkJcmV0dXJuIChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQodXJpLmxhc3RTZWdtZW50KCkpOwotCX0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIE1hcCBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBzeW5jaHJvbml6ZWQgUmVzb3VyY2UuRmFjdG9yeSBnZXRGYWN0b3J5KFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeyAgCi0JCVJlc291cmNlLkZhY3RvcnkgZmFjdG9yeSA9IChGYWN0b3J5KSBmYWN0b3JpZXMuZ2V0KGRlc2NyaXB0b3IpOwotCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3Rvcmllcy5wdXQoZGVzY3JpcHRvciwgKGZhY3RvcnkgPSBkZXNjcmlwdG9yLmNyZWF0ZUZhY3RvcnkoKSkpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0b3IoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7IAotCQlkZXNjcmlwdG9ycy5wdXQoZGVzY3JpcHRvci5nZXRTaG9ydFNlZ21lbnQoKSwgZGVzY3JpcHRvcik7Ci0JfQotIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvR2VuZXJpY1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0dlbmVyaWNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTRmMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvR2VuZXJpY1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBTcGVjaWFsaXplZCB0cmFuc2xhdG9yIGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBzaW1wbGUgbWFwcGluZ3Mgd2l0aCBubyBzcGVjaWFsaXplZCBiZWhhdmlvci4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGVDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gcGF0aHMKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRocyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIGVDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUcmFuc2xhdG9yW10KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogICAgICAgICAgICBUaGUgY2hpbGRyZW4gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZHJlbihHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yW10gY2hpbGQpIHsKLQkJVHJhbnNsYXRvcltdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOwotCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKLQkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiB0cmFuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZChHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yIGNoaWxkKSB7Ci0JCU9iamVjdFtdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOwotCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKLQkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7Ci0JCXJldHVybiB0cmFuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JRFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjBmN2YwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIElEVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCXB1YmxpYyBjbGFzcyBOb1Jlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODYzMzIwMTI5MTI4ODIzNzUzMEw7Ci0KLQkJcHVibGljIE5vUmVzb3VyY2VFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIE5vUmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgSURfRkVBVFVSRSA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzX0VJREF0dHJpYnV0ZSgpOwotCXN0YXRpYyBmaW5hbCBwdWJsaWMgSURUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IElEVHJhbnNsYXRvcigpOwotCi0JcHVibGljIElEVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoImlkIiwgSURfRkVBVFVSRSwgRE9NX0FUVFJJQlVURSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSkgZW1mT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOwotCQlTdHJpbmcgaWQgPSByZXMuZ2V0SUQoZW1mT2JqZWN0KTsKLQkJaWYgKGlkID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKChpZCAhPSBudWxsICYmICFpZC5lcXVhbHModmFsdWUpKSB8fCAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKGlkKSkpCi0JCQlyZXMuc2V0SUQoZW1mT2JqZWN0LCAoU3RyaW5nKSB2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGVtZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE5vUmVzb3VyY2VFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlcy5nZXRJRChlbWZPYmplY3QpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0lETWFwKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JUm9vdE9iamVjdFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JUm9vdE9iamVjdFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDgxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSVJvb3RPYmplY3RSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJvb3RPYmplY3RSZXNvdXJjZSB7Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0xpbmtVcGRhdGVyVGFyZ2V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9MaW5rVXBkYXRlclRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNkMWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0xpbmtVcGRhdGVyVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTGlua1VwZGF0ZXJUYXJnZXQgZXh0ZW5kcyBPYmplY3QgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rVXBkYXRlclRhcmdldCBJTlNUQU5DRSA9IG5ldyBMaW5rVXBkYXRlclRhcmdldCgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExpbmtVcGRhdGVyTXVsdGlUYXJnZXQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIExpbmtVcGRhdGVyVGFyZ2V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJlZnJlc2hTb3VyY2VPYmplY3RzKG1hcCwgbm9kZSwgbW9mT2JqZWN0LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0YoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmVmcmVzaFNvdXJjZU9iamVjdHMobWFwLCBub2RlLCBtb2ZPYmplY3QsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlT2JqZWN0cyhUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCwgYm9vbGVhbiBkb21VcGRhdGUpIHsKLQkJVHJhbnNsYXRvclBhdGhbXSBwYXRocyA9IG1hcC5nZXRUcmFuc2xhdG9yUGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvclBhdGggcGF0aCA9IHBhdGhzW2ldOwotCQkJTGlzdCBhbGxTb3VyY2VPYmplY3RzID0gcGF0aC5maW5kT2JqZWN0cyhtb2ZPYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsU291cmNlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGN1ck9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlFTUYyRE9NQWRhcHRlciBjdXJBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihjdXJPYmplY3QuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoY3VyQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWlmIChkb21VcGRhdGUpCi0JCQkJCQljdXJBZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCQllbHNlCi0JCQkJCQljdXJBZGFwdGVyLnVwZGF0ZU1PRigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NYXBwZWRYTUlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTQ2YWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwZWRYTUlIZWxwZXIgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLU1BBQ0VfUFJPVE9DT0wgPSAid29ya3NwYWNlOi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MID0gInBsYXRmb3JtOi9yZXNvdXJjZS8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIE5VTExfRkVBVFVSRSA9IG5ldyBVbnN1cHBvcnRlZEZlYXR1cmUoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2luZ01hcHMgPSB0cnVlOwotCXByb3RlY3RlZCBNYXAgY2FjaGVkUmVsYXRpdmVVUklzOwotCXByb3RlY3RlZCBNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hcHBlZFhNTEhlbHBlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgTWFwcGVkWE1JSGVscGVyKFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgcHJlZml4ZXNUb1VSSXMpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQl0aGlzLnByZWZpeGVzVG9VUklzLnB1dEFsbChwcmVmaXhlc1RvVVJJcyk7Ci0JCXB1c2hDb250ZXh0KCk7IC8vTmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRleHQgdG8gemVybwotCQlTZXQga2V5cyA9IHByZWZpeGVzVG9VUklzLmtleVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHVyaSA9IChTdHJpbmcpIHByZWZpeGVzVG9VUklzLmdldChwcmVmaXgpOwotCQkJbmFtZXNwYWNlU3VwcG9ydC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFVSSSByZXNvbHZlKFVSSSByZWxhdGl2ZSwgVVJJIGJhc2UpIHsKLQkJVVJJIHJlc29sdmVkID0gbnVsbDsKLQkJYm9vbGVhbiBpc01hcHBlZCA9IGZhbHNlOwotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJVVJJIGxvY2FscmVzb3VyY2VVUkkgPSBudWxsOwotCQkJaWYgKHJlbGF0aXZlLmhhc0ZyYWdtZW50KCkpCi0JCQkJbG9jYWxyZXNvdXJjZVVSSSA9IHJlbGF0aXZlLnRyaW1GcmFnbWVudCgpOwotCQkJZWxzZQotCQkJCWxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZTsKLQkJCWlzTWFwcGVkID0gISgoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKSBzZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSShsb2NhbHJlc291cmNlVVJJKS5lcXVhbHMobG9jYWxyZXNvdXJjZVVSSSkpOwotCQl9Ci0JCWlmICghaXNNYXBwZWQpIHsKLQkJCWlmIChpc1VzaW5nQ29udGFpbmVyUmVsYXRpdmVQYXRocygpICYmIHNldCAhPSBudWxsKQotCQkJCXJlc29sdmVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShyZWxhdGl2ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvbHZlZCA9IHJlbGF0aXZlOwotCQl9Ci0JCXJldHVybiByZXNvbHZlZCA9PSBudWxsID8gc3VwZXIucmVzb2x2ZShyZWxhdGl2ZSwgYmFzZSkgOiByZXNvbHZlZDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaXNVc2luZ0NvbnRhaW5lclJlbGF0aXZlUGF0aHMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNpbmdDb250YWluZXJSZWxhdGl2ZVBhdGhzKCkgewotCQlyZXR1cm4gKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIHJlc291cmNlKS5nZXRGb3JtYXQoKSA9PSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUgfHwgdXNpbmdNYXBzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCS8qCi0JCSAqIHByb2JsZW0gLSB0aGUgaW5jb21pbmcga2V5IHZhbHVlIHBhaXIgaXMgZWpiYm5kLT5lamJibmQueG1pOyBob3dldmVyLCB0aGUgbWFwIGFscmVhZHkgaGFzCi0JCSAqIGEga2V5IHZhbHVlIHBhaXIgb2YgZWpiYm5kLT5odHRwOi8vL2VqYmJuZC5lY29yZQotCQkgKi8KLQkJaWYgKHVyaS5lbmRzV2l0aCgiLmVjb3JlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdXNpbmdNYXBzID0gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4aXN0aW5nID0gcHJlZml4ZXNUb1VSSXMuZ2V0KHByZWZpeCk7Ci0JCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQlwcmVmaXhlc1RvVVJJcy5wdXQocHJlZml4LCB1cmkpOwotCQkJbmFtZXNwYWNlU3VwcG9ydC5kZWNsYXJlUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJfSBlbHNlIGlmICghZXhpc3RpbmcuZXF1YWxzKHVyaSkpIHsKLQkJCWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLmFkZE9yaWdpbmFsUGFja2FnZVVSSShleGlzdGluZywgdXJpKTsKLQkJCWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnNldEZvcm1hdChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSBnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSBnZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0SFJFRihFT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SFJFRihFT2JqZWN0IG9iaikgewotCQlpZiAoIWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnVzZXNEZWZhdWx0Rm9ybWF0KCkpIHsKLQkJCVVSSUNvbnZlcnRlciBjb252ID0gZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQlpZiAoY29udiAhPSBudWxsICYmIGNvbnYgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSB7Ci0JCQkJU3RyaW5nIGhyZWYgPSBnZXRDb21wYXRpYmxpbHR5SFJFRihvYmosIChDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyKSBjb252KTsKLQkJCQlyZXR1cm4gdXNlV29ya3NwYWNlUHJvdG9jb2xJZk5lY2Vzc2FyeShocmVmKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SFJFRihvYmopOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2VXb3Jrc3BhY2VQcm90b2NvbElmTmVjZXNzYXJ5KFN0cmluZyBocmVmKSB7Ci0JCWlmIChocmVmICE9IG51bGwgJiYgaHJlZi5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkKLQkJCXJldHVybiBXT1JLU1BBQ0VfUFJPVE9DT0wgKyBocmVmLnN1YnN0cmluZygxOSk7Ci0JCXJldHVybiBocmVmOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldENvbXBhdGlibGlsdHlIUkVGKEVPYmplY3Qgb2JqLCBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyIGNvbnYpIHsKLQkJLy9JbXBsZW1lbnRhdGlvbiBjb3BpZWQgZnJvbSBzdXBlci5nZXRIUkVGKEVPYmplY3QpCi0JCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgb2JqOwotCi0JCVVSSSBvYmplY3RVUkkgPSBvLmVQcm94eVVSSSgpOwotCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCVJlc291cmNlIG90aGVyUmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JCQlpZiAob3RoZXJSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJb2JqZWN0VVJJID0gaGFuZGxlRGFuZ2xpbmdIUkVGKG9iaik7Ci0JCQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCW9iamVjdFVSSSA9IG90aGVyUmVzb3VyY2UuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQob3RoZXJSZXNvdXJjZS5nZXRVUklGcmFnbWVudChvYmopKTsKLQkJfQotCi0JCS8vTW9kaWZpZWQgdG8gZGlzcGF0Y2ggYmFjayB0byBVUkkgQ29udmVydGVyCi0JCWlmICghb2JqZWN0VVJJLmlzUmVsYXRpdmUoKSkgewotCQkJb2JqZWN0VVJJID0gbWFrZVJlbGF0aXZlKG9iamVjdFVSSSwgY29udik7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBVUkkgbWFrZVJlbGF0aXZlKFVSSSBvYmplY3RVUkksIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgY29udikgewotCQlVUkkgaW5uZXJPYmplY3RVUkkgPSBvYmplY3RVUkk7Ci0JCVN0cmluZyBmcmFnbWVudCA9IGlubmVyT2JqZWN0VVJJLmZyYWdtZW50KCk7Ci0JCWlubmVyT2JqZWN0VVJJID0gaW5uZXJPYmplY3RVUkkudHJpbUZyYWdtZW50KCk7Ci0JCVVSSSByZWxhdGl2ZSA9IChVUkkpIGdldENhY2hlZFJlbGF0aXZlVVJJcygpLmdldChpbm5lck9iamVjdFVSSSk7Ci0JCWlmIChyZWxhdGl2ZSA9PSBudWxsKSB7Ci0JCQlyZWxhdGl2ZSA9IGNvbnYuZGVOb3JtYWxpemUoaW5uZXJPYmplY3RVUkkpOwotCQkJaWYgKHJlbGF0aXZlLmlzUmVsYXRpdmUoKSkKLQkJCQljYWNoZWRSZWxhdGl2ZVVSSXMucHV0KGlubmVyT2JqZWN0VVJJLCByZWxhdGl2ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlbGF0aXZlLmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJJQ29udmVydGVyIGdldFVSSUNvbnZlcnRlcigpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldENhY2hlZFJlbGF0aXZlVVJJcygpIHsKLQkJaWYgKGNhY2hlZFJlbGF0aXZlVVJJcyA9PSBudWxsKQotCQkJY2FjaGVkUmVsYXRpdmVVUklzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNhY2hlZFJlbGF0aXZlVVJJczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldElEKEVPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJRChFT2JqZWN0IG9iaikgewotCQlpZiAoZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkudXNlc0RlZmF1bHRGb3JtYXQoKSkKLQkJCXJldHVybiBzdXBlci5nZXRJRChvYmopOwotCQlyZXR1cm4gSURVdGlsLmdldE9yQXNzaWduSUQob2JqLCByZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldE5TSW5mbyhFUGFja2FnZSBwa2cpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOwotCQlpZiAocHJlZml4ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde3BrZy5nZXROc1ByZWZpeCgpLCBwa2cuZ2V0TnNVUkkoKX07Ci0JCXJldHVybiBuZXcgU3RyaW5nW117cHJlZml4LCBwcmVmaXggKyAiLnhtaSJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwZWRQcmVmaXgoRVBhY2thZ2UgcGtnKSB7Ci0JCVN0cmluZyBuc1VSSSA9IHBrZy5nZXROc1VSSSgpOwotCQlpZiAodXNpbmdNYXBzIHx8ICFnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS51c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIChTdHJpbmcpIHBhY2thZ2VVUklzVG9QcmVmaXhlcy5nZXQobnNVUkkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBlZFByZWZpeE9yRGVmYXVsdChFUGFja2FnZSBwa2cpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOwotCQlyZXR1cm4gcHJlZml4ID09IG51bGwgPyBwa2cuZ2V0TnNQcmVmaXgoKSA6IHByZWZpeDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgewotCQlyZXR1cm4gcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFja2FnZVVSSXNUb1ByZWZpeGVzCi0JICogICAgICAgICAgICBUaGUgcGFja2FnZVVSSXNUb1ByZWZpeGVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VVUklzVG9QcmVmaXhlcyhNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzKSB7Ci0JCXRoaXMucGFja2FnZVVSSXNUb1ByZWZpeGVzID0gcGFja2FnZVVSSXNUb1ByZWZpeGVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoRUNsYXNzIGMpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKGMpOwotCi0JCWlmICh4bWxNYXAgIT0gbnVsbCkgewotCQkJWE1MUmVzb3VyY2UuWE1MSW5mbyBjbHNJbmZvID0geG1sTWFwLmdldEluZm8oYyk7Ci0KLQkJCWlmIChjbHNJbmZvICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY2xzSW5mby5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCQlyZXR1cm4gZ2V0UU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKLQkJCX0KLQkJfQotCi0JCUVQYWNrYWdlIHAgPSBjLmdldEVQYWNrYWdlKCk7Ci0JCXBhY2thZ2VzLnB1dChwLCBudWxsKTsKLQotCQlpZiAocC5nZXROc1ByZWZpeCgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQgCi0JCQlyZXR1cm4gbmFtZTsKLQotCQkvL01vZGlmaWVkIGZyb20gc3VwZXJjbGFzcwotCQkvL3JldHVybiBwLmdldE5zUHJlZml4KCkgKyAiOiIgKyBuYW1lOwotCQlyZXR1cm4gZ2V0TWFwcGVkUHJlZml4T3JEZWZhdWx0KHApICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI3NldFZhbHVlKEVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSwKLQkgKiAgICAgIE9iamVjdCwgaW50KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLQkJaWYgKGZlYXR1cmUgPT0gTlVMTF9GRUFUVVJFKQotCQkJcmV0dXJuOwotCQlpZiAoIWZlYXR1cmUuaXNUcmFuc2llbnQoKSkgewotCQkJaWYgKHZhbHVlID09IG51bGwgJiYgZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkuaXNQcmltaXRpdmUoKSkKLQkJCQkvL0ZvciBjb21wYXRpYmlsaXR5IHdpdGggTU9GNSB3aGVyZSB0eXBlcyBsaWtlIEludGVnZXIgbWlnaHQgaGF2ZSBiZWVuIHNldAotCQkJCS8vYW5kIHNlcmlhbGl6ZWQgYXMgInhzaTpuaWwiCi0JCQkJcmV0dXJuOwotCi0JCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7Ci0JCX0KLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlciNnZXRGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKLQkJaWYgKFVuc3VwcG9ydGVkRmVhdHVyZS5pc1Vuc3VwcG9ydGVkKGVDbGFzcywgbmFtZSkpCi0JCQlyZXR1cm4gTlVMTF9GRUFUVVJFOwotCQlyZXR1cm4gc3VwZXIuZ2V0RmVhdHVyZShlQ2xhc3MsIG5hbWVzcGFjZVVSSSwgbmFtZSwgaXNFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyI2dldEZlYXR1cmVLaW5kKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBnZXRGZWF0dXJlS2luZChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZSA9PSBOVUxMX0ZFQVRVUkUpCi0JCQlyZXR1cm4gWE1MSGVscGVyLkRBVEFUWVBFX1NJTkdMRTsKLQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL011bHRpT2JqZWN0VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjI2ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aU9iamVjdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gRU1QVFlfVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvcltde307Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgTXVsdGlPYmplY3RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFRyYW5zbGF0b3IgZ2V0RGVsZWdhdGVGb3IoRU9iamVjdCBvKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBUcmFuc2xhdG9yIGdldERlbGVnYXRlRm9yKFN0cmluZyBkb21OYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSk7Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlRm9yKG5vZGVOYW1lLCByZWFkQWhlYWROYW1lKS5jcmVhdGVFTUZPYmplY3Qobm9kZU5hbWUsIHJlYWRBaGVhZE5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbikgewotCQlpZiAobyA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX1RSQU5TTEFUT1JTOwotCQlyZXR1cm4gZ2V0RGVsZWdhdGVGb3IoKEVPYmplY3QpIG8pLmdldENoaWxkcmVuKG8sIHZlcnNpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0RE9NTmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlRm9yKChFT2JqZWN0KSB2YWx1ZSkuZ2V0RE9NTmFtZSh2YWx1ZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFuYWdlZEJ5UGFyZW50KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudEVuZFRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZ2V0RE9NUGF0aCgpKSkgewotCQkJcmV0dXJuIHN1cGVyLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKLQkJfQotCQlUcmFuc2xhdG9yIGRlbGVnYXRlID0gZ2V0RGVsZWdhdGVGb3Iobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5zaG91bGRJbmRlbnRFbmRUYWcobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9OYW1lc3BhY2VUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9OYW1lc3BhY2VUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGNjMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTmFtZXNwYWNlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMTQsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5OYW1lc3BhY2VBZGFwdGVyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgTmFtZXNwYWNlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZSkgewotCQlzdXBlcihkb21OYW1lLCBOYW1lc3BhY2VBZGFwdGVyLk5PVElGSUNBVElPTl9GRUFUVVJFLCBET01fQVRUUklCVVRFKTsKLQkJaW5pdFByZWZpeCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UHJlZml4KCkgewotCQlTdHJpbmcgZE5hbWUgPSBnZXRET01OYW1lKG51bGwpOwotCQlwcmVmaXggPSBkTmFtZS5zdWJzdHJpbmcoRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LlhNTE5TLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIuYWRkTmFtZXNwYWNlKHByZWZpeCwgKFN0cmluZykgdmFsdWUsIGVtZk9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc1NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIGdldE1PRlZhbHVlKGVtZk9iamVjdCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJcmV0dXJuIE5hbWVzcGFjZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwocHJlZml4LCBtb2ZPYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjdW5TZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1blNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCwgZW1mT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2ZlYXR1cmVFeGlzdHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzRGF0YVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYXBGb3IoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoT2JqZWN0IGFGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAoYUZlYXR1cmUgPT0gZmVhdHVyZSkgewotCQkJTmFtZXNwYWNlIG5hbWVzcGFjZSA9IChOYW1lc3BhY2UpIChvbGRWYWx1ZSA9PSBudWxsID8gbmV3VmFsdWUgOiBvbGRWYWx1ZSk7Ci0JCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHByZWZpeC5lcXVhbHMobmFtZXNwYWNlLmdldFByZWZpeCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQ3OWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL09iamVjdFRyYW5zbGF0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyIGV4dGVuZHMgVHJhbnNsYXRvckZpbHRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0VHJhbnNsYXRvckZpbHRlcigpIHsKLQkJc3VwZXIobnVsbCwgLTEpOwotCX0KLQotCXB1YmxpYyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7Ci0JCXN1cGVyKHRyYW5zLCB2ZXJzaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCkgewotCQlpbnQgZm91bmQgPSBzdGFydCArIDE7Ci0JCWZvciAoOyBmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aDsgKytmb3VuZCkgewotCQkJaWYgKCFjaGlsZHJlbltmb3VuZF0uaXNET01BdHRyaWJ1dGUoKSkKLQkJCQlicmVhazsKLQkJfQotCQlmb3VuZCA9IChmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aCkgPyBmb3VuZCA6IC0xOwotCQlyZXR1cm4gZm91bmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlYWRBaGVhZEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDFhMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFJlYWRBaGVhZEhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudERPTU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNoaWxkRE9NTmFtZTsKLQotCXB1YmxpYyBSZWFkQWhlYWRIZWxwZXIoU3RyaW5nIHBhcmVudERPTU5hbWUsIFN0cmluZ1tdIHZhbHVlcywgU3RyaW5nIGNoaWxkRE9NTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhcmVudERPTU5hbWUgPSBwYXJlbnRET01OYW1lOwotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsKLQkJdGhpcy5jaGlsZERPTU5hbWUgPSBjaGlsZERPTU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRET01OYW1lKCkgewotCQlyZXR1cm4gY2hpbGRET01OYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudERPTU5hbWUoKSB7Ci0JCXJldHVybiBwYXJlbnRET01OYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZERPTU5hbWUoU3RyaW5nIHN0cmluZykgewotCQljaGlsZERPTU5hbWUgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudERPTU5hbWUoU3RyaW5nIHN0cmluZykgewotCQlwYXJlbnRET01OYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLQkJdmFsdWVzID0gc3RyaW5nczsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIG5vZGVWYWx1ZUlzUmVhZEFoZWFkTmFtZShTdHJpbmcgbm9kZU5hbWUpIHsKLQotCQlyZXR1cm4gKGNoaWxkRE9NTmFtZSAhPSBudWxsKSA/IGNoaWxkRE9NTmFtZS5lcXVhbHMobm9kZU5hbWUpIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbm9kZU5hbWVJc1JlYWRBaGVhZE5hbWUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobm9kZU5hbWUuZXF1YWxzKHZhbHVlc1tpXSkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0ODE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUmVmZXJlbmNlZFJlc291cmNlIGV4dGVuZHMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIHsKLQkvL1RPRE8gLSByZW5hbWUgcGFja2FnZWQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX1dBU19TQVZFRCA9IDYwMTsKLQkKLQkvKioKLQkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBpcyBhYm91dAotCSAqIHRvIHNhdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRSA9IDYwMjsKLQkKLQkvKioKLQkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBoYXMgZmFpbGVkCi0JICogdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9TQVZFX0ZBSUxFRCA9IDYwMzsKLQotCS8qKgotCSAqIEFjY2VzcyB0aGlzIHJlc291cmNlIGZvciByZWFkIG9ubHkuIFRoaXMgY2FsbCBpbmNyZW1lbnRzIHRoZSB1c2UgcmVhZCBjb3VudCBvZiB0aGlzIHJlc291cmNlLgotCSAqIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgdXNlIHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAotCSAqIHJlbGVhc2VGcm9tUmVhZCgpIGFmdGVyIHRoZXkgYXJlIGRvbmUgbW9kaWZ5aW5nIHRoaXMgcmVzb3VyY2UuCi0JICovCi0Jdm9pZCBhY2Nlc3NGb3JSZWFkKCk7Ci0KLQkvKioKLQkgKiBBY2Nlc3MgdGhpcyByZXNvdXJjZSBmb3Igd3JpdGUgb25seS4gVGhpcyBjYWxsIGluY3JlbWVudHMgdGhlIHVzZSB3cml0ZSBjb3VudCBvZiB0aGlzCi0JICogcmVzb3VyY2UuIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgbW9kaWZ5IHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAotCSAqIHJlbGVhc2VGcm9tV3JpdGUoKSBhZnRlciB0aGV5IGFyZSBkb25lIG1vZGlmeWluZyB0aGlzIHJlc291cmNlLgotCSAqLwotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgaGFzIGp1c3QgYmVlbiBsb2FkZWQgYW5kIG5vdCB5ZXQgYWNjZXNzZWQgZm9yIHJlYWQgb3Igd3JpdGUuCi0JICovCi0JYm9vbGVhbiBpc05ldygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGFueSB3cml0ZSByZWZlcmVuY2VzLgotCSAqLwotCWJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBzaGFyZWQgZm9yIHJlYWQgb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGlzIHNoYXJlZCBmb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQotCS8qKgotCSAqIFJlbGVhc2UgcmVhZCB0aGUgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMgY2FsbCBkZWNyZW1lbnRzIHRoZSB1c2UgY291bnQgb2YgdGhpcyByZXNvdXJjZQotCSAqIGFuZCB3aWxsIHJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSBpdHMgcmVzb3VyY2Ugc2V0IGlmIHRoZSB1c2UgY291bnQgZ29lcyB0byAwLiBDbGllbnRzIHNob3VsZAotCSAqIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGV5IGFyZSBkb25lIGFjY2Vzc2luZyB0aGUgcmVzb3VyY2UgYW5kIG9ubHkgYWZ0ZXIgdGhleSBoYXZlIGNhbGxlZAotCSAqIGFjY2Vzc0ZvclJlYWQoKSB0byBvYnRhaW4gYWNjZXNzLgotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHdyaXRlIHRoZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVGhpcyBjYWxsIGRlY3JlbWVudHMgdGhlIHdyaXRlIGNvdW50IG9mIHRoaXMKLQkgKiByZXNvdXJjZSBhbmQgd2lsbCByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gaXRzIHJlc291cmNlIHNldCBpZiB0aGUgdXNlIGNvdW50IGdvZXMgdG8gMC4KLQkgKiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhleSBhcmUgZG9uZSBhY2Nlc3NpbmcgdGhlIHJlc291cmNlIGFuZCBvbmx5IGFmdGVyIHRoZXkKLQkgKiBoYXZlIGNhbGxlZCBhY2Nlc3NGb3JXcml0ZSgpIHRvIG9idGFpbiBhY2Nlc3MuCi0JICovCi0Jdm9pZCByZWxlYXNlRnJvbVdyaXRlKCk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGlzIHJlc291cmNlIG9ubHkgaWYgdGhlIHdyaXRlIGNvdW50IGlzIGVxdWFsIHRvIDEuCi0JICovCi0Jdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBkaXJ0eSBhbmQgaXMgbm90IHNoYXJlZCBmb3Igd3JpdGUuCi0JICovCi0JYm9vbGVhbiBuZWVkc1RvU2F2ZSgpOwotCi0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHdlIHNob3VsZCBhbGxvdyBhIHJlZnJlc2ggdG8gdGFrZSBwbGFjZSBldmVuIHdoZW4gdGhpcyByZXNvdXJjZSBpcyBkaXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXZvaWQgc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4gYik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBzaG91bGQgYWxsb3cgYSByZWZyZXNoIHRvIHRha2UgcGxhY2UgZXZlbiB3aGVuIHRoaXMgcmVzb3VyY2UgaXMgZGlydHkuCi0JICovCi0JYm9vbGVhbiBzaG91bGRGb3JjZVJlZnJlc2goKTsKLQotCWJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvcGVuIHJlYWQgYWNjZXNzZXMgb24gdGhpcyByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0UmVhZENvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3BlbiB3cml0ZSBhY2Nlc3NlcyBvbiB0aGlzIHJlc291cmNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRXcml0ZUNvdW50KCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGJlaW5nIGFjY2Vzc2VkLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSByZXNvdXJjZSBzZXQuCi0JICovCi0Jdm9pZCB1bmxvYWRJZk5lY2Vzc2FyeSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5ZmU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXM7Ci0JcHJvdGVjdGVkIExpc3QgbG9jYWxBZGFwdGVyRmFjdG9yaWVzOwotCi0JLyoqCi0JICogUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSBhIG5ldyBSZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGwjY3JlYXRlUmVzb3VyY2UoVVJJKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlcyA9IGRvQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJYWRhcHROZXcocmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdE5ldyhSZXNvdXJjZSByZXMpIHsKLQkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJZmFjdG9yeS5hZGFwdEFsbE5ldyhyZXMpOwotCQkJfQotCQl9Ci0JCWlmIChsb2NhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCWZhY3RvcnkuYWRhcHRBbGxOZXcocmVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBsb2NhbCBhZGFwdGVyIGZhY3RvcnkgaXMgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeW91IHVzZSB0byBvbmx5IGFkYXB0IHRoZSByZXNvdXJjZQotCSAqIHNwZWNpZmljIHRvIHRoZSBSZXNvdXJjZUZhY3RvcnkgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKQotCQkJbG9jYWxBZGFwdGVyRmFjdG9yaWVzLnJlbW92ZShmYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBBIGdsb2JhbCBhZGFwdGVyIGZhY3Rvcnkgd2lsbCBiZSB1c2VkIHRvIGFkYXB0IGFueSByZXNvdXJjZSBjcmVhdGVkIGJ5IGFueSBSZXNvdXJjZUZhY3RvcnkKLQkgKiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRHbG9iYWxBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWlmIChnbG9iYWxBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpCi0JCQlnbG9iYWxBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUdsb2JhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkKLQkJCWdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMucmVtb3ZlKGZhY3RvcnkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RlMjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZWRSZXNvdXJjZSB7Ci0JLy9UT0RPIEFkZCB0b1N0cmluZyBob29rCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPX1NUUklORyA9ICJSZWZlcmVuY2VkWE1JUmVzb3VyY2UsIGZpbGUgPSAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09VTlRfVE9fU1RSSU5HID0gIiBSPSAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPVU5UX1RPX1NUUklORyA9ICIgVz0gIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgcmVhZFJlZmVyZW5jZUNvdW50ID0gMTsKLQlwcml2YXRlIGludCBlZGl0UmVmZXJlbmNlQ291bnQgPSAwOwotCXByb3RlY3RlZCBib29sZWFuIGlzTmV3ID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZVJlZnJlc2g7Ci0JCi0JICBwdWJsaWMgc3RhdGljIGNsYXNzIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdCBleHRlbmRzIEVBZGFwdGVyTGlzdAotCSAgewotCi0JICAgIC8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc4NTU0MzgzMzkxODc1NDA3MThMOwotCi0JCXB1YmxpYyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCXN1cGVyKG5vdGlmaWVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLmFkZChvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN1cGVyLmFkZChpbmRleCwgb2JqZWN0KTsKLQkgICAgfQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkgICAgfQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpCi0JICAgIHsKLQkgICAgIHN1cGVyLmNsZWFyKCk7Ci0JICAgIH0KLQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5zZXQoaW5kZXgsIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbW92ZShpbnQgbmV3UG9zaXRpb24sIGludCBvbGRQb3NpdGlvbikKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2xkUG9zaXRpb24pOwotCSAgICB9Ci0JICB9Ci0KLQkgCi0JLyoqCi0JICogUmVmZXJlbmNhYmxlWE1JUmVzb3VyY2VJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2dldFJlYWRDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRSZWFkQ291bnQoKSB7Ci0JCXJldHVybiByZWFkUmVmZXJlbmNlQ291bnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjZ2V0V3JpdGVDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRXcml0ZUNvdW50KCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50OwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvclJlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JSZWFkKCkgewotCQljaGVja0RlbGV0ZWQoKTsKLQkJaWYgKCFpc05ldygpKQotCQkJcmVhZFJlZmVyZW5jZUNvdW50Kys7Ci0JCWlzTmV3ID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JXcml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCQljaGVja0RlbGV0ZWQoKTsKLQkJZWRpdFJlZmVyZW5jZUNvdW50Kys7Ci0JCWlmIChpc05ldykKLQkJCXJlbGVhc2VGcm9tUmVhZCgpOwotCQlpc05ldyA9IGZhbHNlOwotCQlpZiAoIWlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSkKLQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhpcyByZXNvdXJjZSBoYXMgYmVlbiByZW1vdmVkIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgZG9lcyBub3QgaGF2ZSBhCi0JICogUmVzb3VyY2VTZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tEZWxldGVkKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oREVMRVRFRF9FUlJPUl9NU0cpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb2xsZWN0Q29udGFpbmVkT2JqZWN0cyhqYXZhLnV0aWwuTGlzdCBjb2xsZWN0aW5nLCBFT2JqZWN0IHBhcmVudE9iamVjdCkgewotCi0JCWphdmEudXRpbC5JdGVyYXRvciBjaGlsZHJlbiA9IHBhcmVudE9iamVjdC5lQ29udGVudHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGNoaWxkcmVuLm5leHQoKTsKLQkJCWNvbGxlY3RpbmcuYWRkKGNoaWxkKTsKLQkJCWNvbGxlY3RDb250YWluZWRPYmplY3RzKGNvbGxlY3RpbmcsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnN1cmVGdWxsSURIeWRyYXRpb24oKSB7Ci0JCUxpc3QgYWxsUmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3Igcm9vdE9iamVjdHMgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyb290T2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcm9vdE9iamVjdHMubmV4dCgpOwotCQkJYWxsUmVmT2JqZWN0cy5hZGQoY2hpbGQpOwotCQkJY29sbGVjdENvbnRhaW5lZE9iamVjdHMoYWxsUmVmT2JqZWN0cywgY2hpbGQpOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGFsbFJlZk9iamVjdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotCQkJSURVdGlsLmFzc2lnbklEKChFT2JqZWN0KSBpdGVyLm5leHQoKSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBiZWluZyBhY2Nlc3NlZCwgdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHVubG9hZElmTmVjZXNzYXJ5KCkgewotCQlpZiAoKGdldFRvdGFsUmVmZXJlbmNlQ291bnQoKSA8PSAwKSB8fCAoZWRpdFJlZmVyZW5jZUNvdW50IDw9IDAgJiYgaXNNb2RpZmllZCgpKSkKLQkJCXVubG9hZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHdyaXRlIGFjY2Vzc2VzIHRvIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VG90YWxSZWZlcmVuY2VDb3VudCgpIHsKLQkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudCArIHJlYWRSZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzTmV3Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0JCXJldHVybiBpc05ldzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzUmVhZE9ubHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50IDw9IDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc1NoYXJlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gZ2V0VG90YWxSZWZlcmVuY2VDb3VudCgpID4gMTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI2lzU2hhcmVkRm9yV3JpdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlyZXR1cm4gZWRpdFJlZmVyZW5jZUNvdW50ID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNwcmVEZWxldGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNyZWxlYXNlRnJvbVJlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCXJlYWRSZWZlcmVuY2VDb3VudC0tOwotCQlpZiAocmVhZFJlZmVyZW5jZUNvdW50IDwgMCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWFkIHJlZmVyZW5jZSBjb3VudCBlcnJvcjogICIgKyB0aGlzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXVubG9hZElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNyZWxlYXNlRnJvbVdyaXRlCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKLQkJZWRpdFJlZmVyZW5jZUNvdW50LS07Ci0JCWlmIChlZGl0UmVmZXJlbmNlQ291bnQgPCAwKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldyaXRlIHJlZmVyZW5jZSBjb3VudCBlcnJvcjogICIgKyB0aGlzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXVubG9hZElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNzYXZlSWZOZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1NoYXJlZEZvcldyaXRlKCkpIC8vIGNhbGxlciBpcyB0aGUgb25seSByZWZlcmVuY2VyCi0JCQlzYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRPX1NUUklORyArIGdldFVSSSgpLnRvU3RyaW5nKCkgKyBSRUFEX0NPVU5UX1RPX1NUUklORyArIG5ldyBJbnRlZ2VyKHJlYWRSZWZlcmVuY2VDb3VudCkgKyBXUklURV9DT1VOVF9UT19TVFJJTkcgKyBuZXcgSW50ZWdlcihlZGl0UmVmZXJlbmNlQ291bnQpOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjbmVlZHNUb1NhdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzVG9TYXZlKCkgewotCQlyZXR1cm4gaXNNb2RpZmllZCgpICYmICFpc1NoYXJlZEZvcldyaXRlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNzZXRGb3JjZVJlZnJlc2goYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVJlZnJlc2goYm9vbGVhbiBiKSB7Ci0JCWZvcmNlUmVmcmVzaCA9IGI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2Ujc2hvdWxkRm9yY2VSZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRGb3JjZVJlZnJlc2goKSB7Ci0JCXJldHVybiBmb3JjZVJlZnJlc2g7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNEb0xvYWQoSW5wdXRTdHJlYW0gYXJnMCwgTWFwIGFyZzEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaXNUcmFja2luZ01vZHMgPSBpc1RyYWNraW5nTW9kaWZpY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQkJc3VwZXIuYmFzaWNEb0xvYWQoYXJnMCwgYXJnMSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9VbmxvYWQoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvVW5sb2FkKCkgewotCQkKLQkJdHJ5IHsKLQkJCS8vIFVzaW5nIGxvYWQgbG9jayB0byBlbnN1cmUgbm8gb3RoZXIgdGhyZWFkcyB3aWxsIGF0dGVtcHQgYSBsb2FkIGR1cmluZyB0aGUgdW5sb2FkIHByb2Nlc3MKLQkJCWFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCk7Ci0JCQl3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotCQkJCi0JCQlpZiAoaXNUcmFja2luZ01vZGlmaWNhdGlvbigpICYmIGVkaXRSZWZlcmVuY2VDb3VudCA8IDEpIC8vZG8gbm90IHR1cm4gb2ZmIG1vZGlmaWNhdGlvbiBpZgotCQkJCS8vIHdlIHN0aWxsIGhhdmUgYSB3cml0ZSBjb3VudAotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXN1cGVyLmRvVW5sb2FkKCk7Ci0JCQlzZXRGb3JjZVJlZnJlc2goZmFsc2UpOwotCQkJc2V0TW9kaWZpZWQoZmFsc2UpOyAvL2RjYiAtIHRoaXMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgcmVzb3VyY2VzIHdpdGhvdXQgZmlsZXMgYXJlCi0JCQkvLyBtYXJrZWQgYXMgbm90IG1vZGlmaWVkLgotCQkJaWYgKHJlYWRSZWZlcmVuY2VDb3VudCA9PSAwICYmIGVkaXRSZWZlcmVuY2VDb3VudCA9PSAwICYmIGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCWdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHRoaXMpOwotCQkJfQotCQkKLQkJfSBmaW5hbGx5IHsKLQkJCS8vUmVtb3ZpbmcgdGhlIGxvYWQgbG9jawotCQkJcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQkJCi0JfQotCi0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgaGFzIGJlZW4gdW5sb2FkZWQsIGFuZCB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcy4gVHJlYXQgdGhlIHJlc291cmNlIGxpa2UgYSBuZXcKLQkgKiBSZXNvdXJjZQotCSAqLwotCS8vIG5ldmVyIHVzZWQKLS8vCXByaXZhdGUgdm9pZCByZXNldEFzTmV3KCkgewotLy8JCXJlYWRSZWZlcmVuY2VDb3VudCA9IDE7Ci0vLwkJaXNOZXcgPSB0cnVlOwotLy8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2Ujc2F2ZShPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbm90aWZ5QWJvdXRUb1NhdmUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLnNhdmUob3B0aW9ucyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBub3RpZnlTYXZlRmFpbGVkKCk7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIEVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVNhdmVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2F2ZWQoKSB7Ci0JCW5vdGlmeVNhdmVFdmVudChSRVNPVVJDRV9XQVNfU0FWRUQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBYm91dFRvU2F2ZSgpIHsKLSAgICAgICAgbm90aWZ5U2F2ZUV2ZW50KFJFU09VUkNFX0FCT1VUX1RPX1NBVkUpOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTYXZlRmFpbGVkKCkgewotICAgICAgICBub3RpZnlTYXZlRXZlbnQoUkVTT1VSQ0VfU0FWRV9GQUlMRUQpOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5U2F2ZUV2ZW50KGludCBldmVudFR5cGUpIHsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCSAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9Ci0JCQluZXcgTm90aWZpY2F0aW9uSW1wbChldmVudFR5cGUsIHRoaXMsIHRoaXMpCi0JCQl7Ci0JCQkgIEBPdmVycmlkZQotCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpCi0JCQkgIHsKLQkJCQlyZXR1cm4gUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC50aGlzOwotCQkJICB9Ci0JCQkgIEBPdmVycmlkZQotCQkJcHVibGljIGludCBnZXRGZWF0dXJlSUQoQ2xhc3MgZXhwZWN0ZWRDbGFzcykKLQkJCSAgewotCQkJCXJldHVybiBldmVudFR5cGU7Ci0JCQkgIH0KLQkJCX07Ci0JCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlZmVyZW5jZWRSZXNvdXJjZSN3YXNSZXZlcnRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0IGVBZGFwdGVycygpCi0JICB7Ci0JICAgIGlmIChlQWRhcHRlcnMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVBZGFwdGVycyA9ICBuZXcgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQWRhcHRlcnM7Ci0JICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWMzN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUgYXBpIGZvciByZW5kZXJpbmcgYW4gRU1GIG9iamVjdCB0byBYTUwgYW5kIHZpY2UgdmVyc2EKLSAqLwotcHVibGljIGludGVyZmFjZSBSZW5kZXJlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhQX1NDSEVNQV9MQU5HVUFHRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hTGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXM0NfWE1MX1NDSEVNQSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLQotCXZvaWQgc2V0UmVzb3VyY2UoVHJhbnNsYXRvclJlc291cmNlIGFSZXNvdXJjZSk7Ci0KLQlUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsKLQotCXZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCWJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCk7Ci0KLQl2b2lkIHByZXBhcmVUb0FkZENvbnRlbnRzKCk7Ci0KLQlpbnQgZ2V0VmVyc2lvbklEKCk7Ci0KLQlib29sZWFuIGlzTW9kaWZpZWQoKTsKLQotCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKLQotCXZvaWQgYWNjZXNzRm9yUmVhZCgpOwotCi0Jdm9pZCByZWxlYXNlRnJvbVJlYWQoKTsKLQotCXZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpOwotCi0Jdm9pZCBwcmVEZWxldGUoKTsKLQotCXZvaWQgcHJlVW5sb2FkKCk7Ci0KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKLQotCXZvaWQgc2V0QmF0Y2hNb2RlKGJvb2xlYW4gaXNCYXRjaCk7Ci0JCi0JYm9vbGVhbiBpc0JhdGNoTW9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2YzA1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIGFic3RyYWN0IFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQotCXByaXZhdGUgc3RhdGljIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGRlZmF1bHRIYW5kbGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpbmcgPSB0cnVlOwotCi0JLyoqCi0JICogSW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiB1c2UgdGhlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBOb3RpZmllciBOb3RpZmljYXRpb25FbmdpbmUgPSBOb3RpZmllci5JTlNUQU5DRTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgewotCQlpZiAoZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9PSBudWxsKQotCQkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGdldERlZmF1bHRIYW5kbGVyKCkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOwotCQlyZXR1cm4gZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuXG4qKipTZXR0aW5nIGZhY3Rvcnk6ICIgKyBmYWN0b3J5KTsKLQkJTm90aWZpY2F0aW9uRW5naW5lLm5vdGlmeUxpc3RlbmVycyhmYWN0b3J5KTsKLQkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSZW5kZXJlckZhY3RvcnkgaW5zdGFuY2U6ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm90aWZpZXIgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE5vdGlmaWVyIElOU1RBTkNFID0gbmV3IE5vdGlmaWVyKCk7Ci0KLQkJLy8gdXNlIGEgV2Vha0hhc2hNYXAgZm9yIGEgd2VhayBIYXNoU2V0Ci0JCXByaXZhdGUgZmluYWwgTWFwIHJlc291cmNlRmFjdG9yeUxpc3RlbmVycyA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgTm90aWZpZXIoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoUmVuZGVyZXJGYWN0b3J5IHJlbmRlcmVyRmFjdG9yeSkgewotCi0JCQlmaW5hbCBpbnQgbGVuZ3RoID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLnNpemUoKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZnlpbmcgIiArIGxlbmd0aCArICIgbGlzdGVuZXJzIik7Ci0KLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBTaW5jZSB0aGUgcmVuZGVyZXIgZmFjdG9yaWVzIGFyZSBzaW5nbGV0b25zLCB0aGlzIHJlZmVyZW5jZSBjaGVjayBzaG91bGQgYWx3YXlzCi0JCQkJICogd29yawotCQkJCSAqLwotCQkJCWlmIChyZW5kZXJlckZhY3RvcnkgIT0gUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkgewotCQkJCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlRmFjdG9yeUxpc3RlbmVycykgewotCQkJCQkJZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTm90aWZ5aW5nIExpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQkJCQkJCWxpc3RlbmVyLnVwZGF0ZVJlbmRlcmVyRmFjdG9yeShyZW5kZXJlckZhY3RvcnkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbCkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBsaXN0ZW5lcjogIiArIGwpOwotCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMucHV0KGwsIG51bGwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXJUb1JlbW92ZSkgewotCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyVG9SZW1vdmUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLQkJdm9pZCB1cGRhdGVSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IG5ld1JlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKLQkJcmV0dXJuIHZhbGlkYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgewotCQl2YWxpZGF0aW5nID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBnZXREZWZhdWx0SGFuZGxlcigpIHsKLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpCi0JCQlkZWZhdWx0SGFuZGxlciA9IEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5JTlNUQU5DRTsKLQkJcmV0dXJuIGRlZmF1bHRIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBoYW5kbGVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRIYW5kbGVyKFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzVkZjRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgewotCi0JUmVuZGVyZXJGYWN0b3J5IGdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YjUxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgewotCQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXNjcmlwdG9yIGlzIGFwcGxpY2FibGUgdG8gdGhlIGdpdmVuIGZpbGVVUkkuCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBkZWNsYXJlcyBhIHJlc291cmNlIGZhY3RvcnkgYXBwbGljYWJsZSB0byB0aGUgZ2l2ZW4gVVJJLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnRlbnRUeXBlIGlzIG9uZSBvcHRpb25hbCB3YXkgdGhhdCBhIFJlc291cmNlRmFjdG9yeQotCSAqIG1pZ2h0IGFwcGx5IHRvIGEgVVJJLiBDbGllbnRzIHNob3VsZCBjYWxsIHtAbGluayBpc0VuYWJsZWRGb3J9IAotCSAqIGluc3RlYWQgb2YgY29tcGFyaW5nIHRoZSBjb250ZW50IFR5cGVzIHdoZW4gc2VhcmNoaW5nIGZvciBhbgotCSAqIGFwcGxpY2FibGUgZGVzY3JpcHRvciBmcm9tIGEgc2V0LiAgCi0JICogCi0JICogPHA+PGI+U3ViY2xhc3NlcyBtYXkgcmV0dXJuIG51bGwuKG9wdGlvbmFsKTwvYj48L3A+Ci0JICogIAotCSAqIEByZXR1cm4gVGhlIGNvbnRlbnQgdHlwZSB0aGF0IHRoaXMgZGVzY3JpcHRvciBpcyBhcHBsaWNhYmxlIHRvLgotCSAqLwotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEluIHRoZSBjYXNlIHdoZXJlIG1vcmUgdGhhbiBvbmUgZmFjdG9yeSBpcyBkZWZpbmVkIGZvciB0aGUgc2FtZSBmaWxlTmFtZSwgCi0JICogYW5kIGNyZWF0aW9uIGlzIHBhc3NlZCBhIHVyaSBvbmx5IGEgZGVmYXVsdCBmYWN0b3J5IGlzIG5lZWRlZAotCSAqIAotCSAqICAKLQkgKiBAcmV0dXJuIFRoZSBib29sZWFuIGRlc2NyaWJpbmcgdGhlIGRlZmF1bHQgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIHNob3J0IHNlZ21lbnQgaXMgb25lIHBvc3NpYmxlIHdheSB0aGF0IGEgUmVzb3VyY2VGYWN0b3J5Ci0JICogbWlnaHQgYXBwbHkgdG8gYSBVUkkuIENsaWVudHMgc2hvdWxkIGNhbGwge0BsaW5rIGlzRW5hYmxlZEZvcn0gCi0JICogaW5zdGVhZCBvZiBjb21wYXJpbmcgdGhlIHNob3J0IHNlZ21lbnRzIHdoZW4gc2VhcmNoaW5nIGZvciBhbgotCSAqIGFwcGxpY2FibGUgZGVzY3JpcHRvciBmcm9tIGEgc2V0LiAgCi0JICogCi0JICogPHA+PGI+U3ViY2xhc3NlcyBtYXkgTk9UIHJldHVybiBudWxsIHVubGVzcyB0aGV5IGFsc28gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI2hhc2hDb2RlKCl9IGFuZCB7QGxpbmsgI2VxdWFscyhPYmplY3QpfS48L2I+PC9wPgotCSAqICAKLQkgKiBAcmV0dXJuIFRoZSBzaG9ydCBzZWdtZW50IHRoYXQgdGhpcyBkZXNjcmlwdG9yIGlzIGFwcGxpY2FibGUgdG8uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKTsKLQkKLQkKLQkvKioKLQkgKiBUaGUgY29ycmVjdCBpbnN0YW5jZSBvZiBSZXNvdXJjZS5GYWN0b3J5LiBUaGUgaW5zdGFuY2UgcmV0dXJuZWQKLQkgKiBtYXkgb3IgbWF5IG5vdCBiZSB1bmlxdWUsIHNvIGlmIHlvdSByZXF1aXJlIHRoZSBzYW1lIGluc3RhbmNlIAotCSAqIGZvciBlYWNoIGNhbGwsIHlvdSBzaG91bGQgY2FjaGUgdGhlIHZhbHVlIHJldHVybmVkIHRoZSBmaXJzdAotCSAqIHRpbWUgZnJvbSB0aGlzIG1ldGhvZC4gCi0JICogCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBSZXNvdXJjZS5GYWN0b3J5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSZXNvdXJjZS5GYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0U2hvcnRTZWdtZW50KCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKG8gaW5zdGFuY2VvZiBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKQotCQkJcmV0dXJuIGdldFNob3J0U2VnbWVudCgpLmVxdWFscygoKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpbykuZ2V0U2hvcnRTZWdtZW50KCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUm9vdFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jvb3RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmEyZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUm9vdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgUm9vdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSb290VHJhbnNsYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gZUNsYXNzCi0JICovCi0JcHVibGljIFJvb3RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKE5vdGlmaWVyLCBPYmplY3QsIGludCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkuYWRkKG5ld0luZGV4LCAoRU9iamVjdCl2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNyZW1vdmVNT0ZWYWx1ZShOb3RpZmllciwgT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZU1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkucmVtb3ZlKHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShSZXNvdXJjZSByZXMsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmVzICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZCgoRU9iamVjdCl2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc011bHRpVmFsdWVkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1NvdXJjZUxpbmtUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MWUwZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUxpbmtUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIFNvdXJjZUxpbmtUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgU291cmNlTGlua1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGgpOwotCQlmU3R5bGUgfD0gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFNvdXJjZUxpbmtUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQotCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQlpZiAoc3RyVmFsdWUgIT0gbnVsbCkKLQkJCS8vIEZpbmQgdGhlIG9iamVjdCB3aXRoIHRoZSBuYW1lIHRoYXQgbWF0Y2hlcyBtYXRjaE5hbWUKLQkJCXZhbHVlID0gZlRyYW5zbGF0b3JQYXRoc1swXS5maW5kT2JqZWN0KG93bmVyLCBzdHJWYWx1ZS50cmltKCkpOwotCQlpZiAoKGZTdHlsZSAmIFRyYW5zbGF0b3IuU1RSSU5HX1JFU1VMVF9PSykgIT0gMCkKLQkJCXJldHVybiAoKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBzdHJWYWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlUcmFuc2xhdG9yUGF0aCBwYXRoID0gZlRyYW5zbGF0b3JQYXRoc1swXTsKLQkJT2JqZWN0IGF0dHJWYWx1ZSA9IHBhdGguZ2V0TGFzdE1hcCgpLmdldE1PRlZhbHVlKChFT2JqZWN0KSB2YWx1ZSk7Ci0JCXJldHVybiBwYXRoLmdldExhc3RNYXAoKS5jb252ZXJ0VmFsdWVUb1N0cmluZyhhdHRyVmFsdWUsIG93bmVyKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1N0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1N0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmNDZmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9TdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIERlY2xhcmVzIGEgc3ViY2xhc3MgdG8gY3JlYXRlIFJlc291cmNlLkZhY3RvcnkoaWVzKSBmcm9tIGFuIGV4dGVuc2lvbi4gCi0gKi8KLWNsYXNzIFN0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIHsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzaG9ydFNlZ21lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZS5GYWN0b3J5IGZhY3Rvcnk7Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNob3J0U2VnbWVudCBBIG5vbi1udWxsIG5hbWUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmYWN0b3J5Ci0JICogQHBhcmFtIGZhY3RvcnkgQSBub24tbnVsbCBSZXNvdXJjZS5GYWN0b3J5IHRoYXQgY2FuIGxvYWQgZmlsZXMgb2YgdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcihTdHJpbmcgc2hvcnRTZWdtZW50LCBSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzaG9ydFNlZ21lbnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnkpOwotCQl0aGlzLnNob3J0U2VnbWVudCA9IHNob3J0U2VnbWVudDsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9ICAKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSkgewotCQkvKiBzaG9ydFNlZ21lbnQgbXVzdCBiZSBub24tbnVsbCBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgY3JlYXRlZCwgCi0JCSAqIGEgdmFsaWRhdGlvbiBjaGVjayBpbiBpbml0KCkgdmVyaWZpZXMgdGhpcyByZXF1aXJlbWVudCAqLwotCQlpZihmaWxlVVJJICE9IG51bGwgJiYgZmlsZVVSSS5sYXN0U2VnbWVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gc2hvcnRTZWdtZW50LmVxdWFscyhmaWxlVVJJLmxhc3RTZWdtZW50KCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSAKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UuRmFjdG9yeSBjcmVhdGVGYWN0b3J5KCkgewotCQkgcmV0dXJuIGZhY3Rvcnk7CQkJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKSB7Ci0JCXJldHVybiBzaG9ydFNlZ21lbnQ7Ci0JfSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NmU1OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19TVFlMRSA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRE9NX0FUVFJJQlVURSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfVEFHID0gMSA8PCAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENEQVRBX0NPTlRFTlQgPSAxIDw8IDI7Ci0JLyoqCi0JICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVuZCB0YWcgc2hvdWxkIE5PVCBiZSBpbmRlbnRlZDsgYnkgZGVmYXVsdCBpdCBpcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTkRfVEFHX05PX0lOREVOVCA9IDEgPDwgMzsKLQkvKioKLQkgKiBTdHlsZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBib29sZWFucyBzaG91bGQgTk9UIGJlIGNvbnZlcnRlZCBhcyAiVHJ1ZSIgYW5kICJGYWxzZSI7IGRlZmF1bHQKLQkgKiBpcyB0aGF0IHRoZXkgYXJlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9MT1dFUkNBU0UgPSAxIDw8IDQ7Ci0JLyoqCi0JICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIGFuIGVudW0gdmFsdWUgY29udGFpbnMgaHlwaGVucyBJZiB0aGlzIGlzIHRydWUsIHRoZW4gaW50ZXJuYWxseSB0aGUKLQkgKiBoeXBoZW5zIGFyZSByZXBsYWNlZCB3aXRoIHVuZGVyc2NvcmVzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5VTV9GRUFUVVJFX1dJVEhfSFlQSEVOUyA9IDEgPDwgNTsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE9CSkVDVF9NQVAgPSAxIDw8IDY7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9GRUFUVVJFID0gMSA8PCA3OwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0hBUkVEX1JFRkVSRU5DRSA9IDEgPDwgODsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBmZWF0dXJlIG1heSBiZSBzaWduaWZpY2FudCBldmVuIGlmIGl0IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfQ09OVEVOVF9JU19TSUdOSUZJQ0FOVCA9IDEgPDwgOTsKLQotCS8qKgotCSAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBmZWF0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1lbnQgbm9kZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IENPTU1FTlRfRkVBVFVSRSA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiBhbiBlVW5zZXQoKSB3aWxsIGJlIGludm9rZWQgb24gdGhlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTlNFVF9JRl9OVUxMID0gMSA8PCAxMTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb250ZW50cyBhcyBhIFN0cmluZyBpZiB0aGUgZmVhdHVyZSBpcyB1bnJlc29sdmVhYmxlIChVc2VkIGJ5IHRoZQotCSAqIFNvdXJjZUxpbmtUcmFuc2xhdG9yKQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUUklOR19SRVNVTFRfT0sgPSAxIDw8IDEyOwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGZET01OYW1lczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTWFwIHJlYWRBaGVhZE5hbWVzOwotCXByb3RlY3RlZCBpbnQgZlN0eWxlID0gTk9fU1RZTEU7Ci0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCXByb3RlY3RlZCBUcmFuc2xhdG9yUGF0aFtdIGZUcmFuc2xhdG9yUGF0aHM7Ci0JcHJvdGVjdGVkIEVDbGFzcyBlbWZDbGFzczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lU3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8vIGFkZGVkIGJ5IE1ERQotCXByb3RlY3RlZCBTdHJpbmcgZG9tTmFtZUFuZFBhdGggPSBudWxsOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFueSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBUcmFuc2xhdG9yIGFyZSB0aGVtc2VsdmVzIERlcGVuZGVuY3lUcmFuc2xhdG9ycwotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzRGVwZW5kZW5jeVBhcmVudDsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGRlcGVuZGVuY3lGZWF0dXJlOwotCXByb3RlY3RlZCBzdGF0aWMgRWNvcmVQYWNrYWdlIEVDT1JFX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCi0JLy8gVXNlIHRoaXMgaWRlbnRpZmllciBmb3IgdGhlIERPTU5hbWUgd2hlbiB0aGUgYXR0cmlidXRlCi0JLy8gdmFsdWUgaXMgdG8gYmUgZXh0cmFjdGVkIGRpcmVjdGx5IGZyb20gdGhlIHRleHQgb2YgdGhlIG5vZGUuCi0JLy8gVGhpcyBpcyByYXJlLCBidXQgb2NjdXJzIGluIHRoZSB3ZWIueG1sIGluIHRoZSBjYXNlIG9mIGEKLQkvLyBXZWxjb21lRmlsZS4KLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBURVhUX0FUVFJJQlVURV9WQUxVRSA9ICIkVEVYVF9BVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBDT05UQUlORVJfRkVBVFVSRSA9IG5ldyBDb250YWluZXJGZWF0dXJlKCk7Ci0KLQlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBST09UX0ZFQVRVUkUgPSBuZXcgUm9vdEZlYXR1cmUoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29udGFpbmVyRmVhdHVyZSBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwgewotCQlwcm90ZWN0ZWQgQ29udGFpbmVyRmVhdHVyZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJvb3RGZWF0dXJlIGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCB7Ci0JCXByb3RlY3RlZCBSb290RmVhdHVyZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBmaW5kQ2hpbGQoU3RyaW5nIHRhZ05hbWUsIE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQotCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7Ci0JCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uSUQpOwotCi0JCWlmIChtYXBzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gbWFwc1tpXTsKLQkJCQlpZiAobWFwLmlzTWFwRm9yKHRhZ05hbWUpKSB7Ci0JCQkJCXJlc3VsdCA9IG1hcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0b3J5ID0gZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCAmJiBmYWN0b3J5LmFjY2VwdHModGFnTmFtZSkpIHsKLQkJCQlyZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZSh0YWdOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHN0cmluZyB0b2dldGhlciBhcnJheXMgb2YgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTEubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3Qgb2JqZWN0MikgewotCQlPYmplY3RbXSBuZXdBcnJheSA9IG5ldyBPYmplY3RbXXtvYmplY3QyfTsKLQkJcmV0dXJuIGNvbmNhdChhcnJheTEsIG5ld0FycmF5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyZW50QW5kVGV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwYXJlbnRGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHBhcmVudCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBwYXJlbnRGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JCXBhcmVudC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltde25ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBjaGlsZEZlYXR1cmUpfSk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCXNldEVNRkNsYXNzKGVDbGFzcyk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJdGhpcyhkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXRoaXMoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBuZXcgVHJhbnNsYXRvclBhdGhbXXtwYXRofSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKLQkJZlRyYW5zbGF0b3JQYXRocyA9IHBhdGhzOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCWZTdHlsZSA9IHN0eWxlOwotCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVjb3JlUGFja2FnZSBnZXRFY29yZVBhY2thZ2UoKSB7Ci0JCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGZET01OYW1lc1swXTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RE9NTmFtZXMoKSB7Ci0JCXJldHVybiBmRE9NTmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRET01QYXRoKCkgewotCQlyZXR1cm4gZkRPTVBhdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRE9NUGF0aCgpIHsKLQkJcmV0dXJuIGZET01QYXRoICE9IG51bGwgJiYgZkRPTVBhdGgubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBET00gbmFtZXMgYW5kIHBhdGggb3V0IG9mIDxkb21OYW1lQW5kUGF0aD5hbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKFN0cmluZyBkb21OYW1lQW5kUGF0aEFyZykgewotCQlpZiAoZG9tTmFtZUFuZFBhdGhBcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGlueCA9IGRvbU5hbWVBbmRQYXRoQXJnLmxhc3RJbmRleE9mKCcvJyk7Ci0JCWlmIChpbnggIT0gLTEpIHsKLQkJCWZET01OYW1lcyA9IHBhcnNlRE9NTmFtZXMoZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKGlueCArIDEpKTsKLQkJCWZET01QYXRoID0gZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKDAsIGlueCk7Ci0JCX0gZWxzZSB7Ci0JCQlmRE9NTmFtZXMgPSBwYXJzZURPTU5hbWVzKGRvbU5hbWVBbmRQYXRoQXJnKTsKLQkJCWZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBhZGRlZCBieSBNREUKLQkJdGhpcy5kb21OYW1lQW5kUGF0aCA9IGRvbU5hbWVBbmRQYXRoQXJnOwotCi0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgYW4gZW1wdHkgdGFnOyBlZywgPGRpc3RyaWJ1dGFibGUvPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ0RBVEFDb250ZW50KCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIENEQVRBX0NPTlRFTlQpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIERPTU5hbWUgcmVwcmVzZW50cyBhIHN1YiBlbGVtZW50IG5hbWUgb3IgYW4gYXR0cmlidXRlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgRE9NTmFtZSBpcyBhbiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RPTUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBET01fQVRUUklCVVRFKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSB3cml0dGVuIGFzIGFuIGVtcHR5IHRhZzsgZWcsIDxkaXN0cmlidXRhYmxlLz4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VGFnKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEVNUFRZX1RBRykgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5VcHBlcmNhc2UoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgQk9PTEVBTl9GRUFUVVJFKSAhPSAwICYmIChmU3R5bGUgJiBCT09MRUFOX0xPV0VSQ0FTRSkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5GZWF0dXJlKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEJPT0xFQU5fRkVBVFVSRSkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRFbmRUYWcoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgRU5EX1RBR19OT19JTkRFTlQpID09IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50RW5kVGFnKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc2hvdWxkSW5kZW50RW5kVGFnKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpIHsKLQkJcmV0dXJuICgoZlN0eWxlICYgRU1QVFlfVEFHKSAhPSAwKSB8fCAoKGZTdHlsZSAmIEVNUFRZX0NPTlRFTlRfSVNfU0lHTklGSUNBTlQpICE9IDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0byBhbm90aGVyIE1PRiBvYmplY3QgKG5vdCBhIHByaW1pdGl2ZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09iamVjdE1hcCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBPQkpFQ1RfTUFQKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBzaGFyZWQgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgU0hBUkVEX1JFRkVSRU5DRSkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudW1XaXRoSHlwaGVucygpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBFTlVNX0ZFQVRVUkVfV0lUSF9IWVBIRU5TKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtYXAgcmVwcmVzZW50cyBhIGNhc2Ugd2hlcmUgdGhlIHRleHQgb2YgdGhlIERPTU5vZGUgcmVwcmVzZW50cyB0aGUKLQkgKiBvYmplY3RzIG9uZSBhbmQgb25seSBhdHRyaWJ1dGUgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBjYXNlIGlzIGEgPHdlbGNvbWUtZmlsZT5maWxlLnR4dAotCSAqIDwvd2VsY29tZS1maWxlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RPTVRleHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZET01OYW1lc1swXSA9PSBURVhUX0FUVFJJQlVURV9WQUxVRTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSURNYXAoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlua01hcCgpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHMgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldExpbmtNYXAoKSB7Ci0JCXJldHVybiBpc0xpbmtNYXAoKSAmJiAhaXNPYmplY3RNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0aGUgb25lIHJlcHJlc2VudGluZyBhIG5vZGUgd2l0aCB0aGUgbmFtZSA8ZG9tTmFtZT4uIEJ5IGRlZmF1bHQKLQkgKiB0aGlzIG1ldGhvZCBzaW1wbHkgY29tcGFyZXMgdGhlIERPTSBuYW1lIG9mIHRoZSBtYXAgYWdhaW5zdCB0aGUgPGRvbU5hbWU+cGFyYW1ldGVyCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGRvbU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hcEZvcihTdHJpbmcgZG9tTmFtZSkgewotCQlpZiAoZG9tTmFtZS5lcXVhbHMoZ2V0RE9NUGF0aCgpKSkKLQkJCXJldHVybiB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZET01OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRvbU5hbWUuZXF1YWxzKGZET01OYW1lc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gYUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgZmVhdHVyZSBiZWluZyBtYXBwZWQgaXMgYSBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBmZWF0dXJlIGlzIG11bHRpIHZhbHVlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJcmV0dXJuIGZlYXR1cmUuaXNNYW55KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgY29tbWEgc2VwYXJhdGVkIG5hbWVzIGZyb20gPGRvbU5hbWVzU3RyaW5nPi4gUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBkb21OYW1lc1N0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBwYXJzZURPTU5hbWVzKFN0cmluZyBkb21OYW1lc1N0cmluZykgewotCQlpbnQgc3RhcnRJbnggPSAwOwotCQlpbnQgaW54ID0gZG9tTmFtZXNTdHJpbmcuaW5kZXhPZignLCcpOwotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCXdoaWxlIChpbnggIT0gLTEpIHsKLQkJCXJlc3VsdHMuYWRkKGRvbU5hbWVzU3RyaW5nLnN1YnN0cmluZyhzdGFydElueCwgaW54KSk7Ci0JCQlzdGFydElueCA9IGlueCArIDE7Ci0JCQlpbnggPSBkb21OYW1lc1N0cmluZy5pbmRleE9mKCcsJywgc3RhcnRJbngpOwotCQl9Ci0JCWlmIChzdGFydElueCA9PSAwKQotCQkJcmVzdWx0cy5hZGQoZG9tTmFtZXNTdHJpbmcpOwotCQllbHNlCi0JCQlyZXN1bHRzLmFkZChkb21OYW1lc1N0cmluZy5zdWJzdHJpbmcoc3RhcnRJbngpKTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWNuID0gY24uc3Vic3RyaW5nKCsraSwgY24ubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoY24pOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGZET01OYW1lc1swXSk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgZkRPTU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlzYi5hcHBlbmQoJ3wnKTsKLQkJCXNiLmFwcGVuZChmRE9NTmFtZXNbal0pOwotCQl9Ci0JCXNiLmFwcGVuZCgnLCcpOwotCQlzYi5hcHBlbmQoaGFzaENvZGUoKSk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBUcmFuc2xhdG9yUGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBUcmFuc2xhdG9yUGF0aAotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUGF0aFtdIGdldFRyYW5zbGF0b3JQYXRocygpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zbGF0b3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlUcmFuc2xhdG9yIG1hcEluZm8gPSAoVHJhbnNsYXRvcikgb2JqZWN0OwotCQlyZXR1cm4gZkRPTU5hbWVzLmVxdWFscyhtYXBJbmZvLmdldERPTU5hbWVzKCkpICYmIChmZWF0dXJlID09IG51bGwgJiYgbWFwSW5mby5nZXRGZWF0dXJlKCkgPT0gbnVsbCB8fCBmZWF0dXJlLmVxdWFscyhtYXBJbmZvLmdldEZlYXR1cmUoKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArZkRPTU5hbWVzLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaXNNYW5hZ2VkQnlQYXJlbnQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihudWxsLCAtMSkgPT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEluIHRoZSA5OSUgY2FzZSB0aGVyZSBpcyBvbmx5IG9uZSBub2RlIG5hbWUgdG8gYmUgY29uY2VybmVkIHdpdGgsIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqIGZvciB0aGUgY2FzZXMgd2hlcmUgbXVsdGlwbGUgZG9tIG5hbWVzIG1hcCB0byBvbmUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCWlmIChlbWZDbGFzcyA9PSBudWxsKSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGlzT2JqZWN0TWFwKCkpCi0JCQkJcmV0dXJuIGNyZWF0ZUVNRk9iamVjdChmZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlRU1GT2JqZWN0KGVtZkNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlpZiAoYUZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBjcmVhdGVFTUZPYmplY3QoKChFUmVmZXJlbmNlKSBhRmVhdHVyZSkuZ2V0RVJlZmVyZW5jZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChFQ2xhc3MgYW5FQ2xhc3MpIHsKLQkJaWYgKGFuRUNsYXNzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFuRUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZShhbkVDbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoU3RyaW5nIHRleHRWYWx1ZSwgTm90aWZpZXIgb3duZXIsIGludCB2ZXJzaW9uSWQpIHsKLQkJVHJhbnNsYXRvciB0ZXh0VHJhbnNsYXRvciA9IHRoaXMuZmluZENoaWxkKFRyYW5zbGF0b3IuVEVYVF9BVFRSSUJVVEVfVkFMVUUsIG93bmVyLCB2ZXJzaW9uSWQpOwotCQlpZiAodGV4dFRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iamVjdFZhbHVlID0gdGV4dFRyYW5zbGF0b3IuY29udmVydFN0cmluZ1RvVmFsdWUodGV4dFZhbHVlLCAoRU9iamVjdCkgb3duZXIpOwotCQkJdGV4dFRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUob3duZXIsIG9iamVjdFZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBmZWF0dXJlIGlzIHZhbGlkIG9uIGEgcGFydGljdWxhciBtb2ZPYmplY3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIFJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIHNwZWNpZmllZCBleGlzdHMgb24gdGhlIE1PRiBvYmplY3QuCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwgfHwgZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGVtZk9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZS5nZXROYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRvcnMgd2hpY2ggZG8gbm90IGhhdmUgYSBmZWF0dXJlIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB3aXRoIGN1c3RvbSBiZWhhdmlvci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3RTdHJpbmdWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlpZiAoaXNFbXB0eVRhZygpICYmIGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy9GYWtlIGl0IG91dCB3aXRoIGEgdmFsdWUgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUsIFN0cmluZyB2YWx1ZSwgTm90aWZpZXIgb3duZXIpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCWlmICghdGhpcy5pc01hbmFnZWRCeVBhcmVudCgpKSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlRU1GT2JqZWN0KG5vZGVOYW1lLCByZWFkQWhlYWROYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gY29udmVydFN0cmluZ1RvVmFsdWUodmFsdWUsIChFT2JqZWN0KSBvd25lcik7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHN0cmluZyB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QgVGhlIGNvbnZlcnRlZCB2YWx1ZQotCSAqIEBwYXJhbSBzdHJWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBzdHJWYWx1ZTsKLQkJU3RyaW5nIGlubmVyU3RyVmFsdWUgPSBzdHJWYWx1ZTsKLQkJaWYgKGlubmVyU3RyVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKGlzRW51bVdpdGhIeXBoZW5zKCkpCi0JCQkJaW5uZXJTdHJWYWx1ZSA9IGlubmVyU3RyVmFsdWUucmVwbGFjZSgnLScsICdfJyk7Ci0JCQlpZiAoIWlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQlpbm5lclN0clZhbHVlID0gaW5uZXJTdHJWYWx1ZS50cmltKCk7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gRmVhdHVyZVZhbHVlQ29udmVydGVyLkRFRkFVTFQuY29udmVydFZhbHVlKGlubmVyU3RyVmFsdWUsIGZlYXR1cmUpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKGlzRW1wdHlUYWcoKSAmJiAhaXNET01BdHRyaWJ1dGUoKSAmJiAhaXNET01UZXh0VmFsdWUoKSAmJiBpc0Jvb2xlYW5GZWF0dXJlKCkpCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCUVPYmplY3QgY29udmVydFRvVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChjb252ZXJ0VG9UeXBlID09IG51bGwpCi0JCQkJdmFsdWUgPSBpbm5lclN0clZhbHVlOwotCQkJZWxzZSBpZiAoY29udmVydFRvVHlwZS5lcXVhbHMoZ2V0RWNvcmVQYWNrYWdlKCkuZ2V0RVN0cmluZygpKSkgewotCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSB2YWx1ZSBvZiBhIHNwZWNpZmllZCB0eXBlIHRvIGEgc3RyaW5nIHZhbHVlLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBmb3Igc3BlY2lhbAotCSAqIGNhc2VzIHdoZXJlIHNwZWNpYWwgY29udmVyc2lvbiBuZWVkcyB0byBvY2N1ciBiYXNlZCBvbiB0aGUgZmVhdHVyZSBhbmQgb3Igb2JqZWN0IHR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgVGhlIGNvbnZlcnRlZCB2YWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGlzRW1wdHlUYWcoKSB8fCB2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGlzRW51bVdpdGhIeXBoZW5zKCkpCi0JCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKCdfJywgJy0nKTsKLQkJZWxzZSBpZiAoaXNCb29sZWFuVXBwZXJjYXNlKCkpCi0JCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgPyAiVHJ1ZSIgOiAiRmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldFZhcmlhYmxlQ2hpbGRyZW4oTm90aWZpZXIgdGFyZ2V0LCBpbnQgdmVyc2lvbikgewotCQlUcmFuc2xhdG9yW10gcmVzdWx0cyA9IG51bGw7Ci0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdG9yeSA9IGdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJTGlzdCB2YXJpYWJsZVRyYW5zbGF0b3JzID0gZmFjdG9yeS5jcmVhdGUodGFyZ2V0KTsKLQkJCWlmICh2YXJpYWJsZVRyYW5zbGF0b3JzICE9IG51bGwgJiYgdmFyaWFibGVUcmFuc2xhdG9ycy5zaXplKCkgPiAwKSB7Ci0JCQkJT2JqZWN0W10gdnRvYSA9IHZhcmlhYmxlVHJhbnNsYXRvcnMudG9BcnJheSgpOwotCi0JCQkJcmVzdWx0cyA9IG5ldyBUcmFuc2xhdG9yW3Z0b2EubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspCi0JCQkJCXJlc3VsdHNbaV0gPSAoVHJhbnNsYXRvcikgdnRvYVtpXTsKLQkJCX0KLQotCQl9Ci0JCWlmIChyZXN1bHRzID09IG51bGwpCi0JCQlyZXN1bHRzID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbnVsbCBieSBkZWZhdWx0OyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byByZXR1cm4gc3BlY2lmaWMgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIE1PRiBjaGlsZHJlbiB0aGF0IGN1cnJlbnRseSBleGlzdCBmb3IgdGhlIHZhbHVlcyBvZiBhbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlPYmplY3QgdmFsdWUgPSBnZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQlMaXN0IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChpc011bHRpVmFsdWVkKCkpCi0JCQlyZXN1bHQgPSAoTGlzdCkgdmFsdWU7Ci0JCWVsc2UgaWYgKHZhbHVlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZk9iamVjdC5lR2V0KGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSB2YWx1ZSBvZiBhIGZlYXR1cmUgaW4gYSBtb2Ygb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGZTdHlsZSAmIFVOU0VUX0lGX05VTEwpICE9IDAgJiYgdmFsdWUgPT0gbnVsbCkKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5lVW5zZXRPclJlbW92ZSgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5lU2V0T3JBZGQoKEVPYmplY3QpIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgbmV3SW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlzZXRNT0ZWYWx1ZSgoRU9iamVjdCkgb3duZXIsIHZhbHVlKTsKLQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlzZXRNT0ZWYWx1ZSgoUmVzb3VyY2UpIG93bmVyLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCS8vCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkvLwkJCWVtZk9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJc2V0TU9GVmFsdWUoZW1mT2JqZWN0LCB2YWx1ZSwgLTEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKFJlc291cmNlIHJlcywgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKQotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KXZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQlFeHRlbmRlZEVjb3JlVXRpbC5lVW5zZXRPclJlbW92ZSgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWJvb2xlYW4gaXNTZXQgPSBmZWF0dXJlICE9IG51bGwgJiYgZW1mT2JqZWN0LmVJc1NldChmZWF0dXJlKTsKLQkJaWYgKGlzRW1wdHlUYWcoKSkKLQkJCXJldHVybiBpc1NldCAmJiAoKEJvb2xlYW4pIGVtZk9iamVjdC5lR2V0KGZlYXR1cmUpKS5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIGlzU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCWVtZk9iamVjdC5lVW5zZXQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJMaXN0KEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQkoKExpc3QpIG1vZk9iamVjdC5lR2V0KGZlYXR1cmUpKS5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGFGZWF0dXJlOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvL1RoaXMgd2F5IGFuIGluc3RhbmNlIGNoZWNrIGhhcHBlbnMgb25seSBvbmNlCi0JCWlmIChhRmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCWZTdHlsZSB8PSBPQkpFQ1RfTUFQOwotCQkJaWYgKCEoKEVSZWZlcmVuY2UpIGFGZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpCi0JCQkJZlN0eWxlIHw9IFNIQVJFRF9SRUZFUkVOQ0U7Ci0JCX0KLQotCQlpZiAoZ2V0RWNvcmVQYWNrYWdlKCkuZ2V0RUJvb2xlYW4oKSA9PSBmZWF0dXJlLmdldEVUeXBlKCkpCi0JCQlmU3R5bGUgfD0gQk9PTEVBTl9GRUFUVVJFOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVNRkNsYXNzKEVDbGFzcyBhbkVDbGFzcykgewotCQl0aGlzLmVtZkNsYXNzID0gYW5FQ2xhc3M7Ci0JCWlmIChhbkVDbGFzcyAhPSBudWxsKQotCQkJZlN0eWxlIHw9IE9CSkVDVF9NQVA7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWFkQWhlYWROYW1lcygpIHsKLQkJcmV0dXJuIHJlYWRBaGVhZE5hbWVzICE9IG51bGwgJiYgIXJlYWRBaGVhZE5hbWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlYWQgYWhlYWQgbmFtZXMsIGlmIHRoZXkgYXJlIGRlZmluZWQsIGZvciBhIGdpdmVuIHBhcmVudCBub2RlIG5hbWUuIFRoaXMgaXMgdXNlZAotCSAqIHdoZW4gY3JlYXRpb24gb2YgYSBzcGVjaWZpYyBFTUYgb2JqZWN0IGlzIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YgYSBjaGlsZCBub2RlLgotCSAqLwotCXB1YmxpYyBSZWFkQWhlYWRIZWxwZXIgZ2V0UmVhZEFoZWFkSGVscGVyKFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JCWlmIChyZWFkQWhlYWROYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVhZEFoZWFkSGVscGVyKSByZWFkQWhlYWROYW1lcy5nZXQocGFyZW50TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVhZEFoZWFkSGVscGVyKFJlYWRBaGVhZEhlbHBlciBoZWxwZXIpIHsKLQkJaWYgKHJlYWRBaGVhZE5hbWVzID09IG51bGwpCi0JCQlyZWFkQWhlYWROYW1lcyA9IG5ldyBIYXNoTWFwKDMpOwotCQlyZWFkQWhlYWROYW1lcy5wdXQoaGVscGVyLmdldFBhcmVudERPTU5hbWUoKSwgaGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lDaGlsZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lQYXJlbnQoKSB7Ci0JCWlmIChpc0RlcGVuZGVuY3lQYXJlbnQgPT0gbnVsbCkgewotCQkJaXNEZXBlbmRlbmN5UGFyZW50ID0gQm9vbGVhbi5GQUxTRTsKLQkJCVRyYW5zbGF0b3JbXSB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKG51bGwsIC0xKTsKLQkJCWlmICh0aGVDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkvL0ZvciBub3cgd2UgYXNzdW1lIG9uZQotCQkJCQlpZiAodGhlQ2hpbGRyZW5baV0uaXNEZXBlbmRlbmN5Q2hpbGQoKSkgewotCQkJCQkJaXNEZXBlbmRlbmN5UGFyZW50ID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJZGVwZW5kZW5jeUZlYXR1cmUgPSB0aGVDaGlsZHJlbltpXS5nZXREZXBlbmRlbmN5RmVhdHVyZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0RlcGVuZGVuY3lQYXJlbnQuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RGVwZW5kZW5jeUZlYXR1cmUoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBiYXNpY0dldERlcGVuZGVuY3lPYmplY3QoRU9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBwYXJlbnQuZUdldChkZXBlbmRlbmN5RmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHdoZW4gdGhlIERPTSBwYXRoIGlzIG5vdCBudWxsLCBhbmQgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLiBEZWZhdWx0IGlzIGZhbHNlLCBidXQKLQkgKiBzdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpOwotCX0KLQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSB0cmFuc2xhdG9yIHRvbGVyYXRlcyBwYXJlbnQgbm9kZXMgdGhhdCByZWxhdGUgdG8gdGhlIERPTSBwYXRoLCBhbmQgbm8gY2hpbGRyZW47Ci0JICogZGVmYXVsdCBpcyBkbyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCi0JfQotCi0JLyoqCi0JICogTmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVTcGFjZSgpIHsKLQkJcmV0dXJuIGZOYW1lU3BhY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBkb20gYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVTcGFjZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWZOYW1lU3BhY2UgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpIHsKLQkJaWYgKGlzT2JqZWN0TWFwKCkpCi0JCQlyZXR1cm4gRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LklOU1RBTkNFOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudW1GZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIEVDT1JFX1BBQ0tBR0UuZ2V0RUVudW0oKS5pc0luc3RhbmNlKGZlYXR1cmUuZ2V0RVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldHRhYmxlKCkgewotCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuaXNVbnNldHRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEYXRhVHlwZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBDT01NRU5UX0ZFQVRVUkUpICE9IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGI4M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLQotLyoKLSAqIFRyYW5zbGF0b3IgZmlsdGVycyBjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gT2JqZWN0IGFuZCBBdHRyaWJ1dGUgVHJhbnNsYXRvcnMgd2l0aG91dAotICogYnJlYWtpbmcgdGhlbSBvdXQgaW50byBzZXBlcmF0ZSBkYXRhIHN0cnVjdHVyZXMuIFRoZSBGaWx0ZXIgd2lsbCByZWx5IG9uIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAqIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gVHJhbnNsYXRvci4KLSAqIAotICogZ2V0TmV4dENoaWxkKCkgd2lsbCByZXR1cm4gbnVsbCB3aGVuIG5vIG90aGVyIHRyYW5zbGF0b3JzIG9mIHRoZSBnaXZlbiBnZW5yZSBhcmUgYXZhaWxhYmxlLgotICogCi0gKiBUaGUgcHJvY2Vzc2luZyBoaW50cyB3aGljaCBhcmUgY3JlYXRlZCBhbmQgdGhlbiBwYXNzZWQgdG8gZ2V0TmV4dCpUcmFuc2xhdG9yKCkgc3RvcmUgaW5mb3JtYXRpb24KLSAqIHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGVkIGJldHdlZW4gY2FsbHMuIFRoZSBjcmVhdGVQcm9jZXNzaW5nSGludHMoKSB3aWxsIGNyZWF0ZSBhIHByb3Blcmx5Ci0gKiBpbml0aWFsaXplZCBhcnJheS4gVGhlIGNvbnN0YW50cyBORVhUX1NUQVJUX0hJTlRfSU5EWCBhbmQgTU9ERV9ISU5UX0lORFggcHJvdmlkZSBwb2ludGVycyBpbnRvCi0gKiB0aGUgYXJyYXkgZm9yIHRoZSBORVhUX1NUQVJUIHBvc2l0aW9uIGFuZCB0aGUgcHJvcGVyIG1vZGUgdG8gb3BlcmF0ZSBpbgotICogKFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgb3IKLSAqICAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGZpbmFsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcjsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IHZlcnNpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVhUX1NUQVJUX0hJTlRfSU5EWCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ISU5UX0lORFggPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA9IDE7Ci0KLQkvKgotCSAqIFRoZXNlIFRyYW5zbGF0b3JGaWx0ZXJzIGFyZSB1c2VkIGluIGEgc3RhdGVsZXNzIG1vZGUuIE9ubHkgdGhlaXIgc2Nhbk5leHRUcmFuc2xhdG9yKCkgbWV0aG9kcwotCSAqIHdpbGwgYmUgaW52b2tlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JGaWx0ZXIgb2JqZWN0VHJhbnNsYXRvckZpbHRlciA9IG5ldyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKG51bGwsIC0xKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRmlsdGVyIGF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIgPSBuZXcgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcihudWxsLCAtMSk7Ci0KLQotCXByb3RlY3RlZCBpbnQgbW9kZSA9IFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREU7Ci0JcHJvdGVjdGVkIGludCBpbmRleCA9IC0xOwotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgVHJhbnNsYXRvckZpbHRlcihUcmFuc2xhdG9yIHRyYW5zLCBpbnQgdmVyc2lvbikgewotCQl0aGlzLnRyYW5zbGF0b3IgPSB0cmFuczsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsaW5nIHBlZWsgdHdpY2Ugd2lsbCBhZHZhbmNlIHRoZSBjdXJyZW50IGNoaWxkCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgcGVla05leHRDaGlsZChFT2JqZWN0IHRhcmdldCkgewotCQljYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yID0gZ2V0TmV4dENoaWxkKHRhcmdldCk7Ci0JCXJldHVybiBjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRDaGlsZCgpIHdpbGwgcmV0dXJuIG51bGwgd2hlbiBubyBvdGhlciB0cmFuc2xhdG9ycyBvZiB0aGUgZ2l2ZW4gZ2VucmUgYXJlIGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXROZXh0Q2hpbGQoRU9iamVjdCB0YXJnZXQpIHsKLQotCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3I7Ci0JCQljYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yID0gbnVsbDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlpbnQgZm91bmQgPSAwOwotCQlUcmFuc2xhdG9yIGNoaWxkcmVuW10gPSBudWxsOwotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJCWNhc2UgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJY2hpbGRyZW4gPSB0aGlzLnRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4odGFyZ2V0LCB0aGlzLnZlcnNpb24pOwotCi0JCQkJLyogTG9vayBmb3IgdGhlIG5leHQgQXR0cmlidXRlIFRyYW5zbGF0b3IgKi8KLQkJCQlmb3VuZCA9IHNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgdGhpcy5pbmRleCk7Ci0KLQkJCQlpZiAoZm91bmQgPj0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiBmb3VuZCwgKDEpIHVwZGF0ZSB0aGUgcmVzdWx0LCAoMikgdXBkYXRlIHRoZSBpbmRleCBzbyB3ZSBjYW4gc2tpcCBhaGVhZCBvbgotCQkJCQkgKiB0aGUgbmV4dCBpbnZvY2F0aW9uICgzKSBlc2NhcGUgdGhlIFZBUklBQkxFX1RSQU5TTEFUT1JTIHByb2Nlc3NpbmcKLQkJCQkJICovCi0JCQkJCXJlc3VsdCA9IGNoaWxkcmVuW2ZvdW5kXTsKLQkJCQkJdGhpcy5pbmRleCA9IGZvdW5kOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBSZXNldCB0aGUgaW5kZXguIERPIE5PVCBCUkVBSy4gQWxsb3cgZW50cnkgaW50byBWQVJJQUJMRV9UUkFOU0xBVE9SUyBjYXNlCi0JCQkJICovCi0JCQkJdGhpcy5pbmRleCA9IC0xOwotCQkJCS8qCi0JCQkJICogdXBkYXRlIHRoZSBtb2RlIHRvIFZBUklBQkxFX1RSQU5TTEFUT1JTIHNvIHdlIGNhbiBza2lwIHRvIGl0IGRpcmVjdGx5IG5leHQgdGltZQotCQkJCSAqLwotCQkJCXRoaXMubW9kZSA9IFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREU7Ci0JCQkvLyRGQUxMLVRIUk9VR0gkCi0JCQljYXNlIFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREUgOgotCQkJCWNoaWxkcmVuID0gdGhpcy50cmFuc2xhdG9yLmdldFZhcmlhYmxlQ2hpbGRyZW4odGFyZ2V0LCB0aGlzLnZlcnNpb24pOwotCQkJCWZvdW5kID0gc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCB0aGlzLmluZGV4KTsKLQkJCQlpZiAoZm91bmQgPj0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiBmb3VuZCwgKDEpIHVwZGF0ZSB0aGUgcmVzdWx0LCAoMikgdXBkYXRlIHRoZSBpbmRleCBzbyB3ZSBjYW4gc2tpcCBhaGVhZCBvbgotCQkJCQkgKiB0aGUgbmV4dCBpbnZvY2F0aW9uCi0JCQkJCSAqLwotCQkJCQlyZXN1bHQgPSBjaGlsZHJlbltmb3VuZF07Ci0JCQkJCXRoaXMuaW5kZXggPSBmb3VuZDsKLQkJCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBjcmVhdGVQcm9jZXNzaW5nSGludHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W117LTEsIFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREV9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBnZXROZXh0QXR0cmlidXRlVHJhbnNsYXRvcihUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGludCBzdGFydEhpbnQsIGludFtdIG5leHRIaW50LCBFT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb24pIHsKLQotCQlyZXR1cm4gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0Q2hpbGQodHJhbnNsYXRvciwgc3RhcnRIaW50LCBuZXh0SGludCwgdGFyZ2V0LCB2ZXJzaW9uLCBhdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBpbnQgc3RhcnRIaW50LCBpbnRbXSBuZXh0SGludCwgRU9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uKSB7Ci0KLQkJcmV0dXJuIFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dENoaWxkKHRyYW5zbGF0b3IsIHN0YXJ0SGludCwgbmV4dEhpbnQsIHRhcmdldCwgdmVyc2lvbiwgb2JqZWN0VHJhbnNsYXRvckZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmV4dENoaWxkKCkgdGFrZXMgaGludHMgb24gd2hlcmUgdG8gYmVnaW4gaW4gdGhlIGNoaWxkcmVuIGFycmF5IG9mIHRoZSBnaXZlbiBUcmFuc2xhdG9yLgotCSAqIFdoZW4gaXQgZmluZHMgdGhlIHRyYW5zbGF0b3IsIGl0IHdpbGwgdXBkYXRlIHRoZSBoaW50cyBhcnJheSB3aXRoIHRoZSBzdGFydCBoaW50IGZvciB0aGUgbmV4dAotCSAqIGludm9jYXRpb24oaGludHNbMF0pIGFuZCB3aGVuIG5lY2Vzc2FyeSBpdCB3aWxsIHVzZSB1cGRhdGUgdGhlIG1vZGUgKGhpbnRzWzFdKSB0byBlaXRoZXIKLQkgKiBTVEFOREFSRF9UUkFOU0xBVE9SUyBvciBWQVJJQUJMRV9UUkFOU0xBVE9SUy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvcgotCSAqIEBwYXJhbSBzdGFydEhpbnQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIGEgdHdvLWVsZW1lbnQgYXJyYXk6IGhpbnRzWzBdIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBuZXh0IHN0YXJ0SGludCBhbmQgaGludHNbMV0KLQkgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgbW9kZS4KLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gdHJhbnNsYXRvckZpbHRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dENoaWxkKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgaW50IHN0YXJ0SGludCwgaW50W10gaGludHMsIEVPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbiwgVHJhbnNsYXRvckZpbHRlciB0cmFuc2xhdG9yRmlsdGVyKSB7Ci0KLQkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwotCQkKLQkJaW50IGlubmVyU3RhcnRIaW50ID0gc3RhcnRIaW50OwotCQlpbnQgaW5kZXggPSBpbm5lclN0YXJ0SGludDsKLQkJVHJhbnNsYXRvciBjaGlsZHJlbltdID0gbnVsbDsKLQotCQlzd2l0Y2ggKGhpbnRzW01PREVfSElOVF9JTkRYXSkgewotCQkJY2FzZSBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFIDoKLQkJCQljaGlsZHJlbiA9IHRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBpbm5lclN0YXJ0SGludCA8IGNoaWxkcmVuLmxlbmd0aCkgewotCi0JCQkJCS8qIExvb2sgZm9yIHRoZSBuZXh0IEF0dHJpYnV0ZSBUcmFuc2xhdG9yICovCi0JCQkJCWluZGV4ID0gdHJhbnNsYXRvckZpbHRlci5zY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIGluZGV4KTsKLQotCQkJCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIElmIGZvdW5kLCAoMSkgdXBkYXRlIHRoZSByZXN1bHQsICgyKSB1cGRhdGUgdGhlIGluZGV4IHNvIHdlIGNhbiBza2lwCi0JCQkJCQkgKiBhaGVhZCBvbiB0aGUgbmV4dCBpbnZvY2F0aW9uICgzKSBlc2NhcGUgdGhlIFZBUklBQkxFX1RSQU5TTEFUT1JTCi0JCQkJCQkgKiBwcm9jZXNzaW5nCi0JCQkJCQkgKi8KLQkJCQkJCXJlc3VsdCA9IGNoaWxkcmVuW2luZGV4XTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIERPIE5PVCBCUkVBSyB3ZSB3aWxsIGRlZmF1bHQgdG8gVkFSSUFCTEUgVFJBTlNMQVRPUlMgTU9ERSBzbyB3ZSBtdXN0IHJlc2V0Ci0JCQkJCSAqIHRoZSBzdGFydEhpbnQgYXBwcm9wcmlhdGVseQotCQkJCQkgKi8KLQkJCQkJaW5uZXJTdGFydEhpbnQgPSAtMTsKLQkJCQl9Ci0KLQkJCS8vJEZBTEwtVEhST1VHSCQKLQkJCWNhc2UgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJaGludHNbTU9ERV9ISU5UX0lORFhdID0gVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERTsKLQkJCQkvKgotCQkJCSAqIFJlc2V0IHRoZSBpbmRleC4KLQkJCQkgKi8KLQkJCQlpbmRleCA9IGlubmVyU3RhcnRIaW50OwotCQkJCWNoaWxkcmVuID0gdHJhbnNsYXRvci5nZXRWYXJpYWJsZUNoaWxkcmVuKHRhcmdldCwgdmVyc2lvbik7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBpbm5lclN0YXJ0SGludCA8IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJCQlpbmRleCA9IHRyYW5zbGF0b3JGaWx0ZXIuc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCBpbmRleCk7Ci0JCQkJCXJlc3VsdCA9IChpbmRleCA+PSAwKSA/IGNoaWxkcmVuW2luZGV4XSA6IG51bGw7Ci0JCQkJfQotCQl9Ci0KLQkJaGludHNbTkVYVF9TVEFSVF9ISU5UX0lORFhdID0gKHJlc3VsdCA9PSBudWxsICYmIGNoaWxkcmVuICE9IG51bGwpID8gY2hpbGRyZW4ubGVuZ3RoIDogaW5kZXg7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgc2Nhbk5leHRUcmFuc2xhdG9yKFRyYW5zbGF0b3JbXSBjaGlsZHJlbiwgaW50IHN0YXJ0KTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NzhiNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLQotcHVibGljIGNsYXNzIFRyYW5zbGF0b3JQYXRoIHsKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIG1hcEluZm9QYXRoOwotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gYXJyYXkgb2YgVHJhbnNsYXRvciB0aGF0IHNwZWNpZmllcyB0aGUgcGF0aCB0byBmb2xsb3cgZnJvbSBhbiBvYmplY3QgdG8KLQkgKiBhbm90aGVyIG9iamVjdAotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUGF0aChUcmFuc2xhdG9yW10gcGF0aCkgewotCQltYXBJbmZvUGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIExpc3QgZmluZE9iamVjdHMoRU9iamVjdCBzdGFydE9iamVjdCkgewotCQlPYmplY3QgY3VyID0gc3RhcnRPYmplY3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwSW5mb1BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCVRyYW5zbGF0b3IgY3VyTWFwID0gbWFwSW5mb1BhdGhbaV07Ci0JCQlpZiAoY3VyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjdXJBdHRyID0gY3VyTWFwLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoY3VyQXR0ciA9PSBUcmFuc2xhdG9yLkNPTlRBSU5FUl9GRUFUVVJFKSB7Ci0JCQkJCWN1ckF0dHIgPSAoKEVPYmplY3QpIGN1cikuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJCQljdXIgPSAoKEVPYmplY3QpIGN1cikuZUNvbnRhaW5lcigpOwotCQkJCX0gZWxzZSBpZiAoY3VyQXR0ciA9PSBUcmFuc2xhdG9yLlJPT1RfRkVBVFVSRSkgewotCQkJCQljdXIgPSAoKFRyYW5zbGF0b3JSZXNvdXJjZSkgc3RhcnRPYmplY3QuZVJlc291cmNlKCkpLmdldFJvb3RPYmplY3QoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdXIgPSAoKEVPYmplY3QpIGN1cikuZUdldChjdXJBdHRyKTsKLQkJCQl9Ci0JCQkJaWYgKGN1ck1hcC5pc011bHRpVmFsdWVkKCkpIHsKLQkJCQkJcmV0dXJuIChMaXN0KSBjdXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZmluZE9iamVjdChFT2JqZWN0IHN0YXJ0T2JqZWN0LCBPYmplY3QgbWF0Y2hWYWx1ZSkgewotCQlMaXN0IG9iamVjdHMgPSBmaW5kT2JqZWN0cyhzdGFydE9iamVjdCk7Ci0JCWlmIChvYmplY3RzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZpbmRPYmplY3Qob2JqZWN0cywgZ2V0TGFzdE1hcCgpLCBtYXRjaFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBmaW5kT2JqZWN0KExpc3Qgb2JqZWN0TGlzdCwgVHJhbnNsYXRvciBtYXAsIE9iamVjdCBtYXRjaFZhbHVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG1vZk9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBjdXJNYXRjaFZhbHVlID0gbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSk7Ci0JCQlpZiAobWF0Y2hWYWx1ZS5lcXVhbHMoY3VyTWF0Y2hWYWx1ZSkpCi0JCQkJcmV0dXJuIG1vZk9iamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRMYXN0TWFwKCkgewotCQlyZXR1cm4gbWFwSW5mb1BhdGhbbWFwSW5mb1BhdGgubGVuZ3RoIC0gMV07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWNuID0gY24uc3Vic3RyaW5nKCsraSwgY24ubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoY24pOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKG1hcEluZm9QYXRoWzBdKTsKLQkJZm9yIChpbnQgaiA9IDE7IGogPCBtYXBJbmZvUGF0aC5sZW5ndGg7IGorKykgewotCQkJc2IuYXBwZW5kKCdcbicpOwotCQkJc2IuYXBwZW5kKG1hcEluZm9QYXRoW2pdKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjOWM0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotcHVibGljIGludGVyZmFjZSBUcmFuc2xhdG9yUmVzb3VyY2UgZXh0ZW5kcyBSZWZlcmVuY2VkUmVzb3VyY2UgewotCS8qCi0JICogbXVzdCBtYWtlIGEgc3ViY2xhc3MgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgZm9yIEVTdHJ1Y3R1cmFsRmVhdHVyZSBpcyBwcm90ZWN0ZWQKLQkgKi8KLQlzdGF0aWMgY2xhc3MgRG9jVHlwZUZlYXR1cmUgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIHsKLQkJcHJvdGVjdGVkIERvY1R5cGVGZWF0dXJlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCi0JRVN0cnVjdHVyYWxGZWF0dXJlIERPQ19UWVBFX0ZFQVRVUkUgPSBuZXcgRG9jVHlwZUZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFRoZSBwdWJsaWMgaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRQdWJsaWNJZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlFT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKLQotCS8qKgotCSAqIFRoZSBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRTeXN0ZW1JZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGljIGlkIGFuZCBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQl2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBwdWJsaWMvc3lzdGVtIGlkcyBpZiBuZWNlc3NhcnkKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSBpbiB0aGUgZG9jdW1lbnQgdHlwZSBoZWFkZXIgb2YgdGhlIHNlcmlhbGl6ZWQgeG1sIGZpbGUKLQkgKi8KLQlTdHJpbmcgZ2V0RG9jdHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWE1MIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotCSAqLwotCVN0cmluZyBnZXRYTUxWZXJzaW9uKCk7Ci0KLQlUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCk7Ci0KLQkvKioKLQkgKiBFbnRpdHkgcmVzb2x2ZXIgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHVzaW5nIHN0YW5kYXJkIHBhcnNlcnMgdG8gcmVhZCB0aGUgcmVzb3VyY2UKLQkgKi8KLQlFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpOwotCi0JYm9vbGVhbiB1c2VzRFREKCk7Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpOwotCi0Jdm9pZCBzZXRWZXJzaW9uSUQoaW50IGkpOwotCi0JUmVuZGVyZXIgZ2V0UmVuZGVyZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MjdmYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFJlbmRlcmVyRmFjdG9yeS5MaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgUmVuZGVyZXJGYWN0b3J5IHJlbmRlcmVyRmFjdG9yeTsKLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnksIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcykgewotCQlzdXBlcigpOwotCQlyZW5kZXJlckZhY3RvcnkgPSBhUmVuZGVyZXJGYWN0b3J5OwotCQlzZXRMaXN0ZW5pbmdGb3JVcGRhdGVzKGxpc3RlbmluZ0ZvclVwZGF0ZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXRoaXMoYVJlbmRlcmVyRmFjdG9yeSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuaW5nRm9yVXBkYXRlcyhib29sZWFuIHNob3VsZEJlTGlzdGVuaW5nRm9yVXBkYXRlcykgewotCi0JCWlmICh0aGlzLmxpc3RlbmluZ0ZvclVwZGF0ZXMgXiBzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJCWlmICghc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzKQotCQkJCVJlbmRlcmVyRmFjdG9yeS5Ob3RpZmljYXRpb25FbmdpbmUucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQllbHNlCi0JCQkJUmVuZGVyZXJGYWN0b3J5Lk5vdGlmaWNhdGlvbkVuZ2luZS5hZGRMaXN0ZW5lcih0aGlzKTsKLQotCQkJdGhpcy5saXN0ZW5pbmdGb3JVcGRhdGVzID0gc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5pbmdGb3JVcGRhdGVzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5pbmdGb3JVcGRhdGVzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBkb0NyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVuZGVyZXIgYVJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKCk7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIGFSZW5kZXJlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeS5MaXN0ZW5lciN1cGRhdGVSZW5kZXJlckZhY3RvcnkoY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBuZXdSZW5kZXJlckZhY3RvcnkpIHsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0aW5nIHJlbmRlcmVyIGZhY3RvcnkiKTsKLQkJcmVuZGVyZXJGYWN0b3J5ID0gbmV3UmVuZGVyZXJGYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmYmNlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgZXh0ZW5kcyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgVHJhbnNsYXRvclJlc291cmNlLCBJUm9vdE9iamVjdFJlc291cmNlewotCXN0YXRpYyBmaW5hbCBwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIElEX0ZFQVRVUkUgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FSURBdHRyaWJ1dGUoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkVSU0lPTiA9ICIxLjAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFJlbmRlcmVyIHJlbmRlcmVyOwotCS8qKgotCSAqIFRoZSBwdWJsaWMgSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCS8qKgotCSAqIFRoZSBzeXN0ZW0gSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlkOwotCXByb3RlY3RlZCBTdHJpbmcgeG1sVmVyc2lvbjsKLQkvLyBEZWZhdWx0IHRoZSByZXNvdXJjZXMgdG8gSjJFRSAxLjQKLQlwcm90ZWN0ZWQgaW50IHZlcnNpb25JRDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKLQkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKLQkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpKTsKLQkJc2V0UmVuZGVyZXIoYVJlbmRlcmVyKTsKLQkJdmVyc2lvbklEID0gZ2V0RGVmYXVsdFZlcnNpb25JRCgpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcigpOwotCQlzZXRSZW5kZXJlcihhUmVuZGVyZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlpZiAoc3VwZXIuZ2V0RW5jb2RpbmcoKSA9PSBudWxsKQotCQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmNvZGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCkgewotCQlpZiAoY29udGVudHMgPT0gbnVsbCB8fCBjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRDb250ZW50cygpLmdldCgwKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgYVB1YmxpY0lkLCBTdHJpbmcgYVN5c3RlbUlkKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9ICEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIGFQdWJsaWNJZCkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoc3lzdGVtSWQsIGFTeXN0ZW1JZCkpOwotCQlwdWJsaWNJZCA9IGFQdWJsaWNJZDsKLQkJc3lzdGVtSWQgPSBhU3lzdGVtSWQ7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQllTm90aWZ5KG5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5TRVQsIG51bGwsIG51bGwpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKSB7Ci0JCQkJCXJldHVybiBET0NfVFlQRV9GRUFUVVJFOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCQkJCXJldHVybiBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsLnRoaXM7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB4bWxWZXJzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRYTUxWZXJzaW9uKCkgewotCQlpZiAoeG1sVmVyc2lvbiA9PSBudWxsKQotCQkJeG1sVmVyc2lvbiA9IERFRkFVTFRfVkVSU0lPTjsKLQkJcmV0dXJuIHhtbFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgeG1sVmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0geG1sVmVyc2lvbgotCSAqICAgICAgICAgICAgVGhlIHhtbFZlcnNpb24gdG8gc2V0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0WE1MVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgewotCQl0aGlzLnhtbFZlcnNpb24gPSB4bWxWZXJzaW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlib29sZWFuIGlzVHJhY2tpbmdNb2RzID0gaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOwotCQl0cnkgewotCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXJlbmRlcmVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCX0KLQkJLy8gbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gcmVjb3JkVGltZSgiTG9hZCIsIHN0YXJ0LCBlbmQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZW5kZXJlci51c2VTdHJlYW1zRm9ySU8oKSkgewotICAgICAgICAgICAgc3VwZXIuc2F2ZShvcHRpb25zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeUFib3V0VG9TYXZlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRvU2F2ZSgoT3V0cHV0U3RyZWFtKW51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIG5vdGlmeVNhdmVkKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICBub3RpZnlTYXZlRmFpbGVkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgICAgIEVjb3JlVXRpbGl0aWVzUGx1Z2luLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5U2F2ZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsI2RvU2F2ZShPdXRwdXRTdHJlYW0sCi0JICogICAgICBNYXApCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXJlbmRlcmVyLmRvU2F2ZShvdXRwdXRTdHJlYW0sIG9wdGlvbnMpOwotCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCS8vIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIHJlY29yZFRpbWUoIlNhdmUiLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgcmVjb3JkVGltZShTdHJpbmcgdHlwZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXHQiICsgdHlwZSArICJcdCIgKwotCS8vIChlbmQgLSBzdGFydCkgKwotCS8vICJcdFx0XHRtcyIgKyAiXHQiICsgKCggdGhpcy5nZXRWZXJzaW9uSUQoKSkgLyAxMC4wKSArICJcdCIgKyB0aGlzKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCS8vIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb1VubG9hZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7Ci0JCXJlbmRlcmVyLnByZVVubG9hZCgpOwotCQlzdXBlci5kb1VubG9hZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArIGdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVuZGVyZXIuCi0JICogCi0JICogQHJldHVybiBSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcigpIHsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbmRlcmVyLgotCSAqIAotCSAqIEBwYXJhbSByZW5kZXJlcgotCSAqICAgICAgICAgICAgVGhlIHJlbmRlcmVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJaWYgKHJlbmRlcmVyLmdldFJlc291cmNlKCkgIT0gdGhpcykKLQkJCXJlbmRlcmVyLnNldFJlc291cmNlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEZvciBjb21wYXRpYmlsaXR5IG9mIG9sZCBzdWJ0eXBlIHJlc291cmNlcywgcmV0dXJucyB0aGUgc3VwZXIKLQkgKiBpbXBsZW1lbnRhdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJpbUdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7Ci0JCXdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplQ29udGVudHMoKTsKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgewotCQljb250ZW50cyA9IG5ldyBSZXNvdXJjZUltcGwuQ29udGVudHNFTGlzdCgpIHsKLQkJCS8qKgotCQkJICogCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmVuZGVyZXIucHJlcGFyZVRvQWRkQ29udGVudHMoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkKG9iamVjdCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJCXJlbmRlcmVyLnByZXBhcmVUb0FkZENvbnRlbnRzKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwgJiYgcHVibGljSWQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHB1YklkID0gcHVibGljSWQgPT0gbnVsbCA/IGdldERlZmF1bHRQdWJsaWNJZCgpIDogcHVibGljSWQ7Ci0JCVN0cmluZyBzeXNJZCA9IHN5c3RlbUlkID09IG51bGwgPyBnZXREZWZhdWx0U3lzdGVtSWQoKSA6IHN5c3RlbUlkOwotCQlzZXREb2N0eXBlVmFsdWVzKHB1YklkLCBzeXNJZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2luaXQoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBudWxsIGJ5IGRlZmF1bHQ7IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNjcmVhdGVFbnRpdHlSZXNvbHZlcigpCi0JICovCi0JcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRQdWJsaWNJZCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gdmVyc2lvbklEOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklEKGludCBpKSB7Ci0JCXZlcnNpb25JRCA9IGk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSN1c2VzRFREKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1c2VzRFREKCkgewotCQlyZXR1cm4gZ2V0UHVibGljSWQoKSAhPSBudWxsICYmIGdldFN5c3RlbUlkKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIG5vdGlmeSB3aGVuIHRoZSBJRCBnZXRzIHNldDsgbmVlZCB0aGlzIHRvIHB1c2ggaXQgaW50bwotCSAqIHRoZSByZXNvdXJjZQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSNzZXRJRChFT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SUQoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJU3RyaW5nIG9sZElkID0gZ2V0SUQoZU9iamVjdCk7Ci0JCXN1cGVyLnNldElEKGVPYmplY3QsIGlkKTsKLQkJZU9iamVjdC5lTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqZWN0LCBOb3RpZmljYXRpb24uU0VULCBJRF9GRUFUVVJFLCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGV4dGVudCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogcmVzb3VyY2UgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgbG9hZGVkIG9yIHNhdmVkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc01vZGlmaWVkKCkgfHwgcmVuZGVyZXIuaXNNb2RpZmllZCgpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1JldmVydGluZygpIHsKLQkJcmV0dXJuICgoQWJzdHJhY3RSZW5kZXJlckltcGwpcmVuZGVyZXIpLmlzUmV2ZXJ0aW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBPdmVycmlkZW4gdG8gZ2l2ZSB0aGUgcmVuZGVyZXIgYSBob29rCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjYWNjZXNzRm9yV3JpdGUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCQlyZW5kZXJlci5hY2Nlc3NGb3JXcml0ZSgpOwotCQlzdXBlci5hY2Nlc3NGb3JXcml0ZSgpOwotCX0KLQotCS8qCi0JICogT3ZlcnJpZGVuIHRvIGdpdmUgdGhlIHJlbmRlcmVyIGEgaG9vawotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2FjY2Vzc0ZvclJlYWQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvclJlYWQoKSB7Ci0JCXJlbmRlcmVyLmFjY2Vzc0ZvclJlYWQoKTsKLQkJc3VwZXIuYWNjZXNzRm9yUmVhZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJcmVuZGVyZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKSB7Ci0JCXJlbmRlcmVyLnJlbGVhc2VGcm9tV3JpdGUoKTsKLQkJc3VwZXIucmVsZWFzZUZyb21Xcml0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsI3ByZURlbGV0ZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgewotCQlzdXBlci5wcmVEZWxldGUoKTsKLQkJcmVuZGVyZXIucHJlRGVsZXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1NoYXJlZCgpIHx8IHJlbmRlcmVyLmlzU2hhcmVkKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2hhcmVkRm9yV3JpdGUoKSB8fCByZW5kZXJlci5pc1NoYXJlZEZvcldyaXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbG9hZChNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCi0JCQlpZiAoaXNMb2FkZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWlmIChyZW5kZXJlci51c2VTdHJlYW1zRm9ySU8oKSkgewotCQkJCXN1cGVyLmxvYWQob3B0aW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICghaXNMb2FkZWQoKSkgewotCQkJCWlzU2hhcmVkKCk7Ci0JCQkJbG9hZEV4aXN0aW5nKG9wdGlvbnMpOwotCQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCSAgICBBZGFwdGVyW10gZUFkYXB0ZXJzID0gZUJhc2ljQWRhcHRlckFycmF5KCk7Ci0JICAgIGlmIChlQWRhcHRlcnMgIT0gbnVsbCAmJiBlRGVsaXZlcigpKQotCSAgICB7Ci0JICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBlQWRhcHRlcnMubGVuZ3RoOyBpIDwgc2l6ZTsgKytpKQotCSAgICAgIHsKLQkgICAgICAJQWRhcHRlciB0ZW1wOwotCSAgICAJICBpZiAoKHRlbXAgPSBlQWRhcHRlcnNbaV0pICE9IG51bGwpCi0JICAgIAkJICB0ZW1wLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Vuc3VwcG9ydGVkRmVhdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVW5zdXBwb3J0ZWRGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNDI0MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVW5zdXBwb3J0ZWRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxMywgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQXR0cmlidXRlSW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZEZlYXR1cmUgZXh0ZW5kcyBFQXR0cmlidXRlSW1wbCB7Ci0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGNhcHR1cmUgZmVhdHVyZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkKEVDbGFzcyBhbkVDbGFzcywgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0KLQkJaWYgKGZlYXR1cmVOYW1lLmVxdWFscygiaXNaZXJvUGFyYW1zIikgJiYgYW5FQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscygiTWV0aG9kRWxlbWVudCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFVuc3VwcG9ydGVkRmVhdHVyZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRlZWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSB7Ci0JLyoqIFJldHVybnMgd2hldGhlciBhIFRyYW5zbGF0b3Igc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBET00gbmFtZSAqLwotCWJvb2xlYW4gYWNjZXB0cyhTdHJpbmcgZG9tTmFtZSk7Ci0KLQkvKiogUmV0dXJucyB3aGV0aGVyIGEgVHJhbnNsYXRvciBzaG91bGQgYmUgY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGZlYXR1cmUgKi8KLQlib29sZWFuIGFjY2VwdHMoTm90aWZpY2F0aW9uIG5vdGlmKTsKLQotCVRyYW5zbGF0b3IgY3JlYXRlKE5vdGlmaWNhdGlvbiBub3RpZik7Ci0KLQkvKiogQ3JlYXRlcyBhIG5ldyBUcmFuc2xhdG9yIGZvciB0aGUgRE9NIG5hbWUgKi8KLQlUcmFuc2xhdG9yIGNyZWF0ZShTdHJpbmcgZG9tTmFtZSk7Ci0KLQkvKiogQ3JlYXRlcyB2YXJpYWJsZSB0cmFuc2xhdG9ycyBmb3IgYW4gRU1GIG9iamVjdCB0byBiZSByZW5kZXJlZCAqLwotCUxpc3QgY3JlYXRlKE5vdGlmaWVyIHRhcmdldCk7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1hNTEVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I3ZjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1hNTEVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTEVuY29kZXJEZWNvZGVyIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgWE1MRW5jb2RlckRlY29kZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSWRlbnRpZmllcyB0aGUgbGFzdCBwcmludGFibGUgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIHJhbmdlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZQotCSAqIGVuY29kaW5nIHVzZWQgd2l0aCB0aGlzIHNlcmlhbGl6ZXIuIEZvciA4LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIGVpdGhlciAweDdFIG9yIDB4RkYuIEZvcgotCSAqIDE2LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIDB4RkZGRi4gQ2hhcmFjdGVycyB0aGF0IGFyZSBub3QgcHJpbnRhYmxlIHdpbGwgYmUgZXNjYXBlZCB1c2luZwotCSAqIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgaW50IF9sYXN0UHJpbnRhYmxlID0gMHhGRkZFOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxFbmNvZGVyRGVjb2RlciBfc2luZ2xldG9uOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gTk9UX0lNUExFTUVOVEVECi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBzdHJpbmcgc28gaXQgbWF5IGJlIHByaW50ZWQgYXMgdGV4dCBjb250ZW50IG9yIGF0dHJpYnV0ZSB2YWx1ZS4gTm9uIHByaW50YWJsZQotCSAqIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFdoZXJlIHRoZSBmb3JtYXQgc3BlY2lmaWVzIGEgZGVhdWx0IGVudGl0eQotCSAqIHJlZmVyZW5jZSwgdGhhdCByZWZlcmVuY2UgaXMgdXNlZCAoZS5nLiA8dHQ+JmFtcDtsdDs8L3R0PikuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyB0byBlc2NhcGUKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGVuY29kZShjaGFyW10gdmFsdWUpIHsKLQkJYm9vbGVhbiB1bm1vZGlmaWVkID0gdHJ1ZTsKLQkJU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmxlbmd0aCk7Ci0JCVN0cmluZyBjaGFyUmVmID0gbnVsbDsKLQkJY2hhciBjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkgewotCQkJY2ggPSB2YWx1ZVtpXTsKLQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcwotCQkJLy8gY2hhcmFjdGVyLCBwcmludCBpdC4gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVudGl0eQotCQkJLy8gcmVmZXJlbmNlcyBpcyBhbG1vc3QgYnV0IG5vdCBpZGVudGljYWwgYmV0d2VlbgotCQkJLy8gWE1MIGFuZCBIVE1MLgotCQkJY2hhclJlZiA9IGdldEVudGl0eVJlZihjaCk7Ci0JCQlpZiAoY2hhclJlZiAhPSBudWxsKSB7Ci0JCQkJc2J1Zi5hcHBlbmQoJyYnKTsKLQkJCQlzYnVmLmFwcGVuZChjaGFyUmVmKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJCXVubW9kaWZpZWQgPSBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoKGNoID49ICcgJyAmJiBjaCA8PSBfbGFzdFByaW50YWJsZSAmJiBjaCAhPSAweEY3KSB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1x0JykgewotCQkJCS8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IHByaW50YWJsZSwgcHJpbnQgYXMgY2hhcmFjdGVyCi0JCQkJLy8gcmVmZXJlbmNlLgotCQkJCS8vIE5vbiBwcmludGFibGVzIGFyZSBiZWxvdyBBU0NJSSBzcGFjZSBidXQgbm90IHRhYiBvciBsaW5lCi0JCQkJLy8gdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZQotCQkJCS8vIHRocmVzaG9sZC4KLQkJCQlzYnVmLmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXNidWYuYXBwZW5kKCImIyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlzYnVmLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNoKSk7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCQl1bm1vZGlmaWVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVubW9kaWZpZWQpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzYnVmLmxlbmd0aCgpXTsKLQkJc2J1Zi5nZXRDaGFycygwLCBzYnVmLmxlbmd0aCgpLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBzdHJpbmcgc28gaXQgbWF5IGJlIHByaW50ZWQgYXMgdGV4dCBjb250ZW50IG9yIGF0dHJpYnV0ZSB2YWx1ZS4gTm9uIHByaW50YWJsZQotCSAqIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFdoZXJlIHRoZSBmb3JtYXQgc3BlY2lmaWVzIGEgZGVhdWx0IGVudGl0eQotCSAqIHJlZmVyZW5jZSwgdGhhdCByZWZlcmVuY2UgaXMgdXNlZCAoZS5nLiA8dHQ+JmFtcDtsdDs8L3R0PikuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyB0byBlc2NhcGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGNoYXJSZWYgPSBudWxsOwotCQljaGFyIGNoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyArK2kpIHsKLQkJCWNoID0gdmFsdWUuY2hhckF0KGkpOwotCQkJLy8gSWYgdGhlcmUgaXMgYSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzCi0JCQkvLyBjaGFyYWN0ZXIsIHByaW50IGl0LiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgZW50aXR5Ci0JCQkvLyByZWZlcmVuY2VzIGlzIGFsbW9zdCBidXQgbm90IGlkZW50aWNhbCBiZXR3ZWVuCi0JCQkvLyBYTUwgYW5kIEhUTUwuCi0JCQljaGFyUmVmID0gZ2V0RW50aXR5UmVmKGNoKTsKLQkJCWlmIChjaGFyUmVmICE9IG51bGwpIHsKLQkJCQlzYnVmLmFwcGVuZCgnJicpOwotCQkJCXNidWYuYXBwZW5kKGNoYXJSZWYpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9IGVsc2UgaWYgKChjaCA+PSAnICcgJiYgY2ggPD0gX2xhc3RQcmludGFibGUgJiYgY2ggIT0gMHhGNykgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpIHsKLQkJCQkvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBwcmludGFibGUsIHByaW50IGFzIGNoYXJhY3RlcgotCQkJCS8vIHJlZmVyZW5jZS4KLQkJCQkvLyBOb24gcHJpbnRhYmxlcyBhcmUgYmVsb3cgQVNDSUkgc3BhY2UgYnV0IG5vdCB0YWIgb3IgbGluZQotCQkJCS8vIHRlcm1pbmF0b3IsIEFTQ0lJIGRlbGV0ZSwgb3IgYWJvdmUgYSBjZXJ0YWluIFVuaWNvZGUKLQkJCQkvLyB0aHJlc2hvbGQuCi0JCQkJc2J1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzYnVmLmFwcGVuZCgiJiMiKTsvLyROT04tTkxTLTEkCi0JCQkJc2J1Zi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChfc2luZ2xldG9uID09IG51bGwpIHsKLQkJCV9zaW5nbGV0b24gPSBuZXcgWE1MRW5jb2RlckRlY29kZXIoKTsKLQkJfQotCQlyZXR1cm4gX3NpbmdsZXRvbi5lbmNvZGUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMgY2hhcmFjdGVyIHZhbHVlLCBvciBudWxsIGlmIG5vIHN1Y2ggZW50aXR5Ci0JICogZXhpc3RzLiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggPHR0PicmYW1wOyc8L3R0PiB3aWxsIHJldHVybiA8dHQ+IiZhbXA7YW1wOyI8L3R0Pi4KLQkgKiAKLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIENoYXJhY3RlciB2YWx1ZQotCSAqIEByZXR1cm4gQ2hhcmFjdGVyIGVudGl0eSBuYW1lLCBvciBudWxsCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbnRpdHlSZWYoY2hhciBjaCkgewotCQkvLyBFbmNvZGUgc3BlY2lhbCBYTUwgY2hhcmFjdGVycyBpbnRvIHRoZSBlcXVpdmFsZW50IGNoYXJhY3RlcgotCQkvLyByZWZlcmVuY2VzLgotCQkvLyBUaGVzZSBmaXZlIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIGFsbCBYTUwgZG9jdW1lbnRzLgotCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JyA6Ci0JCQkJcmV0dXJuICJsdCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnPicgOgotCQkJCXJldHVybiAiZ3QiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyInIDoKLQkJCQlyZXR1cm4gInF1b3QiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJ1wnJyA6Ci0JCQkJcmV0dXJuICJhcG9zIjsvLyROT04tTkxTLTEkCi0JCQljYXNlICcmJyA6Ci0JCQkJcmV0dXJuICJhbXAiOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTU1OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciB7Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQ5MTczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlVdGlsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBZGFwdGVyRmFjdG9yeVV0aWwuCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5VXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRhcHROZXcoTm90aWZpZXIgbmV3T2JqZWN0LCBMaXN0IGZhY3RvcmllcykgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY3Rvcmllcy5zaXplKCk7IGkrKykgewotCQkJZmFjdCA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKLQkJCWZhY3QuYWRhcHROZXcobmV3T2JqZWN0LCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVBZGFwdGVyRmFjdG9yaWVzKExpc3QgZGVzY3JpcHRvcnMsIExpc3QgZmFjdG9yaWVzKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldChpKTsKLQkJCWFkYXB0ZXJGYWN0ID0gZGVzYy5jcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0ICE9IG51bGwpCi0JCQkJZmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdCk7Ci0JCX0KLQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BcnJheVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BcnJheVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3Yjg4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXJyYXlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLXB1YmxpYyBjbGFzcyBBcnJheVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCWlmIChhcnJheTEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gYXJyYXkyLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKQotCQkJY29tcG9uZW50VHlwZSA9IGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJZWxzZQotCQkJY29tcG9uZW50VHlwZSA9IE9iamVjdC5jbGFzczsKLQotCQlyZXR1cm4gY29uY2F0KGFycmF5MSwgYXJyYXkyLCBjb21wb25lbnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MiwgQ2xhc3MgY29tcG9uZW50VHlwZSkgewotCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIGFycmF5MS5sZW5ndGggKyBhcnJheTIubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0QWxsKGphdmEudXRpbC5MaXN0IGFycmF5cywgQ2xhc3MgY29tcG9uZW50VHlwZSkgewotCQlpbnQgcmVzdWx0TGVuZ3RoID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc3VsdExlbmd0aCArPSAoKE9iamVjdFtdKSBhcnJheXMuZ2V0KGkpKS5sZW5ndGg7Ci0JCX0KLQkJT2JqZWN0W10gcmVzdWx0ID0gKE9iamVjdFtdKSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCByZXN1bHRMZW5ndGgpOwotCQlpbnQgcG9zID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gKE9iamVjdFtdKSBhcnJheXMuZ2V0KGkpOwotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCBwb3MsIGFycmF5Lmxlbmd0aCk7Ci0JCQlwb3MgKz0gYXJyYXkubGVuZ3RoOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2MzVhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luOwotCi0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4gY29kZS4gVGhlIHByZWRpY2F0ZQotICogbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdAotICogaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuIHNvbWV0aGluZyBpcwotICogbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZCBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZAotICogbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24gKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLS8vIFRoaXMgY2xhc3Mgd2FzLCBvcmlnaW5hbGx5LCBjb3BpZWQgZGlyZWN0bHkgZnJvbSBjb20uaWJtLml0cC5jb21tb24uCi0vLyBJdCB3YXMgY29waWVkIHRvIG91ciBvd24gcGFja2FnZSBqdXN0IHRvIG1pbmltaXplIG1pbm9yIGRlcGVuZGVuY2llcwotLy8gb24gb3RoZXIgcGFja2FnZXMgYW5kIGludGVybmFsIEFQSXMuCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQkvKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovCi0KLQlwcml2YXRlIEFzc2VydCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdCA8Y29kZT50cnVlPC9jb2RlPiwgYW4KLQkgKiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc0xlZ2FsKGV4cHJlc3Npb24sICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuCi0JICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQKLQkgKiBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kCi0JICogb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJaXNOb3ROdWxsKG9iamVjdCwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQKLQkgKiBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoIm51bGxfYXJndW1lbnQ6ICIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YKLQkgKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YKLQkgKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dFcnJvcigiYXNzZXJ0aW9uIGZhaWxlZDogIiArIG1lc3NhZ2UpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZTQ5MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24gYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcyB0aGF0IGNhdGNoIG9yIG90aGVyd2lzZQotICogZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8gdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUKLSAqIGFyZSBhZGRlZCBvciByZW1vdmVkLgotICogPC9wPgotICovCi0vLyBUaGlzIGNsYXNzIHdhcywgb3JpZ2luYWxseSwgY29waWVkIGRpcmVjdGx5IGZyb20gY29tLmlibS5pdHAuY29tbW9uLgotLy8gSXQgd2FzIGNvcGllZCB0byBvdXIgb3duIHBhY2thZ2UganVzdCB0byBtaW5pbWl6ZSBtaW5vciBkZXBlbmRlbmNpZXMKLS8vIG9uIG90aGVyIHBhY2thZ2VzIGFuZCBpbnRlcm5hbCBBUElzLgotY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzQwODI4NDAwODM0MjY4MzYyMUw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCXN1cGVyKGRldGFpbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NvY2lhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NWQwYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6MTUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uIHsKLQlwcm90ZWN0ZWQgT2JqZWN0IGtleTsKLQlwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlOwotCi0JLyoqCi0JICogQXNzb2NpYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb24oT2JqZWN0IGFLZXksIE9iamVjdCBhVmFsdWUpIHsKLQkJc2V0S2V5KGFLZXkpOwotCQlzZXRWYWx1ZShhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZXkoamF2YS5sYW5nLk9iamVjdCBuZXdLZXkpIHsKLQkJa2V5ID0gbmV3S2V5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ2xvbmVhYmxlUHVibGljLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ2xvbmVhYmxlUHVibGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMzlmYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Nsb25lYWJsZVB1YmxpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMiwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIEludGVyZmFjZSB0aGF0IGV4cG9zZXMgdGhlIGNsb25lIG1ldGhvZCwgZm9yIG9iamVjdHMgdGhhdCBuZWVkIHRvIGdlbmVyaWNhbGx5IGNvcHkgb3RoZXIKLSAqIGNsb25lYWJsZSBvYmplY3RzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xvbmVhYmxlUHVibGljIGV4dGVuZHMgQ2xvbmVhYmxlLCBBZGFwdGVyLkludGVybmFsIHsKLQlPYmplY3QgY2xvbmUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvbW1hbmRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29tbWFuZENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjYjg4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29tbWFuZENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjcsIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotCi0KLS8qKgotICogQGF1dGhvciBKb2huIE1vdXJyYQotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZENvbnRleHQgaW1wbGVtZW50cyBJQ29tbWFuZENvbnRleHQgewotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JcHJpdmF0ZSBNYXAgcHJvcGVydGllczsKLQlwcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZENvbnRleHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMobW9uaXRvciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvblByb3BlcnRpZXMKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZENvbnRleHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBNYXAgY29uZmlndXJhdGlvblByb3BlcnRpZXMsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCXRoaXMucHJvcGVydGllcyA9IGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLndzLnJkLmNvbW1hbmQuZnJhbWV3b3JrLklDb21tYW5kQ29udGV4dCNnZXRQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuY29tbWFuZC5mcmFtZXdvcmsuSUNvbW1hbmRDb250ZXh0I2dldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCkgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5jb21tYW5kLmZyYW1ld29yay5JQ29tbWFuZENvbnRleHQjZ2V0UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpCi0JCQlyZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db3B5R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db3B5R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzOTI4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb3B5IGEgZ3JvdXAgb2YgUmVmT2JqZWN0cyBhbmQvb3IgUmVzb3VyY2VzLiBUaGlzIGdyb3VwIHdpbGwgZW5zdXJlIHRoYXQKLSAqIGFsbCBub24tY29tcG9zaXRlIHJlbGF0aW9uc2hpcHMgYXJlIGRlZmVycmVkIHVudGlsIGFsbCBSZXNvdXJjZXMgYW5kIFJlZk9iamVjdHMgYXJlIGNvcGllZC4gVGhpcwotICogYWxsb3dzIHlvdSB0byBtYWtlIGNvcGllcyBvZiBhIGdyb3VwIG9mIG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBub24tY29tcG9zaXRlIHJlbGF0aW9uc2hpcHMgYW5kCi0gKiBlbnN1cmUgdGhhdCB0aGVzZSByZWxhdGlvbnNoaXBzIGFyZSBwb2ludGluZyB0byB0aGUgY29waWVkIG9iamVjdCBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBncm91cAotICogKGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIGEgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwKS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyMToxNyBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ29weUdyb3VwIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRJZFN1ZmZpeDsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgY29weUNvbnRleHQ7Ci0JcHJvdGVjdGVkIExpc3QgcmVzb3VyY2VzOwotCXByb3RlY3RlZCBMaXN0IHJlZk9iamVjdHM7Ci0JcHJvdGVjdGVkIExpc3QgY29waWVkUmVzb3VyY2VzOwotCXByb3RlY3RlZCBMaXN0IGNvcGllZFJlZk9iamVjdHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlc2VydmVJZHMgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvcHlHcm91cCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb3B5R3JvdXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJcmV0dXJuIGFkZChhUmVmT2JqZWN0LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmIChhUmVmT2JqZWN0ICE9IG51bGwgJiYgIWNvbnRhaW5zUmVmT2JqZWN0KGFSZWZPYmplY3QpKSB7Ci0JCQlnZXRSZWZPYmplY3RzKCkuYWRkKGNyZWF0ZUFzc29jaWF0aW9uKGFSZWZPYmplY3QsIGlkU3VmZml4KSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWFkZChhUmVzb3VyY2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlnZXRSZXNvdXJjZXMoKS5hZGQoY3JlYXRlQXNzb2NpYXRpb24oYVJlc291cmNlLCBuZXdVcmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29waWVkKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsKQotCQkJZ2V0Q29waWVkUmVmT2JqZWN0cygpLmFkZChhUmVmT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjc6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcGllZChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlnZXRDb3BpZWRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJCWlmIChnZXRDb3B5Q29udGV4dCgpICE9IG51bGwpCi0JCQkJZ2V0Q29weUNvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zKExpc3QgYXNzb2NpYXRpb25zLCBPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKGFuT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBzaXplID0gYXNzb2NpYXRpb25zLnNpemUoKTsKLQkJQXNzb2NpYXRpb24gYXNzb2M7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhc3NvYyA9IChBc3NvY2lhdGlvbikgYXNzb2NpYXRpb25zLmdldChpKTsKLQkJCWlmIChhc3NvYy5nZXRLZXkoKSA9PSBhbk9iamVjdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYKLQkgKiAKLQkgKiBAYVJlZk9iamVjdCBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIGdyb3VwLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmVmT2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlyZXR1cm4gY29udGFpbnMoZ2V0UmVmT2JqZWN0cygpLCBhUmVmT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZgotCSAqIAotCSAqIEBhUmVzb3VyY2UgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBncm91cC4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Jlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXR1cm4gY29udGFpbnMoZ2V0UmVzb3VyY2VzKCksIGFSZXNvdXJjZSk7Ci0JfQotCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbiBjcmVhdGVBc3NvY2lhdGlvbihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbihrZXksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTGlzdCBvZiBSZWZPYmplY3RzIHRoYXQgd2VyZSBjb3BpZWQuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb3BpZWRSZWZPYmplY3RzKCkgewotCQlpZiAoY29waWVkUmVmT2JqZWN0cyA9PSBudWxsKQotCQkJY29waWVkUmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGNvcGllZFJlZk9iamVjdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgUmVzb3VyY2VzIHRoYXQgd2VyZSBjb3BpZWQuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb3BpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb3BpZWRSZXNvdXJjZXMgPT0gbnVsbCkKLQkJCWNvcGllZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGNvcGllZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udGV4dCB0byBhZGQgYWxsIGNvcGllZCByZXNvdXJjZXMgaW50by4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgODowOTo0NSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQgZ2V0Q29weUNvbnRleHQoKSB7Ci0JCXJldHVybiBjb3B5Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6NDQ6NDMgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdElkU3VmZml4KCkgewotCQlyZXR1cm4gZGVmYXVsdElkU3VmZml4OwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/IERlZmF1bHRzIHRvIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJlc2VydmVJZHMoKSB7Ci0JCXJldHVybiBwcmVzZXJ2ZUlkczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZWZPYmplY3RzKCkgewotCQlpZiAocmVmT2JqZWN0cyA9PSBudWxsKQotCQkJcmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHJlZk9iamVjdHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgcHJpbUdldFJlZk9iamVjdHMoKSB7Ci0JCXJldHVybiByZWZPYmplY3RzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IHByaW1HZXRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCAmJiBwcmltR2V0UmVmT2JqZWN0cygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcHJpbUdldFJlZk9iamVjdHMoKS5pdGVyYXRvcigpOwotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoYXNzb2NpYXRpb24uZ2V0S2V5KCkgPT0gYVJlZk9iamVjdCkKLQkJCQkJcmV0dXJuIHByaW1HZXRSZWZPYmplY3RzKCkucmVtb3ZlKGFzc29jaWF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBwcmltR2V0UmVzb3VyY2VzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBwcmltR2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGFzc29jaWF0aW9uLmdldEtleSgpID09IGFSZXNvdXJjZSkKLQkJCQkJcmV0dXJuIHByaW1HZXRSZXNvdXJjZXMoKS5yZW1vdmUoYXNzb2NpYXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbnRleHQgdG8gYWRkIGFsbCBjb3BpZWQgcmVzb3VyY2VzIGludG8uIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDg6MDk6NDUgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0NvcHlDb250ZXh0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuQ29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlDb250ZXh0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCBuZXdDb3B5Q29udGV4dCkgewotCQljb3B5Q29udGV4dCA9IG5ld0NvcHlDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIElmIGFuIElEIHN1ZmZpeCBpcyBub3QgZGVmaW5lZCBmb3IgYSBFT2JqZWN0IHRoYXQgaXMgdG8gYmUgY29waWVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZC4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjQ0OjQzIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdEZWZhdWx0SWRTdWZmaXgKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0SWRTdWZmaXgoamF2YS5sYW5nLlN0cmluZyBuZXdEZWZhdWx0SWRTdWZmaXgpIHsKLQkJZGVmYXVsdElkU3VmZml4ID0gbmV3RGVmYXVsdElkU3VmZml4OwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VydmVJZHMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVzZXJ2ZUlkcyA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgcmVxdWlyZSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGdyb3VwCi0JICogaGFzIGJlZW4gY29waWVkLgotCSAqIAotCSAqIEBwYXJhbSBjb3B5VXRpbAotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RDb3B5KEV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsKSB7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTUxvYWRPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWU4YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTUxvYWRPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBET01Mb2FkT3B0aW9ucyB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dKYXZhRW5jb2RpbmdzOwotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlczsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsb3dKYXZhRW5jb2RpbmdzKCkgewotCQlyZXR1cm4gYWxsb3dKYXZhRW5jb2RpbmdzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKCkgewotCQlyZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGUoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGxvd0phdmFFbmNvZGluZ3MuCi0JICogCi0JICogQHBhcmFtIGFsbG93SmF2YUVuY29kaW5ncwotCSAqICAgICAgICAgICAgVGhlIGFsbG93SmF2YUVuY29kaW5ncyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0phdmFFbmNvZGluZ3MoYm9vbGVhbiBhbGxvd0phdmFFbmNvZGluZ3MpIHsKLQkJdGhpcy5hbGxvd0phdmFFbmNvZGluZ3MgPSBhbGxvd0phdmFFbmNvZGluZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMKLQkgKiAgICAgICAgICAgIFRoZSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKSB7Ci0JCXRoaXMuZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzID0gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbGlkYXRlLgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0ZQotCSAqICAgICAgICAgICAgVGhlIHZhbGlkYXRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gdmFsaWRhdGUpIHsKLQkJdGhpcy52YWxpZGF0ZSA9IHZhbGlkYXRlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01VdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0MjI1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQSBjbGFzcyBjb250YWluaW5nIGNvbW1vbiBkb20gbWFuaXB1bGF0aW9uIGFuZCBzZWFyY2ggZnVuY3Rpb25zLgotICovCi1wdWJsaWMgY2xhc3MgRE9NVXRpbGl0aWVzIHsKLQkvLyBIYW5keSBDb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRfU1RSSU5HID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0xJTkVfU1RSSU5HID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JLy9IYWNrIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgRE9NIGFwaXMgY2hhbmdlIHN1Y2ggdGhhdCB0aGVyZSBpcyBhbiBlYXNpZXIKLQkvL3dheSB0byBmbHVmZiB1cCBhbmQgc2V0IHRoZSBkb2N0eXBlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX0VOVElUWV9TVFJJTkcgPSAiZHVtbXkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVTU1ZX0VOVElUWV9OT0RFX1NUUklORyA9ICI8ZHVtbXkvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZGVmYXVsdERvY3VtZW50QnVpbGRlcjsKLQlwcml2YXRlIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBkZWZhdWx0RW50aXR5UmVzb2x2ZXI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgc3ViIG5vZGVzIG9mIGEgcGF0aC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEl0ZXJhdG9yIGNyZWF0ZVBhdGhJdGVyYXRvcihTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgdFBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoIi8iKSA/IHBhdGguc3Vic3RyaW5nKDEpIDogcGF0aDsgLy8kTk9OLU5MUy0xJAotCQlpZiAodFBhdGgubGVuZ3RoKCkgPT0gMCkKLQkJCXRQYXRoID0gbnVsbDsKLQkJZmluYWwgU3RyaW5nIGFQYXRoID0gdFBhdGg7Ci0KLQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCWludCBwcmV2SW5kZXggPSAwOwotCQkJaW50IGN1ckluZGV4ID0gMDsKLQkJCVN0cmluZyBwYXRoU3RyaW5nID0gYVBhdGg7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJcmV0dXJuIHBhdGhTdHJpbmcgIT0gbnVsbCAmJiBwcmV2SW5kZXggIT0gLTE7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQljdXJJbmRleCA9IHBhdGhTdHJpbmcuaW5kZXhPZignLycsIHByZXZJbmRleCk7Ci0JCQkJU3RyaW5nIG5vZGVTdHJpbmcgPSBudWxsOwotCQkJCWlmIChjdXJJbmRleCAhPSAtMSkKLQkJCQkJbm9kZVN0cmluZyA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKHByZXZJbmRleCwgY3VySW5kZXgrKyk7Ci0JCQkJZWxzZQotCQkJCQlub2RlU3RyaW5nID0gcGF0aFN0cmluZy5zdWJzdHJpbmcocHJldkluZGV4KTsKLQkJCQlwcmV2SW5kZXggPSBjdXJJbmRleDsKLQkJCQlyZXR1cm4gbm9kZVN0cmluZzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dCBmb3IgdGhlIHBhc3NlZCBpbiBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGV4dChOb2RlIG5vZGUpIHsKLQkJVGV4dCB0ZXh0Tm9kZSA9IGdldENoaWxkVGV4dE5vZGUobm9kZSk7Ci0JCWlmICh0ZXh0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIHRleHROb2RlLmdldERhdGEoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB0ZXh0IGZvciB0aGUgcGFzc2VkIGluIG5vZGUuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBUZXh0IGdldENoaWxkVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCU5vZGUgdGV4dE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKHRleHROb2RlICE9IG51bGwgJiYgRE9NVXRpbGl0aWVzLmlzVGV4dE5vZGUodGV4dE5vZGUpKSB7Ci0JCQlpZiAoIWlzV2hpdGVzcGFjZSh0ZXh0Tm9kZSkpCi0JCQkJcmV0dXJuIChUZXh0KSB0ZXh0Tm9kZTsKLQkJCXRleHROb2RlID0gdGV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIG9mIHRoZSBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEluZGVudFN0cmluZyhOb2RlIG5vZGUpIHsKLQkJUmV2aXNpdC50b0RvKCk7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGFzdCBub24tdGV4dCBjaGlsZCBvZiBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBsYXN0IG5vbi10ZXh0IGNoaWxkIG5vZGUgb2YKLQkgKiBAbm9kZS4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXRMYXN0Tm9kZUNoaWxkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgY2hpbGQgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJY2hpbGQgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmV4dCBub24tdGV4dCBzaWJsaW5nIGFmdGVyIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IG5vbi10ZXh0IHNpYmxpbmcgbm9kZSBhZnRlcgotCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBuZXh0IG5vbi10ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZ2V0TmV4dE5vZGVTaWJsaW5nKE5vZGUgbm9kZSkgewotCQlOb2RlIHNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJcmV0dXJuIHNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCBjaGlsZCBOb2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0JICovCi0Jc3RhdGljIHB1YmxpYyBOb2RlIGdldE5vZGVDaGlsZChOb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlOb2RlIGNoaWxkID0gbnVsbDsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBuLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCWNoaWxkID0gbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogVHJhdmVyc2VzIHRoZSBwYXRoIHBhc3NlZCBpbiA8cGF0aE5hbWU+LiBUaGUgcGF0aCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybQotCSAqICdub2RlMS9ub2RlMi9ub2RlMycuIFRoaXMgbWV0aG9kIHN0YXJ0cyBhdCBub2RlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgTm9kZSBnZXROb2RlQ2hpbGRGb3JQYXRoKE5vZGUgcGFyZW50LCBTdHJpbmcgcGF0aE5hbWUpIHsKLQotCQlOb2RlIGN1ck5vZGUgPSBwYXJlbnQ7Ci0JCUl0ZXJhdG9yIGkgPSBET01VdGlsaXRpZXMuY3JlYXRlUGF0aEl0ZXJhdG9yKHBhdGhOYW1lKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgY2hpbGQgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWN1ck5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKGN1ck5vZGUsIGNoaWxkKTsKLQkJCWlmIChjdXJOb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGN1ck5vZGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBOb2RlIGNoaWxkcmVuIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lcwotCSAqLwotCXN0YXRpYyBwdWJsaWMgTGlzdCBnZXROb2RlQ2hpbGRyZW4oTm9kZSBub2RlLCBTdHJpbmdbXSBub2RlTmFtZXMpIHsKLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5vZGVOYW1lcy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAobm9kZU5hbWVzW2pdLmVxdWFscyhuLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZm91bmQpCi0JCQkJCXJlc3VsdHMuYWRkKG4pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgTm9kZSBjaGlsZHJlbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgTGlzdCBnZXROb2RlQ2hpbGRyZW4oTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBuLmdldE5vZGVOYW1lKCkuZXF1YWxzKG5vZGVOYW1lKSkKLQkJCQlyZXN1bHRzLmFkZChuKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IG5vbi10ZXh0IHNpYmxpbmcgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IG5vbi10ZXh0IHNpYmxpbmcgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgbm9uLXRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXRQcmV2aW91c05vZGVTaWJsaW5nKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgc2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgRE9NVXRpbGl0aWVzLmlzVGV4dE5vZGUoc2libGluZykpCi0JCQlzaWJsaW5nID0gc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJcmV0dXJuIHNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCB0ZXh0IG5vZGUgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IHRleHQgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gTnVsbCBpZiBubyBzdWNoIG5vZGUgZXhpc3QuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgZ2V0UHJldmlvdXNUZXh0KE5vZGUgbm9kZSkgewotCQlUZXh0IHNpYmxpbmcgPSBnZXRQcmV2aW91c1RleHRTaWJsaW5nKG5vZGUpOwotCi0JCWlmIChzaWJsaW5nID09IG51bGwgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCXNpYmxpbmcgPSBnZXRQcmV2aW91c1RleHQobm9kZS5nZXRQYXJlbnROb2RlKCkpOwotCi0JCXJldHVybiBzaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgdGV4dCBzaWJsaW5nIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGdldFByZXZpb3VzVGV4dFNpYmxpbmcoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJTm9kZSBzaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJTm9kZSBsYXN0VGV4dCA9IG51bGw7Ci0JCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlsYXN0VGV4dCA9IHNpYmxpbmc7Ci0JCQlzaWJsaW5nID0gc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gKFRleHQpIGxhc3RUZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgdGV4dCBzaWJsaW5nIGJlZm9yZSBhIG5vZGUuCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlIFRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgbm9kZSBiZWZvcmUKLQkgKiBAbm9kZS4gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFRleHQgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXREYXRhKCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgaSA9IHRleHQubGVuZ3RoKCkgLSAxOwotCQlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0ZXh0LnN1YnN0cmluZygrK2kpOwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgPG5ld05vZGU+aW50byA8cGFyZW50PmFmdGVyIDxyZWZOb2RlPi4gSWYgPHJlZk5vZGU+aXMgbnVsbCB0aGVuIHRoZSBub2RlIGlzIGluc2VydGVkCi0JICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyZW50J3MgY2hpbGQgbm9kZXMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZk5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0QWZ0ZXJOb2RlKE5vZGUgcGFyZW50LCBOb2RlIG5ld05vZGUsIE5vZGUgcmVmTm9kZSkgewotCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBudWxsOwotCQlpZiAocmVmTm9kZSAhPSBudWxsKSB7Ci0JCQlpbnNlcnRCZWZvcmVOb2RlID0gcmVmTm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlpbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbmV3Tm9kZSwgcGFyZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JCWVsc2UKLQkJCWluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgYSA8bmV3Tm9kZT5pbnRvIDxwYXJlbnQ+YmVmb3JlIDxyZWZOb2RlPi4gVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0Ci0JICogdGhlIGluc2VydGlvbiBkb2VzIG5vdCByZXN1bHQgaW4gdHdvIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZSBET00gbW9kZWwgZG9lcyBub3QgaGFuZGxlCi0JICogYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhleSBtdXN0IGJlIGpvaW5lZCB0b2dldGhlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZk5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlTm9kZShOb2RlIHBhcmVudCwgTm9kZSBuZXdOb2RlLCBOb2RlIHJlZk5vZGUpIHsKLQkJaWYgKG5ld05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dCB0ZXh0TmV3Tm9kZSA9IChUZXh0KSBuZXdOb2RlOwotCi0JCQkvLyBJZiB0aGUgaW5zZXJ0IGJlZm9yZSBub2RlIGlzIHRleHQsIGpvaW4gaXQgd2l0aCB0aGUgbmV3IG5vZGUuCi0JCQlpZiAocmVmTm9kZSAhPSBudWxsICYmIHJlZk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVRleHQgdGV4dFJlZk5vZGUgPSAoVGV4dCkgcmVmTm9kZTsKLQkJCQl0ZXh0UmVmTm9kZS5zZXREYXRhKHRleHROZXdOb2RlLmdldERhdGEoKSArIHRleHRSZWZOb2RlLmdldERhdGEoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gSWYgdGhlIG5vZGUgd2UgYXJlIGluc2VydGluZyBhZnRlciBpcyB0ZXh0LAotCQkJLy8gam9pbiBpdCB3aXRoIHRoZSBuZXcgbm9kZS4KLQkJCU5vZGUgaW5zZXJ0QWZ0ZXJOb2RlID0gKHJlZk5vZGUgPT0gbnVsbCkgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiByZWZOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKGluc2VydEFmdGVyTm9kZSAhPSBudWxsICYmIGluc2VydEFmdGVyTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJVGV4dCB0ZXh0SW5zZXJ0QWZ0ZXJOb2RlID0gKFRleHQpIGluc2VydEFmdGVyTm9kZTsKLQkJCQl0ZXh0SW5zZXJ0QWZ0ZXJOb2RlLnNldERhdGEodGV4dEluc2VydEFmdGVyTm9kZS5nZXREYXRhKCkgKyB0ZXh0TmV3Tm9kZS5nZXREYXRhKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBUaGVyZSBpcyBubyB0ZXh0IG5vZGUgdG8gam9pbiB0bywgc2ltcGxlIGluc2VydCB0aGUgbm9kZS4KLQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgYSA8bmV3Tm9kZT5pbnRvIDxwYXJlbnQ+YmVmb3JlIDxyZWZOb2RlPi4gVGhpcyBtZXRob2Qgd2lsbCBhbHNvIGluc2VydCB0aGUgbm9kZSBiZWZvcmUKLQkgKiBhbnkgd2hpdGVzcGFjZSBub2RlcyB0aGF0IGFwcGVhciBpbiB0aGUgdHJlZSBiZWZvcmUgPHJlZk5vZGU+LiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gZW5zdXJlCi0JICogdGhhdCB0aGUgaW5zZXJ0aW9uIGRvZXMgbm90IHJlc3VsdCBpbiB0d28gYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhlIERPTSBtb2RlbCBkb2VzIG5vdCBoYW5kbGUKLQkgKiBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGV5IG11c3QgYmUgam9pbmVkIHRvZ2V0aGVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShOb2RlIHBhcmVudCwgTm9kZSBuZXdOb2RlLCBOb2RlIHJlZk5vZGUpIHsKLQkJTm9kZSBjdXJOb2RlID0gKHJlZk5vZGUgPT0gbnVsbCkgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiByZWZOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlIGxhc3ROb2RlID0gcmVmTm9kZTsKLQotCQl3aGlsZSAoY3VyTm9kZSAhPSBudWxsICYmIChET01VdGlsaXRpZXMuaXNXaGl0ZXNwYWNlKGN1ck5vZGUpIHx8IERPTVV0aWxpdGllcy5pc0NvbW1lbnQoY3VyTm9kZSkpKSB7Ci0JCQlsYXN0Tm9kZSA9IGN1ck5vZGU7Ci0JCQljdXJOb2RlID0gY3VyTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCi0JCWluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBsYXN0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgYSB0ZXh0IG5vZGUuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIEFuc3dlciB0cnVlIGlmIHRoZSBub2RlIGlzIGEgdGV4dCBub2RlLCBmYWxzZSBvdGhlcndpc2UuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQkJcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHx8IChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGVudGlyZWx5IGNvbW1lbnQgb3Igbm90LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbm9kZSBpcyB3aGl0ZXNwYWNlLCBmYWxzZSBvdGhlcndpc2UuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNDb21tZW50KE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCXJldHVybiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgZW50aXJlbHkgd2hpdGVwYWNlIG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gQW5zd2VyIHRydWUgaWYgdGhlIG5vZGUgaXMgd2hpdGVzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNoZWNrCi0JICovCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZShOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVRleHQgdGV4dE5vZGUgPSAoVGV4dCkgbm9kZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Tm9kZS5nZXREYXRhKCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgY2hpbGRyZW4gb2YgPG5vZGU+Ci0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKE5vZGUgbm9kZSkgewotCQlOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlub2RlLnJlbW92ZUNoaWxkKGxpc3QuaXRlbShpKSk7Ci0JCX0KLQl9Ci0KLQkvLyB0cmF2ZXJzZXMgdGhlIERPTSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIG5vZGUgYW5kIHJldHVybnMgYSBsaXN0Ci0JLy8gb2Ygbm9kZXMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBzdHJpbmcKLQotCXN0YXRpYyBwdWJsaWMgQXJyYXlMaXN0IGdldEFsbE5vZGVzKE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCUFycmF5TGlzdCBub2RlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlTdHJpbmdbXSBub2RlTmFtZXMgPSB7bm9kZU5hbWV9OwotCQlmaW5kQWxsTm9kZXMobm9kZSwgbm9kZU5hbWVzLCBub2RlTGlzdCk7Ci0KLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCS8vIHRyYXZlcnNlcyB0aGUgRE9NIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBhbmQgcmV0dXJucyBhIGxpc3QKLQkvLyBvZiBub2RlcyBtYXRjaGluZyB0aGUgc2VhcmNoIHN0cmluZ3MKLQotCXN0YXRpYyBwdWJsaWMgQXJyYXlMaXN0IGdldEFsbE5vZGVzKE5vZGUgbm9kZSwgU3RyaW5nW10gbm9kZU5hbWVzQXJyYXkpIHsKLQkJQXJyYXlMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmaW5kQWxsTm9kZXMobm9kZSwgbm9kZU5hbWVzQXJyYXksIG5vZGVMaXN0KTsKLQotCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JfQotCi0JLy8gcmVjdXJzaXZlIGhlbHBlciBmb3IgZ2V0QWxsTm9kZXMKLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGZpbmRBbGxOb2RlcyhOb2RlIG5vZGUsIFN0cmluZ1tdIG5vZGVOYW1lcywgQXJyYXlMaXN0IHJlc3VsdHMpIHsKLQotCQlOb2RlTGlzdCBub2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBub2RlTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG5vZGVzLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobm9kZU5hbWVzW2pdKSkgewotCQkJCQkJcmVzdWx0cy5hZGQobm9kZXMuaXRlbShpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluZEFsbE5vZGVzKG5vZGVzLml0ZW0oaSksIG5vZGVOYW1lcywgcmVzdWx0cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gZGVmaW5lZCBKQVhQIGRvY3VtZW50IGJ1aWxkZXIKLQkgKi8KLQlzdGF0aWMgcHVibGljIERvY3VtZW50QnVpbGRlciBuZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKERPTUxvYWRPcHRpb25zIG9wdGlvbnMpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCWRiZi5zZXRWYWxpZGF0aW5nKG9wdGlvbnMuaXNWYWxpZGF0ZSgpKTsKLQkJZGJmLnNldE5hbWVzcGFjZUF3YXJlKG9wdGlvbnMuaXNWYWxpZGF0ZSgpKTsKLQkJLyoKLQkJICogQ2F1c2VzIGVycm9ycyBpbiBJQk0gSkRLIHRyeSB7IGRiZi5zZXRBdHRyaWJ1dGUoUmVuZGVyZXIuSkFYUF9TQ0hFTUFfTEFOR1VBR0UsCi0JCSAqIFJlbndkZXJlci5XM0NfWE1MX1NDSEVNQSk7IH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7IH0KLQkJICovCi0JCXRyeSB7Ci0JCQlkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCBuZXcgQm9vbGVhbihvcHRpb25zLmlzQWxsb3dKYXZhRW5jb2RpbmdzKCkpKTsgLy8kTk9OLU5MUy0xJAkgICAgICAgIAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dXYXJuaW5nKCJXYXJuaW5nOiBQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBcImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5nc1wiLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsIG5ldyBCb29sZWFuKG9wdGlvbnMuaXNWYWxpZGF0ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlnbm9yZSkgewotCQkJZGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWFcIi4gVmFsaWRhdGlvbiB3aWxsIGJlIGRpc2FibGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCWRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9kb20vZGVmZXItbm9kZS1leHBhbnNpb24iLCBCb29sZWFuLkZBTFNFKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQlFY29yZVV0aWxpdGllc1BsdWdpbi5sb2dXYXJuaW5nKCJXYXJuaW5nOiBQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBcImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9kb20vZGVmZXItbm9kZS1leHBhbnNpb25cIi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWRiZi5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKG9wdGlvbnMuaXNFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMoKSk7Ci0JCURvY3VtZW50QnVpbGRlciByZXN1bHQgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCXJlc3VsdC5zZXRFcnJvckhhbmRsZXIobmV3IEVycm9ySGFuZGxlcigpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQl0aHJvdyBhcmcwOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCXRocm93IGFyZzA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nV2FybmluZyhhcmcwKTsKLQkJCX0KLQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3R1YiBkb2N1bWVudCwgd2hlcmUgdGhlIERvY3VtZW50VHlwZSBpcyBkZWZpbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlTmV3RG9jdW1lbnQoU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0RGVmYXVsdERvY3VtZW50QnVpbGRlcigpOwotCQlJbnB1dFN0cmVhbSBpbiA9IGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKGRvY3R5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgdHJ1ZSk7Ci0JCURvY3VtZW50IHJlc3VsdCA9IGJ1aWxkZXIucGFyc2UoaW4pOwotCQlyZW1vdmVEdW1teUVudGl0eShyZXN1bHQpOwotCQlyZW1vdmVFeHRyYW5lb3VzQ29tbWVudHMocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IGxvYWREb2N1bWVudChJbnB1dFN0cmVhbSBpbiwgRE9NTG9hZE9wdGlvbnMgb3B0aW9ucywgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBET01VdGlsaXRpZXMubmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihvcHRpb25zKTsKLQkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0JCURvY3VtZW50IHJlc3VsdCA9IGJ1aWxkZXIucGFyc2UoaW4pOwotCQlyZW1vdmVFeHRyYW5lb3VzQ29tbWVudHMocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIHRoZSBET00gTGV2ZWwgMiBBUElzIGFyZSBub3QgYWR2YW5jZWQgZW5vdWdoIGZvciBzZXR0aW5nIHRoZQotCSAqIGRvY3VtZW50IHR5cGU7IHNvIHRoZSBvbmx5IHBhcnNlciBpbmRlcGVuZGVudCB3YXkgb2YgYWNjb21wbGlzaGluZyB0aGlzIGlzIGJ5IGNyZWF0aW5nIGEKLQkgKiBzdHJlYW0gYW5kIHBhcnNpbmcgaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJcmV0dXJuIGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKGRvY3R5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgZmFsc2UpOwotCX0KLQotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBib29sZWFuIGluY2x1ZGVEdW1teSkgewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0JCS8vIFRoZSBwcmlvciBjb2RlICh3aGljaCBpcyBzdGlsbCBpbiB0aGUgY2F0Y2ggYmxvY2spLCB1c2VzCi0JCS8vIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZyBbU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIildOwotCQkvLyBvbiBaL09TIHRoaXMgaXMgQ3AxMDQ3LiBUaGUgY29tYmluYXRpb24gb2YgIlVURi04IiBpbiB0aGUgaGVhZGVyCi0JCS8vIGFuZCAiQ3AxMDQ3IiBpbiB0aGUgd3JpdGVyIGNyZWF0ZSBhbiB1bnVzYWJsZSBpbnB1dCBzdHJlYW0uCi0KLQkJUHJpbnRXcml0ZXIgd3JpdGVyOwotCi0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0V3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFdyaXRlcik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlIChlYXJsaWVyIGNvZGUpCi0JCQl3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0U3RyZWFtKTsgCi0JCX0KLQotCQl3cml0ZUhlYWRlcih3cml0ZXIsIGRvY3R5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCWlmIChpbmNsdWRlRHVtbXkpCi0JCQlhZGREdW1teUVudGl0eSh3cml0ZXIpOwotCQl3cml0ZXIuZmx1c2goKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0KLQkJYnl0ZVtdIGJ5dGVzID0gb3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0JCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUhlYWRlcihQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQl3cml0ZXIud3JpdGUoIjw/eG1sIHZlcnNpb249XCIiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIjEuMCIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiXCIgZW5jb2Rpbmc9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCJcIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oKTsKLQotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQl3cml0ZXIud3JpdGUoIjwhRE9DVFlQRSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKGRvY3R5cGUpOwotCQkJd3JpdGVyLndyaXRlKCIgUFVCTElDIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShwdWJsaWNJZCk7Ci0JCQl3cml0ZXIud3JpdGUoIlwiIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShzeXN0ZW1JZCk7Ci0JCQl3cml0ZXIud3JpdGUoIlwiPiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREdW1teUVudGl0eShQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJUmV2aXNpdC5yZXZpc2l0KCk7Ci0JCXdyaXRlci5wcmludGxuKERVTU1ZX0VOVElUWV9OT0RFX1NUUklORyk7Ci0JCS8vTWFqb3IgaGFjayBiZWNhdXNlIHdlIGNhbiBub3QgcGFyc2UgYW4gZW1wdHkgZG9jdW1lbnQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUR1bW15RW50aXR5KERvY3VtZW50IGRvYykgewotCQlkb2MucmVtb3ZlQ2hpbGQoZ2V0Tm9kZUNoaWxkKGRvYywgRFVNTVlfRU5USVRZX1NUUklORykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRXh0cmFuZW91c0NvbW1lbnRzKERvY3VtZW50IGRvYykgewotCQkvL2Fub3RoZXIgbWFqb3IgaGFjayBiZWNhdXNlIG9mIGEgYnVnIGluIFhNTDRKIDQuMC43IHRoYXQgYWRkZWQgYWxsIHRoZQotCQkvL2NvbW1lbnRzIGZyb20gdGhlIGR0ZCB0byB0aGUgZG9jdW1lbnQuIENhbiBiZSByZW1vdmVkIGFmdGVyIHdlIG1vdmUgdXAKLQkJLy9YZXJjZXMgbGV2ZWxzCi0JCU5vZGUgYU5vZGUgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBuZXh0Tm9kZSA9IGFOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoYU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkKLQkJCQlkb2MucmVtb3ZlQ2hpbGQoYU5vZGUpOwotCQkJYU5vZGUgPSBuZXh0Tm9kZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZvciBwZXJmb3JtYW5jZSwgY2FjaGUgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhlIEpBWFAgcmVnaXN0ZXJlZCBkb2N1bWVudCBidWlsZGVyLiBWYWxpZGF0aW9uCi0JICogaXMgZGlzYWJsZWQgZm9yIHRoaXMgaW5zdGFuY2UuIElmIHlvdSBuZWVkIHZhbGlkYXRpb24sIHVzZQotCSAqIHtAbGluayAjbmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihib29sZWFuLCBib29sZWFuLCBib29sZWFuKX0KLQkgKiAKLQkgKiBAcmV0dXJuIERvY3VtZW50QnVpbGRlcgotCSAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIEpBWFAgaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RGVmYXVsdERvY3VtZW50QnVpbGRlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGRlZmF1bHREb2N1bWVudEJ1aWxkZXIgPT0gbnVsbCkgewotCQkJRE9NTG9hZE9wdGlvbnMgb3B0cyA9IG5ldyBET01Mb2FkT3B0aW9ucygpOwotCQkJb3B0cy5zZXRBbGxvd0phdmFFbmNvZGluZ3ModHJ1ZSk7Ci0JCQlvcHRzLnNldEV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyh0cnVlKTsKLQkJCW9wdHMuc2V0VmFsaWRhdGUoZmFsc2UpOwotCQkJZGVmYXVsdERvY3VtZW50QnVpbGRlciA9IG5ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIob3B0cyk7Ci0JCQlkZWZhdWx0RG9jdW1lbnRCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGRlZmF1bHRFbnRpdHlSZXNvbHZlcik7Ci0JCQlkZWZhdWx0RG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRXJyb3JIYW5kbGVyKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCQkJfQotCi0JCQl9KTsKLQkJfQotCi0JCXJldHVybiBkZWZhdWx0RG9jdW1lbnRCdWlsZGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudGl0eVJlc29sdmVyIGdldERlZmF1bHRFbnRpdHlSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGRlZmF1bHRFbnRpdHlSZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKEVudGl0eVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCWRlZmF1bHRFbnRpdHlSZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RhbmdsaW5nSFJFRkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RhbmdsaW5nSFJFRkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA3NzEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EYW5nbGluZ0hSRUZFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMTIsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIHByb3h5IGNhbiBub3QgYmUgcmVzb2x2ZWQKLSAqLwotcHVibGljIGNsYXNzIERhbmdsaW5nSFJFRkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzY5MTI4NzQyODk5MjYzMzI3TDsKLQotCXB1YmxpYyBEYW5nbGluZ0hSRUZFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNTk2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS8xMC8yMDAxIDI6NDk6NDkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgaW1wbGVtZW50cyBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMRURfQ09OVkVSU0lPTl9QQVRURVJOID0gV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfOwotCi0JLyoqCi0JICogRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgQm9vbGVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0Jvb2xlYW4oT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5Cb29sZWFuX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBCeXRlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvQnl0ZShPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gQnl0ZS52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBCeXRlKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkJ5dGVfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIENoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0NoYXJhY3RlcihPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgKChTdHJpbmcpIGFWYWx1ZSkubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKCgoU3RyaW5nKSBhVmFsdWUpLmNoYXJBdCgwKSk7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuQ2hhcmFjdGVyX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBEb3VibGUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Eb3VibGUoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBEb3VibGUudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdERvdWJsZSgpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRG91YmxlX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBFRW51bUxpdGVyYWwuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9FbnVtKE9iamVjdCBhVmFsdWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9IG51bGw7Ci0JCUVFbnVtIGVlbnVtID0gKEVFbnVtKSBhRmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJbGl0ZXJhbCA9IGVlbnVtLmdldEVFbnVtTGl0ZXJhbCgoU3RyaW5nKSBhVmFsdWUpOwotCQllbHNlIGlmIChhVmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJbGl0ZXJhbCA9IGVlbnVtLmdldEVFbnVtTGl0ZXJhbCgoKEludGVnZXIpIGFWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCWVsc2UgaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEVFbnVtTGl0ZXJhbCkKLQkJCWxpdGVyYWwgPSAoRUVudW1MaXRlcmFsKSBhVmFsdWU7Ci0KLQkJaWYgKGxpdGVyYWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5FbnVtZXJhdGlvbl9VSV8pOwotCi0JCXJldHVybiBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBGbG9hdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0Zsb2F0KE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gRmxvYXQudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdEZsb2F0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEZsb2F0KQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkZsb2F0X1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBJbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvSW50ZWdlcihPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdEludGVnZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5JbnRlZ2VyX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBKYXZhIE9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0phdmFPYmplY3QoT2JqZWN0IGFWYWx1ZSkgewotCQlyZXR1cm4gYVZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgTG9uZy4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0xvbmcoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBMb25nLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRMb25nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIExvbmcpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuTG9uZ19VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgTW9mT2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvTW9mT2JqZWN0KE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuTW9mT2JqZWN0X1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBTaG9ydC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb1Nob3J0KE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gU2hvcnQudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFNob3J0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFNob3J0KQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLlNob3J0X1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBTdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IGFWYWx1ZSkgewotCQlyZXR1cm4gYVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKLQkgKiBAYW5BdHRyaWJ1dGUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKLQotCQlFQ2xhc3NpZmllciBtZXRhID0gYW5BdHRyaWJ1dGUuZ2V0RVR5cGUoKTsKLQkJaWYgKG1ldGEuZUNsYXNzKCkgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFRW51bSgpKQotCQkJcmV0dXJuIGNvbnZlcnRUb0VudW0oYVZhbHVlLCBhbkF0dHJpYnV0ZSk7Ci0JCWlmIChtZXRhLmdldEVQYWNrYWdlKCkgaW5zdGFuY2VvZiBFY29yZVBhY2thZ2UpCi0JCXsKLQkJCXN3aXRjaCAobWV0YS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTVFJJTkcgOgotCQkJCQlyZXR1cm4gY29udmVydFRvU3RyaW5nKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU5fT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQk9PTEVBTiA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9Cb29sZWFuKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVEVHRVJfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FSU5UIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0ludGVnZXIoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVRfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVQgOgotCQkJCQlyZXR1cm4gY29udmVydFRvRmxvYXQoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQ0hBUkFDVEVSX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUNIQVIgOgotCQkJCQlyZXR1cm4gY29udmVydFRvQ2hhcmFjdGVyKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUxPTkdfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FTE9ORyA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9Mb25nKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJZVEVfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQllURSA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9CeXRlKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRURPVUJMRV9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEUgOgotCQkJCQlyZXR1cm4gY29udmVydFRvRG91YmxlKGFWYWx1ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb1Nob3J0KGFWYWx1ZSk7Ci0JCQkJLy8JCWNhc2UgRWNvcmVQYWNrYWdlLkVFTlVNOgotCQkJCS8vCQkJcmV0dXJuIGNvbnZlcnRUb0VudW0oYVZhbHVlLCBhbkF0dHJpYnV0ZSk7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRU9CSkVDVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9Nb2ZPYmplY3QoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FSkFWQV9PQkpFQ1QgOgotCQkJCQlyZXR1cm4gY29udmVydFRvSmF2YU9iamVjdChhVmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG1ldGEuZ2V0RVBhY2thZ2UoKSBpbnN0YW5jZW9mIFhNTFR5cGVQYWNrYWdlKQotCQl7Ci0JCQlzd2l0Y2ggKG1ldGEuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU1RSSU5HIDoKLQkJCQlyZXR1cm4gY29udmVydFRvU3RyaW5nKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJPT0xFQU5fT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuQk9PTEVBTiA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0Jvb2xlYW4oYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuSU5UX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLklOVEVHRVIgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5JTlQgOgotCQkJCXJldHVybiBjb252ZXJ0VG9JbnRlZ2VyKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkZMT0FUX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkZMT0FUIDoKLQkJCQlyZXR1cm4gY29udmVydFRvRmxvYXQoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuTE9OR19PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5MT05HIDoKLQkJCQlyZXR1cm4gY29udmVydFRvTG9uZyhhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CWVRFX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJZVEUgOgotCQkJCXJldHVybiBjb252ZXJ0VG9CeXRlKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkRPVUJMRV9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5ET1VCTEUgOgotCQkJCXJldHVybiBjb252ZXJ0VG9Eb3VibGUoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU0hPUlRfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU0hPUlQgOgotCQkJCXJldHVybiBjb252ZXJ0VG9TaG9ydChhVmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKLQkgKiBAYUZlYXR1cmUuCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlpZiAoYVZhbHVlID09IG51bGwgfHwgYUZlYXR1cmUgPT0gbnVsbCB8fCAhKGFGZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkpCi0JCQlyZXR1cm4gYVZhbHVlOyAvL25vdGhpbmcgdG8gY29udmVydAotCQlyZXR1cm4gY29udmVydFZhbHVlKGFWYWx1ZSwgKEVBdHRyaWJ1dGUpIGFGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgRG91YmxlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgZGVmYXVsdERvdWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IEZsb2F0IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBGbG9hdCBkZWZhdWx0RmxvYXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBJbnRlZ2VyIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGRlZmF1bHRJbnRlZ2VyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgTG9uZyB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTG9uZyBkZWZhdWx0TG9uZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IFNob3J0IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBTaG9ydCBkZWZhdWx0U2hvcnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZhaWxlZCB0byBjb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZhaWxlZFRvQ29udmVydChPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN0cmluZykgewotCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoRkFJTEVEX0NPTlZFUlNJT05fUEFUVEVSTiwgbmV3IE9iamVjdFtde2FWYWx1ZS50b1N0cmluZygpLCBhU3RyaW5nfSk7Ci0JCXRocm93IG5ldyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTZlZGI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGwgewotCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBHTE9CQUxfRkFDVE9SWSA9IFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShVUkkuY3JlYXRlVVJJKERFRkFVTFRfRVhURU5TSU9OKSk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIERlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeSh1cmksIG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSwgU3RyaW5nIGNvbnRlbnRUeXBlKQotCXsKLQkJT2JqZWN0IHJlc291cmNlRmFjdG9yeSA9IG51bGw7Ci0JCVN0cmluZyBwcm90b2NvbCA9IHVyaS5zY2hlbWUoKTsKLQkJcmVzb3VyY2VGYWN0b3J5ID0gcHJvdG9jb2xUb0ZhY3RvcnlNYXAuZ2V0KHByb3RvY29sKTsKLQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gdXJpLmZpbGVFeHRlbnNpb24oKTsKLQkJCXJlc291cmNlRmFjdG9yeSA9IGV4dGVuc2lvblRvRmFjdG9yeU1hcC5nZXQoZXh0ZW5zaW9uKTsKLQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkgewotCQkJCXJlc291cmNlRmFjdG9yeSA9IGRlbGVnYXRlZEdldEZhY3RvcnkodXJpKTsKLQkJCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IEdMT0JBTF9GQUNUT1JZKSB7Ci0JCQkJCXJlc291cmNlRmFjdG9yeSA9IGV4dGVuc2lvblRvRmFjdG9yeU1hcC5nZXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkKLQkJCQkJCXJlc291cmNlRmFjdG9yeSA9IEdMT0JBTF9GQUNUT1JZOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzb3VyY2VGYWN0b3J5IGluc3RhbmNlb2YgUmVzb3VyY2UuRmFjdG9yeS5EZXNjcmlwdG9yID8gKChSZXNvdXJjZS5GYWN0b3J5LkRlc2NyaXB0b3IpIHJlc291cmNlRmFjdG9yeSkuY3JlYXRlRmFjdG9yeSgpIDogKFJlc291cmNlLkZhY3RvcnkpIHJlc291cmNlRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbCNkZWxlZ2F0ZWRHZXRGYWN0b3J5KG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEZhY3RvcnkgZGVsZWdhdGVkR2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCXJldHVybiBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkodXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWY2NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8yMDAwIDU6MjU6NDMgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgcmVmZXJlbmNlOwotCXByb3RlY3RlZCBPYmplY3QgcmVmZXJlbmNlVmFsdWU7Ci0JcHJvdGVjdGVkIEVPYmplY3QgY29weUNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkU3VmZml4OwotCi0JLyoqCi0JICogRGVmZXJyZWRDb3B5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbihFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIE9iamVjdCBhVmFsdWUsIFN0cmluZyBhU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCXJlZmVyZW5jZSA9IGFSZWZlcmVuY2U7Ci0JCXJlZmVyZW5jZVZhbHVlID0gYVZhbHVlOwotCQlpZFN1ZmZpeCA9IGFTdWZmaXg7Ci0JCWNvcHlDb250YWluZXIgPSBhQ29weUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNi8yMDAwIDk6MzI6MjggQU0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBnZXRDb3B5Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29weUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8yMDAwIDU6MzQ6NTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWRTdWZmaXgoKSB7Ci0JCXJldHVybiBpZFN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8yMDAwIDU6MzQ6NTYgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjMyOjI4IEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlVmFsdWUoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtQWN0aW9uKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmUwNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhbiBpbnRlcmZhY2UgdG8gYW4gb2JqZWN0IHdoaWNoIGNhbiBlbmNvZGUgYW5kIGRlY29kZSB2YWx1ZXMuIFRoaXMgdHlwaWNhbGx5IGludm9sdmVzCi0gKiBjcnlwdG9ncmFwaHkgYWxnb3JpdGhtcy4gVGhpcyBpbnRlcmZhY2UsIGFsb25nIHdpdGggdGhlIHN1cHBsaWVkIGFkYXB0ZXJzIHByb3ZpZGUgYW4gZXh0ZW5zaW9uCi0gKiBtZWNoYW5pc20gZm9yIHBsdWdnYWJsZSBjcnl0b2dyYXBoeSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gc3RvcmluZyBhbmQgcmV0cmlldmluZyBhdHRyaWJ1dGUKLSAqIHZhbHVlcywgYW5kIGlzIHVzZWQgcHJldmFsZW50bHkgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwYXNzd29yZCB2YWx1ZXMgb2YgbW9mIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW5jb2RlckRlY29kZXIgewotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OGIzMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIEVuY29kZXJEZWNvZGVyIGltcGxlbWVudGF0aW9ucwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW5jb2RlckRlY29kZXJBZGFwdGVyIGltcGxlbWVudHMgRW5jb2RlckRlY29kZXIgewotCi0JLyoqCi0JICogRW5jb2RlckRlY29kZXJBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVuY29kZXJEZWNvZGVyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTUxMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFJlZ2lzdHJ5IGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHZhbHVlIGRlY29kZXJzIGFuZCBlbmNvZGVycy4gVXNhZ2UgRXhhbXBsZToKLSAqIAotICogPHByZT4KLSAqIAotICogCi0gKiAvLyBVc2UgdGhlIHN0YW5kYXJkIFdlYlNwaGVyZSBwYXNzd29yZCB2YWx1ZSBlbmNvZGVyL2RlY29kZXIuCi0gKiBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmdldERlZmF1bHRSZWdpc3RyeSgpLnNldERlZmF1bHRFbmNvZGVyRGVjb2RlcihuZXcgY29tLmlibS5lanMuc2VjdXJpdHkudXRpbC5XQVNFbmNvZGVyRGVjb2RlcigpKTsKLSAqIC8vIEJlZ2luIHRyYWNraW5nIGNoYW5nZXMuLi4KLSAqIFdyaXRlQmFja0hlbHBlci5iZWdpbigpOwotICogLy8gTG9hZCBhIHJlc291cmNlIHdoaWNoIG1heSBoYXZlIHVuLWVuY29kZWQgdmFsdWVzLi4uCi0gKiAvLyBOb3RlOiBUaGUgV0NDTSB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHVuLWVuY29kZWQgdmFsdWVzLiAgSWYgdW5lbmNvZGVkIHZhbHVlcwotICogLy8gYXJlIGZvdW5kLCB0aGUgdmFsdWUgd2lsbCBiZSBlbmNvZGVkLCBhbmQgdGhlIHJlc291cmNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0gKiAvLyBXcml0ZUJhY2tIZWxwZXIuCi0gKiBSZXNvdXJjZSByZXMgPSByZXNvdXJjZVNldC5sb2FkKCZxdW90O215UmVzb3VyY2UmcXVvdDspOwotICogLy8gRW5zdXJlIHRoYXQgYW55IGNoYW5nZXMgZHVlIHRvIGVuY29kaW5nIGFyZSB3cml0dGVuIGJhY2sgb3V0LgotICogV3JpdGVCYWNrSGVscGVyLmVuZCgpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgX2RlZmF1bHRJbnN0YW5jZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVuY29kZXJEZWNvZGVyIElOSVRJQUxfREVGQVVMVF9FTkNPREVSID0gUGFzc3RocnVFbmNvZGVyRGVjb2Rlci5JTlNUQU5DRTsKLQlwcm90ZWN0ZWQgTWFwIGVuY29kZXJzID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgT2JqZWN0IGRlZmF1bHRFbmNvZGVyS2V5OwotCi0JLyoqCi0JICogRW5jb2RlckRlY29kZXJSZWdpc3RyeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplRGVmYXVsdEVuY29kZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMi8yLzIwMDEgMTI6NDM6MzEgQU0pCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW5jb2RlckRlY29kZXIoRW5jb2RlckRlY29kZXIgZW5jb2RlckRlY29kZXIpIHsKLQkJZW5jb2RlcnMucHV0KGVuY29kZXJEZWNvZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBlbmNvZGVyRGVjb2Rlcik7Ci0JCWlmIChkZWZhdWx0RW5jb2RlcktleSA9PSBudWxsKQotCQkJZGVmYXVsdEVuY29kZXJLZXkgPSBlbmNvZGVyRGVjb2Rlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCi0JICovCi0JcHVibGljIEVuY29kZXJEZWNvZGVyIGdldERlZmF1bHRFbmNvZGVyRGVjb2RlcigpIHsKLQkJaWYgKGRlZmF1bHRFbmNvZGVyS2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFbmNvZGVyRGVjb2RlcikgZW5jb2RlcnMuZ2V0KGRlZmF1bHRFbmNvZGVyS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlZ2lzdHJ5IHRvIHVzZSBmb3IgcmV0cmlldmluZyB2YWx1ZSBlbmNvZGVycyBhbmQgZGVjb2RlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgZ2V0RGVmYXVsdFJlZ2lzdHJ5KCkgewotCQlpZiAoX2RlZmF1bHRJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlfZGVmYXVsdEluc3RhbmNlID0gbmV3IEVuY29kZXJEZWNvZGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gX2RlZmF1bHRJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCi0JICovCi0JcHVibGljIEVuY29kZXJEZWNvZGVyIGdldEVuY29kZXJEZWNvZGVyKE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIChFbmNvZGVyRGVjb2RlcikgZW5jb2RlcnMuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgYSBzdGFuZGFyZCBzZXQgb2YgZW5jb2Rlci9kZWNvZGVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdEVuY29kZXJzKCkgewotCQlzZXREZWZhdWx0RW5jb2RlckRlY29kZXIoSU5JVElBTF9ERUZBVUxUX0VOQ09ERVIpOwotCQlhZGRFbmNvZGVyRGVjb2RlcihuZXcgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBlbmNvZGVyL2RlY29kZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbmNvZGVyRGVjb2RlcihPYmplY3Qga2V5KSB7Ci0JCWlmIChlbmNvZGVycy5jb250YWluc0tleShrZXkpKSB7Ci0JCQllbmNvZGVycy5yZW1vdmUoa2V5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW5jb2Rlci9kZWNvZGVyIGJ5IGtleS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RW5jb2RlckRlY29kZXIoRW5jb2RlckRlY29kZXIgZW5jb2RlcikgewotCQlkZWZhdWx0RW5jb2RlcktleSA9IGVuY29kZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWlmICghZW5jb2RlcnMuY29udGFpbnNLZXkoZGVmYXVsdEVuY29kZXJLZXkpKSB7Ci0JCQlhZGRFbmNvZGVyRGVjb2RlcihlbmNvZGVyKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FdG9vbHNDb3B5U2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU5NTEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FdG9vbHNDb3B5U2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wNC8wMSAxMToyNTo1OSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRXRvb2xzQ29weVNlc3Npb24gZXh0ZW5kcyBFdG9vbHNDb3B5VXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQ09QSUVEID0gNTAwOwotCXByaXZhdGUgRXRvb2xzQ29weVV0aWxpdHkgcGFyZW50Q29weVV0aWxpdHk7Ci0JcHJpdmF0ZSBYTUxSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2U7Ci0JcHJpdmF0ZSBYTUxSZXNvdXJjZSBjdXJyZW50Q29weVJlc291cmNlOwotCi0JLyoqCi0JICogRXRvb2xzQ29weVNlc3Npb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRXRvb2xzQ29weVNlc3Npb24oRXRvb2xzQ29weVV0aWxpdHkgYUNvcHlVdGlsaXR5KSB7Ci0JCXBhcmVudENvcHlVdGlsaXR5ID0gYUNvcHlVdGlsaXR5OwotCQlzZXRQcmVzZXJ2ZUlkcyhhQ29weVV0aWxpdHkucHJlc2VydmVJZHMoKSk7Ci0JCXNldENvcHlBZGFwdGVycyhhQ29weVV0aWxpdHkuaXNDb3B5QWRhcHRlcnMoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIHdpdGhpbiA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlbSB0bwotCSAqIDxjb2RlPmFHcm91cDwvY29kZT4uIE5vbiBjb21wb3NpdGUgcmVmZXJlbmNlcyB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFsbCBvYmplY3RzIGFyZQotCSAqIGNvcGllZCBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICogCi0JICogQ29weSBSZXNvdXJjZXMgZmlyc3QgYW5kIHRoZW4gY29weSBSZWZPYmplY3RzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKLQkJCWNvcHlSZXNvdXJjZXMoYUdyb3VwKTsKLQkJCWNvcHlSZWZPYmplY3RzKGFHcm91cCk7Ci0JCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQkJYUdyb3VwLnBvc3RDb3B5KHRoaXMpOwotCQkJbm90aWZ5TmV3UmVzb3VyY2VzQ29waWVkKGFHcm91cCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBpbiB0aGlzCi0JICogY29weSBleGVjdXRpb24uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcGllZCA9IGNvbnRhaW5tZW50Q29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWV4ZWN1dGVEZWZlcnJlZENvcHlBY3Rpb25zKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGlzIG1ldGhvZCBvbmx5IGNvcGllcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBhdHRyaWJ1dGVzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBjb250YWlubWVudENvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGUgY29waWVkIFJlc291cmNlIHdpbGwgaGF2ZSBhIFVSSSBlcXVhbCB0byA8Y29kZT5uZXdVcmk8L2NvZGU+LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlSZXNvdXJjZSBjb3BpZWQgPSBjb250YWlubWVudENvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQljb3B5TW9kaWZpY2F0aW9uRmxhZyhhUmVzb3VyY2UsIGNvcGllZCk7Ci0JCW5vdGlmeU5ld1Jlc291cmNlQ29waWVkKGNvcGllZCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TmV3UmVzb3VyY2VzQ29waWVkKENvcHlHcm91cCBncm91cCkgewotCQlMaXN0IGNvcGllZCA9IGdyb3VwLmdldENvcGllZFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvcGllZC5zaXplKCk7IGkrKykgewotCQkJbm90aWZ5TmV3UmVzb3VyY2VDb3BpZWQoKFJlc291cmNlKSBjb3BpZWQuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld1Jlc291cmNlQ29waWVkKFJlc291cmNlIGNvcGllZCkgewotCQljb3BpZWQuZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uSW1wbChSRVNPVVJDRV9DT1BJRUQsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eSNwcmltQ29weU9iamVjdChFT2JqZWN0LAotCSAqICAgICAgU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29weSA9IHN1cGVyLnByaW1Db3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJY29weUlkSWZOZWNlc3NhcnkoYVJlZk9iamVjdCwgY29weSwgaWRTdWZmaXgpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5SWRJZk5lY2Vzc2FyeShFT2JqZWN0IG9iaiwgRU9iamVjdCBjb3B5LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJaWYgKChpZFN1ZmZpeCA9PSBudWxsICYmICFwcmVzZXJ2ZUlkcykgfHwgY3VycmVudFJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpZCA9IGN1cnJlbnRSZXNvdXJjZS5nZXRJRChvYmopOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWQgPSBpZFN1ZmZpeCA9PSBudWxsID8gaWQgOiBpZCArIGlkU3VmZml4OwotCQljdXJyZW50Q29weVJlc291cmNlLnNldElEKGNvcHksIGlkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCBkZWxpdmVyeSBiYWNrIG9uIGZvciBhbGwgdGhlIGNhY2hlZCBvYmplY3RzIGFuZCBwdXNoIHRoZW0gdG8gdGhlIHBhcmVudENvcHlVdGlsaXR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQlJdGVyYXRvciBpdCA9IGdldENvcGllZE9iamVjdHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcCBwYXJlbnRDb3BpZXMgPSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpLmdldENvcGllZE9iamVjdHMoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlFT2JqZWN0IGNvcHk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJY29weSA9IChFT2JqZWN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJY29weS5lU2V0RGVsaXZlcih0cnVlKTsKLQkJCXBhcmVudENvcGllcy5wdXQoZW50cnkuZ2V0S2V5KCksIGNvcHkpOwotCQl9Ci0JCWNvcGllZE9iamVjdHMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNhY2hlZCBjb3B5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldENvcHkoRU9iamVjdCBhbk9iamVjdCkgewotCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmdldENvcHkoYW5PYmplY3QpOwotCQlpZiAoY29waWVkID09IG51bGwpCi0JCQljb3BpZWQgPSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpLmdldENvcHkoYW5PYmplY3QpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzA0LzAxIDExOjI4OjA3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5jb3B5LkV0b29sc0NvcHlVdGlsaXR5Ci0JICovCi0JcHJvdGVjdGVkIEV0b29sc0NvcHlVdGlsaXR5IGdldFBhcmVudENvcHlVdGlsaXR5KCkgewotCQlyZXR1cm4gcGFyZW50Q29weVV0aWxpdHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIEVPYmplY3QgdGhhdCBpcyB0aGUgc2FtZSB0eXBlIGFzIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IG5ld0luc3RhbmNlKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlFT2JqZWN0IG5ld1R5cGUgPSBzdXBlci5uZXdJbnN0YW5jZShhUmVmT2JqZWN0KTsKLQkJbmV3VHlwZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCXJldHVybiBuZXdUeXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5jb3B5LkV0b29sc0NvcHlVdGlsaXR5I25ld0luc3RhbmNlKFJlc291cmNlLCBTdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlIG5ld0luc3RhbmNlKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlSZXNvdXJjZSBjb3B5ID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlc291cmNlLCBuZXdVcmkpOwotCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCWN1cnJlbnRSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgYVJlc291cmNlOwotCQkJY3VycmVudENvcHlSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgY29weTsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRSZXNvdXJjZSA9IG51bGw7Ci0JCQljdXJyZW50Q29weVJlc291cmNlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5YTdjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzEzLzIwMDAgOToxMDo1NSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRXRvb2xzQ29weVV0aWxpdHkgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVOVU1MSVRFUkFMX1RZUEVfTkFNRSA9ICJFRW51bUxpdGVyYWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBFY29yZVBhY2thZ2UgcGtnID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQotCXByaXZhdGUgZmluYWwgRVR5cGVkRWxlbWVudCBNRVRBRU5BTUUgPSBwa2cuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgSGFzaE1hcCBjb3BpZWRPYmplY3RzOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkUmVmZXJlbmNlQ29waWVzOwotCXByb3RlY3RlZCBib29sZWFuIHByZXNlcnZlSWRzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY29weUFkYXB0ZXJzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgY29waWVkQWRhcHRlcnM7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5QWN0aW9uIGV4dGVuZHMgRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uIHsKLQkJcHVibGljIERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbihFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIE9iamVjdCBhVmFsdWUsIFN0cmluZyBhU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCQlzdXBlcihhUmVmZXJlbmNlLCBhVmFsdWUsIGFTdWZmaXgsIGFDb3B5Q29udGFpbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCQkJRU9iamVjdCB2YWx1ZSA9IChFT2JqZWN0KSBnZXRSZWZlcmVuY2VWYWx1ZSgpOwotCQkJZ2V0Q29weUNvbnRhaW5lcigpLmVTZXQoZ2V0UmVmZXJlbmNlKCksIGdldENvcHlJZkZvdW5kKHZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbiBleHRlbmRzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JCXB1YmxpYyBEZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgTGlzdCBhVmFsdWUsIFN0cmluZyBhU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCQlzdXBlcihhUmVmZXJlbmNlLCBhVmFsdWUsIGFTdWZmaXgsIGFDb3B5Q29udGFpbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCQkJTGlzdCBjb3B5TGlzdCA9IChMaXN0KSBnZXRDb3B5Q29udGFpbmVyKCkuZUdldChnZXRSZWZlcmVuY2UoKSk7Ci0JCQlJdGVyYXRvciBpdCA9ICgoTGlzdCkgZ2V0UmVmZXJlbmNlVmFsdWUoKSkuaXRlcmF0b3IoKTsKLQkJCUVPYmplY3QgbmV4dDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQluZXh0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQljb3B5TGlzdC5hZGQoZ2V0Q29weUlmRm91bmQobmV4dCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTMvMjAwMCA5OjE0OjI2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBFdG9vbHNDb3B5VXRpbGl0eSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSA8Y29kZT5EZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uPC9jb2RlPiBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGRlZmVycmVkCi0JICogY29weSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHkoRVJlZmVyZW5jZSByZWZlcmVuY2UsIExpc3QgYVZhbHVlLCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgYUNvcHlDb250YWluZXIpIHsKLQkJZ2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5hZGQobmV3IERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHlBY3Rpb24ocmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBhQ29weUNvbnRhaW5lcikpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPkRlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbjwvY29kZT4gYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBkZWZlcnJlZAotCSAqIGNvcHkgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHkoRVJlZmVyZW5jZSByZWZlcmVuY2UsIEVPYmplY3QgYVZhbHVlLCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgYUNvcHlDb250YWluZXIpIHsKLQkJZ2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5hZGQobmV3IERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbihyZWZlcmVuY2UsIGFWYWx1ZSwgaWRTdWZmaXgsIGFDb3B5Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGFuIGFscmVhZHkgY29waWVkIG9iamVjdCBmaXJzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBjb250YWlubWVudENvcHkoRU9iamVjdCBhbk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gZ2V0Q29weShhbk9iamVjdCk7Ci0JCWlmIChjb3BpZWQgPT0gbnVsbCkKLQkJCWNvcGllZCA9IHByaW1Db3B5KGFuT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGFuIGFscmVhZHkgY29waWVkIG9iamVjdCBmaXJzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBjb250YWlubWVudENvcHlPYmplY3QoRU9iamVjdCBhbk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gZ2V0Q29weShhbk9iamVjdCk7Ci0JCWlmIChjb3BpZWQgPT0gbnVsbCkKLQkJCWNvcGllZCA9IHByaW1Db3B5T2JqZWN0KGFuT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlIGNvbnRhaW5tZW50Q29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJLyogY29waWVkIHJlc291cmNlcyBhcmUgbmV2ZXIgY2FjaGVkICovCi0JCXJldHVybiBwcmltQ29weShhUmVzb3VyY2UsIG5ld1VyaSk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIHdpdGhpbiA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlbSB0bwotCSAqIDxjb2RlPmFHcm91cDwvY29kZT4uIE5vbiBjb21wb3NpdGUgcmVmZXJlbmNlcyB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFsbCBvYmplY3RzIGFyZQotCSAqIGNvcGllZCBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICogCi0JICogQ29weSBSZXNvdXJjZXMgZmlyc3QgYW5kIHRoZW4gY29weSBSZWZPYmplY3RzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgewotCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKLQkJCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7Ci0JCQlzZXNzaW9uLnNldFByZXNlcnZlSWRzKGFHcm91cC5nZXRQcmVzZXJ2ZUlkcygpKTsKLQkJCXNlc3Npb24uY29weShhR3JvdXApOwotCQkJc2Vzc2lvbi5mbHVzaCgpOwotCQl9Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJcmV0dXJuIGNvcHkoYVJlZk9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKLQkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGlzIG1ldGhvZCBvbmx5IGNvcGllcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiB3aXRoIGl0cyBwcm9wZXJ0aWVzLCBub3QKLQkgKiByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKLQkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCXJldHVybiBjb3BpZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlc291cmNlPC9jb2RlPiBpbiB0aGlzCi0JICogY29weSBleGVjdXRpb24uIFRoZSBjb3BpZWQgUmVzb3VyY2Ugd2lsbCBoYXZlIGEgVVJJIGVxdWFsIHRvIDxjb2RlPm5ld1VyaTwvY29kZT4uCi0JICovCi0JcHVibGljIFJlc291cmNlIGNvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7Ci0JCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7Ci0JCVJlc291cmNlIGNvcGllZCA9IHNlc3Npb24uY29weShhUmVzb3VyY2UsIG5ld1VyaSk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhbiBhdHRyaWJ1dGUgaXMgc2V0IGFuZCBpdHMgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHBlcmZvcm0gY29weQotCSAqIDxjb2RlPmF0dHJpYnV0ZTwvY29kZT4gdmFsdWUgZnJvbSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiB0byA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKiBOdWxsIGlzIGEgdmFsaWQgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5QXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0cmlidXRlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmICghYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSgpKQotCQkJcmV0dXJuOyAvL2lnbm9yZQotCQlpZiAoYXR0cmlidXRlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHZhbHVlID0gKExpc3QpIGFSZWZPYmplY3QuZUdldChhdHRyaWJ1dGUpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJY29weU1hbnlBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9IGVsc2UgaWYgKGFSZWZPYmplY3QuZUlzU2V0KGF0dHJpYnV0ZSkpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGFSZWZPYmplY3QuZUdldChhdHRyaWJ1dGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgdmFsdWUpOwotCQkJZWxzZQotCQkJCWNvcHlTaW5nbGVBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PSBNRVRBRU5BTUUpIHsKLQkJCS8vc2V0IG5hbWUgdG8gdGhlIElEICh0aGlzIGlzIGNvbXB1dGVkIGFzIGEgZGVmYXVsdCksIG9ubHkgZ2V0IGhlcmUgaWYgaXNTZXROYW1lIGlzCi0JCQkvLyBmYWxzZS4KLQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFSZWZPYmplY3QuZUdldChhdHRyaWJ1dGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgb3ZlciB0aGUgYXR0cmlidXRlcyBvZiB0aGUgcmVjZWl2ZXIgYW5kIGNvcHkgZWFjaCBhdHRyaWJ1dGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weUN1cnJlbnRBdHRyaWJ1dGVzKEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJTGlzdCBhdHRyaWJ1dGVzID0gYVJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLQkJCUVBdHRyaWJ1dGUgcmE7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcmEgPSAoRUF0dHJpYnV0ZSkgaXQubmV4dCgpOwotCQkJCWNvcHlBdHRyaWJ1dGUocmEsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhIHNlcmllcyBvZiB0ZXN0cyBhcmUgZG9uZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCB0aGUKLQkgKiBjb3BpZWQgb2JqZWN0LCA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKiAKLQkgKiBUZXN0czogMS4gRG8gbm90aGluZyBpZiB0aGUgcmVmZXJlbmNlIGVxdWFscyB0aGUgbWV0YUVDb250YWluZXIgb3IgbWV0YUVDb250YWlucyByZWZlcmVuY2VzLgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weUN1cnJlbnRSZWZlcmVuY2VzKEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gYVJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOwotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsKLQkJCUVSZWZlcmVuY2UgcnI7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcnIgPSAoRVJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJCWlmIChzaG91bGRDb3B5UmVmZXJlbmNlKHJyKSkKLQkJCQkJY29weVJlZmVyZW5jZShyciwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSBvdmVyIDxjb2RlPmFuRXh0ZW50PC9jb2RlPiBhbmQgY29weSBlYWNoIGVsZW1lbnQgdG8gPGNvZGU+Y29weUV4dGVudDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weUV4dGVudChFTGlzdCBhbkV4dGVudCwgRUxpc3QgY29weUV4dGVudCkgewotCQlJdGVyYXRvciBpdCA9IGFuRXh0ZW50Lml0ZXJhdG9yKCk7Ci0JCUVPYmplY3QgcmVmT2JqZWN0OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlyZWZPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJY29weUV4dGVudC5hZGQoY29udGFpbm1lbnRDb3B5KHJlZk9iamVjdCwgbnVsbCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIG1hbnkgdmFsdWUgYXR0cmlidXRlIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSBtYW55IHZhbHVlZCByZWZlcmVuY2UuCi0JICogCi0JICogVGVzdHM6Ci0JICogCi0JICogMS4gSWYgdGhlIHR5cGUgaXMgPGJvbGQ+bm90IDwvYm9sZD4gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gc2V0IHRoZSB2YWx1ZSBvbgotCSAqIDxjb2RlPmNvcHlSZWY8L2NvZGU+IHdpdGhvdXQgbWFraW5nIGEgY29weS4gMi4gSWYgdGhlIHR5cGUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4KLQkgKiBvYnRhaW4gdGhlIGxpc3QgZnJvbSA8Y29kZT5jb3B5UmVmPC9jb2RlPiBhbmQgYWRkIGEgY29weSBvZiBlYWNoIHZhbHVlIGZyb20gdGhlIG9yaWdpbmFsCi0JICogbGlzdCB0byBpdC4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlNYW55QXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0cmlidXRlLCBMaXN0IGFWYWx1ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoYXR0cmlidXRlLmdldEVUeXBlKCkgPT0gbnVsbCkKLQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFWYWx1ZSk7Ci0JCWVsc2UgewotCQkJTGlzdCBjb3B5TGlzdCA9IChMaXN0KSBjb3B5UmVmLmVHZXQoYXR0cmlidXRlKTsKLQkJCUl0ZXJhdG9yIGl0ID0gYVZhbHVlLml0ZXJhdG9yKCk7Ci0JCQlPYmplY3QgbmV4dDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQluZXh0ID0gaXQubmV4dCgpOwotCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJY29weUxpc3QuYWRkKGNvbnRhaW5tZW50Q29weSgoRU9iamVjdCkgbmV4dCwgaWRTdWZmaXgpKTsKLQkJCQllbHNlCi0JCQkJCWNvcHlMaXN0LmFkZChuZXh0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhIHNlcmllcyBvZiB0ZXN0cyBhcmUgZG9uZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCB0aGUKLQkgKiBjb3BpZWQgb2JqZWN0LCA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKiAKLQkgKiBUZXN0czogMS4gSWYgdGhlIHJlZmVyZW5jZSBpcyBtYW55LCBvYnRhaW4gdGhlIGxpc3QgZnJvbSB0aGUgcmVjZWl2aW5nIG9iamVjdCBhbmQgbWFrZSBhIGNvcHkKLQkgKiBvZiBlYWNoIHZhbHVlIGlmIHRoZSByZWZlcmVuY2UgaXMgY29tcG9zaXRlIGJlZm9yZSBhZGRpbmcgdG8gdGhlIGxpc3Q7IG90aGVyd2lzZSwganVzdCBhZGQKLQkgKiBlYWNoIHZhbHVlIHRvIHRoZSBvZiB0aGUgPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TWFueVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIExpc3QgYUxpc3QsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKCFhTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWlmIChhUmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKSkgewotCQkJCUxpc3QgY29weUxpc3QgPSAoTGlzdCkgY29weVJlZi5lR2V0KGFSZWZlcmVuY2UpOwotCQkJCUl0ZXJhdG9yIGl0ID0gYUxpc3QuaXRlcmF0b3IoKTsKLQkJCQlFT2JqZWN0IHRhcmdldFZhbHVlOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJdGFyZ2V0VmFsdWUgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQljb3B5TGlzdC5hZGQoY29udGFpbm1lbnRDb3B5KHRhcmdldFZhbHVlLCBpZFN1ZmZpeCkpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWFkZERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHkoYVJlZmVyZW5jZSwgYUxpc3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBwZXJmb3JtIHRoZSBjb3B5LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKGFSZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgYVJlZk9iamVjdC5lR2V0KGFSZWZlcmVuY2UpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJY29weU1hbnlSZWZlcmVuY2UoYVJlZmVyZW5jZSwgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfSBlbHNlIGlmIChhUmVmT2JqZWN0LmVJc1NldChhUmVmZXJlbmNlKSkgewotCQkJT2JqZWN0IHZhbHVlID0gYVJlZk9iamVjdC5lR2V0KGFSZWZlcmVuY2UpOwotCQkJY29weVNpbmdsZVJlZmVyZW5jZShhUmVmZXJlbmNlLCAoRU9iamVjdCkgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlZk9iamVjdHMgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlIGNvcHkgYmFjayB0byA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZPYmplY3RzKENvcHlHcm91cCBhR3JvdXApIHsKLQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247Ci0JCUVPYmplY3QgcmVmT2JqZWN0OwotCQlTdHJpbmcgaWRTdWZmaXg7Ci0JCWlmIChhR3JvdXAucHJpbUdldFJlZk9iamVjdHMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGFHcm91cC5wcmltR2V0UmVmT2JqZWN0cygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlyZWZPYmplY3QgPSAoRU9iamVjdCkgYXNzb2NpYXRpb24uZ2V0S2V5KCk7Ci0JCQkJaWRTdWZmaXggPSAoU3RyaW5nKSBhc3NvY2lhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCWlmIChpZFN1ZmZpeCA9PSBudWxsKQotCQkJCQlpZFN1ZmZpeCA9IGFHcm91cC5nZXREZWZhdWx0SWRTdWZmaXgoKTsKLQkJCQlhR3JvdXAuYWRkQ29waWVkKGNvbnRhaW5tZW50Q29weShyZWZPYmplY3QsIGlkU3VmZml4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBSZXNvdXJjZXMgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlIGNvcHkgYmFjayB0byA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvcHlSZXNvdXJjZXMoQ29weUdyb3VwIGFHcm91cCkgewotCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKLQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCVN0cmluZyB1cmk7Ci0JCWlmIChhR3JvdXAucHJpbUdldFJlc291cmNlcygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYUdyb3VwLnByaW1HZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGFzc29jaWF0aW9uLmdldEtleSgpOwotCQkJCXVyaSA9IChTdHJpbmcpIGFzc29jaWF0aW9uLmdldFZhbHVlKCk7Ci0JCQkJUmVzb3VyY2UgY29waWVkID0gY29udGFpbm1lbnRDb3B5KHJlc291cmNlLCB1cmkpOwotCQkJCWNvcHlNb2RpZmljYXRpb25GbGFnKHJlc291cmNlLCBjb3BpZWQpOwotCQkJCWFHcm91cC5hZGRDb3BpZWQoY29waWVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYSBzaW5nbGUgdmFsdWUgYXR0cmlidXRlLgotCSAqIAotCSAqIFRlc3RzOgotCSAqIAotCSAqIDEuIElmIGFuIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGl0IGlzIGFuIG9iamVjdCB0eXBlIGFuZCBpdCBtdXN0IGJlCi0JICogY29waWVkLiBEbyBub3QgY29weSB0aGUgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbiBFbnVtZXJhdGlvbiB0eXBlLiAyLiBJZiBhbiBhdHRyaWJ1dGUKLQkgKiB0eXBlIGlzIDxib2xkPm5vdCA8L2JvbGQ+IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gY29weSB0aGUgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXQgb24KLQkgKiA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlTaW5nbGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsIE9iamVjdCBhVmFsdWUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKGF0dHJpYnV0ZS5nZXRFVHlwZSgpID09IG51bGwpIHsKLQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvL01PRjEwOAotCQkJLy8gaWYgKGF0dHJpYnV0ZS5pc09iamVjdFR5cGUoKSkKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykKLQkJCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBjb250YWlubWVudENvcHkoKEVPYmplY3QpIGFWYWx1ZSwgaWRTdWZmaXgpKTsKLQkJCWVsc2UKLQkJCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhVmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGEgc2VyaWVzIG9mIHRlc3RzIGFyZSBkb25lIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZQotCSAqIGNvcGllZCBvYmplY3QsIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqIAotCSAqIFRlc3RzOiAxLiBJZiB0aGUgcmVmZXJlbmNlIGlzIDxib2xkPm5vdCA8L2JvbGQ+IG1hbnksIG1ha2UgYSBjb3B5IG9mIHRoZSB2YWx1ZSBpZiB0aGUKLQkgKiByZWZlcmVuY2UgaXMgY29tcG9zaXRlIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIDxjb2RlPmNvcHlSZWY8L2NvZGU+OyBvdGhlcndpc2UsIGp1c3QKLQkgKiBzZXQgdGhlIHZhbHVlIGFzIGlzLgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weVNpbmdsZVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIEVPYmplY3QgYVZhbHVlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCS8vRXhjZXB0aW9uYWwgY2FzZTsgdGhlIHJlbGF0aW9uc2hpcCBpcyBub3QgdGhlIGNvbnRhaW5lciByZWxhdGlvbnNoaXAKLQkJLy9BbmQgaXMgbm90IG5hdmlnYWJsZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uOyBnbyBhaGVhZCBhbmQgY29weQotCQlpZiAoYVZhbHVlICE9IGFSZWZPYmplY3QuZUNvbnRhaW5lcigpIHx8IGFSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgPT0gbnVsbCkgewotCQkJaWYgKGFSZWZlcmVuY2UuaXNDb250YWlubWVudCgpKQotCQkJCWNvcHlSZWYuZVNldChhUmVmZXJlbmNlLCBjb250YWlubWVudENvcHkoYVZhbHVlLCBpZFN1ZmZpeCkpOwotCQkJZWxzZQotCQkJCWFkZERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weShhUmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyB3aXRoaW4gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZW0gdG8KLQkgKiA8Y29kZT5hR3JvdXA8L2NvZGU+LiBOb24gY29tcG9zaXRlIHJlZmVyZW5jZXMgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhbGwgb2JqZWN0cyBhcmUKLQkgKiBjb3BpZWQgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqIAotCSAqIENvcHkgUmVzb3VyY2VzIGZpcnN0IGFuZCB0aGVuIGNvcHkgUmVmT2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQ29weShDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJdXRpbGl0eS5jb3B5KGFHcm91cCk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQXR0cmlidXRlQ29weShFT2JqZWN0IGFSZWZPYmplY3QsIEVPYmplY3QgY29weU9iamVjdCkgewotCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXV0aWxpdHkuY29weUN1cnJlbnRBdHRyaWJ1dGVzKGFSZWZPYmplY3QsIG51bGwsIGNvcHlPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCi0JICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCi0JICogSURzIG9mIGNvcGllZCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVDb3B5KEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlyZXR1cm4gY3JlYXRlQ29weShhUmVmT2JqZWN0LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZwotCSAqIElEcyBvZiBjb3BpZWQgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlQ29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXJldHVybiB1dGlsaXR5LmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIENvcHkgPGNvZGU+YVJlc291cmNlPC9jb2RlPiB1c2luZyA8Y29kZT5uZXdVcmk8L2NvZGU+IGZvciB0aGUgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlQ29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQlyZXR1cm4gdXRpbGl0eS5jb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpIHsKLQkJaWYgKHByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcHJpbUdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuaXRlcmF0b3IoKTsKLQkJCURlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiBhY3Rpb247Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJYWN0aW9uID0gKERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbikgaXQubmV4dCgpOwotCQkJCWFjdGlvbi5wZXJmb3JtQWN0aW9uKCk7Ci0JCQl9Ci0JCQlwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTMvMjAwMCA5OjE3OjM1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkhhc2hNYXAgZ2V0Q29waWVkT2JqZWN0cygpIHsKLQkJaWYgKGNvcGllZE9iamVjdHMgPT0gbnVsbCkKLQkJCWNvcGllZE9iamVjdHMgPSBuZXcgSGFzaE1hcCgyMDApOwotCQlyZXR1cm4gY29waWVkT2JqZWN0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkhhc2hNYXAgZ2V0Q29waWVkQWRhcHRlcnMoKSB7Ci0JCWlmIChjb3BpZWRBZGFwdGVycyA9PSBudWxsKQotCQkJY29waWVkQWRhcHRlcnMgPSBuZXcgSGFzaE1hcCgyMDApOwotCQlyZXR1cm4gY29waWVkQWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY2FjaGVkIGNvcHkuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weShFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmIChhbk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRU9iamVjdCkgZ2V0Q29waWVkT2JqZWN0cygpLmdldChhbk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY2FjaGVkIGNvcHksIGlmIG5vbmUsIHJldHVybiB0aGUgYXJndW1lbnQuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weUlmRm91bmQoRU9iamVjdCBhbk9iamVjdCkgewotCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkoYW5PYmplY3QpOwotCQlyZXR1cm4gY29waWVkID09IG51bGwgPyBhbk9iamVjdCA6IGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNi8yMDAwIDk6MTE6MzIgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpIHsKLQkJaWYgKGRlZmVycmVkUmVmZXJlbmNlQ29waWVzID09IG51bGwpCi0JCQlkZWZlcnJlZFJlZmVyZW5jZUNvcGllcyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKLQkJcmV0dXJuIGRlZmVycmVkUmVmZXJlbmNlQ29waWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBFT2JqZWN0IHRoYXQgaXMgdGhlIHNhbWUgdHlwZSBhcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBuZXdJbnN0YW5jZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJaWYgKGFSZWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFUGFja2FnZSBlcGtnID0gKEVQYWNrYWdlKSBhUmVmT2JqZWN0LmVDbGFzcygpLmVDb250YWluZXIoKTsKLQkJRUZhY3RvcnkgZmFjdG9yeSA9IGVwa2cuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQlFQ2xhc3MgcmVmT2JqID0gYVJlZk9iamVjdC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlKHJlZk9iaik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIFJlc291cmNlIHRoYXQgdXNlcyB0aGUgc2FtZSBSZXNvdXJjZUZhY3RvcnkgYXMgdGhlIG9uZSB1c2VkIGJ5Ci0JICogPGNvZGU+YVJlc291cmNlPC9jb2RlPi4gSWYgPGNvZGU+bmV3VXJpPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHVzZSB0aGUgVVJJCi0JICogZnJvbSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBuZXdJbnN0YW5jZShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBpbm5lck5ld1VyaSA9IG5ld1VyaTsKLQkJUmVzb3VyY2UgbmV3UmVzb3VyY2U7Ci0JCVN0cmluZyBvcmlnaW5hbFVyaSA9IGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpOwotCQlpbm5lck5ld1VyaSA9IGlubmVyTmV3VXJpID09IG51bGwgPyBvcmlnaW5hbFVyaSA6IGlubmVyTmV3VXJpOwotCi0JCVJlc291cmNlLkZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKQotCQkJZmFjdG9yeSA9IFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShVUkkuY3JlYXRlVVJJKG9yaWdpbmFsVXJpKSk7Ci0JCWVsc2UKLQkJCWZhY3RvcnkgPSBhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShvcmlnaW5hbFVyaSkpOwotCi0KLQkJbmV3UmVzb3VyY2UgPSBmYWN0b3J5LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoaW5uZXJOZXdVcmkpKTsKLQkJcmV0dXJuIG5ld1Jlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/IERlZmF1bHRzIHRvIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlc2VydmVJZHMoKSB7Ci0JCXJldHVybiBwcmVzZXJ2ZUlkczsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZwotCSAqIElEcyBvZiBjb3BpZWQgb2JqZWN0cy4gSWYgYW4gaWRTdWZmaXggZG9lcyBub3QgZXhpc3QsIGRvIG5vdCBzZXQgYW4gaWQgb24gdGhlIGNvcGllZCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgcHJpbUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJaWYgKGFSZWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFT2JqZWN0IGNvcHlSZWYgPSBwcmltQ29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0KLQkJY29weUN1cnJlbnRSZWZlcmVuY2VzKGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJcmV0dXJuIGNvcHlSZWY7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUgY29udGFpbm1lbnQKLQkgKiB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgSURzIG9mCi0JICogY29waWVkIG9iamVjdHMuIElmIGFuIGlkU3VmZml4IGRvZXMgbm90IGV4aXN0LCBkbyBub3Qgc2V0IGFuIGlkIG9uIHRoZSBjb3BpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmIChhUmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb3B5UmVmID0gbmV3SW5zdGFuY2UoYVJlZk9iamVjdCk7Ci0KLQkJcmVjb3JkQ29weShhUmVmT2JqZWN0LCBjb3B5UmVmKTsKLQkJY29weUN1cnJlbnRBdHRyaWJ1dGVzKGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKLQkJaWYgKGlzQ29weUFkYXB0ZXJzKCkpCi0JCQljb3B5QWRhcHRlcnMoYVJlZk9iamVjdCwgY29weVJlZik7Ci0JCXJldHVybiBjb3B5UmVmOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlBZGFwdGVycyhFT2JqZWN0IGFSZWZPYmplY3QsIEVPYmplY3QgY29weVJlZikgewotCQlMaXN0IGFkYXB0ZXJzID0gYVJlZk9iamVjdC5lQWRhcHRlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5zaXplKCk7IGkrKykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLmdldChpKTsKLQkJCWNvcHlBZGFwdGVyKGFSZWZPYmplY3QsIGNvcHlSZWYsIGFkYXB0ZXIpOwotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5QWRhcHRlcihFT2JqZWN0IGFSZWZPYmplY3QsIEVPYmplY3QgY29weVJlZiwgQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBDbG9uZWFibGVQdWJsaWMpKQotCQkJcmV0dXJuOwotCQlDbG9uZWFibGVQdWJsaWMgY29weUFkYXB0ZXIgPSAoQ2xvbmVhYmxlUHVibGljKSBnZXRDb3BpZWRBZGFwdGVycygpLmdldChhZGFwdGVyKTsKLQkJaWYgKGNvcHlBZGFwdGVyID09IG51bGwpIHsKLQkJCWNvcHlBZGFwdGVyID0gKENsb25lYWJsZVB1YmxpYykgKChDbG9uZWFibGVQdWJsaWMpIGFkYXB0ZXIpLmNsb25lKCk7Ci0JCQlnZXRDb3BpZWRBZGFwdGVycygpLnB1dChhZGFwdGVyLCBjb3B5QWRhcHRlcik7Ci0JCX0KLQkJaWYgKGNvcHlBZGFwdGVyICE9IG51bGwpCi0JCQljb3B5UmVmLmVBZGFwdGVycygpLmFkZChjb3B5QWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIHByaW1Db3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgY29weVJlc291cmNlID0gbmV3SW5zdGFuY2UoYVJlc291cmNlLCBuZXdVcmkpOwotCQljb3B5RXh0ZW50KGFSZXNvdXJjZS5nZXRDb250ZW50cygpLCBjb3B5UmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0JCXJldHVybiBjb3B5UmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weU1vZGlmaWNhdGlvbkZsYWcoUmVzb3VyY2UgYVJlc291cmNlLCBSZXNvdXJjZSBjb3BpZWQpIHsKLQkJaWYgKGFSZXNvdXJjZS5pc01vZGlmaWVkKCkpCi0JCQljb3BpZWQuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjExOjMyIEFNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpIHsKLQkJcmV0dXJuIGRlZmVycmVkUmVmZXJlbmNlQ29waWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlY29yZENvcHkoRU9iamVjdCBhU291cmNlLCBFT2JqZWN0IGFDb3B5KSB7Ci0JCWdldENvcGllZE9iamVjdHMoKS5wdXQoYVNvdXJjZSwgYUNvcHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlY29yZENvcHkoQWRhcHRlciBhU291cmNlLCBBZGFwdGVyIGFDb3B5KSB7Ci0JCWdldENvcGllZEFkYXB0ZXJzKCkucHV0KGFTb3VyY2UsIGFDb3B5KTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlSWRzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlc2VydmVJZHMgPSB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRDb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSkgewotCQlyZXR1cm4gYVJlZmVyZW5jZS5pc0NoYW5nZWFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb3B5QWRhcHRlcnMoKSB7Ci0JCXJldHVybiBjb3B5QWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICogRmxhZyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgYWRhcHRlcnMgc2hvdWxkIGJlIGNvcGllZCBhcyB3ZWxsLiBJbiBvcmRlciBmb3IgYW4gYWRhcHRlciB0bwotCSAqIGJlIGNvcGllZCwgaXQgbXVzdCBpbXBsZW1lbnQgdGhlIHtAbGluayBDbG9uZWFibGVQdWJsaWN9aW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlBZGFwdGVycyhib29sZWFuIGIpIHsKLQkJY29weUFkYXB0ZXJzID0gYjsKLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXhjZXB0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjI5YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuSVdGVFdyYXBwZWRFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gZmFjdG9yIGNvbW1vbiBjb2RlIGZvciBpbXBsZW1lbnRlcnMgb2YgSUFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IZWxwZXIgewotCi0JLyoqCi0JICogVXRpbGl0eSBjbGFzczsgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotCSAqLwotCXByaXZhdGUgRXhjZXB0aW9uSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbQotCSAqIAotCSAqIEBleGNlcHRpb24gYW5kCi0JICogICAgICAgICAgICAgICAgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcyhJV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0JCW1lc3NhZ2VzLmFkZChleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4Y2VwdGlvbi5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJd2hpbGUgKG5lc3RlZCAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQobmVzdGVkLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAobmVzdGVkIGluc3RhbmNlb2YgSVdGVFdyYXBwZWRFeGNlcHRpb24pCi0JCQkJbmVzdGVkID0gKChJV0ZUV3JhcHBlZEV4Y2VwdGlvbikgbmVzdGVkKS5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCWVsc2UKLQkJCQluZXN0ZWQgPSBudWxsOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIG1lc3NhZ2VzLnRvQXJyYXkobmV3IFN0cmluZ1ttZXNzYWdlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGFuZAotCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMKLQkgKiAgICAgICAgICAgICAgICBvbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcyhJV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJU3RyaW5nW10gbWVzc2FnZXMgPSBnZXRBbGxNZXNzYWdlcyhleGNlcHRpb24pOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDI1Nik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZChtZXNzYWdlc1tpXSk7Ci0JCQlpZiAoaSA8IG1lc3NhZ2VzLmxlbmd0aCAtIDEpCi0JCQkJc2IuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4dGVuZGVkRWNvcmVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2YxOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4dGVuZGVkRWNvcmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbC5FQWRhcHRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEVjb3JlVXRpbCBleHRlbmRzIEVjb3JlVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgRmlsZU5vdEZvdW5kRGV0ZWN0b3IgRklMRV9OT1RfRk9VTkRfREVURUNUT1I7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5BTUVfQVRUUklCVVRFX1NUUklORyA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QgZXh0ZW5kcyBFQWRhcHRlckxpc3QKLQkgIHsKLQotCSAgICAvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3ODU1NDM4MzM5MTg3NTQwNzE4TDsKLQotCQlwdWJsaWMgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCQlzdXBlcihub3RpZmllcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5hZGQob2JqZWN0KTsKLQkgICAgfQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICBzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkgICAgfQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JICAgIH0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLQkgICAgfQotCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKQotCSAgICB7Ci0JICAgICBzdXBlci5jbGVhcigpOwotCSAgICB9Ci0KLQotCSAgICBAT3ZlcnJpZGUKLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIuc2V0KGluZGV4LCBvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICBzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgQE92ZXJyaWRlCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBpbnQgb2xkUG9zaXRpb24pCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9sZFBvc2l0aW9uKTsKLQkgICAgfQotCSAgfQotCQotCXB1YmxpYyBpbnRlcmZhY2UgRmlsZU5vdEZvdW5kRGV0ZWN0b3IgewotCQlib29sZWFuIGlzRmlsZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IoRmlsZU5vdEZvdW5kRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLQkJRklMRV9OT1RfRk9VTkRfREVURUNUT1IgPSBkZXRlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVOb3RGb3VuZERldGVjdG9yIGdldEZpbGVOb3RGb3VuZERldGVjdG9yKCkgewotCQlpZiAoRklMRV9OT1RfRk9VTkRfREVURUNUT1IgPT0gbnVsbCkgewotCQkJRklMRV9OT1RfRk9VTkRfREVURUNUT1IgPSBuZXcgRmlsZU5vdEZvdW5kRGV0ZWN0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaXNGaWxlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKLQkJCQkJaWYgKGdldElubmVyRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHdyYXBwZWRFeCkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gRklMRV9OT1RfRk9VTkRfREVURUNUT1I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlTm90Rm91bmRFeGNlcHRpb24gZ2V0SW5uZXJGaWxlTm90Rm91bmRFeGNlcHRpb24oV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKLQkJaWYgKHdyYXBwZWRFeC5leGNlcHRpb24oKSBpbnN0YW5jZW9mIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgd3JhcHBlZEV4LmV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKHdyYXBwZWRFeC5leGNlcHRpb24oKSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCXJldHVybiBnZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbigoV3JhcHBlZEV4Y2VwdGlvbikgd3JhcHBlZEV4LmV4Y2VwdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZVNldE9yQWRkKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWVTZXRPckFkZChvYmosIGZlYXR1cmUsIHZhbHVlLCAwKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZVNldE9yQWRkKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJaWYgKGZlYXR1cmUuaXNNYW55KCkgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJTGlzdCBmZWF0dXJlTGlzdCA9ICgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpOwotCQkJaWYgKG5ld0luZGV4ID49IDAgJiYgbmV3SW5kZXggPCBmZWF0dXJlTGlzdC5zaXplKCkpCi0JCQkJZmVhdHVyZUxpc3QuYWRkKG5ld0luZGV4LCB2YWx1ZSk7Ci0JCQllbHNlCi0JCQkJZmVhdHVyZUxpc3QuYWRkKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlVW5zZXRPclJlbW92ZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsIHx8IGZlYXR1cmUuaXNNYW55KCkpCi0JCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5yZW1vdmUodmFsdWUpOwotCQllbHNlCi0JCQlvYmouZVVuc2V0KGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aChVUkkgc291cmNlVXJpLCBVUkkgdGVzdFVyaSkgewotCQkvL1RPRE8gV2FpdGluZyBvbiBuZXcgZW1mIFVSSSBBUEkKLQkJU3RyaW5nW10gc291cmNlU2VnbWVudHMgPSBzb3VyY2VVcmkuc2VnbWVudHMoKTsKLQkJU3RyaW5nW10gdGVzdFNlZ21lbnRzID0gdGVzdFVyaS5zZWdtZW50cygpOwotCQlpbnQgaSA9IHRlc3RTZWdtZW50cy5sZW5ndGg7Ci0JCWludCBqID0gc291cmNlU2VnbWVudHMubGVuZ3RoOwotCQlpZiAoaiA+PSBpKSB7Ci0JCQlib29sZWFuIHRlc3QgPSB0cnVlOwotCi0JCQl3aGlsZSAodGVzdCAmJiBpID4gMCkgewotCQkJCWktLTsKLQkJCQlqLS07Ci0JCQkJdGVzdCA9IHRlc3RTZWdtZW50c1tpXS5lcXVhbHMoc291cmNlU2VnbWVudHNbal0pOwotCQkJfQotCQkJcmV0dXJuIHRlc3Q7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBFTmFtZWRFbGVtZW50KQotCQkJcmV0dXJuICgoRU5hbWVkRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCUxpc3QgYWxsQXR0cyA9IG9iai5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQlpbnQgc2l6ZSA9IGFsbEF0dHMuc2l6ZSgpOwotCQlFQXR0cmlidXRlIGF0dCwgbmFtZUF0dHJpYnV0ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhdHQgPSAoRUF0dHJpYnV0ZSkgYWxsQXR0cy5nZXQoaSk7Ci0JCQlpZiAoTkFNRV9BVFRSSUJVVEVfU1RSSU5HLmVxdWFscyhhdHQuZ2V0TmFtZSgpKSkgewotCQkJCW5hbWVBdHRyaWJ1dGUgPSBhdHQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5hbWVBdHRyaWJ1dGUgIT0gbnVsbCkKLQkJCXJldHVybiAoU3RyaW5nKSBvYmouZUdldChuYW1lQXR0cmlidXRlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTG9hZGluZ1RhZyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvL3Jlc291cmNlLmVBZGFwdGVycygpLmFkZChJc0xvYWRpbmdEZXRlY3Rvci5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTG9hZGluZ1RhZyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvL3Jlc291cmNlLmVBZGFwdGVycygpLnJlbW92ZShJc0xvYWRpbmdEZXRlY3Rvci5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHJlc291cmNlIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyBmb3IgdGhlCi0JICogSXNMb2FkaW5nRGVjdG9yIGluIHRoZSBsaXN0IG9mIGVBZGFwdGVycyBvbiB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogQHNlZSBhZGRMb2FkaW5nVGFnKFJlc291cmNlKQotCSAqIEBzZWUgcmVtb3ZlTG9hZGluZ1RhZyhSZXNvdXJjZSkKLQkgKiAgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBSZXNvdXJjZS5JbnRlcm5hbCNpc0xvYWRpbmcoKX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2FkaW5nKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZSAhPSBudWxsID8gKChSZXNvdXJjZS5JbnRlcm5hbClyZXNvdXJjZSkuaXNMb2FkaW5nKCkgOiBmYWxzZTsgCi0JfQotCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJGb3JMb2FkaW5nKEFkYXB0ZXIgdGFyZ2V0QWRhcHRlciwgRU9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzID0gdGFyZ2V0T2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzID09IG51bGwgfHwgaXNMb2FkaW5nKHJlcykpCi0JCQlyZXR1cm4gbmV3IElzTG9hZGluZ1Byb3h5QWRhcHRlcih0YXJnZXRBZGFwdGVyLCB0YXJnZXRPYmplY3QpOwotCQlyZXR1cm4gdGFyZ2V0QWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJlUmVnaXN0ZXJQYWNrYWdlKFN0cmluZyBuc1ByZWZpeCwgRVBhY2thZ2UuRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmICghRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuY29udGFpbnNLZXkobnNQcmVmaXgpKQotCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KG5zUHJlZml4LCBkZXNjcmlwdG9yKTsKLQl9Ci0JLyoqCi0JICAgKiBSZXR1cm5zIHRoZSBhZGFwdGVyIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBAcGFyYW0gYW5PYmplY3QgCi0JICAgKiBAcGFyYW0gYWRhcHRlcnMgbGlzdCBvZiBhZGFwdGVycyB0byBzZWFyY2guCi0JICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBhZGFwdGVyLgotCSAgICogQHJldHVybiBhbiBhZGFwdGVyIGZyb20gdGhlIGxpc3Qgb3IgbnVsbC4KLQkgICAqLwotCSAgcHVibGljIHN0YXRpYyBBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBhbk9iamVjdCwgTGlzdCBhZGFwdGVycywgT2JqZWN0IHR5cGUpIHsKLQotCQkgIAlPYmplY3QgW10gYWRhcHRBcnJheSA9ICgoRUFkYXB0ZXJMaXN0KWFkYXB0ZXJzKS5kYXRhKCk7Ci0JCSAgCWlmIChhZGFwdEFycmF5ID09IG51bGwpIHJldHVybiBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0QXJyYXlbaV07Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpIHsKLQkJCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gaXQncyBjb250YWluZXIsIGFuZCBtYWtlIGl0IGFuZCBhbGwgaXQncyBjaGlsZHJlbgotCSAqIHByb3hpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5sb2FkKEVPYmplY3Qgcm9vdCkgewotCQlSZXNvdXJjZSByZXMgPSByb290LmVSZXNvdXJjZSgpOwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHJvb3QuZUNvbnRhaW5lcigpOwotCQkvKiBNYWtpbmcgc3VyZSB0aGUgcHJveHkgaXMgY3JlYXRlZCBmaXJzdCBiZWZvcmUgdW5sb2FkaW5nICovCi0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCWJlY29tZVByb3h5KHJvb3QsIHJlcyk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQlyZXMuZ2V0Q29udGVudHMoKS5yZW1vdmUocm9vdCk7Ci0JCQllbHNlIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHJvb3QuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQkJCWVVbnNldE9yUmVtb3ZlKGNvbnRhaW5lciwgZmVhdHVyZSwgcm9vdCk7Ci0JCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFR1cm5zIHRoaXMgb2JqZWN0IGFuZCBhbGwgaXQncyBjaGlsZHJlbiB0byBwcm94aWVzLCBhbmQgcmVtb3ZlcyBhZGFwdGVycyBwcmVjb25kaXRpb246IFRoZQotCSAqIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gaXQncyBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmVjb21lUHJveHkoRU9iamVjdCByb290LCBSZXNvdXJjZSByZXMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHJvb3QuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZG9CZWNvbWVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSwgcmVzKTsKLQkJfQotCQlkb0JlY29tZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHJvb3QsIHJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvQmVjb21lUHJveHkoSW50ZXJuYWxFT2JqZWN0IHAsIFJlc291cmNlIHJlcykgewotCQlTdHJpbmcgaWQgPSByZXMuZ2V0VVJJRnJhZ21lbnQocCk7Ci0JCXAuZVNldFByb3h5VVJJKHJlcy5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCSgoWE1MUmVzb3VyY2UpIHJlcykuc2V0SUQocCxudWxsKTsKLQkJfQotCQlwLmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByb3h5KEVPYmplY3Qgcm9vdCwgUmVzb3VyY2UgcmVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByb290LmVBbGxDb250ZW50cygpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWRvUmVtb3ZlUHJveHkoKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCksIHJlcyk7Ci0JCX0KLQkJZG9SZW1vdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSByb290LCByZXMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkb1JlbW92ZVByb3h5KEludGVybmFsRU9iamVjdCBwLCBSZXNvdXJjZSByZXMpIHsKLQkJU3RyaW5nIGlkID0gcC5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCSgoWE1MUmVzb3VyY2UpIHJlcykuc2V0SUQocCwgaWQpOwotCQl9Ci0JCXAuZVNldFByb3h5VVJJKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGUgcGFzc2VkIG9iamVjdCBpcyBub3QgYSBwcm94eTsgaWYgaXQgaXMsIHRocm93cyBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgYmFkCi0JICogSFJFRi4gSWYgdGhlIG9iamVjdCBpcyBudWxsLCBkb2VzIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEB0aHJvd3MgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUHJveHkoRU9iamVjdCBvYmplY3QpIHRocm93cyBEYW5nbGluZ0hSRUZFeGNlcHRpb24gewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgIW9iamVjdC5lSXNQcm94eSgpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbXNnID0gV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkRBTkdMSU5HX0hSRUZfRVJST1JfLCBuZXcgT2JqZWN0W117KChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCkuZVByb3h5VVJJKCl9KTsKLQkJdGhyb3cgbmV3IERhbmdsaW5nSFJFRkV4Y2VwdGlvbihtc2cpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIG8xIGFuZCBvMiBhcmUgbm90IHRoZSBzYW1lIHZhbHVlcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgdGhhdAotCSAqIGVpdGhlciBwYXJhbWV0ZXIgY2FuIGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIG8xCi0JICogQHBhcmFtIG8yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZUNoYW5nZWQoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuIChvMSA9PSBudWxsIF4gbzIgPT0gbnVsbCkgfHwgKG8xID09IG51bGwgfHwgIW8xLmVxdWFscyhvMikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzI0ZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODE5MDg5MTY0ODMzMzgxNDIwMUw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2YTY4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvMTAvMjAwMSAyOjQ2OjU0IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZVZhbHVlQ29udmVydGVyIHsKLQlzdGF0aWMgZmluYWwgRmVhdHVyZVZhbHVlQ29udmVydGVyIERFRkFVTFQgPSBuZXcgRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKLQkgKiBAYUZlYXR1cmUuCi0JICovCi0JT2JqZWN0IGNvbnZlcnRWYWx1ZShPYmplY3QgYVZhbHVlLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDgxN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBKb2huIE1vdXJyYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kIHsKLQotCS8qCi0JICogVGhpcyB3aWxsIGNvbnRhaW4gdGhlIG11bHRpLXNlbGVjdGlvbiBvZiBvYmplY3RzIHRvIGRlcGxveS4gVGhpcyBzZWxlY3Rpb24gY291bGQgYmUgdXNlZCB0bwotCSAqIGZpbHRlciBlbGVtZW50cyB3aXRoaW4gYSBNb2R1bGUuIEFueSBvdGhlciBzZXR1cCBjb2RlIHNob3VsZCBiZSBkb25lIGhlcmUuLi4KLQkgKi8KLQl2b2lkIGluaXQoT2JqZWN0W10gc2VsZWN0aW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSBkZWx0YQotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVJlc291cmNlIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSUNvbW1hbmRDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjNjOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZDIgZXh0ZW5kcyBJQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBBY2Nlc3NvciBmb3IgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIElQcm9qZWN0fSB0aGF0IHdlcmUgbW9kaWZpZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNvbW1hbmQuCi0JICogCi0JICogQHJldHVybiBBIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgSVByb2plY3R9IHRoYXQgd2VyZSBtb2RpZmllZCBieSB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZmZlY3RlZFByb2plY3RzKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDI3MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBAYXV0aG9yIEpvaG4gTW91cnJhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRDb250ZXh0IHsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSURVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSURVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTAyMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lEVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJRFV0aWwgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB0byBhc3NpZ24gYSB1bmlxdWUgSUQgdG8gdGhlIG9iamVjdC4gVGhlIG9iamVjdCBtdXN0IGJlIGNvbnRhaW5lZCBpbiBhCi0JICogcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2lnbklEKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIGFSZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKQotCQkJYXNzaWduSUQob2JqZWN0LCAoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPckFzc2lnbklEKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCVJlc291cmNlIGFSZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKQotCQkJcmV0dXJuIGdldE9yQXNzaWduSUQob2JqZWN0LCAoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9yQXNzaWduSUQoRU9iamVjdCBvYmplY3QsIFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlTdHJpbmcgaWQgPSBhUmVzb3VyY2UuZ2V0SUQob2JqZWN0KTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gYXNzaWduSUQob2JqZWN0LCBhUmVzb3VyY2UpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWduSUQoRU9iamVjdCBvYmplY3QsIFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlTdHJpbmcgbmFtZSA9IGdldEJhc2VJREZvckFzc2lnbm1lbnQob2JqZWN0KTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgaWQgPSBlbnN1cmVVbmlxdWVJRChhUmVzb3VyY2UsIG5hbWUpOwotCQlhUmVzb3VyY2Uuc2V0SUQob2JqZWN0LCBpZCk7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBlbnN1cmVVbmlxdWVJRChYTUxSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBiYXNlSUROYW1lKSB7Ci0JCVN0cmluZyBpbm5lckJhc2VJRE5hbWUgPSBiYXNlSUROYW1lOwotCQlpbm5lckJhc2VJRE5hbWUgKz0gIl8iOyAvLyROT04tTkxTLTEkCi0JCS8vQ2hhbmdlIHRvIHVzZSB0aGUgY3VycmVudCB0aW1lIGluc3RlYWQgb2YgaW5jcmVtZW50YWwgbnVtYmVycyB0byBoZWxwCi0JCS8vc3VwcG9ydCB0ZWFtIGRldmVsb3BtZW50LgotCQlsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVN0cmluZyBpZCA9IGlubmVyQmFzZUlETmFtZSArIGN1cnJlbnRUaW1lOwotCQl3aGlsZSAoYVJlc291cmNlLmdldEVPYmplY3QoaWQpICE9IG51bGwpIHsKLQkJCSsrY3VycmVudFRpbWU7Ci0JCQlpZCA9IGlubmVyQmFzZUlETmFtZSArIGN1cnJlbnRUaW1lOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRCYXNlSURGb3JBc3NpZ25tZW50KEVPYmplY3Qgb2JqZWN0KSB7Ci0JCUVDbGFzcyBtZXRhTyA9IG9iamVjdC5lQ2xhc3MoKTsKLQkJcmV0dXJuIG1ldGFPLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiOGQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTg3ODU3NDQwMTAyMTU5MDU0NUw7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWMwNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyMTE5NDI4NTM3OTY4MjM4NDBMOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNlNjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVXNlckV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTMyMDc1OTc1MjcwNjg5ODA5NUw7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdEZXRlY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDExNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlCi0gKiBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgSXNMb2FkaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElzTG9hZGluZ0RldGVjdG9yIElOU1RBTkNFID0gbmV3IElzTG9hZGluZ0RldGVjdG9yKCk7Ci0KLQlwcml2YXRlIElzTG9hZGluZ0RldGVjdG9yKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCX0KLQotCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IHRoaXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdQcm94eUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdQcm94eUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyZmU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nUHJveHlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSXNMb2FkaW5nUHJveHlBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7Ci0JcHJpdmF0ZSBBZGFwdGVyIHRhcmdldEFkYXB0ZXI7Ci0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldE9iamVjdDsKLQotCXB1YmxpYyBJc0xvYWRpbmdQcm94eUFkYXB0ZXIoQWRhcHRlciBhVGFyZ2V0QWRhcHRlciwgRU9iamVjdCBhVGFyZ2V0T2JqZWN0KSB7Ci0JCXRhcmdldEFkYXB0ZXIgPSBhVGFyZ2V0QWRhcHRlcjsKLQkJdGFyZ2V0T2JqZWN0ID0gYVRhcmdldE9iamVjdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkvL2xpc3RlbiBmb3IgdGhlIHJlbW92ZSBvZiB0aGUgbG9hZGluZyBhZGFwdGVyCi0JCQlpZiAobXNnLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEICYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJcmVtb3ZlUHJveHlTdXBwb3J0KCk7Ci0JCQkJcmVzZXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjYWNoZVJlc291cmNlKCkpIHsKLQkJCXRhcmdldEFkYXB0ZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhY2hlIHRoZSByZXNvdXJjZSB2YXJpYWJsZSBhbmQgcmV0dXJuIHRydWUgaWYgd2UgcmVtb3ZlZCB0aGUgcHJveHkgc3VwcG9ydC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FjaGVSZXNvdXJjZSgpIHsKLQkJaWYgKGdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBnZXRUYXJnZXQoKTsKLQkJCXJlc291cmNlID0gZU9iai5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmlzTG9hZGluZyhyZXNvdXJjZSkpCi0JCQkJCXJlc291cmNlLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCQllbHNlIHsKLQkJCQkJdGFyZ2V0T2JqZWN0LmVBZGFwdGVycygpLmFkZCh0YXJnZXRBZGFwdGVyKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3h5U3VwcG9ydCgpIHsKLQkJZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQl0YXJnZXRPYmplY3QuZUFkYXB0ZXJzKCkuYWRkKHRhcmdldEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJcmVzb3VyY2UgPSBudWxsOwotCQl0YXJnZXRBZGFwdGVyID0gbnVsbDsKLQkJdGFyZ2V0T2JqZWN0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0YTczNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKLSAqICAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZSB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5zVVJJOwotCi0KLQlwdWJsaWMgTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMubnNVUkkgPSB1cmk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROc1VSSSgpIHsKLQkJcmV0dXJuIG5zVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5zVVJJKFN0cmluZyBzdHJpbmcpIHsKLQkJbnNVUkkgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBzdHJpbmcpIHsKLQkJcHJlZml4ID0gc3RyaW5nOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4OTJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyB1c2VkIHRvIGhvbGQgbmFtZXNwYWNlcyBwYXJzZWQgZnJvbSBhbiBYTUwgZmlsZSB1c2luZyB0aGUgeG1sbnM6cHJlZml4PSJhVVJJIgotICogc3ludGF4Ci0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDbG9uZWFibGVQdWJsaWMgewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURBUFRFUl9UWVBFID0gTmFtZXNwYWNlQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHJvdGVjdGVkIE1hcCBwcmVmaXhlc1RvTlM7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlczsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIE5PVElGSUNBVElPTl9GRUFUVVJFID0gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwoKSB7Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vdGlmaWNhdGlvbiBleHRlbmRzIE5vdGlmaWNhdGlvbkltcGwgewotCi0JCS8qKgotCQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JCSAqIEBwYXJhbSBvbGRWYWx1ZQotCQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkJICovCi0JCXB1YmxpYyBOb3RpZmljYXRpb24oaW50IGV2ZW50VHlwZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKGV2ZW50VHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldEZlYXR1cmUoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZSgpIHsKLQkJCXJldHVybiBOT1RJRklDQVRJT05fRkVBVFVSRTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBOYW1lc3BhY2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOYW1lc3BhY2VBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iaik7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLmFkZE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgpOwotCX0KLQotCS8qKgotCSAqIEZhY2FkZSBtZXRob2QgZm9yIHJlc29sdmluZyBwcmVmaXhlcyB0byBhbiBhY3R1YWwgbmFtZXNwYWNlIFVSSS4gVXNlZCBmb3Igb2JqZWN0cyBjb250YWluZWQKLQkgKiBieSBpbnN0YW5jZXMgb2Yge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlfS4gV2Fsa3MgdXAgdGhlIG9iamVjdAotCSAqIGNvbnRhaW5tZW50IHBhdGggdW50aWwgYSBuYW1lc3BhY2UgaXMgZm91bmQsIG9yIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAocHJlZml4ID09IG51bGwgfHwgb2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb250YWluZXIgPSBvYmo7Ci0JCVN0cmluZyBuc1VSSTsKLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQluc1VSSSA9IGdldE5hbWVzcGFjZVVSSUF0VGhpc0xldmVsKHByZWZpeCwgY29udGFpbmVyKTsKLQkJCWlmIChuc1VSSSAhPSBudWxsKQotCQkJCXJldHVybiBuc1VSSTsKLQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwoU3RyaW5nIHByZWZpeCwgRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TmFtZXNwYWNlcyhFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmdldE5hbWVzcGFjZXMoKTsKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihFT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKE5hbWVzcGFjZUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIob2JqLCBBREFQVEVSX1RZUEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBjcmVhdGVBZGFwdGVyKG9iaikgOiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciBjcmVhdGVBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBOYW1lc3BhY2VBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuc2V0VGFyZ2V0KG9iaik7Ci0JCW9iai5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotCQlpZiAobmFtZXNwYWNlcyA9PSBudWxsKQotCQkJbmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWZpeGVzVG9OUyA9PSBudWxsKQotCQkJcHJlZml4ZXNUb05TID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcmVmaXhlc1RvTlMucHV0KHByZWZpeCwgbnMpOwotCQluYW1lc3BhY2VzLmFkZChucyk7Ci0JCWZpcmVOb3RpZmljYXRpb24ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLkFERCwgbnVsbCwgbnMpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsKLQkJTmFtZXNwYWNlIG5zID0gbnVsbDsKLQkJaWYgKHByZWZpeGVzVG9OUyAhPSBudWxsKQotCQkJbnMgPSAoTmFtZXNwYWNlKSBwcmVmaXhlc1RvTlMuZ2V0KHByZWZpeCk7Ci0KLQkJaWYgKG5zICE9IG51bGwpCi0JCQluYW1lc3BhY2VzLnJlbW92ZShucyk7Ci0JCWZpcmVOb3RpZmljYXRpb24ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlJFTU9WRSwgbnMsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKHByZWZpeGVzVG9OUyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5hbWVzcGFjZSBucyA9IChOYW1lc3BhY2UpIHByZWZpeGVzVG9OUy5nZXQocHJlZml4KTsKLQkJaWYgKG5zICE9IG51bGwpCi0JCQlyZXR1cm4gbnMuZ2V0TnNVUkkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX1RZUEUuZXF1YWxzKHR5cGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuYW1lc3BhY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTm90aWZpY2F0aW9uKGludCB0eXBlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQl0YXJnZXQuZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uKHR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzICE9IG51bGwgJiYgIW5hbWVzcGFjZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5DbG9uZWFibGVQdWJsaWMjY2xvbmUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgcmVzdWx0ID0gbmV3IE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQkJaWYgKGhhc05hbWVzcGFjZXMoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgbmFtZXNwYWNlcy5nZXQoaSk7Ci0JCQkJcmVzdWx0LmFkZE5hbWVzcGFjZShucy5nZXRQcmVmaXgoKSwgbnMuZ2V0TnNVUkkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3RocnVFbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODY3N2ViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogQSBwYXNzdGhydSBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgUGFzc3RocnVFbmNvZGVyRGVjb2RlciBleHRlbmRzIEVuY29kZXJEZWNvZGVyQWRhcHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXNzdGhydUVuY29kZXJEZWNvZGVyIElOU1RBTkNFID0gbmV3IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBQYXNzdGhydUVuY29kZXJEZWNvZGVyLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUGFzc3RocnVFbmNvZGVyRGVjb2RlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRDaXBoZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRDaXBoZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzcxNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkQ2lwaGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBQYXNzd29yZENpcGhlclV0aWwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1tdID0geyJ4b3IifTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBfc3VwcG9ydGVkX2NyeXB0b19hbGdvcml0aG1zW107Ci0KLQlwdWJsaWMgUGFzc3dvcmRDaXBoZXJVdGlsKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY2lwaGVyKGJ5dGUgYWJ5dGUwW10sIFN0cmluZyBzKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7Ci0JCWlmIChzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKLQkJYnl0ZSBhYnl0ZTFbXSA9IG51bGw7Ci0JCWlmIChzLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbMF0pKQotCQkJYWJ5dGUxID0geG9yKGFieXRlMCk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCi0JCWlmIChhYnl0ZTEgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY2lwaGVyKGJ5dGUgYWJ5dGUwW10sIFN0cmluZyBzKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7Ci0JCWlmIChzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKLQkJYnl0ZSBhYnl0ZTFbXSA9IG51bGw7Ci0JCWlmIChzLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbMF0pKQotCQkJYWJ5dGUxID0geG9yKGFieXRlMCk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCi0JCWlmIChhYnl0ZTEgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGFieXRlMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENyeXB0b0FsZ29yaXRobXMoKSB7Ci0JCXJldHVybiBfc3VwcG9ydGVkX2NyeXB0b19hbGdvcml0aG1zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSB4b3IoYnl0ZSBhYnl0ZTBbXSkgewotCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJaWYgKGFieXRlMCAhPSBudWxsKSB7Ci0JCQlhYnl0ZTEgPSBuZXcgYnl0ZVthYnl0ZTAubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWJ5dGUwLmxlbmd0aDsgaSsrKQotCQkJCWFieXRlMVtpXSA9IChieXRlKSAoMHg1ZiBeIGFieXRlMFtpXSk7Ci0JCX0KLQkJcmV0dXJuIGFieXRlMTsKLQl9Ci0KLQlzdGF0aWMgewotCQlfc3VwcG9ydGVkX2NyeXB0b19hbGdvcml0aG1zID0gbnVsbDsKLQkJaWYgKF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXMgPT0gbnVsbCkKLQkJCV9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXMgPSBERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZEVuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMzRlZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkRW5jb2RlckRlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgUGFzc3dvcmRFbmNvZGVyRGVjb2RlciBleHRlbmRzIEVuY29kZXJEZWNvZGVyQWRhcHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gInBhc3N3b3JkLXNlY3VyaXR5LWNvZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFBhc3N3b3JkRW5jb2RlckRlY29kZXIoKSB7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIFBhc3N3b3JkVXRpbC5wYXNzd29yZERlY29kZShzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgewotCQlyZXR1cm4gUGFzc3dvcmRVdGlsLnBhc3N3b3JkRW5jb2RlKHMpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gS0VZOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NmE5N2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXNzd29yZFV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19DT05WRVJTSU9OX0NPREUgPSAiVVRGOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEVNUFRZX0JZVEVfQVJSQVkgPSBuZXcgYnl0ZVswXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NSWVBUT19BTEdPUklUSE07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1tdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQkFTRTY0X0VOQ09ERV9NQVBbXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEJBU0U2NF9ERUNPREVfTUFQW107Ci0KLQlwdWJsaWMgUGFzc3dvcmRVdGlsKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgdGhyb3dzIEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7Ci0JCWlmIChzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24oKTsKLQkJU3RyaW5nIHMxID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczEgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbigpOwotCi0JCWlmICghaXNWYWxpZENyeXB0b0FsZ29yaXRobShzMSkpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKLQotCQlTdHJpbmcgczIgPSBkZWNvZGVfcGFzc3dvcmQocmVtb3ZlQ3J5cHRvQWxnb3JpdGhtVGFnKHMpLCBzMSk7Ci0JCWlmIChzMiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBzMjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlyZXR1cm4gZW5jb2RlKHMsIERFRkFVTFRfQ1JZUFRPX0FMR09SSVRITSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgczEpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24oKTsKLQotCQlpZiAoZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24oKTsKLQotCQlTdHJpbmcgczIgPSBlbmNvZGVfcGFzc3dvcmQocy50cmltKCksIHMxLnRyaW0oKSk7Ci0JCWlmIChzMiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBzMjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDcnlwdG9BbGdvcml0aG0oU3RyaW5nIHMpIHsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJU3RyaW5nIGlubmVyUyA9IHM7Ci0JCWlmIChpbm5lclMgIT0gbnVsbCkgewotCQkJaW5uZXJTID0gaW5uZXJTLnRyaW0oKTsKLQkJCWlmIChpbm5lclMubGVuZ3RoKCkgPj0gMikgewotCQkJCWludCBpID0gaW5uZXJTLmluZGV4T2YoInsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpID09IDApIHsKLQkJCQkJaW50IGogPSBpbm5lclMuaW5kZXhPZigifSIsICsraSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGogPiAwKQotCQkJCQkJaWYgKGkgPCBqKQotCQkJCQkJCXMxID0gaW5uZXJTLnN1YnN0cmluZyhpLCBqKS50cmltKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJczEgPSBFTVBUWV9TVFJJTkc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDcnlwdG9BbGdvcml0aG1UYWcoU3RyaW5nIHMpIHsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJU3RyaW5nIHMyID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczIgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoInsiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHMyLmxlbmd0aCgpID4gMCkKLQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMyKTsKLQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAotCQkJczEgPSBzdHJpbmdidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gczE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDcnlwdG9BbGdvcml0aG0oU3RyaW5nIHMpIHsKLQkJU3RyaW5nIGlubmVyUyA9IHM7Ci0JCWlmIChpbm5lclMgIT0gbnVsbCkgewotCQkJaW5uZXJTID0gaW5uZXJTLnRyaW0oKTsKLQkJCWlmIChpbm5lclMubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TLmxlbmd0aDsgaSsrKQotCQkJCWlmIChpbm5lclMuZXF1YWxzSWdub3JlQ2FzZShTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbaV0pKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDcnlwdG9BbGdvcml0aG1UYWcoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIGlzVmFsaWRDcnlwdG9BbGdvcml0aG0oZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXNzd29yZERlY29kZShTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzMSA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKLQkJaWYgKHMxID09IG51bGwpCi0JCQlyZXR1cm4gczsKLQkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZGVjb2RlX3Bhc3N3b3JkKHJlbW92ZUNyeXB0b0FsZ29yaXRobVRhZyhzKSwgczEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3N3b3JkRW5jb2RlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBwYXNzd29yZEVuY29kZShzLCBERUZBVUxUX0NSWVBUT19BTEdPUklUSE0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3N3b3JkRW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKLQkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzMiA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKLQkJaWYgKHMyICE9IG51bGwpIHsKLQkJCWlmIChzMi5lcXVhbHNJZ25vcmVDYXNlKHMxLnRyaW0oKSkpCi0JCQkJcmV0dXJuIHMudHJpbSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuY29kZV9wYXNzd29yZChzLnRyaW0oKSwgczEudHJpbSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVDcnlwdG9BbGdvcml0aG1UYWcoU3RyaW5nIHMpIHsKLQkJU3RyaW5nIHMxID0gbnVsbDsKLQkJU3RyaW5nIGlubmVyUyA9IHM7Ci0JCWlmIChpbm5lclMgIT0gbnVsbCkgewotCQkJaW5uZXJTID0gaW5uZXJTLnRyaW0oKTsKLQkJCWlmIChpbm5lclMubGVuZ3RoKCkgPj0gMikgewotCQkJCWludCBpID0gaW5uZXJTLmluZGV4T2YoInsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpID09IDApIHsKLQkJCQkJaW50IGogPSBpbm5lclMuaW5kZXhPZigifSIsICsraSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGogPiAwKQotCQkJCQkJaWYgKCsraiA8IGlubmVyUy5sZW5ndGgoKSkKLQkJCQkJCQlzMSA9IGlubmVyUy5zdWJzdHJpbmcoaikudHJpbSgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXMxID0gRU1QVFlfU1RSSU5HOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gczE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbnZlcnRfdG9fYnl0ZXMoU3RyaW5nIHMpIHsKLQkJYnl0ZSBhYnl0ZTBbXSA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpCi0JCQlpZiAocy5sZW5ndGgoKSA9PSAwKQotCQkJCWFieXRlMCA9IEVNUFRZX0JZVEVfQVJSQVk7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJYWJ5dGUwID0gcy5nZXRCeXRlcyhTVFJJTkdfQ09OVkVSU0lPTl9DT0RFKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVuc3VwcG9ydGVkZW5jb2RpbmdleGNlcHRpb24pIHsKLQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJfQotCQlyZXR1cm4gYWJ5dGUwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0X3RvX3N0cmluZyhieXRlIGFieXRlMFtdKSB7Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJaWYgKGFieXRlMCAhPSBudWxsKQotCQkJaWYgKGFieXRlMC5sZW5ndGggPT0gMCkKLQkJCQlzID0gRU1QVFlfU1RSSU5HOwotCQkJZWxzZQotCQkJCXRyeSB7Ci0JCQkJCXMgPSBuZXcgU3RyaW5nKGFieXRlMCwgU1RSSU5HX0NPTlZFUlNJT05fQ09ERSk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1bnN1cHBvcnRlZGVuY29kaW5nZXhjZXB0aW9uKSB7Ci0JCQkJCS8vZG8gbm90aGluZwotCQkJCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbnZlcnRfdmlld2FibGVfdG9fYnl0ZXMoU3RyaW5nIHMpIHsKLQkJYnl0ZSBhYnl0ZTBbXSA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpCi0JCQlpZiAocy5sZW5ndGgoKSA9PSAwKQotCQkJCWFieXRlMCA9IEVNUFRZX0JZVEVfQVJSQVk7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJYWJ5dGUwID0gYmFzZTY0RGVjb2RlKGNvbnZlcnRfdG9fYnl0ZXMocykpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJYWJ5dGUwID0gbnVsbDsKLQkJCQl9Ci0JCXJldHVybiBhYnl0ZTA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJhc2U2NERlY29kZShieXRlIGFieXRlMFtdKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSBhYnl0ZTAubGVuZ3RoOyBhYnl0ZTBbLS1pXSA9PSA2MTspewotCQkJLy9kbyBub3RoaW5nIGp1c3QgZmluZGluZyBpbmRleCBvZiA2MQotCQl9Ci0JCWJ5dGUgYWJ5dGUxW10gPSBuZXcgYnl0ZVsoaSArIDEpIC0gYWJ5dGUwLmxlbmd0aCAvIDRdOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGFieXRlMC5sZW5ndGg7IGorKykKLQkJCWFieXRlMFtqXSA9IEJBU0U2NF9ERUNPREVfTUFQW2FieXRlMFtqXV07Ci0JCWludCBrID0gYWJ5dGUxLmxlbmd0aCAtIDI7Ci0JCWludCBsID0gMDsKLQkJaW50IGkxOwotCQlmb3IgKGkxID0gMDsgbCA8IGs7IGkxICs9IDQpIHsKLQkJCWFieXRlMVtsXSA9IChieXRlKSAoYWJ5dGUwW2kxXSA8PCAyICYgMHhmZiB8IGFieXRlMFtpMSArIDFdID4+PiA0ICYgMHgzKTsKLQkJCWFieXRlMVtsICsgMV0gPSAoYnl0ZSkgKGFieXRlMFtpMSArIDFdIDw8IDQgJiAweGZmIHwgYWJ5dGUwW2kxICsgMl0gPj4+IDIgJiAweGYpOwotCQkJYWJ5dGUxW2wgKyAyXSA9IChieXRlKSAoYWJ5dGUwW2kxICsgMl0gPDwgNiAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAzXSAmIDB4M2YpOwotCQkJbCArPSAzOwotCQl9Ci0JCWlmIChsIDwgYWJ5dGUxLmxlbmd0aCkgewotCQkJYWJ5dGUxW2wrK10gPSAoYnl0ZSkgKGFieXRlMFtpMV0gPDwgMiAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAxXSA+Pj4gNCAmIDB4Myk7Ci0JCQlpZiAobCA8IGFieXRlMS5sZW5ndGgpCi0JCQkJYWJ5dGUxW2xdID0gKGJ5dGUpIChhYnl0ZTBbaTEgKyAxXSA8PCA0ICYgMHhmZiB8IGFieXRlMFtpMSArIDJdID4+PiAyICYgMHhmKTsKLQkJfQotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0X3ZpZXdhYmxlX3RvX3N0cmluZyhieXRlIGFieXRlMFtdKSB7Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJaWYgKGFieXRlMCAhPSBudWxsKQotCQkJaWYgKGFieXRlMC5sZW5ndGggPT0gMCkKLQkJCQlzID0gRU1QVFlfU1RSSU5HOwotCQkJZWxzZQotCQkJCXRyeSB7Ci0JCQkJCXMgPSBjb252ZXJ0X3RvX3N0cmluZyhiYXNlNjRFbmNvZGUoYWJ5dGUwKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlzID0gbnVsbDsKLQkJCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiYXNlNjRFbmNvZGUoYnl0ZSBhYnl0ZTBbXSkgewotCQlieXRlIGFieXRlMVtdID0gbmV3IGJ5dGVbKChhYnl0ZTAubGVuZ3RoICsgMikgLyAzKSAqIDRdOwotCQlpbnQgaSA9IDA7Ci0JCWludCBqID0gMDsKLQkJZm9yICg7IGkgPCBhYnl0ZTAubGVuZ3RoIC0gMjsgaSArPSAzKSB7Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA+Pj4gMiAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdID4+PiA0ICYgMHhmIHwgYWJ5dGUwW2ldIDw8IDQgJiAweDNmXTsKLQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAyXSA+Pj4gNiAmIDB4MyB8IGFieXRlMFtpICsgMV0gPDwgMiAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDJdICYgMHgzZl07Ci0JCX0KLQkJaWYgKGkgPCBhYnl0ZTAubGVuZ3RoKSB7Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA+Pj4gMiAmIDB4M2ZdOwotCQkJaWYgKGkgPCBhYnl0ZTAubGVuZ3RoIC0gMSkgewotCQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAxXSA+Pj4gNCAmIDB4ZiB8IGFieXRlMFtpXSA8PCA0ICYgMHgzZl07Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdIDw8IDIgJiAweDNmXTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaV0gPDwgNCAmIDB4M2ZdOwotCQkJfQotCQl9Ci0JCWZvciAoOyBqIDwgYWJ5dGUxLmxlbmd0aDsgaisrKQotCQkJYWJ5dGUxW2pdID0gNjE7Ci0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZV9wYXNzd29yZChTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChzMS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmIChzLmxlbmd0aCgpID4gMCkgewotCQkJCWJ5dGUgYWJ5dGUwW10gPSBjb252ZXJ0X3ZpZXdhYmxlX3RvX2J5dGVzKHMpOwotCQkJCWlmIChhYnl0ZTAgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKGFieXRlMC5sZW5ndGggPiAwKSB7Ci0JCQkJCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJYWJ5dGUxID0gUGFzc3dvcmRDaXBoZXJVdGlsLmRlY2lwaGVyKGFieXRlMCwgczEpOwotCQkJCQl9IGNhdGNoIChJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gaW52YWxpZHBhc3N3b3JkY2lwaGVyZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gdW5zdXBwb3J0ZWRjcnlwdG9hbGdvcml0aG1leGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChhYnl0ZTEgIT0gbnVsbCAmJiBhYnl0ZTEubGVuZ3RoID4gMCkKLQkJCQkJCXMyID0gY29udmVydF90b19zdHJpbmcoYWJ5dGUxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoczIgIT0gbnVsbCAmJiBzMi5sZW5ndGgoKSA+IDApCi0JCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMik7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGVfcGFzc3dvcmQoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzMS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKCJ9IikuYXBwZW5kKHMpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMxKS5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmIChzLmxlbmd0aCgpID4gMCkgewotCQkJCWJ5dGUgYWJ5dGUwW10gPSBjb252ZXJ0X3RvX2J5dGVzKHMpOwotCQkJCWlmIChhYnl0ZTAubGVuZ3RoID4gMCkgewotCQkJCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFieXRlMSA9IFBhc3N3b3JkQ2lwaGVyVXRpbC5lbmNpcGhlcihhYnl0ZTAsIHMxKTsKLQkJCQkJfSBjYXRjaCAoSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uIGludmFsaWRwYXNzd29yZGNpcGhlcmV4Y2VwdGlvbikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHVuc3VwcG9ydGVkY3J5cHRvYWxnb3JpdGhtZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAoYWJ5dGUxICE9IG51bGwgJiYgYWJ5dGUxLmxlbmd0aCA+IDApIHsKLQkJCQkJCXMyID0gY29udmVydF92aWV3YWJsZV90b19zdHJpbmcoYWJ5dGUxKTsKLQkJCQkJCWlmIChzMiA9PSBudWxsKQotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHMyICE9IG51bGwgJiYgczIubGVuZ3RoKCkgPiAwKQotCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczIpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlzdGF0aWMgewotCQlTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVMgPSBQYXNzd29yZENpcGhlclV0aWwuZ2V0U3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtcygpOwotCQlERUZBVUxUX0NSWVBUT19BTEdPUklUSE0gPSBTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbMF07Ci0JCWJ5dGUgYWJ5dGUwW10gPSB7NjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDQzLCA0N307Ci0JCUJBU0U2NF9FTkNPREVfTUFQID0gYWJ5dGUwOwotCQlCQVNFNjRfREVDT0RFX01BUCA9IG5ldyBieXRlWzEyOF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQkFTRTY0X0RFQ09ERV9NQVAubGVuZ3RoOyBpKyspCi0JCQlCQVNFNjRfREVDT0RFX01BUFtpXSA9IC0xOwotCQlmb3IgKGludCBqID0gMDsgaiA8IEJBU0U2NF9FTkNPREVfTUFQLmxlbmd0aDsgaisrKQotCQkJQkFTRTY0X0RFQ09ERV9NQVBbQkFTRTY0X0VOQ09ERV9NQVBbal1dID0gKGJ5dGUpIGo7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDc3NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IgZXh0ZW5kcyBFcnJvciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMTM3MDEwOTk5NDAwMjk4ODM5TDsKLQotCS8vVE9ETyBEZWxldGUgbWUKLQlwdWJsaWMgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IoKSB7Ci0JCXN1cGVyKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLlBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yX0VSUk9SXzApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YzgwNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3RlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgR0xPQkFMX0RFUEVOREVOQ0lFUyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0RFUEVOREVOQ1lfVFlQRSA9ICJSZXNvdXJjZURlcGVuZGVuY3lBZGFwdGVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBNYXAgbG9jYWxEZXBlbmRlbmNpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JY2xhc3MgUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJUmVzb3VyY2UgZGVwZW5kZW50UmVzb3VyY2U7Ci0KLQkJUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlcihSZXNvdXJjZSBhRGVwZW5kZW50UmVzb3VyY2UpIHsKLQkJCWRlcGVuZGVudFJlc291cmNlID0gYURlcGVuZGVudFJlc291cmNlOwotCQkJZGVwZW5kZW50UmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfREVQRU5ERU5DWV9UWVBFLmVxdWFscyh0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCS8vTGlzdGVuIGZvciB1bmxvYWRzIGFuZCByZW1vdmVzCi0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkpIHsKLQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgOgotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgIT0gZGVwZW5kZW50UmVzb3VyY2UgJiYgbXNnLmdldE9sZEJvb2xlYW5WYWx1ZSgpICYmICFtc2cuZ2V0TmV3Qm9vbGVhblZhbHVlKCkpCi0JCQkJCQlkZXBlbmRlbnRSZXNvdXJjZS51bmxvYWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fUkVTT1VSQ0VfU0VUIDoKLQkJCQkJaWYgKG1zZy5nZXRPbGRWYWx1ZSgpICE9IG51bGwgJiYgbXNnLmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgewotCQkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IGRlcGVuZGVudFJlc291cmNlKQotCQkJCQkJCSgoUmVzb3VyY2UpIGdldFRhcmdldCgpKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlSZXNvdXJjZVNldCBzZXQgPSBkZXBlbmRlbnRSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJCWlmIChzZXQgIT0gbnVsbCkKLQkJCQkJCQkJc2V0LmdldFJlc291cmNlcygpLnJlbW92ZShkZXBlbmRlbnRSZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZVNldExpc3RlbmVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpCi0JCQkJcHJvY2Nlc3NBZGRlZFJlc291cmNlKChSZXNvdXJjZVNldCkgbXNnLmdldE5vdGlmaWVyKCksIChSZXNvdXJjZSkgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIFVSSXMuIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIGFVUklTdHJpbmcsIGlzIHRoZSBvbmUgdGhhdAotCSAqIGRlcGVuZGVudFVyaVN0cmluZyBkZXBlbmRzIG9uLgotCSAqIAotCSAqIEBwYXJhbSBhVXJpU3RyaW5nCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlcGVuZGVudFVyaVN0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckRlcGVuZGVuY3koVVJJIHRhcmdldFVSSSwgVVJJIGRlcGVuZGVudFVSSSkgewotCQlpZiAodGFyZ2V0VVJJICE9IG51bGwgJiYgZGVwZW5kZW50VVJJICE9IG51bGwpIHsKLQkJCUdMT0JBTF9ERVBFTkRFTkNJRVMucHV0KGRlcGVuZGVudFVSSSwgdGFyZ2V0VVJJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3RlcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJaW5pdGlhbGl6ZShhUmVzb3VyY2VTZXQpOwotCX0KLQotCi0JUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmIChhUmVzb3VyY2VTZXQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIFJlc291cmNlU2V0IGNhbm5vdCBiZSBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCWluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhhUmVzb3VyY2VTZXQpOwotCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVycyhhUmVzb3VyY2VTZXQpOwotCQlzZXR1cFJlc291cmNlU2V0TGlzdGVuZXIoYVJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBSZXNvdXJjZVNldExpc3RlbmVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKG5ldyBSZXNvdXJjZVNldExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZXBlbmRlbmN5QWRhcHRlcnMoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmICghYVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXQgPSBsb2NhbERlcGVuZGVuY2llcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlNYXAuRW50cnkgZW50cnk7Ci0JCQlVUkkgZGVwZW5kZW50VVJJLCB0YXJnZXRVUkk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJZGVwZW5kZW50VVJJID0gKFVSSSkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdGFyZ2V0VVJJID0gKFVSSSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVyKGFSZXNvdXJjZVNldCwgZGVwZW5kZW50VVJJLCB0YXJnZXRVUkkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEBwYXJhbSBkZXBlbmRlbnRVUkkKLQkgKiBAcGFyYW0gdGFyZ2V0VVJJCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVwZW5kZW5jeUFkYXB0ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBVUkkgZGVwZW5kZW50VVJJLCBVUkkgdGFyZ2V0VVJJKSB7Ci0JCVJlc291cmNlIGRlcGVuZGVudCA9IGFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZShkZXBlbmRlbnRVUkksIGZhbHNlKTsKLQkJaWYgKGRlcGVuZGVudCAhPSBudWxsKQotCQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihkZXBlbmRlbnQsIHRhcmdldFVSSSwgYVJlc291cmNlU2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlcGVuZGVuY3lBZGFwdGVyKFJlc291cmNlIGRlcGVuZGVudCwgVVJJIHRhcmdldFVSSSwgUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCVJlc291cmNlIHRhcmdldCA9IGFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh0YXJnZXRVUkksIGZhbHNlKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJdGFyZ2V0ID0gYVJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHRhcmdldFVSSSk7Ci0JCXRhcmdldC5lQWRhcHRlcnMoKS5hZGQobmV3IFJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIoZGVwZW5kZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IGFSZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJaW5pdGlhbGl6ZUxvY2FsRGVwZW5kZW5jaWVzKGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhVUklDb252ZXJ0ZXIgYUNvbnZlcnRlcikgewotCQlJdGVyYXRvciBpdCA9IEdMT0JBTF9ERVBFTkRFTkNJRVMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAgcmVzb2x2ZWQgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCVVSSSBrZXksIHZhbHVlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWtleSA9IChVUkkpIGVudHJ5LmdldEtleSgpOwotCQkJdmFsdWUgPSAoVVJJKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJa2V5ID0gbm9ybWFsaXplKGtleSwgYUNvbnZlcnRlciwgcmVzb2x2ZWQpOwotCQkJdmFsdWUgPSBub3JtYWxpemUodmFsdWUsIGFDb252ZXJ0ZXIsIHJlc29sdmVkKTsKLQkJCWxvY2FsRGVwZW5kZW5jaWVzLnB1dChrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWxhdGl2ZVVSSQotCSAqIEBwYXJhbSBjb252ZXJ0ZXIKLQkgKiBAcGFyYW0gcmVzb2x2ZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFVSSSBub3JtYWxpemUoVVJJIHJlbGF0aXZlVVJJLCBVUklDb252ZXJ0ZXIgY29udmVydGVyLCBNYXAgcmVzb2x2ZWQpIHsKLQkJVVJJIHJlc3VsdCA9IChVUkkpIHJlc29sdmVkLmdldChyZWxhdGl2ZVVSSSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29udmVydGVyLm5vcm1hbGl6ZShyZWxhdGl2ZVVSSSk7Ci0JCQlyZXNvbHZlZC5wdXQocmVsYXRpdmVVUkksIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2V0Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Nlc3NBZGRlZFJlc291cmNlKFJlc291cmNlU2V0IHNldCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJVVJJIHRhcmdldFVSSSA9IChVUkkpIGxvY2FsRGVwZW5kZW5jaWVzLmdldChyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCWlmICh0YXJnZXRVUkkgIT0gbnVsbCkKLQkJCXNldHVwRGVwZW5kZW5jeUFkYXB0ZXIocmVzb3VyY2UsIHRhcmdldFVSSSwgc2V0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQ5NmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBSRVNPVVJDRV9JU19MT0FESU5HX0FEQVBURVJfQ0xBU1MgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuY2xhc3M7Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGZpbmRBZGFwdGVyKFJlc291cmNlIGFSZXNvdXJjZSkgewotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgU3luY2hyb25pemluZyBvbiAiICsgYVJlc291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFN5bmNocm9uaXplIG9uIHRoZSBSZXNvdXJjZSAod2hpY2ggd2lsbCBiZSB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgKiB0aGUgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMpLgotICAgICAgICAgKiAKLSAgICAgICAgICogcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpIHdpbGwgY29vcmRpbmF0ZSB3aXRoIHRoaXMgCi0gICAgICAgICAqIHN5bmNocm9uaXphdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZChhUmVzb3VyY2UuZUFkYXB0ZXJzKCkpIHsKLSAgICAgICAgCWFkYXB0ZXIgPSAoUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKSBnZXRBZGFwdGVyKGFSZXNvdXJjZS5lQWRhcHRlcnMoKSwgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGFkYXB0ZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotICAgICAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0gICAgICAgIGlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgdGhlIHJlbW92ZSBvZiB0aGUgbG9hZGluZyBhZGFwdGVyCi0gICAgICAgICAgICBpZiAoaXNTZXRMb2FkZWRSZXNvdXJjZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pKSByZW1vdmVJc0xvYWRpbmdTdXBwb3J0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FpdEZvclJlc291cmNlVG9Mb2FkKCkgewotCi0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgQWRhcHRlciBnZXRBZGFwdGVyKExpc3Q8QWRhcHRlcj4gYWRhcHRlcnMsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gYWRhcHRlcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVycy5nZXQoaSk7Ci0gICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGFkYXB0ZXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBub3RpZmljYXRpb24KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXRMb2FkZWRSZXNvdXJjZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgJiYgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpIHsKLQotICAgICAgICAvKiBTeW5jaHJvbml6ZSBvbiB0aGUgdGFyZ2V0IG9mIHRoZSBBZGFwdGVyLiBJZiAKLSAgICAgICAgICogdGhlIGxpc3Qgb2YgYWRhcHRlcnMgaXMgc2VhcmNoZWQgZm9yIGEgCi0gICAgICAgICAqIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciB1c2luZyB0aGUgCi0gICAgICAgICAqIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcigpIEFQSSwgdGhlbgotICAgICAgICAgKiB0aGUgYWNjZXNzIHRvIHJlbW92ZSB0aGUgQWRhcHRlciB1c2luZyB0aGlzIG1ldGhvZCAKLSAgICAgICAgICogd2lsbCBiZSBjb29yZGluYXRlZC4gIAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGdldFRhcmdldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgU3luY2hyb25pemluZyBvbiAiICsgZ2V0VGFyZ2V0KCkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChnZXRUYXJnZXQoKS5lQWRhcHRlcnMoKSkgewotICAgICAgICAgICAgICAgIGdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotICAgICAgICByZXR1cm4gdHlwZSA9PSBSRVNPVVJDRV9JU19MT0FESU5HX0FEQVBURVJfQ0xBU1M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9yY2VSZWxlYXNlKCkgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzMDQ5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSgpOwotICAgICAgICAgCi0gICAgcHVibGljIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBjcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1JldmlzaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXZpc2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzY3ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1JldmlzaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBSZXZpc2l0IHsKLQotCS8qKgotCSAqIFJldmlzaXQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmV2aXNpdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmV2aXNpdCgpIHsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bkNvbW1lbnQoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRvRG8oKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZmFjdG9yKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVEZXByZWNhdGVkTWV0aG9kKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVNZSgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmV2aWV3RGVzaWduKCkgewotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1N0cmluZ1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9TdHJpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjIzMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE4LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1V0aWwgewotCS8qKgotCSAqIEVuaGFuY2VkIGVxdWFsaXR5IGNoZWNrIGZvciB0d28gc3RyaW5nIHBhcmFtZXRlcnMsIHRoYXQgdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIG51bGwgdmFsdWVzLgotCSAqIElmIGJvdGggdmFsdWVzIGFyZSBudWxsLCB0aGlzIHdpbGwgcmV0dXJuIHRydWUuCi0JICogCi0JICogQHBhcmFtIHMxCi0JICogQHBhcmFtIHMyCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlpZiAoczEgPT0gbnVsbCkKLQkJCXJldHVybiBzMiA9PSBudWxsOwotCQlyZXR1cm4gczEuZXF1YWxzKHMyKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzVkYjI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luLkVjb3JlVXRpbGl0aWVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgVHJhbnNsYXRvck1hbmFnZXIgY2xhc3MgdXNlZCBieSB0aGUgVHJhbnNsYXRvclNlcnZpY2UgaW4gb3JkZXIgdG8gZGlzY292ZXIKLSAqIGFuZCBjYWNoZSBhbGwgb2YgdGhlIGV4dGVuZGVkIFRyYW5zbGF0b3JzIHRvIGJlIHVzZWQgYnkgRU1GMkRPTUFkYXB0ZXJJbXBsLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvck1hbmFnZXIgewotCQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gVHJhbnNsYXRvck1hbmFnZXIgaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBUcmFuc2xhdG9yTWFuYWdlcigpOwotCQotCS8qKgotCSAqIENhY2hlIG9mIGFsbCB0aGUgVHJhbnNsYXRvckRlc2NyaXB0b3JzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZXQgdHJhbnNsYXRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQotCS8qKgotCSAqIERlZmF1bHQgc3RhdGljIGVtcHR5IGFycmF5IHVzZWQgd2hlbiBubyBkZXNjcmlwdG9ycyBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10gTk9fRVhURU5ERURfVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvckRlc2NyaXB0b3JbMF07Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUcmFuc2xhdG9yTWFuYWdlcgotCSAqIEByZXR1cm4gVHJhbnNsYXRvck1hbmFnZXIgSU5TVEFOQ0UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvck1hbmFnZXIoKSB7Ci0JCW5ldyBUcmFuc2xhdG9yUmVnaXN0cnkoKS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2ltcGxlIFJlZ2lzdHJ5IFJlYWRlciB1c2VkIGJ5IFRyYW5zbGF0b3IgTWFuYWdlciB0byByZWNvZ25pemUgdGhlIFRyYW5zbGF0b3IgZXh0ZW5zaW9ucwotCSAqLwotCXByaXZhdGUgY2xhc3MgVHJhbnNsYXRvclJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCQkKLQkJLyoqCi0JCSAqIFRoZSBUcmFuc2xhdG9yIGVsZW1lbnQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TTEFUT1IgPSAidHJhbnNsYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qKgotCQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvclJlZ2lzdHJ5KCkgewotCQkJc3VwZXIoRWNvcmVVdGlsaXRpZXNQbHVnaW4uSUQsIEVjb3JlVXRpbGl0aWVzUGx1Z2luLlRSQU5TTEFUT1JfRVhURU5TVElPTl9QT0lOVCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaWYgaXQgbWF0Y2hzIHRoZSBleHBlY3RlZCB0cmFuc2xhdG9yIGVsZW1lbnQgbmFtZQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKFRSQU5TTEFUT1IuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCWFkZFRyYW5zbGF0b3JEZXNjcmlwdG9yKG5ldyBUcmFuc2xhdG9yRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVzY3JpYmVzIGEgVHJhbnNsYXRvciBleHRlbnNpb24gcG9pbnQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yRGVzY3JpcHRvciB7Ci0JCi0JCS8qKgotCQkgKiBRdWFsaWZpZWQgY2xhc3MgbmFtZSBhdHRyaWJ1dGUKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKioKLQkJICogVGhlIGNvbmZpZyBlbGVtZW50IGZvciB0aGlzIERlc2NyaXB0b3IKLQkJICovCi0JCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQ7Ci0JCQotCQkvKioKLQkJICogdGhlIGNhY2hlZCBxdWFsaWZpZWQgY2xhc3NOYW1lIHZhbHVlIG9mIHRoaXMgZGVzY3JpcHRvcgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCQotCQkvKioKLQkJICogQ29uc3RydWN0b3IKLQkJICogQHBhcmFtIGFDb25maWdFbGVtZW50Ci0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJY29uZmlnRWxlbWVudCA9IGFDb25maWdFbGVtZW50OwotCQkJY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQ0xBU1NOQU1FKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9yCi0JCSAqIEByZXR1cm4gU3RyaW5nIGNsYXNzbmFtZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBDcmVhdGUgdGhlIGFjdHVhbCBUcmFuc2xhdG9yIGluc3RhbmNlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkJICogQHJldHVybiBUcmFuc2xhdG9yCi0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVUcmFuc2xhdG9yKCkgewotCQkJVHJhbnNsYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluc3RhbmNlID0gKFRyYW5zbGF0b3IpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU05BTUUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJRWNvcmVVdGlsaXRpZXNQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBUcmFuc2xhdG9yRGVzY3JpcHRvciB0byB0aGUgY2FjaGUgb2YgZGVzY3JpcHRvciBleHRlbnNpb25zLgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRyYW5zbGF0b3JEZXNjcmlwdG9yKFRyYW5zbGF0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChkZXNjcmlwdG9yKTsKLQkJdHJhbnNsYXRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kIGFsbCB0aGUgYXNzb2NpYXRlZCBUcmFuc2xhdG9yRGVzY3JpcHRvcnMgZm9yIHRoZSBUcmFzbGF0b3IgZXh0ZW5zaW9ucyBkZWZpbmVkLgotCSAqIEByZXR1cm4gVHJhbnNsYXRvckRlc2NyaXB0b3JbXQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yRGVzY3JpcHRvcltdIGZpbmRUcmFuc2xhdG9ycygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVRyYW5zbGF0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIHRyYW5zbGF0b3JzSXRyID0gdHJhbnNsYXRvcnMuaXRlcmF0b3IoKTsgdHJhbnNsYXRvcnNJdHIuaGFzTmV4dCgpOykgewotCQkJZGVzY3JpcHRvciA9IChUcmFuc2xhdG9yRGVzY3JpcHRvcikgdHJhbnNsYXRvcnNJdHIubmV4dCgpOwotCQkJcmVzdWx0LmFkZChkZXNjcmlwdG9yKTsKLQkJfQotCQlpZiAocmVzdWx0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fRVhURU5ERURfVFJBTlNMQVRPUlM7Ci0JCX0KLQkJcmV0dXJuIChUcmFuc2xhdG9yRGVzY3JpcHRvcltdKSByZXN1bHQudG9BcnJheShuZXcgVHJhbnNsYXRvckRlc2NyaXB0b3JbcmVzdWx0LnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTJhN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5UcmFuc2xhdG9yTWFuYWdlci5UcmFuc2xhdG9yRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBzZXJ2aWNlIGNsYXNzIHRvIGRlbGl2ZXIgQVBJIHRvIHVzZSB0byByZXRyaWV2ZSBUcmFuc2xhdG9yIGV4dGVuc2lvbnMgZnJvbQotICogdGhlIFRyYW5zbGF0b3JNYW5hZ2VyIGFuZCBpdHMgUmVnaXN0cnlSZWFkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yU2VydmljZSB7Ci0KLQkvKioKLQkgKiBTdGF0aWMgS2V5IHZhbHVlIHBhaXIgb2YgZGVzY3JpcHRvcnMgYXMga2V5cyBhbmQgVHJhbnNsYXRvciBpbnN0YW5jZXMgYXMgdmFsdWVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIHRyYW5zbGF0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBTdGF0aWMgZW1wdHkgYXJyYXkgdXNlZCB3aGVuIG5vIGV4dGVuc2lvbnMgZm91bmQKLQkgKi8KLQkvLyBuZXZlciB1c2VkCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gTk9fVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvclswXTsKLQkKLQkvKioKLQkgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFRyYW5zbGF0b3Igc2VydmljZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JTZXJ2aWNlIElOU1RBTkNFID0gbmV3IFRyYW5zbGF0b3JTZXJ2aWNlKCk7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgVHJhbnNsYXRvclNlcnZpY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvclNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB3aWxsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBleHRlbnNpb24gcG9pbnQgVHJhbnNsYXRvckRlc2NyaXB0b3Igb2JqZWN0cyBmcm9tIHRoZSBtYW5hZ2VyCi0JICogQHJldHVybiBUcmFuc2xhdG9yRGVzY3JpcHRvcltdCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10gZ2V0VHJhbnNsYXRvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gVHJhbnNsYXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5maW5kVHJhbnNsYXRvcnMoKTsKLQl9Ci0JCi0JLyoqCi0gICAgICogVGhpcyByZXRyaWV2ZXMgdGhlIGV4dGVuZGVkIFRyYW5zbGF0b3JzIHVzaW5nIHRoZSBleHRlbnNpb24gcG9pbnQgbWFuYWdlciBhbmQgZGVzY3JpcHRvcnMKLSAgICAgKiBAcmV0dXJuIFRyYW5zbGF0b3JbXSAoTm90ZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgY29udGFpbiBudWxsIGVudHJpZXMuKQotICAgICAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0VHJhbnNsYXRvcnMoKSB7Ci0JCVRyYW5zbGF0b3JEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRUcmFuc2xhdG9yRGVzY3JpcHRvcnMoKTsKLQkJVHJhbnNsYXRvcltdIHJlc3VsdCA9IG5ldyBUcmFuc2xhdG9yW2Rlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCS8vVGhlIHJlc3VsdCBpbmRleCBjb3VsZCBkaWZmZXIgZnJvbSB0aGUgZGVzY3JpcHRvcnMgaW5kZXguCi0JCWludCByZXN1bHRJbmRleCA9IDA7Ci0JCWZvciAoaW50IGk9MDsgaTxkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJVHJhbnNsYXRvciBpbnN0YW5jZSA9IGdldFRyYW5zbGF0b3IoZGVzY3JpcHRvcnNbaV0pOwotCQkJaWYgKGluc3RhbmNlIT1udWxsKSB7Ci0JCQkJcmVzdWx0W3Jlc3VsdEluZGV4XSA9IGluc3RhbmNlOwotCQkJCXJlc3VsdEluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsgIAotICAgIH0KLQkKLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgYXNzb2NpYXRlZCBUcmFuc2xhdG9yIGluc3RhbmNlIGZvciB0aGUgZGVzY3JpcHRvciwgb3IgY3JlYXRlIGEgbmV3Ci0JICogb25lIGFuZCBjYWNoZSBvbiB0aGUgU2V0LgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdG9yRGVzY3JpcHRvcgotCSAqIEByZXR1cm4gVHJhbnNsYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKFRyYW5zbGF0b3JEZXNjcmlwdG9yIHRyYW5zbGF0b3JEZXNjcmlwdG9yKSB7Ci0JCVRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IChUcmFuc2xhdG9yKSB0cmFuc2xhdG9ycy5nZXQodHJhbnNsYXRvckRlc2NyaXB0b3IpOwotCQlpZiAodHJhbnNsYXRvciAhPSBudWxsKQotCQkJcmV0dXJuIHRyYW5zbGF0b3I7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRyYW5zbGF0b3JzKSB7Ci0JCQl0cmFuc2xhdG9yID0gdHJhbnNsYXRvckRlc2NyaXB0b3IuY3JlYXRlVHJhbnNsYXRvcigpOwotCQkJaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkKLQkJCQl0cmFuc2xhdG9ycy5wdXQodHJhbnNsYXRvckRlc2NyaXB0b3IsIHRyYW5zbGF0b3IpOwotCQl9Ci0JCXJldHVybiB0cmFuc2xhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Vuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDU5YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Vuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNTEwNDUzNzY3NjI0MTU1OTkxTDsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNjMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBXRlRVdGlsc1Jlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIndmdHV0aWxzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEQU5HTElOR19IUkVGX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlZ2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGYWlsZWRfdG9fY29udmVydF9fMF9fdG9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bWVyYXRpb25fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3J0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFyYWN0ZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvbmdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERvdWJsZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXJfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGbG9hdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnl0ZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2FybmluZ19fQ291bGRfbm90X3dyaXRlX2JfV0FSTl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhY2tfdHJhY2Vfb2ZfbmVzdGVkX2V4Y2VfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZk9iamVjdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3JfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV3JpdGVCYWNrSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV3JpdGVCYWNrSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGFhNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyB3aWxsIGJlIGRlbGV0ZWQuIElmIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLCBwbGVhc2UgY29udGFjdCB0aGUKLSAqICAgICAgICAgICAgIFdDQ00gdGVhbS4gQSBjbGFzcyB3aGljaCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEVuY29kZXIvRGVjb2RlcnMgdG8gc2F2ZQotICogICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoZXkgYXJlIG1hZGUgZGlydHkgYnkgYXV0b21hdGljIGVuY29kaW5nIHN1cHBvcnQuIFVzYWdlIEV4YW1wbGU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAKLSAqIAotICogLy8gVXNlIHRoZSBzdGFuZGFyZCBXZWJTcGhlcmUgcGFzc3dvcmQgdmFsdWUgZW5jb2Rlci9kZWNvZGVyLgotICogRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKS5zZXREZWZhdWx0RW5jb2RlckRlY29kZXIobmV3IGNvbS5pYm0uZWpzLnNlY3VyaXR5LnV0aWwuV0FTRW5jb2RlckRlY29kZXIoKSk7Ci0gKiAvLyBCZWdpbiB0cmFja2luZyBjaGFuZ2VzLi4uCi0gKiBXcml0ZUJhY2tIZWxwZXIuYmVnaW4oKTsKLSAqIC8vIExvYWQgYSByZXNvdXJjZSB3aGljaCBtYXkgaGF2ZSB1bi1lbmNvZGVkIHZhbHVlcy4uLgotICogLy8gTm90ZTogVGhlIFdDQ00gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB1bi1lbmNvZGVkIHZhbHVlcy4gIElmIHVuZW5jb2RlZCB2YWx1ZXMKLSAqIC8vIGFyZSBmb3VuZCwgdGhlIHZhbHVlIHdpbGwgYmUgZW5jb2RlZCwgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICogLy8gV3JpdGVCYWNrSGVscGVyLgotICogUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VTZXQubG9hZCgmcXVvdDtteVJlc291cmNlJnF1b3Q7KTsKLSAqIC8vIEVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIGR1ZSB0byBlbmNvZGluZyBhcmUgd3JpdHRlbiBiYWNrIG91dC4KLSAqIFdyaXRlQmFja0hlbHBlci5lbmQoKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgV3JpdGVCYWNrSGVscGVyIHsKLQlwcml2YXRlIFNldCBkaXJ0eU9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgYm9vbGVhbiB0cmFja2luZ0NoYW5nZXMgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBXcml0ZUJhY2tIZWxwZXIgX2luc3RhbmNlOwotCXN0YXRpYyB7Ci0JCS8vRGVwcmVjYXRlZCBjbGFzcwotCQlSZXZpc2l0LmRlbGV0ZU1lKCk7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBlbnN1cmVzIHByb3BlciB1c2FnZSB0aHJvdWdoIHNpbmdsZXRvbi4KLQkgKi8KLQlwcml2YXRlIFdyaXRlQmFja0hlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb3VyY2Ugd2hpY2ggaXMgZGlydHksIGFuZCBuZWVkcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXJ0eU9iamVjdChFT2JqZWN0IGRpcnR5T2JqZWN0KSB7Ci0JCWRpcnR5T2JqZWN0cy5hZGQoZGlydHlPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGNvbGxlY3Rpbmcgb2JqZWN0cyB3aGljaCBoYXZlIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW4oKSB7Ci0JCXRyYWNraW5nQ2hhbmdlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gc2F2ZSBhbGwgZGlydHkgcmVzb3VyY2VzIChpZiBwb3NzaWJsZSksIHRoZW4gbWFya3MgdGhlIHJlc291cmNlcyBhcyBub24tZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgZW5kKCkgewotCQlzYXZlRGlydHlSZXNvdXJjZXMoKTsKLQkJcmVzZXQoKTsKLQkJdHJhY2tpbmdDaGFuZ2VzID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGNoYW5nZXMgdG8gbW9mIG9iamVjdHMgYXJlIGN1cnJlbnRseSBiZWluZyB0cmFja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gdHJhY2tpbmdDaGFuZ2VzOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgbGlzdCBvZiBkaXJ0eSByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCWRpcnR5T2JqZWN0cy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIHNhdmUgYWxsIGRpcnR5IHJlc291cmNlcyAoaWYgcG9zc2libGUpLCB0aGVuIG1hcmtzIHRoZSByZXNvdXJjZXMgYXMgbm9uLWRpcnR5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVEaXJ0eVJlc291cmNlcygpIHsKLQkJU2V0IGRpcnR5UmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgZGlydHlPYmpJdGVyID0gZGlydHlPYmplY3RzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChkaXJ0eU9iakl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IGRpcnR5T2JqZWN0ID0gKEVPYmplY3QpIGRpcnR5T2JqSXRlci5uZXh0KCk7Ci0JCQlpZiAoZGlydHlPYmplY3QuZVJlc291cmNlKCkgIT0gbnVsbCAmJiAhZGlydHlSZXNvdXJjZXMuY29udGFpbnMoZGlydHlPYmplY3QpKSB7Ci0JCQkJZGlydHlSZXNvdXJjZXMuYWRkKGRpcnR5T2JqZWN0LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlJdGVyYXRvciBkaXJ0eUl0ZXIgPSBkaXJ0eVJlc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZGlydHlJdGVyLmhhc05leHQoKSkgewotCQkJUmVzb3VyY2UgZGlydHlSZXNvdXJjZSA9IChSZXNvdXJjZSkgZGlydHlJdGVyLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJZGlydHlSZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXdhcm4oZGlydHlSZXNvdXJjZSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcmVzb3VyY2Ugd2hpY2ggaXMgZGlydHksIGFuZCBuZWVkcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdyaXRlQmFja0hlbHBlciBzaW5nbGV0b24oKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IFdyaXRlQmFja0hlbHBlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogV2FybiB0aGUgdXNlciBvZiBwcm9ibGVtcyBkdXJpbmcgc2F2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3YXJuKFJlc291cmNlIHJlcywgRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5XYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXywgbmV3IE9iamVjdFtde3Jlcy5nZXRVUkkoKX0pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvWE1MVmFsdWVFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwMzUyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvWE1MVmFsdWVFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBbiBYTUwgdmFsdWUgZXNjYXBpbmcgRW5jb2RlckRlY29kZXIgaW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbHVlRW5jb2RlckRlY29kZXIgZXh0ZW5kcyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgewotCS8qKgotCSAqIElkZW50aWZpZXMgdGhlIGxhc3QgcHJpbnRhYmxlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSByYW5nZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUKLQkgKiBlbmNvZGluZyB1c2VkIHdpdGggdGhpcyBzZXJpYWxpemVyLiBGb3IgOC1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSBlaXRoZXIgMHg3RSBvciAweEZGLiBGb3IKLQkgKiAxNi1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSAweEZGRkYuIENoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHByaW50YWJsZSB3aWxsIGJlIGVzY2FwZWQgdXNpbmcKLQkgKiBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGludCBfbGFzdFByaW50YWJsZSA9IDB4N0U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyIF9zaW5nbGV0b247Ci0KLQkvKioKLQkgKiBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gTk9UX0lNUExFTUVOVEVECi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIGl0IG1heSBiZSBwcmludGVkIGFzIHRleHQgY29udGVudCBvciBhdHRyaWJ1dGUgdmFsdWUuIE5vbiBwcmludGFibGUKLQkgKiBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLiBXaGVyZSB0aGUgZm9ybWF0IHNwZWNpZmllcyBhIGRlYXVsdCBlbnRpdHkKLQkgKiByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQgKGUuZy4gPHR0PiZhbXA7bHQ7PC90dD4pLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZXNjYXBlCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBjaGFyUmVmID0gbnVsbDsKLQkJY2hhciBjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgKytpKSB7Ci0JCQljaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcwotCQkJLy8gY2hhcmFjdGVyLCBwcmludCBpdC4gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVudGl0eQotCQkJLy8gcmVmZXJlbmNlcyBpcyBhbG1vc3QgYnV0IG5vdCBpZGVudGljYWwgYmV0d2VlbgotCQkJLy8gWE1MIGFuZCBIVE1MLgotCQkJY2hhclJlZiA9IGdldEVudGl0eVJlZihjaCk7Ci0JCQlpZiAoY2hhclJlZiAhPSBudWxsKSB7Ci0JCQkJc2J1Zi5hcHBlbmQoJyYnKTsKLQkJCQlzYnVmLmFwcGVuZChjaGFyUmVmKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJfSBlbHNlIGlmICgoY2ggPj0gJyAnICYmIGNoIDw9IF9sYXN0UHJpbnRhYmxlICYmIGNoICE9IDB4RjcpIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKSB7Ci0JCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgcHJpbnRhYmxlLCBwcmludCBhcyBjaGFyYWN0ZXIgcmVmZXJlbmNlLgotCQkJCS8vIE5vbiBwcmludGFibGVzIGFyZSBiZWxvdyBBU0NJSSBzcGFjZSBidXQgbm90IHRhYiBvciBsaW5lCi0JCQkJLy8gdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZSB0aHJlc2hvbGQuCi0JCQkJc2J1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzYnVmLmFwcGVuZCgiJiMiKTsvLyROT04tTkxTLTEkCi0JCQkJc2J1Zi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChfc2luZ2xldG9uID09IG51bGwpIHsKLQkJCV9zaW5nbGV0b24gPSBuZXcgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpOwotCQl9Ci0JCXJldHVybiBfc2luZ2xldG9uLmVuY29kZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcyBjaGFyYWN0ZXIgdmFsdWUsIG9yIG51bGwgaWYgbm8gc3VjaCBlbnRpdHkKLQkgKiBleGlzdHMuIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCA8dHQ+JyZhbXA7JzwvdHQ+IHdpbGwgcmV0dXJuIDx0dD4iJmFtcDthbXA7IjwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyIHZhbHVlCi0JICogQHJldHVybiBDaGFyYWN0ZXIgZW50aXR5IG5hbWUsIG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudGl0eVJlZihjaGFyIGNoKSB7Ci0JCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JCS8vIFRoZXNlIGZpdmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBmb3IgYWxsIFhNTCBkb2N1bWVudHMuCi0JCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gImx0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuICJndCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnIicgOgotCQkJCXJldHVybiAicXVvdCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnXCcnIDoKLQkJCQlyZXR1cm4gImFwb3MiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gImFtcCI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvd2Z0dXRpbHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyZTJhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXz1JV0FFMDAwOFcgV2FybmluZzogQ291bGQgbm90IHdyaXRlIGJhY2sgezB9Ci1TdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl89SVdBRTAwMDlFIFN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Ci1FbnVtZXJhdGlvbl9VSV89RW51bWVyYXRpb24KLURvdWJsZV9VSV89RG91YmxlCi1GbG9hdF9VSV89RmxvYXQKLUxvbmdfVUlfPUxvbmcKLVNob3J0X1VJXz1TaG9ydAotQm9vbGVhbl9VSV89Qm9vbGVhbgotSW50ZWdlcl9VSV89SW50ZWdlcgotQ2hhcmFjdGVyX1VJXz1DaGFyYWN0ZXIKLUJ5dGVfVUlfPUJ5dGUKLUZhaWxlZF90b19jb252ZXJ0X18wX190b19fX0VSUk9SXz1JV0FFMDAxNEUgRmFpbGVkIHRvIGNvbnZlcnQgezB9IHRvIHsxfS4KLURBTkdMSU5HX0hSRUZfRVJST1JfPUlXQUUwMDAxRSBVbmFibGUgdG8gcmVzb2x2ZSBIUkVGIHswfS4gQ2hlY2sgdGhlIGRlc2NyaXB0b3IgZmlsZXMgYW5kIGVuc3VyZSB0aGUgaWRzIGFyZSB2YWxpZC4KLU1vZk9iamVjdF9VSV89TW9mT2JqZWN0X1VJXwotUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3JfRVJST1JfMD1QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wCi1FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMD1FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMAotCi1SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlcl9FUlJPUl8wPUlXQUUwMDAyRSBUaGUgUmVzb3VyY2VTZXQgY2Fubm90IGJlIG51bGwuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjNkZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvamVtLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2U0NjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1lbWZ3b3JrYmVuY2hlZGl0LmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWYwMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2E0ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jTW9uIEp1biAwOCAxNTozNTo0NSBFRFQgMjAwOQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxN2FjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuNC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5WZW5kb3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjEuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg4YWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGUvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gc2NoZW1hLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Yjg0ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVNRl9SZXNvdXJjZV9FZGl0X01vZGVsPUVNRiBSZXNvdXJjZSBFZGl0IE1vZGVsCi1FZGl0X01vZGVsX0V4dGVuc2lvbnM9RWRpdCBNb2RlbCBFeHRlbnNpb25zCi1BZGFwdGVyX0ZhY3RvcnlfRXh0ZW5zaW9uPUFkYXB0ZXIgRmFjdG9yeSBFeHRlbnNpb24KLU1vZGlmaWVySGVscGVyRmFjdG9yeT1Nb2RpZmllckhlbHBlckZhY3RvcnkKLXBsdWdpbk5hbWU9RU1GIFdvcmtiZW5jaCBFZGl0IFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjczYjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRNb2RlbCIgbmFtZT0iJUVNRl9SZXNvdXJjZV9FZGl0X01vZGVsIiBzY2hlbWE9InNjaGVtYS9lZGl0TW9kZWwuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWRpdE1vZGVsRXh0ZW5zaW9uIiBuYW1lPSIlRWRpdF9Nb2RlbF9FeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYWRhcHRlckZhY3RvcnkiIG5hbWU9IiVBZGFwdGVyX0ZhY3RvcnlfRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJNb2RpZmllckhlbHBlckZhY3RvcnkiIG5hbWU9IiVNb2RpZmllckhlbHBlckZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC5pbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5Ij4KLSAgICAgIDxmYWN0b3J5Q2xhc3MKLSAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5Ij4KLSAgICAgIDwvZmFjdG9yeUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgaWQ9ImVtZlZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBuYW1lPSJlbWZWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIj4KLSAgICAgIDx2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcgotICAgICAgICBpZD0iZW1mVmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIGhhbmRsZXJDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRW1mVmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIHNlbGVjdGlvblR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVtZlBhY2thZ2VQcm9wZXJ0eVRlc3RlciIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IgotICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIKLSAgICAgIHByb3BlcnRpZXM9ImVtZlBhY2thZ2UiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyIj4KLSAgICA8L3Byb3BlcnR5VGVzdGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICBrZXk9IlZhbGlkYXRlRWRpdENvbnRleHQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuVmFsaWRhdGVFZGl0SGVhZGxlc3NDb250ZXh0IgotICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkMWQ0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuZW1mLndvcmtiZW5jaC5lZGl0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZSIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGUiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ0b3NlZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZnRvc2VkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDg0ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZnRvc2VkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1VbmV4cGVjdGVkX0lPX2V4Y2VwdGlvbl9vY2N1cnJlZF9jcmVhdGluZ194bWxfZG9jdW1lbnRfMV9FWENfPUlXQUUwMDE3RSBVbmV4cGVjdGVkIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBjcmVhdGluZyB4bWwgZG9jdW1lbnQKLUVNRjJET01TZWRSZW5kZXJlcl9VSV8wPXswfSBzaG91bGQgbm90IHVzZSBhbiBPdXRwdXRTdHJlYW0gZm9yIGxvYWRpbmcKLUVNRjJET01TZWRSZW5kZXJlcl9VSV8xPXswfSBzaG91bGQgbm90IHVzZSBhbiBJbnB1dFN0cmVhbSBmb3IgbG9hZGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZndvcmtiZW5jaGVkaXQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ3b3JrYmVuY2hlZGl0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMWQxYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZndvcmtiZW5jaGVkaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzA9SVdBRTAwMTBFIEEgbnVsbCBFUGFja2FnZSB3aWxsIG5vdCBiZSB0aWVkIHRvIGFueSBBZGFwdGVyIEZhY3RvcnkuCi1DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wPVRoZXJlIGFyZSBhdCBsZWFzdCB7MH0gaW1wcm9wZXJseSByZWxlYXNlZCBlZGl0IG1vZGVscy4KLUNsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uX1VJXzE9VGhpcyBleGNlcHRpb24gd2FzIGdlbmVyYXRlZCB0byBpbmRpY2F0ZSBhbiBpbnZhbGlkIHVzYWdlIG9mIHJlZmVyZW5jZSBjb3VudHMuXG4gVHlwaWNhbGx5LCB0aGlzIG9jY3VycyBvbiBhdHRlbXB0cyB0byBvcGVuIGFuIGFscmVhZHkgb3BlbiBhcnRpZmFjdCBlZGl0LlxuIE1ha2Ugc3VyZSB0aGUgZGlzcG9zZSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gZG9uZSBhY2Nlc3NpbmcuXG4gUGxlYXNlIGV4YW1pbmUgdGhlIHN0YWNrIHRyYWNlLlxuIENsaWVudCBBY2Nlc3MgRXhjZXB0aW9uIG9mIHR5cGUgezB9IFxuCi1DbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wPUlXQUUwMDExRSBLZXkgYWxyZWFkeSB1c2VkIHRvIGFjY2VzcyBSZXNvdXJjZQotQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMT1JV0FFMDAxMkUgS2V5IGhhcyBub3QgcHJvcGVybHkgYWNjZXNzZWQgUmVzb3VyY2UuCi1FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8wPUlXQUUwMDEzRSBUaGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZvciB0aGUgRWRpdCBNb2RlbCBcInswfVwiIGNvbnRhaW5zIGEgY3ljbGUuIFBsZWFzZSBjb3JyZWN0IHRoZSBlbnRyaWVzIGluIHlvdXIgcGx1Z2luLnhtbCBmaWxlcy4KLUVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzE9SVdBRTAwMTRFIENvdWxkIG5vdCBjcmVhdGUgZmFjdG9yeSBiZWNhdXNlIElDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsLgotRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMj1JV0FFMDAxNUUgTm8gRWRpdE1vZGVsRmFjdG9yeSBmb3Iga2V5IFwiezB9XCIKLVNuYXBzaG90X0VSUk9SXzA9SVdBRTAwMTZFIExvY2tpbmcgSW5zdXJhbmNlIFN0YWNrIFRyYWNlCi1BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMD1JV0FFMDAxN0UgQSBwYWNrYWdlVVJJIGlzIHJlcXVpcmVkIGZvciBhbGwgQWRhcHRlciBGYWN0b3JpZXMKLUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xPUlXQUUwMDE4RSBBbiBpZCBpcyByZXF1aXJlZCBmb3IgYWxsIEFkYXB0ZXIgRmFjdG9yaWVzLiBDaGVjayBhbGwgYWRhcHRlciBmYWN0b3JpZXMgZGVmaW5lZCBpbiBcInswfVwiLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvTW9kdWxlQ29yZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2YmRkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvTW9kdWxlQ29yZS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIHJ1bnRpbWVKYXI9InRydWUiCi0gICAgbW9kZWxOYW1lPSJQcm9qZWN0TW9kdWxlIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5wcm9qZWN0bW9kdWxlLnByb3ZpZGVyLk1vZHVsZUNvcmVFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QucHJvamVjdG1vZHVsZS5wcmVzZW50YXRpb24uTW9kdWxlQ29yZUVkaXRvclBsdWdpbiIKLSAgICBydW50aW1lQ29tcGF0aWJpbGl0eT0iZmFsc2UiPgotICA8Zm9yZWlnbk1vZGVsPm1vZHVsZUNvcmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+V09SS1NQQUNFX1JPT1Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5EOlx3b3JrXFdUUDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2R1bGVDb3JlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0ibW9kdWxlQ29yZS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUvdXNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW5jeVR5cGUvY29uc3VtZXMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibW9kdWxlQ29yZS5lY29yZSMvL1VSSSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL2hhbmRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUvZGVwbG95ZWROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9yZXNvdXJjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL21vZHVsZVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL21vZHVsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2Uvc291cmNlUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZS9kZXBsb3llZFBhdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UvZXhjbHVzaW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UvbW9kdWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9Nb2R1bGVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vTW9kdWxlVHlwZS9tZXRhZGF0YVJlc291cmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Nb2R1bGVUeXBlL21vZHVsZVR5cGVJZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vUHJvamVjdE1vZHVsZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Qcm9qZWN0TW9kdWxlcy9wcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vUHJvamVjdE1vZHVsZXMvd29ya2JlbmNoTW9kdWxlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW50TW9kdWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW50TW9kdWxlL2hhbmRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbnRNb2R1bGUvZGVwbG95ZWRQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVudE1vZHVsZS9kZXBlbmRlbmN5VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5jYXQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGY1YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMTA2NSArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTUwDQotICAgIF93cml0dGVuICAgCSJSb3NlIDguMy4wNDA3LjI4MDAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibW9kdWxlQ29yZSINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIk1vZHVsZUNvcmUiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJuc1VSSSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJtb2R1bGVjb3JlLnhtaSIpKSkNCi0gICAgcXVpZCAgICAgICAJIjNBMERCNjhCMDA0NiINCi0gICAgdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0DQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNUEiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplamJleHQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlBQTg2NjYwMTkwIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI1QiINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndlYmFwcGV4dCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI1MzRGRDAyNEMiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjVDIg0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MEZDMDNDQSIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjQiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYxMDYwMTA3IikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NSINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmNsaWVudGJuZCINCi0JICAgIHF1aWR1ICAgICAgCSIzOUI5NjE0RjAzMUYiKQ0KLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQotCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY2Ig0KLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6YXBwbGljYXRpb25leHQiDQotCSAgICBxdWlkdSAgICAgIAkiM0EyMkU2MDgwMzAzIikNCi0JKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KLQkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NyINCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uYm5kIg0KLQkgICAgcXVpZHUgICAgICAJIjM5Qjk2MTE1MDJBNCIpDQotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCi0JICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjgiDQotCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqMmNibmQiDQotCSAgICBxdWlkdSAgICAgIAkiMzlCOTYzMkUwMzhDIikpDQotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3MgIldvcmtiZW5jaE1vZHVsZSINCi0JICAgIHF1aWQgICAgICAgCSI0MUUzREY1ODAxRkEiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaGFuZGxlIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ3MTAxNUQiDQotCQkgICAgdHlwZSAgICAgICAJIlVSSSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVwbG95ZWROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAxNDcxRDAyMDgiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSINCi0JICAgIHF1aWQgICAgICAgCSI0MUUzREY2NzAwMzkiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic291cmNlUGF0aCINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFM0RGOTcwMTI4Ig0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGxveWVkUGF0aCINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFRUM2NDAwMjVCIg0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2lvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRTNERjlFMDExRSINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiTW9kdWxlVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSI0MUVDMUQ1MTAzRTIiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWV0YWRhdGFSZXNvdXJjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMxREYwMDIxRSINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiVVJJIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2R1bGVUeXBlSWQiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMyMTM0MDM1NyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIlVSSSINCi0JICAgIHF1aWQgICAgICAgCSI0MUVDMjZEQTAyN0EiDQotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFQzI3MDgwM0FDIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiUHJvamVjdE1vZHVsZXMiDQotCSAgICBxdWlkICAgICAgIAkiNDFGNTY2REIwMjUxIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2plY3ROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUY1NjdGRDAyM0EiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEZXBlbmRlbnRNb2R1bGUiDQotCSAgICBxdWlkICAgICAgIAkiNDFGNkMyNEIwMjNEIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImhhbmRsZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ1RjAwMUM5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGxveWVkUGF0aCINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMTQ1RkEwMDE1Ig0KLQkJICAgIHR5cGUgICAgICAgCSJVUkkiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGVuZGVuY3lUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAzOTI0MzAxNkUiDQotCQkgICAgdHlwZSAgICAgICAJIkRlcGVuZGVuY3lUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MjAzOTRGNTAxODUiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRGVwZW5kZW5jeVR5cGUiDQotCSAgICBxdWlkICAgICAgIAkiNDIwMzk0RjUwMTg1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfHVzZXM9MA0KLXxjb25zdW1lcz0xDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAzOTkzODAxOEQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdW1lcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDIwMzlBNkUwMTM5Ig0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0UxNEIwMUUzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInJlc291cmNlcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFM0UxNEQwMzFEIg0KLQkJICAgIGxhYmVsICAgICAgCSJyZXNvdXJjZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjY3MDAzOSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIm1vZHVsZSINCi0JCSAgICBxdWlkICAgICAgIAkiNDFFM0UxNEQwMzFGIg0KLQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkgICAgcXVpZCAgICAgICAJIjQxRUMxRDk4MDJDMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJtb2R1bGVUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5OTAyNDEiDQotCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZVR5cGUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6TW9kdWxlVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzFENTEwM0UyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIiDQotCQkgICAgcXVpZCAgICAgICAJIjQxRUMxRDk5MDI0MyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpXb3JrYmVuY2hNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjU4MDFGQSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JICAgIHF1aWQgICAgICAgCSI0MUY1NjcyMDAwRTgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAid29ya2JlbmNoTW9kdWxlcyINCi0JCSAgICBxdWlkICAgICAgIAkiNDFGNTY3MjEwMTExIg0KLQkJICAgIGxhYmVsICAgICAgCSJ3b3JrYmVuY2hNb2R1bGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4qIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCINCi0JCSAgICBxdWlkICAgICAgIAkiNDFGNTY3MjEwMTEzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OlByb2plY3RNb2R1bGVzIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjZEQjAyNTEiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiDQotCSAgICBxdWlkICAgICAgIAkiNDIwMTQ2QTUwMkUyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1vZHVsZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NkE2MDI3RiINCi0JCSAgICBsYWJlbCAgICAgIAkibW9kdWxlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpEZXBlbmRlbnRNb2R1bGUiDQotCQkgICAgcXVpZHUgICAgICAJIjQxRjZDMjRCMDIzRCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2Ig0KLQkJICAgIHF1aWQgICAgICAgCSI0MjAxNDZBNjAyODEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCSAgICBxdWlkICAgICAgIAkiNDFFM0RGMDYwMjEwIg0KLQkgICAgdGl0bGUgICAgICAJIk1haW4iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMTAwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpVUkkiIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTIwLCAxNjQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTQ2MCwgMTU4OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk5MjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlVSSSIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTQ2MCwgMTUzOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTkyMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDE0NjAsIDE2NTApDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk5MjUpDQotCQkgICAgd2lkdGggICAgICAJOTM4DQotCQkgICAgaGVpZ2h0ICAgICAJMjQyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAyDQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgMTI2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE3NiwgMTA1NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTgNCi0JCQltYXhfd2lkdGggIAk1MDgNCi0JCQlsYWJlbCAgICAgIAkNCi18VGhlIG1vZHVsZSAiaGFuZGxlIiBVUkkgd2lsbCBjb250YWluIHRoZSBzcGVjaWFsIE1vZHVsZSBwcm90b2NvbCwgcHJvamVjdCBuYW1lLCBhbmQgbW9kdWxlIGlkZW50aWZpZXIsIGFuZCB3aWxsIGJlIGZ1bGx5IHJlc29sdmVkIHRvIGEgZnVsbCBwbGF0Zm9ybSBVUkkNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNTY4DQotCQkgICAgaGVpZ2h0ICAgICAJNDMxKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSIgQDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk5MiwgMTc0NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDcxNCwgMTYxMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldvcmtiZW5jaE1vZHVsZVJlc291cmNlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNjcwMDM5Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDcxNCwgMTY3NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTUzMSkNCi0JCSAgICB3aWR0aCAgICAgIAk1NzQNCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6TW9kdWxlVHlwZSIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDExMzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxNTA5LCAxMDMwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTW9kdWxlVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDUxMDNFMiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxNTA5LCAxMDkxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJNzAwKQ0KLQkJICAgIHdpZHRoICAgICAgCTcxMg0KLQkJICAgIGhlaWdodCAgICAgCTIzNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpQcm9qZWN0TW9kdWxlcyIgQDUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQxNiwgMzY4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUNCi0JCQlsb2NhdGlvbiAgIAkoMjA0LCAyODcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDI0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQcm9qZWN0TW9kdWxlcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRjU2NkRCMDI1MSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANQ0KLQkJCWxvY2F0aW9uICAgCSgyMDQsIDM0OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQzMSkNCi0JCSAgICB3aWR0aCAgICAgIAk0NDINCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW50TW9kdWxlIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgNDgwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMTQ3MCwgMzQ5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTcwOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVwZW5kZW50TW9kdWxlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiNDFGNkMyNEIwMjNEIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDE0NzAsIDQxMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJNA0KLQkJCW1heF93aWR0aCAgCTcxNSkNCi0JCSAgICB3aWR0aCAgICAgIAk3MjYNCi0JCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCA3NTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSg3MTIsIDY0NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldvcmtiZW5jaE1vZHVsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjU4MDFGQSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSg3MTIsIDcwNykNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTQ3MSkNCi0JCSAgICB3aWR0aCAgICAgIAk0ODINCi0JCSAgICBoZWlnaHQgICAgIAkyMzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAOA0KLQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDEyMzUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUUzRTE0QjAxRTMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicmVzb3VyY2VzIiBAOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgMzU1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3NSwgMTUwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVzb3VyY2VzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyNjc3Ng0KLQkJCQloZWlnaHQgICAgIAkxMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEQwMzFEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk0MCwgMTIzNSkNCi0JCQkJKDk0MCwgMTYwMSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDAsIDEyMzUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NDAsIDE2MDEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQlsb2NhdGlvbiAgIAkoODYxLCAxNDk1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43MTAzODMNCi0JCQkJaGVpZ2h0ICAgICAJNzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm1vZHVsZSIgQDEyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDYwLCAzNTUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MywgOTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIittb2R1bGUiDQotCQkJCXBjdERpc3QgICAgCTAuNzIwODI0DQotCQkJCWhlaWdodCAgICAgCTEwMw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUUzRTE0RDAzMUYiDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoOTQwLCAxMjM1KQ0KLQkJCQkoOTQwLCA4NzApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQwLCAxMjM1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTQwLCA4NzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQkJbG9jYXRpb24gICAJKDg2OCwgOTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MDkzODINCi0JCQkJaGVpZ2h0ICAgICAJNzMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDE1DQotCQkgICAgbG9jYXRpb24gICAJKDE2MzQsIDc5MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDk4MDJDMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGVUeXBlIiBAMTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgLTEzNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNw0KLQkJCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJCWxvY2F0aW9uICAgCSgyMDEwLCA5NzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK21vZHVsZVR5cGUiDQotCQkJCXBjdERpc3QgICAgCTAuOTExNTczDQotCQkJCWhlaWdodCAgICAgCTE1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5OTAyNDEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNQ0KLQkJCSAgICBzdXBwbGllciAgIAlANA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MzQsIDc5MSkNCi0JCQkJKDE4NTcsIDc5MSkNCi0JCQkJKDE4NTcsIDEwMTgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYzNCwgNzkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NywgMTAxOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTgwNCwgOTcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIiIEAxOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjk4LCAtMTM3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDk5MDI0MyINCi0JCQkgICAgY2xpZW50ICAgICAJQDE1DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTYzNCwgNzkxKQ0KLQkJCQkoMTE4NSwgNzkxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MzQsIDc5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExODUsIDc5MSkpKSkNCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMjANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGNsaWVudCAgICAgCUAyDQotCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoNjU3LCAxMDQ4KQ0KLQkJCSg4MjksIDg3MCkpDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMjENCi0JCSAgICBsb2NhdGlvbiAgIAkoMzk5LCA2OTEpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjcyMDAwRTgiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAid29ya2JlbmNoTW9kdWxlcyIgQDIyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjENCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMywgNDAzKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzDQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDQ3NiwgNzQ3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzczDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit3b3JrYmVuY2hNb2R1bGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjI1MzI4OQ0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjcyMTAxMTEiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMQ0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM5OSwgNjkxKQ0KLQkJCQkoNzAzLCA2OTEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzk5LCA2OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDMsIDY5MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5Mjc2Mw0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDI1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjENCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMywgNDAzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQxRjU2NzIxMDExMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxDQotCQkJICAgIHN1cHBsaWVyICAgCUA1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzk5LCA2OTEpDQotCQkJCSgzMjUsIDY5MSkNCi0JCQkJKDMyNSwgNDYxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5OSwgNjkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI1LCA0NjEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDI2DQotCQkgICAgbG9jYXRpb24gICAJKDEzMjIsIDYzMykNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjQyMDE0NkE1MDJFMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGVzIiBAMjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDkwLCAtNzExKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4DQotCQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQkJbG9jYXRpb24gICAJKDEzNjcsIDU0NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbW9kdWxlcyINCi0JCQkJcGN0RGlzdCAgICAJMC40NzU3MzYNCi0JCQkJaGVpZ2h0ICAgICAJNzINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiNDIwMTQ2QTYwMjdGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzIyLCA2MzMpDQotCQkJCSgxNDYwLCA1ODkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5DQotCQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQkJbG9jYXRpb24gICAJKDE0MjcsIDY2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNjM2MDc3DQotCQkJCWhlaWdodCAgICAgCTU5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2IiBAMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNDkwLCAtNzExKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjQyMDE0NkE2MDI4MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTMyMiwgNjMzKQ0KLQkJCQkoMTE4NSwgNjc1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkJKG9iamVjdCBOb3RlVmlldyBAMzENCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc4NCwgNDE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMxDQotCQkJbG9jYXRpb24gICAJKDIzODcsIDE2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTEwDQotCQkJbWF4X3dpZHRoICAJNzU5DQotCQkJbGFiZWwgICAgICAJDQotfFRoZSBkZXBlbmRlbnQgbW9kdWxlICJoYW5kbGUiIG11c3QgYmUgcmVzb2x2YWJsZSB0byBhIFdvcmtiZW5jaE1vZHVsZS4NCi18DQotfFRoZSBEZXBsb3llZFBhdGggc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBtb2R1bGUgaW4gdGhpcyBkZXBsb3ltZW50IHN0cnVjdHVyZS4NCi18DQotfFRoZSBkZXBlbmRlbmN5VHlwZSBzcGVjaWZpZXMgaG93IHRoZSBkZXBlbmRlbnQgbW9kdWxlIGlzIGFzc2VtYmxlZC4NCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJODE5DQotCQkgICAgaGVpZ2h0ICAgICAJNTEzKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpEZXBlbmRlbmN5VHlwZSIgQDMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCA5NDQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM4NywgODYwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRGVwZW5kZW5jeVR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMg0KLQkJCWxvY2F0aW9uICAgCSgyMzg3LCA4MTApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjQyMDM5NEY1MDE4NSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMjM4NywgOTIxKQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMjM3KQ0KLQkJICAgIHdpZHRoICAgICAgCTM2NA0KLQkJICAgIGhlaWdodCAgICAgCTI5Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAzMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgY2xpZW50ICAgICAJQDYNCi0JCSAgICBzdXBwbGllciAgIAlAMzENCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjE4NywgNDU1KQ0KLQkJCSgyMzc0LCA0NDMpKQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApKSkpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzIzZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2R1bGVjb3JlIgotICAgIG5zVVJJPSJtb2R1bGVjb3JlLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2JlbmNoTW9kdWxlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFuZGxlIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlcGxveWVkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL21vZHVsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTW9kdWxlVHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RlcGVuZGVudE1vZHVsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZVBhdGgiIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwbG95ZWRQYXRoIiBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1c2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZHVsZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtiZW5jaE1vZHVsZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaE1vZHVsZS9yZXNvdXJjZXMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kdWxlVHlwZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGFkYXRhUmVzb3VyY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGVUeXBlSWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2plY3RNb2R1bGVzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2JlbmNoTW9kdWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrYmVuY2hNb2R1bGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlcGVuZGVudE1vZHVsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZSIgZVR5cGU9IiMvL1VSSSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXBsb3llZFBhdGgiIGVUeXBlPSIjLy9VUkkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwZW5kZW5jeVR5cGUiIGVUeXBlPSIjLy9EZXBlbmRlbmN5VHlwZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRlcGVuZGVuY3lUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ1c2VzPTAmI3hEOyYjeEE7Y29uc3VtZXM9MSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0idXNlcyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29uc3VtZXMiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5YjRjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4ODM5ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNTANCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4zLjA0MDcuMjgwMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiSURFIg0KLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MSINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDIiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiDQotCSAgICB2YWx1ZSAgICAgIAkiIikNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIg0KLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyINCi0JICAgIHZhbHVlICAgICAgCSIiKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQzIg0KLQkgICAgdmFsdWUgICAgICAJIiIpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIg0KLQkgICAgdmFsdWUgICAgICAJIiIpKQ0KLSAgICBxdWlkICAgICAgIAkiM0EwQjI0NzQwMjVGIg0KLSAgICBlbmZvcmNlQ2xvc3VyZUF1dG9Mb2FkIAlGQUxTRQ0KLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzDQotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMA0KLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMA0KLQl0b3BNYXJnaW4gIAkwLjI1MDAwMA0KLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwDQotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMA0KLQljbGlwSWNvbkxhYmVscyAJVFJVRQ0KLQlhdXRvUmVzaXplIAlUUlVFDQotCXNuYXBUb0dyaWQgCVRSVUUNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjZBIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzM5Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI2OSINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzQTBCMjQ3NDAyN0QiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJtb2R1bGVDb3JlIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkV09SS1NQQUNFX1JPT1RcXG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uXFxyb3NlXFxtb2R1bGVDb3JlLmNhdCINCi0JCXF1aWQgICAgICAgCSIzQTBEQjY4QjAwNDYiKSkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiUGFja2FnZVZpZXciDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzYwIg0KLQkJdGl0bGUgICAgICAJIlBhY2thZ2VWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTY1MA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlIiBAMQ0KLQkJCWxvY2F0aW9uICAgCSgzNTIsIDMyMCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDIzNikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkibW9kdWxlQ29yZSIpDQotCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzQTBEQjY4QjAwNDYiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkNCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RCINCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEIyNDc5MDMzOCINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpDQotCWNhdGVnb3J5ICAgCSJMb2dpY2FsIFZpZXciDQotCXF1aWR1ICAgICAgCSI0MUVDMUMzQjAwQTQiKQ0KLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMNCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RSINCi0JUHJvY3NORGV2cyAJKGxpc3QNCi0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciDQotCQlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjkxIg0KLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzDQotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkicm9zZUlkIg0KLQkJdmFsdWUgICAgICAJIjc1MzExNzU0MCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdSb290RGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIg0KLQkJCXZhbHVlICAgICAgCTgpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJLTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIg0KLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIxIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjUiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5Ig0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBODNfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQotCQkJCXZhbHVlICAgICAgCTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiINCi0JCQkJdmFsdWUgICAgICAJMjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQotCQkJCXZhbHVlICAgICAgCTIzMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQotCQkJCXZhbHVlICAgICAgCTIzNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJUeXBlSW1wbGVtZW50YXRpb25TZXQiIDIwOCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk1heWJlQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU3VwZXJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheUluZGV4RGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJGcmVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVFcXVhbGl0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMjEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNaXhpbiINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYXNrIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiDQotCQkJCXZhbHVlICAgICAgCTIxMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJMjE0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIyNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5pdGlhbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMjI4KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyINCi0JCQkJdmFsdWUgICAgICAJMjI5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBdXRvIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5jb21wbGV0ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmNvbXBsZXRlVHlwZVNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluY29tcGxldGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb0Rpc2NyaW1pbmFudFBhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVua25vd25EaXNjcmltaW5hbnRQYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJLbm93bkRpc2NyaW1pbmFudFBhcnQiDQotCQkJCXZhbHVlICAgICAgCTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlckNsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUJhcnJpZXJDb25kaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlRydWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQotCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCi0JCQkJdmFsdWUgICAgICAJMjMzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBZnRlciINCi0JCQkJdmFsdWUgICAgICAJMjM0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudENsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSm9pbkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEQk1TIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRhYmxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tPcHRpb24iDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvcnJlbGF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTbmFwU2hvdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1BhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUcmlnZ2VyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrUHJlZGljYXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDaGVja1RpbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3VGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1JvdyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSINCi0JCQl2YWx1ZSAgICAgIAkiU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByb2NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5lZE51bGwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJJQk0iDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIm1fIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJzXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIg0KLQkJCXZhbHVlICAgICAgCTMpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1NpbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSb3NlSUQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVmZXJlbmNlQ2xhc3NwYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZUphdmFEb2NUYWdzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhbEhvbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU291cmNlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NTZWxlY3RlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0U291cmNlUm9vdCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTQ0NDb21tZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIyLjAiDQotCQkJCXZhbHVlICAgICAgCTIzMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIxLngiDQotCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQotCQkJCXZhbHVlICAgICAgCTY1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiDQotCQkJdmFsdWUgICAgICAJImNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTIwNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZW51bSINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkicmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyINCi0JCQkJdmFsdWUgICAgICAJMTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJCXZhbHVlICAgICAgCTEwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtYXgiDQotCQkJCXZhbHVlICAgICAgCTEwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkia2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGNpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjAiDQotCQkJCXZhbHVlICAgICAgCTIyMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjEiDQotCQkJCXZhbHVlICAgICAgCTIyNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVZhbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNsZWFyQ2FzZSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJlcXVpc2l0ZVBybyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNvREEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIuaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIi5jcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiDQotCQkJdmFsdWUgICAgICAJOCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAktMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiDQotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiDQotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJVcHBlciBjYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkIxIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJCMyINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkI0Ig0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQjUiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyBGaXJzdCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVCYWNrdXBGaWxlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlcyINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbW1lbnRSdWxlc1NldCIgMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50UnVsZXNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIHN5bmNocm9uaXplIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJSZXZlcnNlIGVuZ2luZWVyaW5nIG9ubHkiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJCW5hbWUgICAgICAgCSJOZXZlciBzeW5jaHJvbml6ZSINCi0JCQkJdmFsdWUgICAgICAJNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjMyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQotCQkJCXZhbHVlICAgICAgCTIzMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW4iDQotCQkJCXZhbHVlICAgICAgCTIwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIzMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRlcGxveSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtRGlyZWN0aW9uVHlwZVNldCIgMTAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1EaXJlY3Rpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW4iDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiaW5vdXQiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkib3V0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDQpKSkpKSkNCi0JcXVpZCAgICAgICAJIjNBMEIyNDc0MDI3RiIpKQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2FkYXB0ZXJGYWN0b3J5LmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDEwMGRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2FkYXB0ZXJGYWN0b3J5LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iIGlkPSJhZGFwdGVyRmFjdG9yeSIgbmFtZT0iQWRhcHRlciBGYWN0b3J5IEV4dGVuc2lvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW4gYWRhcHRlciBmYWN0b3J5IHdpdGggdGhlIGR5bmFtaWMgYWRhcHRlciBmYWN0b3J5Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWRhcHRlckZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImFkYXB0ZXJGYWN0b3J5Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBEZWZpbmVzIHRoZSBBZGFwdGVyIEZhY3RvcnkgYmVpbmcgYWRkZWQuIEFsbCBhZGRlZCBBZGFwdGVyIEZhY3RvcmllcyBhcmUgcXVlcmlhYmxlIHdoZW5ldmVyIHRoZWlyIEZ1bmN0aW9uIEdyb3VwIGFuZCBvcHRpb25hbCBWaWV3ZXIgSWQgYXJlIHNwZWNpZmllZC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aWV3IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2VVUkkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHBhY2thZ2UgVVJJIHRoYXQgeW91IGFyZSBleHRlbmRpbmcgKGZvciBleGFtcGxlICZxdW90O2VqYi54bWkmcXVvdDspDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQWRhcHRlciBGYWN0b3J5IGV4dGVuc2lvbi4gIFRoaXMgd2lsbCBhc3NvY2lhdGUgaXQgd2l0aCBvbmUgb3IgbW9yZSBmdW5jdGlvbiBncm91cHMgYmFzZWQgb24gdGhlIGZ1bmN0aW9uIGdyb3VwIHBhdHRlcm5zLiAgRnVuY3Rpb24gR3JvdXBzIGFsbG93IENvbnRlbnQgYW5kIEFjdGlvbnMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBiYXNlZCBvbiBwcm9qZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uLiBHZW5lcmFsbHksIHRoZXkgYXJlIHVzZWQgYnkgdmVuZG9ycyB3aG8gd2lzaCB0byBhZGQgZnVuY3Rpb25hbGl0eSBzcGVjaWZpYyB0byB0aGVpciBwcm9kdWN0cywgZS5nLiBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlcnMuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InZpZXciPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIHZpZXdlciBJZCB3aGljaCB3aWxsIGxpbWl0IHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBkZWZpbmVkIEFkYXB0ZXIgRmFjdG9yeSB0byB0aGUgZ2l2ZW4gdmlld2VyIGlkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWwuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2VkaXRNb2RlbC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc0M2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2VkaXRNb2RlbC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iZWRpdE1vZGVsIiBuYW1lPSJFTUYgUmVzb3VyY2UgRWRpdCBNb2RlbCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBFZGl0IG1vZGVscyBwcm92aWRlIGEgZnJhbWV3b3JrIGZvciBtYW5hZ2luZyBhIHNldCBvZiBFTUYgcmVzb3VyY2VzIHdpdGhpbiBhIHVuaXQgb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIHdvcmtzcGFjZSBvcGVyYXRpb24gbWF5IGFmZmVjdCBhIGNoYW5nZSB0byBtdWx0aXBsZSBFTUYgcmVzb3VyY2VzLiBFZGl0IG1vZGVscyBwcm92aWRlIGJhc2ljIHNlcnZpY2VzIHN1Y2ggYXMgbG9hZHMsIHNhdmVzICh3aGVuIG5lY2Vzc2FyeSksIGFuZCB2YWxpZGF0ZSBlZGl0IGZvciB0aGUgbWFuYWdlZCByZXNvdXJjZXMuICBFZGl0IG1vZGVscyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQsIHRoZXJlZm9yZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBhbiBlZGl0IG1vZGVsIGNhbiBiZSBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gb3IgZWRpdG9yLiAgQnkgZGVjbGFyaW5nIGFuIGVkaXQgbW9kZWwsIGEgcGx1Z2luIHByb3ZpZGVyIGVuYWJsZXMgb3RoZXIgY29tcG9uZW50cyB0byBjb250cmlidXRlIHJlc291cmNlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoYXQgZWRpdCBtb2RlbC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24gZm9yIGFuIGVkaXQgbW9kZWwgdG8gYmUgdXNlZCBpbiB0aGUgd29ya3NwYWNlLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbFJlc291cmNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVkaXRNb2RlbElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlZGl0IG1vZGVsLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIHVzZWQgZm9yIHRoaXMgZWRpdCBtb2RlbC4gIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LiBJZiBub25lIGlzIHNwZWNpZmllZCwgdGhlbiBhIGdlbmVyaWMgJmx0O2NvZGUmZ3Q7RWRpdE1vZGVsJmx0Oy9jb2RlJmd0OyBpcyBjcmVhdGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2FkVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRNb2RlbElEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsUmVzb3VyY2UiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgaXMgYW4gaW5kaXZpZHVhbCBjb250cmlidXRpb24gb2YgYSByZXNvdXJjZSB0byB0aGUgZWRpdCBtb2RlbC4gIElmIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgVVJJIGlzIHJlZ2lzdGVyZWQgYWdhaW5zdCBhbiBlZGl0IG1vZGVsIGlkLCB0aGUgcmVzb3VyY2UgaXMgc3RpbGwgb25seSBsb2FkZWQgb25jZS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb250YWluZXIgZnJvbSB3aGljaCBFTUYgcmVzb3VyY2VzIGFyZSBsb2FkZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9sb2FkIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgSW5kaWNhdG9yIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGlzIHJlc291cmNlIHNob3VsZCBiZSBhdXRvbG9hZGVkIHdoZW4gdGhlIGVkaXQgbW9kZWwgaXMgY3JlYXRlZCwgb3Igd2hlbiBhbiBJRmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVzb3VyY2UgaXMgYWRkZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0gICANCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZUV4dGVuc2lvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhpcyBhbGxvd3MgcmVnaXN0cmF0aW9uIG9mIGZpbGVzIGZvciBhdXRvbG9hZGluZyBhY2NvcmRpbmcgdG8gZmlsZSBleHRlbnNpb24uDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBmaWxlIGV4dGVuc2lvbiBpdHNlbGYgKCZxdW90O215eG1pJnF1b3Q7KQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9JnF1b3Q7ZWRpdE1vZGVsLmFjbWUucGFyZW50JnF1b3Q7DQotICAgICAgICAgbmFtZT0mcXVvdDtBY21lIFBhcmVudCBFZGl0IE1vZGVsJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtlZGl0TW9kZWwNCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvLnBhcmVudC5lZGl0TW9kZWwmcXVvdDsNCi0gICAgICAgICAgICBmYWN0b3J5Q2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSZxdW90OyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMC54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvcmVzb3VyY2UxLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgJmx0Oy9lZGl0TW9kZWwmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotDQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIGlkPSZxdW90O2VkaXRNb2RlbC5hY21lLmNoaWxkJnF1b3Q7DQotICAgICAgICAgbmFtZT0mcXVvdDtBY21lIENoaWxkIEVkaXQgTW9kZWwmcXVvdDsNCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWwmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2VkaXRNb2RlbA0KLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSZxdW90O2NvbS5hY21lLmFjbWVwcm8uY2hpbGQuZWRpdE1vZGVsJnF1b3Q7DQotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmcXVvdDsNCi0gICAgICAgICAgICBwYXJlbnRNb2RlbElEPSZxdW90O2NvbS5hY21lLmFjbWVwcm8ucGFyZW50LmVkaXRNb2RlbCZxdW90OyZndDsNCi0gICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMi54bWwmcXVvdDsvJmd0Ow0KLSAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvcmVzb3VyY2UzLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgJmx0Oy9lZGl0TW9kZWwmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRWRpdCBNb2RlbHMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQmbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2ZDJhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgaWQ9ImVkaXRNb2RlbEV4dGVuc2lvbiIgbmFtZT0iRWRpdCBNb2RlbCBFeHRlbnNpb25zIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBFZGl0IE1vZGVsIEV4dGVuc2lvbiBhbGxvd3MgdGhpcmQgcGFydGllcyB0byBjb250cmlidXRlIGV4cGVjdGVkIHJlc291cmNlcyB0byBFZGl0IE1vZGVscy4gVGhlIGZ1bmN0aW9uR3JvdXBJRCBhbGxvd3MgdXNlcnMgdG8gc2VsZWN0IHdoaWNoIGV4dGVuc2lvbnMgdGhleSBjaG9vc2UgdG8gaGF2ZSBlbmFibGVkLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImVkaXRNb2RlbC5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdE1vZGVsRXh0ZW5zaW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0TW9kZWxFeHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIEVkaXQgbW9kZWwgZXh0ZW5zaW9ucyBhbGxvdyBjb21wb25lbnRzIHRvIGNvbnRyaWJ1dGUga25vd24gcmVzb3VyY2UgVVJJcyB0byBhbiBlZGl0IG1vZGVsLiAgV2hlbmV2ZXIgYW4gZWRpdCBtb2RlbCBpcyBsb2FkZWQsIHRoZSByZXNvdXJjZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGxvYWRlZCBhbmQgbWFuYWdlZCBieSB0aGUgZWRpdCBtb2RlbC4gIENoYW5nZXMgdG8gdGhlIHJlc291cmNlcyB3aWxsIGJlIHRyYWNrZWQgYW5kIHNhdmVkIGR1cmluZyBvcGVyYXRpb25zIG9yIGVkaXRvciBzYXZlcy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0TW9kZWxSZXNvdXJjZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlZGl0TW9kZWxJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBlZGl0IG1vZGVsIGJlaW5nIGV4dGVuZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uLiAgVGhpcyB3aWxsIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBmdW5jdGlvbiBncm91cCBwYXR0ZXJuIGJpbmRpbmcuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxFeHRlbnNpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O2VkaXRNb2RlbEV4dGVuc2lvbg0KLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSZxdW90O29yZy5zYW1wbGUuaW5oZXJpdGFuY2UucGFyZW50LmVkaXRNb2RlbCZxdW90Ow0KLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0mcXVvdDtvcmcuc2FtcGxlLmdyb3VwJnF1b3Q7Jmd0Ow0KLSAgICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL2V4dGVuc2lvbjAueG1sJnF1b3Q7LyZndDsNCi0gICAgICAgICAmbHQ7ZWRpdE1vZGVsUmVzb3VyY2UgVVJJPSZxdW90O0RJUi9leHRlbnNpb24xLnhtbCZxdW90Oy8mZ3Q7DQotICAgICAgJmx0Oy9lZGl0TW9kZWxFeHRlbnNpb24mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9tb2RpZmllckhlbHBlckZhY3RvcnkuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MwN2RiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iTW9kaWZpZXJIZWxwZXJGYWN0b3J5IiBuYW1lPSJNb2RpZmllciBIZWxwZXIgRmFjdG9yeSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGZvciB0aGUgbW9kZWwgbW9kaWZpZXJzLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYWNrYWdlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icGFja2FnZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0idHlwZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZlYXR1cmUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZlYXR1cmUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFjdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0NvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTBjZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwgZXh0ZW5kcyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsIGltcGxlbWVudHMgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIpIHsKLQkJc3VwZXIoYW5JbnB1dENvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJc3VwZXIoYUNvbnRhaW5lciwgYVN5bmNocm9uaXplcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyLCBJQ29udGFpbmVyIGFuT3V0cHV0Q29udGFpbmVyKSB7Ci0JCXN1cGVyKGFuSW5wdXRDb250YWluZXIsIGFuT3V0cHV0Q29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqIEBwYXJhbSBhbk91dHB1dENvbnRhaW5lcgotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lciwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQlzdXBlcihhbklucHV0Q29udGFpbmVyLCBhbk91dHB1dENvbnRhaW5lciwgYVN5bmNocm9uaXplcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyI2RlTm9ybWFsaXplKFVSSSkKLQkgKi8KLQlwdWJsaWMgVVJJIGRlTm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJCWlmIChhRmlsZSAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgZmlsZVByb2plY3QgPSBhRmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJLy9JZiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgcHJvamVjdCB0aGVuIGp1c3QgcmV0dXJuIHRoZSBVUkkgYXMgaXMuCi0JCQkJaWYgKHJlc291cmNlU2V0U3luY2hyb25pemVyLmdldFByb2plY3QoKSA9PSBmaWxlUHJvamVjdCkKLQkJCQkJcmV0dXJuIGdldENvbnRhaW5lclJlbGF0aXZlVVJJKGFGaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9EeW5hbWljR3Jvd3RoTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhOWE2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9EeW5hbWljR3Jvd3RoTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotCi1wdWJsaWMgY2xhc3MgRHluYW1pY0dyb3d0aE1vZGVsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOSU1VTV9PUFRJTUFMX1NJWkUgPSAxMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRU1PUllfVEhSRVNISE9MRCA9IDEwMDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUNFQUJMRV9DSEFOR0UgPSA1OwotCQotCQotCS8qIFN0b3JlcyBhIEZJRk8gbGlzdCBvZiB0aGUgS2V5IHR5cGVzIChJUGF0aCkqLwotCXByaXZhdGUgZmluYWwgTGlzdCBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCi0JLyogV2UgdXNlIGFuIGludFtdIGFzIHRoZSB2YWx1ZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY3JlYXRpbmcgSW50ZWdlciBvYmplY3RzICovCi0JcHJpdmF0ZSBmaW5hbCBNYXAvKiA8SVBhdGgsIGludFtdPiAqLyB1bmlxdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkKLQkvKioKLQkgKiBJbmplY3QgdGhlIGtleSBpbnRvIHRoZSBEeW5hbWljR3Jvd3RoTW9kZWwuIE1heSBvciBtYXkgbm90IGFmZmVjdCB0aGUgCi0JICogZHluYW1pYyBzaXplLgotCSAqCi0JICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGluamVjdCBpbnRvIHRoZSBtb2RlbAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgb3B0aW1hbCBzaXplIGNoYW5nZWQgZ3JlYXRoZXIgdGhhbiB7QHZhbHVlIE5PVElDRUFCTEVfQ0hBTkdFfSBhcyBhIHJlc3VsdCBvZiB0aGUgaW5qZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpbmplY3RLZXkoSVBhdGgga2V5KSB7Ci0JCQotCQlpbnQgb3JpZ2luYWxTaXplID0gZ2V0T3B0aW1hbFNpemUoKTsKLQkJCi0JCWludFtdIGNvdW50ID0gbnVsbDsKLQkJaWYoIChjb3VudCA9IChpbnRbXSkgdW5pcXVlc01hcC5nZXQoa2V5KSkgIT0gbnVsbCApIHsKLQkJCS8qIGluY3JlbWVudCB0aGUgY291bnQgKi8KLQkJCSsrY291bnRbMF07Ci0JCX0gZWxzZSB7Ci0JCQkvKiBpbnNlcnQgdGhlIGZpcnN0IGNvdW50ICovCi0JCQl1bmlxdWVzTWFwLnB1dChrZXksIGNvdW50ID0gbmV3IGludFtdIHsgMSB9ICk7Ci0JCX0KLQkJCi0JCWlmKCBxdWV1ZS5zaXplKCkgPT0gTUVNT1JZX1RIUkVTSEhPTEQgKSB7Ci0JCQkKLQkJCS8qIHRha2UgdGhlIG9sZGVzdCB2YWx1ZSBvZmYgdGhlIHF1ZXVlICovCi0JCQlJUGF0aCBvbGRlc3RLZXkgPSAoSVBhdGgpIHF1ZXVlLnJlbW92ZSgwKTsKLQkJCQotCQkJLyogZGV0ZXJtaW5lIGlmIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIG9sZGVzdCBrZXkgaXMgc3RpbGwgaW4gdGhlIHF1ZXVlICovCi0JCQljb3VudCA9IChpbnRbXSkgdW5pcXVlc01hcC5nZXQob2xkZXN0S2V5KTsKLQkJCUFzc2VydC5pc05vdE51bGwoY291bnQpOwotCQkJCi0JCQkvKiBSZWR1Y2UgdGhlIGNvdW50ICovCi0JCQljb3VudFswXSAtPSAxOwotCQkKLQkJCS8qIENvdW50IHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZSAqLwotCQkJQXNzZXJ0LmlzVHJ1ZShjb3VudFswXSA+PSAwKTsKLQkJCQotCQkKLQkJCS8qIFRoaXMgdW5pcXVlIGtleSBpcyBubyBsb25nZXIgaW4gdGhlIHF1ZXVlKi8KLQkJCWlmKGNvdW50WzBdID09IDApIHsKLQkJCQl1bmlxdWVzTWFwLnJlbW92ZShvbGRlc3RLZXkpOwotCQkJfQotCQkJCi0JCQkKLQkJCQotCQl9Ci0JCS8qIEFkZCB0aGUgbmV3S2V5IHRvIGVuZCBvZiB0aGUgbGlzdCovCi0JCXF1ZXVlLmFkZChrZXkpOwotCQkKLQkJcmV0dXJuIE1hdGguYWJzKCBvcmlnaW5hbFNpemUgLSBnZXRPcHRpbWFsU2l6ZSgpICkgPiBOT1RJQ0VBQkxFX0NIQU5HRTsKLQotCX0KLQkKLQkvKioKLQkgKiBUaGUgb3B0aW1hbCBzaXplIGlzIGFuIGludGVnZXIgZnJvbSBbe0B2YWx1ZSAjTUlOSU1VTV9PUFRJTUFMX1NJWkV9LCB7QHZhbHVlICNNRU1PUllfVEhSRVNISE9MRH1dLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcHRpbWFsIHNpemUgZm9yIHRoZSBMUlUgQ2FjaGUuICAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wdGltYWxTaXplKCkgewkJCi0JCXJldHVybiB1bmlxdWVzTWFwLnNpemUoKSA+IE1JTklNVU1fT1BUSU1BTF9TSVpFID8gdW5pcXVlc01hcC5zaXplKCkgOiBNSU5JTVVNX09QVElNQUxfU0laRTsKLQl9Ci0KLX0JCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjFmOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRU1GV29ya2JlbmNoRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGw7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoQ29udGV4dCBleHRlbmRzIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGltcGxlbWVudHMgSVN5bmNocm9uaXplckV4dGVuZGVyIHsKLQotCXByaXZhdGUgTWFwIHJlYWRPbmx5TW9kZWxzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBlZGl0YWJsZU1vZGVscyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciByZXNvdXJjZVNldExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkgPSBmYWxzZTsKLQotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJc3VwZXIoYVByb2plY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dCNpbml0aWFsaXplUmVzb3VyY2VTZXQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXNvdXJjZVNldChQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVSZXNvdXJjZVNldChhUmVzb3VyY2VTZXQpOwotCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IHJlZyA9IG5ldyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSBuZXcgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsKCk7Ci0JCXJlZy5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwgZmFjdG9yeSk7Ci0JCS8vIGFkZCB4bWkgYmVjYXVzZSBvdGhlciBwbHVnaW5zIGFyZSByZWdpc3RlcmluZyBpdCBnbG9iYWxseQotCQlyZWcuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4bWkiLCBmYWN0b3J5KTsgLy8kTk9OLU5MUy0xJAotCQlhUmVzb3VyY2VTZXQuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkocmVnKTsKLQkJYVJlc291cmNlU2V0LmdldFN5bmNocm9uaXplcigpLmFkZEV4dGVuZGVyKHRoaXMpOyAvLyBhZGRlZCBzbyB3ZSBjYW4gYmUgaW5mb3JtZWQgb2YgY2xvc2VzCi0JCS8vIHRvIHRoZSBwcm9qZWN0LgotCQlzdGFydExpc3RlbmluZ1RvUmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDYWNoZUlEKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIEFQSSB0aGF0IGNsaWVudHMgc2hvdWxkIHVzZSB3aGVuIHRoZXkgaGF2ZSBhbiBpbnRlbnQgdG8gbW9kaWZ5IGEgcGFydGljdWxhcgotCSAqIHJlc291cmNlLiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogdGhpcyBtZXRob2QgaWYgeW91IGhhdmUgdGhlIGludGVudCB0byBtb2RpZnkuCi0JICogCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIE9iamVjdCBhY2Nlc3NvcktleSwgTWFwIHBhcmFtcykgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gZ2V0RXhpc3RpbmdFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIHBhcmFtcywgZmFsc2UpOwotCQlpZiAobnVsbCA9PSBlZGl0TW9kZWwpIHsKLQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLQkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7Ci0JCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZWRpdE1vZGVsLmlzRGlzcG9zZWQoKSB8fCBlZGl0TW9kZWwuaXNEaXNwb3NpbmcoKSkgewotCQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBwYXJhbXMpOwotCQkJCWNhY2hlRWRpdE1vZGVsKGVkaXRNb2RlbCwgcGFyYW1zKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7Ci0JCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IHdhbnQgdG8gcmVhZCBhIGdyb3VwIG9mIHJlc291cmNlcyB0aGF0IGFyZQotCSAqIG5vcm1hbGx5IG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgd2l0aAotCSAqIAotCSAqIEBhS2V5LiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogICAgICAgIHRoaXMgbWV0aG9kLiBZb3UgbXVzdCBjYWxsIHJlbGVhc2VFZGl0TW9kZWwoLi4uKSB3aGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgZWRpdAotCSAqICAgICAgICBtb2RlbC4KLQkgKiBAc2VlIEoyRUVFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgZmluYWwgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJdHJ5IHsKLQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBnZXRFeGlzdGluZ0VkaXRNb2RlbChlZGl0TW9kZWxJRCwgcGFyYW1zLCB0cnVlKTsKLQkJCWlmIChudWxsID09IGVkaXRNb2RlbCkgewotCQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIHBhcmFtcyk7Ci0JCQkJc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLQkJCQkJY2FjaGVFZGl0TW9kZWwoZWRpdE1vZGVsLCBwYXJhbXMpOwotCQkJCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLmFjY2VzcyhlZGl0TW9kZWwpOwotCQkJCQllZGl0TW9kZWwuYWNjZXNzKGFjY2Vzc29yS2V5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlZGl0TW9kZWwuaXNEaXNwb3NlZCgpIHx8IGVkaXRNb2RlbC5pc0Rpc3Bvc2luZygpKSB7Ci0JCQkJCWVkaXRNb2RlbCA9IGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIHBhcmFtcyk7Ci0JCQkJCWNhY2hlRWRpdE1vZGVsKGVkaXRNb2RlbCwgcGFyYW1zKTsKLQkJCQl9Ci0JCQkJc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLQkJCQkJRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuZ2V0SW5zdGFuY2UoKS5hY2Nlc3MoZWRpdE1vZGVsKTsKLQkJCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVkaXRNb2RlbDsKLQkJfSBmaW5hbGx5IHsKLQkJCUVkaXRNb2RlbExlYXN0VXNlZENhY2hlLmdldEluc3RhbmNlKCkub3B0aW1pemVMUlVTaXplSWZOZWNlc3NhcnkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIEFQSSB0aGF0IGNsaWVudHMgc2hvdWxkIHVzZSB3aGVuIHRoZXkgaGF2ZSBhbiBpbnRlbnQgdG8gbW9kaWZ5IGEgcGFydGljdWxhcgotCSAqIHJlc291cmNlLiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogdGhpcyBtZXRob2QgaWYgeW91IGhhdmUgdGhlIGludGVudCB0byBtb2RpZnkuCi0JICogCi0JICogQHNlZSBKMkVFRWRpdE1vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZXR1cm4gZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIGFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IHdhbnQgdG8gcmVhZCBhIGdyb3VwIG9mIHJlc291cmNlcyB0aGF0IGFyZQotCSAqIG5vcm1hbGx5IG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgd2l0aAotCSAqIAotCSAqIEBhS2V5LiBZb3Ugc2hvdWxkIG9ubHkgYWNjZXNzIHRoZSByZXNvdXJjZXMgdGhyb3VnaCB0aGUgSjJFRUVkaXRNb2RlbCB0aGF0IGlzIHJldHVybmVkIGJ5Ci0JICogICAgICAgIHRoaXMgbWV0aG9kLiBZb3UgbXVzdCBjYWxsIHJlbGVhc2VFZGl0TW9kZWwoLi4uKSB3aGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgZWRpdAotCSAqICAgICAgICBtb2RlbC4KLQkgKiBAc2VlIEoyRUVFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgZmluYWwgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIGFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0KLQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFeGlzdGluZ0VkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJaWYgKGlzUmVhZE9ubHkpIHsKLQkJCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSByZWFkT25seU1vZGVscy5nZXQoZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKSk7Ci0JCQl9IGVsc2UgewotCQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKLQkJCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgZWRpdGFibGVNb2RlbHMuZ2V0KGdldENhY2hlSUQoZWRpdE1vZGVsSUQsIHBhcmFtcykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdE1vZGVsOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcmVhZC1vbmx5IEoyRUVFZGl0TW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCB0aGlzLCBwYXJhbXMpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgSjJFRUVkaXRNb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlyZXR1cm4gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgdGhpcywgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzE2LzIwMDEgMTI6MjU6MzkgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGNhY2hlRWRpdE1vZGVsKEVkaXRNb2RlbCBlZGl0TW9kZWwsIE1hcCBwYXJhbXMpIHsKLQkJZWRpdE1vZGVsLnNldFBhcmFtcyhwYXJhbXMpOwotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlpZiAoZWRpdE1vZGVsLmlzUmVhZE9ubHkoKSkKLQkJCQlyZWFkT25seU1vZGVscy5wdXQoZ2V0Q2FjaGVJRChlZGl0TW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgcGFyYW1zKSwgZWRpdE1vZGVsKTsKLQkJCWVsc2UKLQkJCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJCWVkaXRhYmxlTW9kZWxzLnB1dChnZXRDYWNoZUlEKGVkaXRNb2RlbC5nZXRFZGl0TW9kZWxJRCgpLCBwYXJhbXMpLCBlZGl0TW9kZWwpOwotCQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2NhcmRBbGxFZGl0TW9kZWxzKCkgewotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJQ29sbGVjdGlvbiByZWFkT25seSA9IHJlYWRPbmx5TW9kZWxzLnZhbHVlcygpOwotCQkJCUVkaXRNb2RlbExlYXN0VXNlZENhY2hlLmdldEluc3RhbmNlKCkucmVtb3ZlQWxsQ2FjaGVkKHJlYWRPbmx5KTsKLQkJCQlkaXNjYXJkTW9kZWxzKHJlYWRPbmx5KTsKLQkJCQlkaXNjYXJkTW9kZWxzKGVkaXRhYmxlTW9kZWxzLnZhbHVlcygpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2NhcmRNb2RlbHMoQ29sbGVjdGlvbiBlZGl0TW9kZWxzKSB7Ci0JCWlmIChlZGl0TW9kZWxzICE9IG51bGwgJiYgIWVkaXRNb2RlbHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBNYWtlIGEgY29weSBmb3Igc2FmZXR5IGFnYWluc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCUl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChlZGl0TW9kZWxzKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCSgoRWRpdE1vZGVsKSBpdC5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsLCBib29sZWFuIHJlYWRPbmx5KSB7Ci0JCS8vIFRoZSBiZXN0IHdheSB3b3VsZCBiZSB0byByZWNvbXB1dGUgdGhlIGNhY2hlIGlkLCBidXQgd2UgZG9uJ3QgY2FyZQotCQkvLyBiZWNhdXNlIHRoZSBlZGl0IG1vZGVsIHNob3VsZCBvbmx5IGJlIGNhY2hlZCBvbmNlIGFueXdheQotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlpZiAocmVhZE9ubHkpCi0JCQkJcmVhZE9ubHlNb2RlbHMudmFsdWVzKCkucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCQllbHNlCi0JCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCQllZGl0YWJsZU1vZGVscy52YWx1ZXMoKS5yZW1vdmUoZWRpdE1vZGVsKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGVkaXRNb2RlbHMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFZGl0TW9kZWxzKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJaWYgKGFuRXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTGlzdCBhTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgewotCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgewotCQkJCWFMaXN0LmFkZEFsbChyZWFkT25seU1vZGVscy52YWx1ZXMoKSk7Ci0JCQkJYUxpc3QuYWRkQWxsKGVkaXRhYmxlTW9kZWxzLnZhbHVlcygpKTsKLQkJCX0KLQkJfQotCQlFZGl0TW9kZWwgZWRpdE1vZGVsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBhTGlzdC5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWVkaXRNb2RlbC5yZXNvdXJjZUNoYW5nZWQoYW5FdmVudCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkgewotCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7Ci0JCQkJcmV0dXJuICF0aGlzLnJlYWRPbmx5TW9kZWxzLmlzRW1wdHkoKSB8fCAhdGhpcy5lZGl0YWJsZU1vZGVscy5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciBnZXRSZXNvdXJjZVNldExpc3RlbmVyKCkgewotCQlpZiAocmVzb3VyY2VTZXRMaXN0ZW5lciA9PSBudWxsKQotCQkJcmVzb3VyY2VTZXRMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZVNldExpc3RlbmVyKCk7Ci0JCXJldHVybiByZXNvdXJjZVNldExpc3RlbmVyOwotCX0KLQotCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0TGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIEBzZWUgQWRhcHRlciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU5vdGlmaWVyLAotCQkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQkJYWRkZWRSZXNvdXJjZSgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQkJcmVtb3ZlZFJlc291cmNlKChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJCXJlbW92ZWRSZXNvdXJjZXMoKExpc3QpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGVkaXRNb2RlbHMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRlZFJlc291cmNlKFJlc291cmNlIGFkZGVkUmVzb3VyY2UpIHsKLQkJaWYgKGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5ICYmIChhZGRlZFJlc291cmNlICE9IG51bGwpICYmIChhZGRlZFJlc291cmNlIGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSkKLQkJCSgoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSBhZGRlZFJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJaWYgKHNob3VsZE5vdGlmeUVkaXRNb2RlbHMoKSkgewotCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuQURERURfUkVTT1VSQ0UsIG51bGwpOwotCQkJZXZlbnQuYWRkUmVzb3VyY2UoYWRkZWRSZXNvdXJjZSk7Ci0JCQlub3RpZnlFZGl0TW9kZWxzKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgZWRpdE1vZGVscyBvZiB0aGUgY2hhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWRSZXNvdXJjZShSZXNvdXJjZSByZW1vdmVkUmVzb3VyY2UpIHsKLQkJaWYgKHNob3VsZE5vdGlmeUVkaXRNb2RlbHMoKSkgewotCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSwgbnVsbCk7Ci0JCQlldmVudC5hZGRSZXNvdXJjZShyZW1vdmVkUmVzb3VyY2UpOwotCQkJbm90aWZ5RWRpdE1vZGVscyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgYWxsIGVkaXRNb2RlbHMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkUmVzb3VyY2VzKExpc3QgcmVtb3ZlZFJlc291cmNlcykgewotCQlpZiAoc2hvdWxkTm90aWZ5RWRpdE1vZGVscygpKSB7Ci0JCQlFZGl0TW9kZWxFdmVudCBldmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFLCBudWxsKTsKLQkJCWV2ZW50LmFkZFJlc291cmNlcyhyZW1vdmVkUmVzb3VyY2VzKTsKLQkJCW5vdGlmeUVkaXRNb2RlbHMoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRMaXN0ZW5pbmdUb1Jlc291cmNlU2V0KCkgewotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlzZXQuZUFkYXB0ZXJzKCkuYWRkKGdldFJlc291cmNlU2V0TGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5JU3luY2hyb25pemVyRXh0ZW5kZXIjcHJvamVjdENoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIHZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJLy8gZGVmYXVsdCBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5JU3luY2hyb25pemVyRXh0ZW5kZXIjcHJvamVjdENsb3NlZCgpCi0JICovCi0JcHVibGljIHZvaWQgcHJvamVjdENsb3NlZCgpIHsKLQkJZGlzY2FyZEFsbEVkaXRNb2RlbHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlI2NyZWF0ZVVSSUNvbnZlcnRlcihvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBjcmVhdGVVUklDb252ZXJ0ZXIoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gbmV3IENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKGdldFByb2plY3QoKSwgYVJlc291cmNlU2V0LmdldFN5bmNocm9uaXplcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvamVjdFJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBjcmVhdGUgcmVzb3VyY2Ugc2V0IHdpdGggbnVsbCBwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBQcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbChwcm9qZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlI2RlbGV0ZUZpbGUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRlbGV0ZUZpbGUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmRlbGV0ZVJlc291cmNlKHJlc291cmNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5sb2dFcnJvcihleCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eQotCSAqICAgICAgICAgICAgVGhlIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eShib29sZWFuIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5KSB7Ci0JCXRoaXMuZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkgPSBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwNTRiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDI1LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiZW1md29ya2JlbmNoZWRpdCI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU25hcHNob3RfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEeW5hbWljQWRhcHRlckZhY3RvcnlfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwMWNiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBjYWNoZSB0aGUgcmVjZW50bHkgdXNlZCBlZGl0IG1vZGVscy4gIExvYWRpbmcgYW5kIHVubG9hZGluZyBvZiBlZGl0IG1vZGVscyBjYW4gYmUKLSAqIGNvc3RseSwgZXNwZWNpYWxseSBpZiBvcGVyYXRpb25zIGFuZC9vciBwb3N0IG9wZXJhdGlvbnMgaGF2ZSBhIG5lZWQgdG8gcmVsb2FkIHRoZSBzYW1lIGVkaXQgbW9kZWwgcmVwZWF0ZWRseS4KLSAqIFRoaXMgd2lsbCBhbGxvdyB0aG9zZSByZXBlYXRlZGx5IHVzZWQgZWRpdCBtb2RlbHMgdG8gYmUgY2FjaGVkLCB0aGVyZWJ5IGltcHJvdmluZyBwZXJmb3JtYW5jZS4gIEJ5IGRlc2lnbiwgdGhlCi0gKiBlZGl0IG1vZGVscyBsb2FkIHJlc291cmNlcyBhbmQgdGhlc2UgcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbWVtb3J5LCBzbyB3ZSBkb24ndCB3YW50IHRvIGNhY2hlIGV2ZXJ5IGVkaXQKLSAqIG1vZGVsIGFjY2Vzc2VkLCBzbyB0aGlzIGlzIGEgbGVhc3QgdXNlZCBjYWNoZSBtZWNoYW5pc20sIHdoZXJlIHRoZSBtYXggc2l6ZSBpcyAxMC4gIElmIGFuIGVkaXQgbW9kZWwgaXMgdXNlZAotICogaXQgaXMgcHV0IHRvIHRoZSBiYWNrIG9mIHRoZSBzdGFjaywgYW5kIG5ldyBlZGl0IG1vZGVscyBhY2Nlc3NlZCBhcmUgcHV0IHRvIHRoZSBiYWNrIG9mIHRoZSBzdGFjaywgc28gdGhhdCB0aGUKLSAqIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGZpcnN0IGVkaXQgbW9kZWwgZGlzcG9zZWQgd2hlbiB0aGUgY2FjaGUgaXMgaGlnaGVyIHRoYW4gdGhlIHRocmVzaGhvbGQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgewotCQotCS8qKgotCSAqIFByb3ZpZGUgYSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgSU5TVEFOQ0UgPSBuZXcgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUoKTsJCi0JCi0JLyoqCi0JICogVGhlIHRocmVzaG9sZCwgb3IgbW9zdCBlZGl0IG1vZGVscyB3ZSB3aWxsIGtlZXAgb3BlbiBhdCBhIHRpbWUgaXMgMTAuICBUaGlzIGlzIGxvdyBlbm91Z2ggdG8gbm90Ci0JICogb3ZlcndoZWxtIHdvcmtiZW5jaCBtZW1vcnkgYW5kIGhpZ2ggZW5vdWdoIHRvIGFpZCBpbiBvcGVyYXRpb25zIHdoaWNoIGNvbnRpbnVhbGx5IHJlbG9hZCAzLTQgCi0JICogZWRpdCBtb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IHRocmVzaGhvbGQgPSAxMDsKLQkKLQkvKioKLQkgKiAgQSBMSFMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoZSBvcmRlciBvZiB0aGUgaXRlbXMgaXMgbWFpbnRhaW5lZC4gT3RoZXIKLQkgKiBTZXQgaW1wbGVtZW50YXRpb25zIChIYXNoU2V0LCBUcmVlU2V0KSBkbyBub3QgcHJlc2VydmUgdGhlIG9yZGVyLiBUaGlzIAotCSAqIGlzIGNyaXRpY2FsIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4gRE8gTk9UIENIQU5HRSBUSElTLiAKLQkgKi8KLQlwcml2YXRlIExpbmtlZEhhc2hTZXQgbHJ1ID0gbmV3IExpbmtlZEhhc2hTZXQodGhyZXNoaG9sZCk7Ci0JCi0JLyoqCi0JICogQWNjZXNzb3IgZm9yIHRoZSBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSBJTlNUQU5DRQotCSAqIAotCSAqIEByZXR1cm4gdGhlIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIElOU1RBTkNFCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBscnUgdGhhdCBhcmUgY29udGFpbmVkCi0JICogaW4gPGNvZGU+YUNvbGxlY3Rpb248L2NvZGU+LiAgVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUKLQkgKiBFZGl0TW9kZWxzIGluIHRoZSBhQ29sbGVjdGlvbiB3aWxsIGJlIGRpc2NhcmRlZCBhbmQgaXQKLQkgKiB3aWxsIG5vdCBhdHRlbXB0IHRvIGRlY3JlbWVtdCBpdHMgcmVmZXJlbmNlIGNvdW50LgotCSAqIEBwYXJhbSBhQ29sbGVjdGlvbiAtIEEge0BsaW5rIENvbGxlY3Rpb259IG9mIHtAbGluayBFZGl0TW9kZWx9LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbENhY2hlZChDb2xsZWN0aW9uIGFDb2xsZWN0aW9uKSB7Ci0JCWlmIChhQ29sbGVjdGlvbiAhPSBudWxsKSB7IAotCQkJbHJ1LnJlbW92ZUFsbChhQ29sbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiB7QGxpbmsgRWRpdE1vZGVsfSBpcyBiZWluZyBhY2Nlc3NlZCBzbyB3ZSB3aWxsIHdhbnQKLQkgKiB0byB1cGRhdGUgdGhlIGxydSBhbmQgYWNjZXNzIHRoZSBlZGl0TW9kZWwgd2hpY2ggd2lsbCBob2xkCi0JICogYSByZWZlcmVuY2UgY291bnQuCi0JICogQHBhcmFtIGVkaXRNb2RlbCAtIFRoZSB7QGxpbmsgRWRpdE1vZGVsfSB0aGF0IHdlIHdhbnQgdG8gcGxhY2UKLQkgKiAJaW4gdGhlIGxlYXN0IHVzZWQgY2FjaGUuCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzKEVkaXRNb2RlbCBlZGl0TW9kZWwpIHsKLQkJYm9vbGVhbiBzaG91bGRBY2Nlc3MgPSB0cnVlOwotCQlzeW5jaHJvbml6ZWQgKGxydSkgewotCQkJaWYgKGxydS5jb250YWlucyhlZGl0TW9kZWwpKSB7Ci0JCQkJbW92ZVRvRW5kKGVkaXRNb2RlbCk7Ci0JCQkJc2hvdWxkQWNjZXNzID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNob3VsZEFjY2VzcykgewotCQkJZWRpdE1vZGVsLmFjY2Vzcyh0aGlzKTsKLQkJCXN5bmNocm9uaXplZCAobHJ1KSB7Ci0JCQkJbHJ1LmFkZChlZGl0TW9kZWwpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIHdlIGhpdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGxydSB0aGVuIHJlbW92ZSB0aGUgZmlyc3Qgb25lCi0JICogYW5kIHJlbGVhc2UgYWNjZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIG9wdGltaXplTFJVU2l6ZUlmTmVjZXNzYXJ5KCkgewotCQlFZGl0TW9kZWwgbW9kZWwgPSBudWxsOwotCQkKLQkJc3luY2hyb25pemVkIChscnUpIHsKLQkJCWlmIChscnUuc2l6ZSgpID4gdGhyZXNoaG9sZCkgewotCQkJCS8vIHJlbW92ZSBvbGRlc3QgZWxlbWVudCBhbmQgcmVsZWFzZSB0aGUgZWRpdCBtb2RlbC4KLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxydS5pdGVyYXRvcigpOwotCQkJCW1vZGVsID0gKEVkaXRNb2RlbCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWxydS5yZW1vdmUobW9kZWwpOwkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgdGhlIGVkaXRNb2RlbCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IAotCSAqIEBwYXJhbSBlZGl0TW9kZWwgLS0gRWRpdE1vZGVsIHRvIGJlIG1vdmVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0VuZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWxydS5yZW1vdmUoZWRpdE1vZGVsKTsKLQkJbHJ1LmFkZChlZGl0TW9kZWwpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlBhY2thZ2VQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU5NDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlBhY2thZ2VQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotcHVibGljIGNsYXNzIEVtZlBhY2thZ2VQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmIChyZWNlaXZlciA9PSBudWxsIHx8ICEocmVjZWl2ZXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB8fCBleHBlY3RlZFZhbHVlID09IG51bGwgfHwgIShleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSByZWNlaXZlcjsKLQkJU3RyaW5nIGVtZlBhY2thZ2UgPSAoU3RyaW5nKWV4cGVjdGVkVmFsdWU7Ci0JCXJldHVybiBlbWZQYWNrYWdlLmVxdWFscyhlT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkuZ2V0TnNVUkkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZWYWxpZGF0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRW1mVmFsaWRhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmNDJjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZWYWxpZGF0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI7Ci0KLQotLyoqCi0gKiBFbWYgdmFsaWRhdGlvbiBleHRlbnNpb24gZm9yIHZhbGFkaXRlbWVudWFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRW1mVmFsaWRhdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGlvblR5cGUgPSBudWxsOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRW1mVmFsaWRhdGlvbkhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNnZXRCYXNlVmFsaWRhdGlvblR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldEJhc2VWYWxpZGF0aW9uVHlwZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgc2VsZWN0aW9uOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlT2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChyZXNvdXJjZSk7Ci0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI2dldFZhbGlkYXRpb25UeXBlU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25UeXBlU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsaWRhdGlvblR5cGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNzZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25UeXBlU3RyaW5nKFN0cmluZyB2YWxpZGF0aW9uVHlwZSkgewotCQl0aGlzLnZhbGlkYXRpb25UeXBlID0gdmFsaWRhdGlvblR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvUGFzc3RocnVSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvUGFzc3RocnVSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU5NTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1Bhc3N0aHJ1UmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci0KLS8qKgotICogVGhpcyBSZXNvdXJjZVNldCBpcyB0byBiZSB1c2VkIGJ5IHBsdWdpbnMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRpbmcgdG8gYSBjYWNoZWQgUmVzb3VyY2VTZXQgdGhhdAotICogYWx3YXlzIGxvYWRzIHJlbGF0aXZlIHRvIHRoZSBXb3JrYmVuY2guIFRoaXMgUmVzb3VyY2VTZXQgd2lsbCBkaXJlY3QgdGhlIGxvYWRzIHRvIHRoZSBhcHByb3ByaWF0ZQotICogUHJvamVjdCBSZXNvdXJjZVNldC4gSXQgd2lsbCBvbmx5IGxvYWQgaW4gdGhpcyBSZXNvdXJjZVNldCBpZiBpdCB3YXMgdW5hYmxlIHRvIGxvYWQgdmlhIHRoZQotICogV29ya3NwYWNlLgotICogCi0gKiBJZiB5b3Ugc2V0IHdhbnQgdG8gdXNlZCB0aGlzIFJlc291cmNlU2V0IHNvIHRoYXQgdGhlIGxvYWRlZCByZXNvdXJjZXMgYXJlIGlzb2xhdGVkIGZyb20gZXZlcnlvbmUKLSAqIGVsc2UsIHlvdSBzaG91bGQgdXNlIHRoZQotICogCi0gKiBAbGluayBQYXNzdGhydVJlc291cmNlU2V0KElQcm9qZWN0KSBjb25zdHJ1Y3Rvci4gVGhpcyB3aWxsIGxvYWQgYWxsIHJlc291cmNlcyBsb2NhbGx5IGFuZCBpdCB3aWxsCi0gKiAgICAgICBub3QgZGVsZWdhdGUgdG8gYW5vdGhlciBQcm9qZWN0UmVzb3VyY2VTZXQuIFRoaXMgd291bGQgYmUgZXF1aXZhbGVudCB0byBjcmVhdGluZyBhCi0gKiAgICAgICBQcm9qZWN0UmVzb3VyY2VTZXQgd2l0aG91dCBzZXR0aW5nIGFueSBoYW5kbGVycy4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFBhc3N0aHJ1UmVzb3VyY2VTZXQgZXh0ZW5kcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0lzb2xhdGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgY2xhc3MgUGFzc3RocnVSZXNvdXJjZXNFTGlzdCBleHRlbmRzIFN5bmNocm9uaXplZFJlc291cmNlc0VMaXN0IHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjUwNDIwNzA3MDI0NDYyNzk4MEw7Ci0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQoKChSZXNvdXJjZSkgb2JqZWN0KS5nZXRVUkkoKSk7Ci0JCQlpZiAoc2V0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZXMoKS5hZGQoKFJlc291cmNlKW9iamVjdCk7Ci0KLQkJCXJldHVybiBzdXBlci5hZGQob2JqZWN0KTsKLQkJfQotCi0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlJdGVyYXRvciBpdCA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCVJlc291cmNlIHJlczsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZXMgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5jYWNoZVJlc291cmNlKHJlcykpCi0JCQkJCXN1cGVyLmFkZChyZXMpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUGFzc3RocnVSZXNvdXJjZVNldCgpIHsKLQkJaXNJc29sYXRlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBSZXNvdXJjZVNldCBpc29sYXRlZCBmcm9tIHRoZQotCSAqIGFjdHVhbCBjYWNoZWQgUHJvamVjdFJlc291cmNTZXQgZm9yIHRoZSBwYXNzZWQgSVByb2plY3QuCi0JICovCi0JcHVibGljIFBhc3N0aHJ1UmVzb3VyY2VTZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlpc0lzb2xhdGVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lzb2xhdGVkKCkgewotCQlyZXR1cm4gaXNJc29sYXRlZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZENyZWF0ZVJlc291cmNlKFVSSSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZGVtYW5kQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlKHVyaSk7IC8vV2UgZG8gd2FudCB0byBjYWxsIHN1cGVyLmNyZWF0ZVJlc291cmNlIGFuZCBub3QKLQkJLy8gZGVtYW5kQ3JlYXRlUmVzb3VyY2UKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChpc0lzb2xhdGVkKQotCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJlc291cmNlcyA9IG5ldyBQYXNzdGhydVJlc291cmNlc0VMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbCNjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSB1cmkpIHsKLQkJaWYgKCFpc0lzb2xhdGVkKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsI2dldFJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJIHVyaSkgewotCQlpZiAoIWlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnModXJpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGwjZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkksIGJvb2xlYW4pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoIWlzSXNvbGF0ZWQpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdEZyb21IYW5kbGVycyh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NGFmOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3MgUkVGRVJFTkNFRF9SRVNfQ0xBU1MgPSBSZWZlcmVuY2VkUmVzb3VyY2UuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBGaWxlQWRhcHRlcigpOwotCQkJYWRhcHRlci5zZXRUYXJnZXQodGFyZ2V0KTsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIGludGVybmFsIGFuZCBpcyB1c2VkIHRvIHN0b3JlIHN0YXRlIG9uIHRoZSByZXNvdXJjZSwgc3BlY2lmaWNhbGx5LCBhIGNhY2hlZAotCSAqIHJlZmVyZW5jZSB0byB0aGUgSUZpbGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgQURBUFRFUl9LRVkgPSBGaWxlQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgZGVsYXkgPSAzMDsKLQkJcHJpdmF0ZSBJRmlsZSBmaWxlOwotCQlwcml2YXRlIGxvbmcgc3luY2hyb25pemF0aW9uU3RhbXA7Ci0JCXByb3RlY3RlZCBSZXNvdXJjZVNldCBwcmV2aW91c1Jlc291cmNlU2V0OwotCQlwcml2YXRlIElMb2NrIHNhdmVMb2NrOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX05PVF9MT0FERUQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX0lOQUNDRVNTSUJMRSA9IC0xOwotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gQURBUFRFUl9LRVkuZXF1YWxzKHR5cGUpOwotCQl9Ci0KLQkJLyoKLQkJICogVXBkYXRlIHRoZSBzeW5jaHJvbml6YXRpb24gc3RhbXAgd2hlcmUgYXBwcm9wcmlhdGUKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChudWxsKSkgewotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCA6Ci0JCQkJCWlmIChnZXRSZXNvdXJjZSgpLmlzTG9hZGVkKCkpCi0JCQkJCQloYW5kbGVMb2FkZWQoKTsKLQkJCQkJZWxzZQotCQkJCQkJaGFuZGxlVW5sb2FkZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRToKLQkgICAgICAgICAgICAgICAgaGFuZGxlQWJvdXRUb1NhdmUoKTsKLQkgICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICAgICAgY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfV0FTX1NBVkVEOgotCSAgICAgICAgICAgICAgICBoYW5kbGVTYXZlZCgpOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgICAgICAgICBjYXNlIFJlZmVyZW5jZWRSZXNvdXJjZS5SRVNPVVJDRV9TQVZFX0ZBSUxFRDoKLQkgICAgICAgICAgICAgICAgaGFuZGxlU2F2ZUZhaWxlZCgpOwotCSAgICAgICAgICAgICAgICBicmVhazsKLQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19VUkkgOgotCQkJCQloYW5kbGVVUklDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKCkgewotICAgICAgICAgICAgcmVsZWFzZVNhdmVMb2NrKCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBYm91dFRvU2F2ZSgpIHsKLSAgICAgICAgICAgIGFxdWlyZVNhdmVMb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYXF1aXJlU2F2ZUxvY2soKSB7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZU5hbWU6ICIgKyBnZXRGaWxlKCkuZ2V0TmFtZSgpICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jazogIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXB0aCIgKyBnZXRTYXZlTG9jaygpLmdldERlcHRoKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlOiIrZ2V0U2F2ZUxvY2soKS5oYXNoQ29kZSgpKTsKLS8vICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIGdldFNhdmVMb2NrKCkuYWNxdWlyZSgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYXF1aXJlU2F2ZUxvY2sobG9uZyBkZWxheSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jayB3aXRoIGRlbGF5OiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlcHRoIiArIGdldFNhdmVMb2NrKCkuZ2V0RGVwdGgoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFuY2U6IitnZXRTYXZlTG9jaygpLmhhc2hDb2RlKCkpOwotLy8gICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZ2V0U2F2ZUxvY2soKS5hY3F1aXJlKGRlbGF5KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VTYXZlTG9jaygpIHsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlbGVhc2VkU2F2ZUxvY2s6ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVwdGgiICsgZ2V0U2F2ZUxvY2soKS5nZXREZXB0aCgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnN0YW5jZToiK2dldFNhdmVMb2NrKCkuaGFzaENvZGUoKSk7Ci0vLyAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBnZXRTYXZlTG9jaygpLnJlbGVhc2UoKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJTG9jayBnZXRTYXZlTG9jaygpIHsKLSAgICAgICAgICAgIGlmIChzYXZlTG9jayA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNhdmVMb2NrID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLSAgICAgICAgICAgIHJldHVybiBzYXZlTG9jazsKLSAgICAgICAgfQotCi0JCS8qKgotCQkgKiAgCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaGFuZGxlVVJJQ2hhbmdlZCgpIHsKLQkJCWZpbGUgPSBudWxsOwotCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX05PVF9MT0FERUQ7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCS8vRmlyc3QgdGVzdCB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlc2V0IHRoZSBmaWxlLgotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAoIWZpbGUuaXNBY2Nlc3NpYmxlKCkgfHwgcHJldmlvdXNSZXNvdXJjZVNldCAhPSBnZXRSZXNvdXJjZVNldCgpKSkgewotCQkJCWZpbGUgPSBudWxsOwotCQkJCXN5bmNocm9uaXphdGlvblN0YW1wID0gRklMRV9OT1RfTE9BREVEOwotCQkJfQotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkoZ2V0VVJJKCkpKSB7Ci0JCQkJCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUoZ2V0VVJJKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vd2Ugc2hvdWxkIG5vdCBiZSBoZXJlIGFueW1vcmUuCi0JCQkJCWZpbGUgPSBpbnRlcm5hbEdldEZpbGUoZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJCWlmKG51bGwhPSBmaWxlICYmICFmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX0lOQUNDRVNTSUJMRTsKLQkJCQl9Ci0JCQkJcHJldmlvdXNSZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKLQkJCXJldHVybiBzeW5jaHJvbml6YXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemF0aW9uU3RhbXAobG9uZyBsKSB7Ci0JCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjaXNDb25zaXN0ZW50KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVudCgpIHsKLQkJCS8vVGhpcyBjaGVja3MgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSByZXNvdXJjZSBoYXNuJ3QgZmluaXNoZWQgc2F2aW5nIGZvIHRoZSBmaXJzdCB0aW1lCi0JCQlpZighZ2V0UmVzb3VyY2UoKS5pc0xvYWRlZCgpKQotCQkJCXJldHVybiB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaGFzTG9ja2VkID0gYXF1aXJlU2F2ZUxvY2soZGVsYXkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRGaWxlKCkgPT0gbnVsbCB8fCAhZ2V0RmlsZSgpLmlzQWNjZXNzaWJsZSgpKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWdldEZpbGUoKS5pc1N5bmNocm9uaXplZChJRmlsZS5ERVBUSF9aRVJPKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN5bmNocm9uaXphdGlvblN0YW1wID09IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChnZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoaGFzTG9ja2VkKQotICAgICAgICAgICAgICAgICAgICByZWxlYXNlU2F2ZUxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGdldEZpbGUoKSkpOwotCQl9Ci0KLQkJcHVibGljIFJlZmVyZW5jZWRSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJCXJldHVybiAoUmVmZXJlbmNlZFJlc291cmNlKSB0YXJnZXQ7Ci0JCX0KLQotCQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJCXJldHVybiB0YXJnZXQgPT0gbnVsbCA/IG51bGwgOiBnZXRSZXNvdXJjZSgpLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQkJcmV0dXJuIHRhcmdldCA9PSBudWxsID8gbnVsbCA6IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZVVubG9hZGVkKCkgewotCQkJZmlsZSA9IG51bGw7Ci0JCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IEZJTEVfTk9UX0xPQURFRDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUxvYWRlZCgpIHsKLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVkKCkgewotCQkJY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpOwotCQkJcmVsZWFzZVNhdmVMb2NrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0byBiZSB1c2VkIGJ5IHRoZSBwbHVnaW4gb25seQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZUZpbGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKCFmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCkgewotCQkJUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmFkZEdsb2JhbEFkYXB0ZXJGYWN0b3J5KG5ldyBGaWxlQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGdldEZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IChGaWxlQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyZXMsIEZpbGVBZGFwdGVyLkFEQVBURVJfS0VZKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUZpbGVBZGFwdGVyKHJlcykgOiBhZGFwdGVyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGNyZWF0ZUZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBGaWxlQWRhcHRlcigpOwotCQlhZGFwdGVyLnNldFRhcmdldChyZXMpOwotCQlyZXMuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUZpbGUgZm9yIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLiBUaGlzIG1heSByZXR1cm4gbnVsbCBpZiB0aGUKLQkgKiByZXNvdXJjZSBkb2VzIG5vdCBiZWxvbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBGaWxlQWRhcHRlci5GSUxFX05PVF9MT0FERUQgOiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN5bmhyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlcywgbG9uZyBzdGFtcCkgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoc3RhbXApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnNpc3RlbnQoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgewotCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKLQkJcmV0dXJuIGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQ29uc2lzdGVudCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSByCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlZlJlc291cmNlKSB7Ci0JCWlmIChyZWZSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVmUmVzb3VyY2UpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPD0gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEKQotCQkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlZlJlc291cmNlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBSRUZFUkVOQ0VEX1JFU19DTEFTUy5pc0luc3RhbmNlKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZWZlcmVuY2VkUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlc291cmNlKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IEZpbGVBZGFwdGVyLkZJTEVfTk9UX0xPQURFRCA6IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChhZGFwdGVyLmdldEZpbGUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEOwotCQlpZighZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9JTkFDQ0VTU0lCTEU7Ci0JCX0KLQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCUlQYXRoIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJcmV0dXJuIGN1cnJlbnRTdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIHRoYXQgY3VycmVudGx5IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChpc1JlZmVyZW5jZWRSZXNvdXJjZShhUmVzb3VyY2UpKQotCQkJCXJldHVybiBnZXRGaWxlKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gaW50ZXJuYWxHZXRGaWxlKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVJlc291cmNlIG1vZlJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOwotCQlpZiAobW9mUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RmlsZShtb2ZSZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9yIGxvYWQgYSBjYWNoZWQgUmVzb3VyY2Ugb3IgY3JlYXRlIG9uZSBpZiBpdCBpcyBub3QgZm91bmQuIEEgV3JhcHBlZEV4Y2VwdGlvbiB3aWxsIG9ubHkKLQkgKiBiZSB0aHJvd24gaWYgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBleGlzdHMgYnV0IGl0IGZhaWxlZCB0byBsb2FkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0T3JDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCBzZXQpIHRocm93cyBXcmFwcGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsgLy90aGlzIHdpbGwgY3JlYXRlIHRoZSByZXNvdXJjZSBubyBtYXR0ZXIgd2hhdAotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5nZXRGaWxlTm90Rm91bmREZXRlY3RvcigpLmlzRmlsZU5vdEZvdW5kKGUpKQotCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2FtZVByb2plY3QoUmVzb3VyY2UgcmVzb3VyY2VBLCBSZXNvdXJjZSByZXNvdXJjZUIpIHsKLQkJSVByb2plY3QgcEEsIHBCOwotCQlwQSA9IGdldFByb2plY3QocmVzb3VyY2VBKTsKLQkJcEIgPSBnZXRQcm9qZWN0KHJlc291cmNlQik7Ci0JCWlmIChwQSAhPSBudWxsICYmIHBCICE9IG51bGwpCi0JCQlyZXR1cm4gcEEuZXF1YWxzKHBCKTsKLQkJLy9vdGhlcndpc2Ugd2UgZG8gbm90IGhhdmUgZW5vdWdoIGluZm8gdG8gZGV0ZXJtaW5lIGZhbHNlIHNvIHdlIG11c3QgcmV0dXJuIHRydWUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlIHJlcykgewotCQlJUHJvamVjdCBwcm9qID0gZ2V0UHJvamVjdChyZXMuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChwcm9qID09IG51bGwpIHsKLQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCXByb2ogPSBmaWxlLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gcHJvajsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGNsaWVudHMuIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSBjbGllbnRzIHRoYXQgYWxzbyBjYWxsCi0JICogZ2V0RmlsZSguLi4pLiBUaGlzIGlzIHRvIGF2b2lkIGVuZGxlc3MgbG9vcHMuCi0JICogCi0JICogQHNlZSBnZXRGaWxlKFJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSUZpbGUgaW50ZXJuYWxHZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RmlsZShhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSwgYVJlc291cmNlLmdldFVSSSgpKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGUoUmVzb3VyY2VTZXQgc2V0LCBVUkkgdXJpKSB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwotCQkJCWlmICghdXJpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQotCQkJCQlyZXR1cm4gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKLQkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShJUHJvamVjdCBwcm9qZWN0LCBVUkkgdXJpKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHByb2plY3QpOwotCQlyZXR1cm4gZ2V0RmlsZShzZXQsIHVyaSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHNhdmUgPGNvZGU+YVJlc291cmNlPC9jb2RlPiB3aXRoaW4gdGhlIElQcm9qZWN0Ci0JICogdGhhdCBpdCBpcyBjdXJyZW50bHkgcmVzaWRpbmcgYnV0IHlvdSBkbyBub3Qgd2FudCB0byBzYXZlIGl0IGluIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbi4KLQkgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBhcGkgdG8gc2F2ZSBhIFJlc291cmNlIHRvIGFuIGV4aXN0aW5nIGZpbGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBhcGkgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIHJlc291cmNlIHdpdGggdGhlIGFic29sdXRlCi0JICogICAgICAgICAgICAgcGF0aCAocGxhdGZvcm06L3Jlc291cmNlLy4uLikuIFVwb24gc2F2ZSwgdGhlIGZpbGUgd2lsbCBiZSBzYXZlZCB0byB0aGlzCi0JICogICAgICAgICAgICAgbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVSZXNvdXJjZVRvRmlsZShSZXNvdXJjZSBhUmVzb3VyY2UsIElGaWxlIGFGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNhdmVSZXNvdXJjZVRvRmlsZShhUmVzb3VyY2UsIGFGaWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gc2F2ZSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IHdpdGhpbiB0aGUgSVByb2plY3QKLQkgKiB0aGF0IGl0IGlzIGN1cnJlbnRseSByZXNpZGluZyBidXQgeW91IGRvIG5vdCB3YW50IHRvIHNhdmUgaXQgaW4gdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uLgotCSAqIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGFwaSB0byBzYXZlIGEgUmVzb3VyY2UgdG8gYW4gZXhpc3RpbmcgZmlsZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGFwaSBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFlvdSBzaG91bGQgY3JlYXRlIGEgcmVzb3VyY2Ugd2l0aCB0aGUgYWJzb2x1dGUKLQkgKiAgICAgICAgICAgICBwYXRoIChwbGF0Zm9ybTovcmVzb3VyY2UvLi4uKS4gVXBvbiBzYXZlLCB0aGUgZmlsZSB3aWxsIGJlIHNhdmVkIHRvIHRoaXMKLQkgKiAgICAgICAgICAgICBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZVJlc291cmNlVG9GaWxlKFJlc291cmNlIGFSZXNvdXJjZSwgSUZpbGUgYUZpbGUsIE1hcCBzYXZlT3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBhRmlsZSAhPSBudWxsICYmICFhRmlsZS5leGlzdHMoKSkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gYVJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCQlVUklDb252ZXJ0ZXIgY29udiA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQlpZiAoY29udiAhPSBudWxsICYmIGNvbnYgaW5zdGFuY2VvZiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHsKLQkJCQkJV29ya2JlbmNoVVJJQ29udmVydGVyIHdiQ29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnY7Ci0JCQkJCVN0cmluZyB1cmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCQkJSVBhdGggcmVzUGF0aCwgZmlsZVBhdGg7Ci0JCQkJCXJlc1BhdGggPSBuZXcgUGF0aCh1cmkpOwotCQkJCQlmaWxlUGF0aCA9IGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJaW50IHJlc0NvdW50LCBmaWxlQ291bnQ7Ci0JCQkJCXJlc0NvdW50ID0gcmVzUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJZmlsZUNvdW50ID0gZmlsZVBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCWlmIChyZXNDb3VudCA8PSBmaWxlQ291bnQpIHsKLQkJCQkJCWZpbGVQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhmaWxlQ291bnQgLSByZXNDb3VudCk7Ci0JCQkJCQlpZiAocmVzUGF0aC5lcXVhbHMoZmlsZVBhdGgpKSB7Ci0JCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gd2JDb252LmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS50b1N0cmluZygpKSk7Ci0JCQkJCQkJaWYgKG9zICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWFSZXNvdXJjZS5zYXZlKG9zLCBzYXZlT3B0aW9ucyk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlvcy5jbG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRlbGV0ZUZpbGUoSUZpbGUgYUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZXhpc3RzKCkpCi0JCQlhRmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlCi0JICogCi0JICogQGFSZXNvdXJjZSBpbiB0aGUgV29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZGVsZXRlRmlsZShnZXRGaWxlKGFSZXNvdXJjZSkpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDY5YjRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjYsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlVVJJID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgdmlld0lEcyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbG9hZE9yZGVyOwotCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMDsKLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0KLQkJcGFja2FnZVVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuUEFDS0FHRV9VUkkpOwotCQlpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuSUQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhY2thZ2VVUkksIEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzApOwotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xLCBuZXcgT2JqZWN0W117ZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKX0pKTsKLQotCQlyZWFkVmlld0lEcygpOwotCQl0aGlzLmxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoJ1snKTsKLQkJc2IuYXBwZW5kKHBhY2thZ2VVUkkpOwotCQlzYi5hcHBlbmQoIixwIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGdldFByaW9yaXR5KCkpOwotCQlpZiAodmlld0lEcyAhPSBudWxsICYmICF2aWV3SURzLmlzRW1wdHkoKSkgewotCQkJc2IuYXBwZW5kKCc6Jyk7Ci0JCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB2aWV3SURzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIWZpcnN0KQotCQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKCddJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVmlld0lEcygpIHsKLQkJdmlld0lEcyA9IG5ldyBIYXNoU2V0KDMpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5WSUVXKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHZpZXdJRCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXZpZXdJRCA9IGNoaWxkcmVuW2ldLmdldEF0dHJpYnV0ZShBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LklEKTsKLQkJCWlmICh2aWV3SUQgIT0gbnVsbCkKLQkJCQl2aWV3SURzLmFkZCh2aWV3SUQpOwotCQl9Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUluc3RhbmNlKCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5DTEFTU19OQU1FKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVVJJKCkgewotCQlyZXR1cm4gcGFja2FnZVVSSTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFZpZXdJRHMoKSB7Ci0JCXJldHVybiB2aWV3SURzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhTdHJpbmcgdmlld0lEKSB7Ci0JCXJldHVybiB2aWV3SURzLmlzRW1wdHkoKSB8fCB2aWV3SURzLmNvbnRhaW5zKHZpZXdJRCk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pCi0JCQlyZXR1cm4gMDsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gMTsKLQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBvOwotCi0JCWludCBwQ29tcGFyZSA9IGdldFByaW9yaXR5KCkgLSBkZXNjLmdldFByaW9yaXR5KCk7Ci0JCWlmIChwQ29tcGFyZSAhPSAwKQotCQkJLy9XZSBoYXZlIHJldmVyc2UgdGhlIHNvcnRpbmcgb2YgdGhlIHByaW9yaXR5IGZvciB0aGUgYWRhcHRlciBmYWN0b3JpZXMKLQkJCXJldHVybiAtcENvbXBhcmU7Ci0KLQkJLy9UaGUgZ3JvdXAgaXMgdGhlIHNhbWUgLSBpbiB0aGlzIGNhc2UgdGhlIG9uZSBmb3IgYSBzcGVjaWZpYyB2aWV3IGhhcyBwcmVjZWRlbmNlIG92ZXIKLQkJLy9hIGdlbmVyaWMgb25lCi0JCWVsc2UgaWYgKHZpZXdJRHMgIT0gbnVsbCAmJiAhdmlld0lEcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yI2dldElEKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRPcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2U0YmEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfRkFDVE9SWSA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfVVJJID0gInBhY2thZ2VVUkkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZGVzY3JpcHRvck1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkFEQVBURVJfRkFDVE9SWV9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0b3JzKEVQYWNrYWdlIHBrZywgU3RyaW5nIHZpZXdJRCkgewotCQlDb2xsZWN0aW9uIGFsbCA9IGdldERlc2NyaXB0b3JzKHBrZyk7Ci0JCWlmIChhbGwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhbGwuaXRlcmF0b3IoKTsKLQkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoYWxsLnNpemUoKSk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlc2MuYXBwbGllc1RvKHZpZXdJRCkpCi0JCQkJcmVzdWx0LmFkZChkZXNjKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldERlc2NyaXB0b3JzKEVQYWNrYWdlIHJlZ2lzdGVyZWRQYWNrYWdlKSB7Ci0JCXJldHVybiAoQ29sbGVjdGlvbikgZ2V0RGVzY3JpcHRvck1hcCgpLmdldChyZWdpc3RlcmVkUGFja2FnZS5nZXROc1VSSSgpKTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXREZXNjcmlwdG9yTWFwKCkgewotCQlpZiAoZGVzY3JpcHRvck1hcCA9PSBudWxsKQotCQkJZGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBkZXNjcmlwdG9yTWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoQURBUFRFUl9GQUNUT1JZKSkgewotCQkJCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCQltYXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKHJlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1hcERlc2NyaXB0b3IoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJU3RyaW5nIHVyaSA9IGRlc2NyaXB0b3IuZ2V0UGFja2FnZVVSSSgpOwotCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzID0gKENvbGxlY3Rpb24pIGdldERlc2NyaXB0b3JNYXAoKS5nZXQodXJpKTsKLQkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JzID0gbmV3IFRyZWVTZXQoKTsKLQkJCWdldERlc2NyaXB0b3JNYXAoKS5wdXQodXJpLCBkZXNjcmlwdG9ycyk7Ci0JCX0KLQkJZGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaW5zdGFuY2UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2hpbGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZTIzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1Nzo1NiBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2hpbGRDb21tYW5kIGV4dGVuZHMgRWRpdE1vZGVsQ29tbWFuZCB7Ci0JcHJpdmF0ZSBQYXJlbnRDb21tYW5kIHBhcmVudDsKLQlwcml2YXRlIEVkaXRNb2RlbFJldHJpZXZlciBtb2RlbFJldHJpZXZlcjsKLQotCXB1YmxpYyBDaGlsZENvbW1hbmQoUGFyZW50Q29tbWFuZCBwYXJlbnRDbWQsIENvbW1hbmQgdGFyZ2V0Q21kLCBFZGl0TW9kZWxSZXRyaWV2ZXIgcmV0cmlldmVyKSB7Ci0JCXN1cGVyKHRhcmdldENtZCk7Ci0JCXBhcmVudCA9IHBhcmVudENtZDsKLQkJbW9kZWxSZXRyaWV2ZXIgPSByZXRyaWV2ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy9kb2VzIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlSW5Nb2RlbChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgY21kKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotCQl0cnkgewotCQkJbW9kZWwuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDk6MzU6MzYgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RWRpdE1vZGVsS2V5KCkgewotCQlyZXR1cm4gbW9kZWxSZXRyaWV2ZXIuZ2V0RWRpdE1vZGVsSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA5OjM1OjM2IEFNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guUGFyZW50Q29tbWFuZAotCSAqLwotCXB1YmxpYyBQYXJlbnRDb21tYW5kIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlyZWRvSW5Nb2RlbCgpOwotCQlnZXRQYXJlbnQoKS5yZWRvRnJvbSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWRvSW5Nb2RlbCgpIHsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbW9kZWxSZXRyaWV2ZXIuZ2V0RWRpdE1vZGVsRm9yV3JpdGUodGhpcyk7Ci0JCXRyeSB7Ci0JCQlnZXRUYXJnZXQoKS5yZWRvKCk7Ci0JCQltb2RlbC5zYXZlSWZOZWNlc3NhcnkodGhpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJdW5kb0luTW9kZWwoKTsKLQkJZ2V0UGFyZW50KCkudW5kb0Zyb20odGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5kb0luTW9kZWwoKSB7Ci0JCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotCQl0cnkgewotCQkJZ2V0VGFyZ2V0KCkudW5kbygpOwotCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0YmMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCA2LCAyMDAzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRBY2Nlc3NSZWdpc3RyeSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV2Vha0hhc2hNYXAgcmVnaXN0cnkgPSBuZXcgV2Vha0hhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgZmluYWwgU2V0IGJhc2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKGlzU3RhYmxlKCkpIHsKLQkJCWlmICghcmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7Ci0JCQkJU25hcHNob3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3QoKTsKLQkJCQl0aGlzLnJlZ2lzdHJ5LnB1dChhY2Nlc3NvcktleSwgc25hcHNob3QpOwotCQkJCXRoaXMuYmFzZVNldC5hZGQoc25hcHNob3QpOwotCi0JCQl9IGVsc2UKLQkJCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wLCBhY2Nlc3NvcktleSk7Ci0KLQkJfSBlbHNlCi0JCQljb21wbGFpbigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCS8qCi0JCSAqIEVycm9yIGNvbmRpdGlvbjogU29tZSBvbmUgaGFzIGJlZW4gbmF1Z2h0eSBhbmQgbm90IHJlbGVhc2VkIHRoZSByZXNvdXJjZQotCQkgKi8KLQkJaWYgKHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpICYmIGlzU3RhYmxlKCkpIHsKLQkJCVNuYXBzaG90IHNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LnJlbW92ZShhY2Nlc3NvcktleSk7Ci0JCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKLQkJfSBlbHNlCi0JCQljb21wbGFpbihhY2Nlc3NvcktleSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFzc2VydEFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJaWYgKCFpc0NsaWVudEFjY2Vzc2luZyhhY2Nlc3NvcktleSkpCi0JCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMSIpLCBhY2Nlc3NvcktleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbGllbnRBY2Nlc3NpbmcoT2JqZWN0IGNsaWVudCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoY2xpZW50KTsKLQkJaWYgKCFpc1N0YWJsZSgpKQotCQkJY29tcGxhaW4oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBbnlDbGllbnRBY2Nlc3NpbmcoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5yZWdpc3RyeS5zaXplKCkgPiAwOwotCQlpZiAoIWlzU3RhYmxlKCkpCi0JCQljb21wbGFpbigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1N0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVNldC5zaXplKCkgPT0gdGhpcy5yZWdpc3RyeS5zaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcGxhaW4oKSB7Ci0JCWNvbXBsYWluKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbXBsYWluKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlpZiAoIWlzU3RhYmxlKCkpCi0JCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24odGhpcy5yZWdpc3RyeSwgdGhpcy5iYXNlU2V0KTsKLQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzEiKSwgYWNjZXNzb3JLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5OiBbIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCgoaXNTdGFibGUoKSkgPyAiU1RBQkxFIiA6ICJPVVQgT0YgU1lOQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmVzdWx0LmFwcGVuZCgiXTogUmVmZXJlbmNlIENvdW50ID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0aGlzLnNpemUoKSk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5yZWdpc3RyeS5zaXplKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzQyYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMiwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIFRoZSBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbiBhY2NlcHRzIGEgV2Vha0hhc2hTZXQgcmVnaXN0cnkgYW5kIGEgU2V0IG9mIGFsbCBTbmFwc2hvdHMgdGhhdAotICogc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiB0aGUgcmVnaXN0cnkuIEl0IHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IHNldCBkaWZmZXJlbmNlIGluIG9yZGVyIHRvCi0gKiBkZXRlcm1pbmUgd2hpY2ggU25hcHNob3RzIGV4aXN0IGluIHRoZSBiYXNlU2V0IGJ1dCBub3QgaW4gdGhlIHJlZ2lzdHJ5LgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTAxNjgyNzAyMjI4OTM3NzI5Mkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFOR0xJTkdfUkVGRVJFTkNFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FDQ0VTU19LRVkgPSAyOwotCXByaXZhdGUgV2Vha0hhc2hNYXAgcmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgU2V0IGJhc2VTZXQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsKLQlwcml2YXRlIGludCB0eXBlID0gVU5LTk9XTjsKLQotCXB1YmxpYyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihXZWFrSGFzaE1hcCByZWdpc3RyeSwgU2V0IGJhc2VTZXQpIHsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl0aGlzLmJhc2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCQl0aGlzLmJhc2VTZXQuYWRkQWxsKGJhc2VTZXQpOwotCQl0aGlzLnR5cGUgPSBEQU5HTElOR19SRUZFUkVOQ0U7Ci0JfQotCi0JcHVibGljIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKFN0cmluZyBtc2csIE9iamVjdCBrZXkpIHsKLQkJc3VwZXIobXNnICsgIiA6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMudHlwZSA9IElOVkFMSURfQUNDRVNTX0tFWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLQotCQlzLnByaW50bG4odG9TdHJpbmcoKSk7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQotCQlpZiAodGhpcy5yZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlTbmFwc2hvdCBzbmFwc2hvdCA9IG51bGw7Ci0JCQlpZiAoIXByb2Nlc3NlZCkgewotCQkJCU9iamVjdCBrZXkgPSBudWxsOwotCQkJCUl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gdGhpcy5yZWdpc3RyeS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJa2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOwotCQkJCQlzbmFwc2hvdCA9IChTbmFwc2hvdCkgdGhpcy5yZWdpc3RyeS5nZXQoa2V5KTsKLQkJCQkJdGhpcy5iYXNlU2V0LnJlbW92ZShzbmFwc2hvdCk7Ci0JCQkJfQotCQkJCXByb2Nlc3NlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzLnByaW50bG4oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoYmFzZVNldC5zaXplKCkpLnRvU3RyaW5nKCl9KSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgcG9zc2libGVDdWxwcml0c0l0ciA9IGJhc2VTZXQuaXRlcmF0b3IoKTsgcG9zc2libGVDdWxwcml0c0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHBvc3NpYmxlQ3VscHJpdHNJdHIubmV4dCgpOwotCQkJCXNuYXBzaG90LnByaW50U3RhY2tUcmFjZShzKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBzKSB7Ci0KLQkJcy5wcmludGxuKHRvU3RyaW5nKCkpOwotCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCWlmICh0aGlzLnJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCVNuYXBzaG90IHNuYXBzaG90ID0gbnVsbDsKLQkJCWlmICghcHJvY2Vzc2VkKSB7Ci0JCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQkJSXRlcmF0b3Iga2V5SXRlcmF0b3IgPSB0aGlzLnJlZ2lzdHJ5LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlrZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCXNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LmdldChrZXkpOwotCQkJCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKLQkJCQl9Ci0JCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXMucHJpbnRsbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiIiwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGJhc2VTZXQuc2l6ZSgpKS50b1N0cmluZygpfSkpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZvciAoSXRlcmF0b3IgcG9zc2libGVDdWxwcml0c0l0ciA9IGJhc2VTZXQuaXRlcmF0b3IoKTsgcG9zc2libGVDdWxwcml0c0l0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHBvc3NpYmxlQ3VscHJpdHNJdHIubmV4dCgpOwotCQkJCXNuYXBzaG90LnByaW50U3RhY2tUcmFjZShzKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgREFOR0xJTkdfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gIkRBTkdMSU5HX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgSU5WQUxJRF9BQ0NFU1NfS0VZIDoKLQkJCQlyZXR1cm4gIklOVkFMSURfQUNDRVNTX0tFWSI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8xLCBuZXcgT2JqZWN0W117Z2V0VHlwZSgpfSkpOwotCQkvLwkJaWYgKHRoaXMuYmFkUmVmZXJlbmNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkvLwkJCXJlc3VsdC5hcHBlbmQoIlRoZSBpbnZhbGlkIGFjY2VzcyBvY2N1cnJlZCBzb21ld2hlcmUgaW4gdGhlIGZvbGxvd2luZyBzdGFjawotCQkvLyB0cmFjZS4iKS5hcHBlbmQoIlxuIik7Ci0JCS8vCQkJcmVzdWx0LmFwcGVuZCh0aGlzLmJhZFJlZmVyZW5jZUxvY2F0aW9uLmdldFN0YWNrVHJhY2VTdHJpbmcoKSk7Ci0JCS8vCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oInRlc3QgbWVzc2FnZSIsICItc29tZWtleW9iai0iKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTElORUJSRUFLIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihuZXcgV2Vha0hhc2hNYXAoKSwgbmV3IEhhc2hTZXQoKSkudG9TdHJpbmcoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTElORUJSRUFLIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKCJ0ZXN0IG1lc3NhZ2UiLCAiLXNvbWVrZXlvYmotIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxJTkVCUkVBSyIpOyAvLyROT04tTkxTLTEkCi0JCW5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihuZXcgV2Vha0hhc2hNYXAoKSwgbmV3IEhhc2hTZXQoKSkucHJpbnRTdGFja1RyYWNlKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODUzYTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Mb2NrTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSUVNRkNvbnRleHRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSBleHRlbmRzIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IHsKLQkKLQkKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgcHJpbUNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0KGFQcm9qZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlU3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgTG9ja01hbmFnZXIgbG9ja01hbmFnZXIgPSBuZXcgTG9ja01hbmFnZXIoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBwcm9qZWN0TG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIElMb2NrIGdldFByb2plY3RMb2NrT2JqZWN0KElQcm9qZWN0IGFQcm9qZWN0KXsKLQkJaWYobnVsbCA9PSBhUHJvamVjdCl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJbnRlZ2VyIGhhc2hDb2RlID0gbmV3IEludGVnZXIoYVByb2plY3QuaGFzaENvZGUoKSk7Ci0JCXN5bmNocm9uaXplZCAocHJvamVjdExvY2tzKSB7Ci0JCQlJTG9jayBsb2NrID0gKElMb2NrKXByb2plY3RMb2Nrcy5nZXQoaGFzaENvZGUpOwotCQkJaWYobG9jayA9PSBudWxsKXsKLQkJCQlsb2NrID0gbG9ja01hbmFnZXIubmV3TG9jaygpOwotCQkJCXByb2plY3RMb2Nrcy5wdXQoaGFzaENvZGUsIGxvY2spOwotCQkJfQotCQkJcmV0dXJuIGxvY2s7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKLQkJdHJ5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVFTUZDb250ZXh0KGFQcm9qZWN0LCBjb250cmlidXRvcik7Ci0JCX0gZmluYWxseXsKLQkJCWlmKG51bGwgIT0gbG9jayl7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldENhY2hlZEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKLQkJdHJ5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQkJfSBmaW5hbGx5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGIwODU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxOCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkNvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxFeHRlbnNpb24gZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFIgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlc291cmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0KLQlwdWJsaWMgRWRpdE1vZGVsRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSURfQVRUUik7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKCJJbmNvcnJlY3QgdXNhZ2Ugb2YgZWRpdE1vZGVsRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludC4gIEVsZW1lbnQgbXVzdCBjb250YWluIGlkIGF0dHJpYnV0ZS4gIFBsdWdpbjogIiArIGdldFBsdWdpbklkKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQllZGl0TW9kZWxJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LkVESVRfTU9ERUxfSURfQVRUUik7Ci0JCXJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWRpdE1vZGVsUmVzb3VyY2VzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFZGl0TW9kZWxSZXNvdXJjZS5FRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGVkaXRNb2RlbFJlc291cmNlcy5sZW5ndGg7IGorKykKLQkJCXJlc291cmNlcy5hZGQobmV3IEVkaXRNb2RlbFJlc291cmNlKGVkaXRNb2RlbFJlc291cmNlc1tqXSwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0TW9kZWxJRCgpIHsKLQkJcmV0dXJuIGVkaXRNb2RlbElEOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyZmJjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotY2xhc3MgRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0VYVF9FTEVNRU5UID0gImVkaXRNb2RlbEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEX0FUVFIgPSAiZWRpdE1vZGVsSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfSURfQVRUUiA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgTWFwIGV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkVESVRfTU9ERUxfRVhURU5TSU9OX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gZXh0ZW5zaW9uc0J5SUQgPSBudWxsOwotCQlFZGl0TW9kZWxFeHRlbnNpb24gZWRpdE1vZGVsRXh0ZW5zaW9uID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFRElUX01PREVMX0VYVF9FTEVNRU5UKSkgewotCQkJZWRpdE1vZGVsRXh0ZW5zaW9uID0gbmV3IEVkaXRNb2RlbEV4dGVuc2lvbihlbGVtZW50KTsKLQkJCWV4dGVuc2lvbnNCeUlEID0gKENvbGxlY3Rpb24pIGdldEV4dGVuc2lvbnMoKS5nZXQoZWRpdE1vZGVsRXh0ZW5zaW9uLmdldEVkaXRNb2RlbElEKCkpOwotCQkJaWYgKGV4dGVuc2lvbnNCeUlEID09IG51bGwpIHsKLQkJCQlleHRlbnNpb25zQnlJRCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlnZXRFeHRlbnNpb25zKCkucHV0KGVkaXRNb2RlbEV4dGVuc2lvbi5nZXRFZGl0TW9kZWxJRCgpLCBleHRlbnNpb25zQnlJRCk7Ci0JCQl9Ci0JCQlleHRlbnNpb25zQnlJRC5hZGQoZWRpdE1vZGVsRXh0ZW5zaW9uKTsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChleHRlbnNpb25zID09IG51bGwpCi0JCQlleHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbFJlc291cmNlcyhPYmplY3QgZWRpdE1vZGVsSUQpIHsKLQkJLy9UT0RPIC0gQ2FjaGUgdGhlIHJlc291cmNlcwotCQlDb2xsZWN0aW9uIGVkaXRNb2RlbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBlZGl0TW9kZWxFeHRlbnNpb25zID0gKENvbGxlY3Rpb24pIGdldEV4dGVuc2lvbnMoKS5nZXQoZWRpdE1vZGVsSUQpOwotCi0JCWlmIChlZGl0TW9kZWxFeHRlbnNpb25zID09IG51bGwgfHwgZWRpdE1vZGVsRXh0ZW5zaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlJdGVyYXRvciBpdHIgPSBlZGl0TW9kZWxFeHRlbnNpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0TW9kZWxFeHRlbnNpb24gZXh0ID0gKEVkaXRNb2RlbEV4dGVuc2lvbikgaXRyLm5leHQoKTsKLQkJCWVkaXRNb2RlbFJlc291cmNlcy5hZGRBbGwoZXh0LmdldFJlc291cmNlcygpKTsKLQkJfQotCQlyZXR1cm4gKCFlZGl0TW9kZWxFeHRlbnNpb25zLmlzRW1wdHkoKSkgPyBlZGl0TW9kZWxSZXNvdXJjZXMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzdmZmE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLklFZGl0TW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBFZGl0TW9kZWxSZWdpc3RyeSBJTlNUQU5DRSA9ICBuZXcgRWRpdE1vZGVsUmVnaXN0cnkoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwIGZhY3RvcnlDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9FTEVNRU5UID0gImVkaXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTiA9ICJyZXNvdXJjZUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRF9BVFRSID0gImVkaXRNb2RlbElEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1NfQVRUUiA9ICJmYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX01PREVMX0FUVFIgPSAicGFyZW50TW9kZWxJRCI7IC8vJE5PTi1OTFMtMSQKLQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1VOS05PV05fUkVTT1VSQ0VTX0FUVFIgPSAibG9hZFVua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbFJlZ2lzdHJ5KCkgewotCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkVESVRfTU9ERUxfRkFDVE9SSUVTX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFZGl0TW9kZWxSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYoaXNJbml0aWFsaXplZCgpKSAKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJc3luY2hyb25pemVkKElOU1RBTkNFKSB7Ci0JCQlpZighaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJfQotCQl9IAotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvKgotCQkgKiBUaGUgRWRpdE1vZGVsIEV4dGVuc2lvbiBQb2ludCBkZWZpbmVzIENvbmZpZ3VyYXRpb24gZWxlbWVudHMgbmFtZWQgImVkaXRNb2RlbCIgd2l0aAotCQkgKiBhdHRyaWJ1dGVzICJlZGl0TW9kZWxJRCIgYW5kICJmYWN0b3J5Q2xhc3MiCi0JCSAqLwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVESVRfTU9ERUxfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyBlZGl0TW9kZWxJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVESVRfTU9ERUxfSURfQVRUUik7Ci0JCQlpZiAoZWRpdE1vZGVsSUQgIT0gbnVsbCkgewotCQkJCXRoaXMuZmFjdG9yeUNvbmZpZ3VyYXRpb25zLnB1dChlZGl0TW9kZWxJRCwgbmV3IEVkaXRNb2RlbEluZm8oZWRpdE1vZGVsSUQsIGVsZW1lbnQpKTsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgewotCQlJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RWRpdE1vZGVsRmFjdG9yeUJ5S2V5KGVkaXRNb2RlbElEKTsKLQkJcmV0dXJuIGZhY3RvcnkuZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZhY3RvcnlCeUtleShlZGl0TW9kZWxJRCkuY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgY29udGV4dCwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCXJldHVybiBnZXRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoZWRpdE1vZGVsSUQpLmNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBjb250ZXh0LCBwYXJhbXMpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBuZXcgVHJlZVNldCgpOwotCi0JCUVkaXRNb2RlbEluZm8gbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0KLQkJU3RyaW5nIHBhcmVudE1vZGVsSUQgPSBudWxsOwotCQlNYXAgdmlzaXRlZEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOwotCQkvKiBjb2xsZWN0IHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgcGFyZW50cyAqLwotCQl3aGlsZSAobmV4dEVkaXRNb2RlbEluZm8gIT0gbnVsbCAmJiAocGFyZW50TW9kZWxJRCA9IG5leHRFZGl0TW9kZWxJbmZvLmdldFBhcmVudE1vZGVsSUQoKSkgIT0gbnVsbCkgewotCQkJaWYgKHZpc2l0ZWRFZGl0TW9kZWxzLmNvbnRhaW5zS2V5KHBhcmVudE1vZGVsSUQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5FZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8wLCBuZXcgT2JqZWN0W117ZWRpdE1vZGVsSUR9KSk7Ci0JCQl2aXNpdGVkRWRpdE1vZGVscy5wdXQocGFyZW50TW9kZWxJRCwgbnVsbCk7Ci0JCQlyZXNvdXJjZXMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhwYXJlbnRNb2RlbElEKSk7Ci0JCQluZXh0RWRpdE1vZGVsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKHBhcmVudE1vZGVsSUQpOwotCQl9Ci0KLQkJLyogR2V0IHRoZSByZXNvdXJjZXMgZm9yIHRoZSBhY3R1YWwgZWRpdCBtb2RlbCBpZCAqLwotCQlyZXNvdXJjZXMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhlZGl0TW9kZWxJRCkpOwotCi0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbEV4dGVuc2lvbnMoU3RyaW5nIGVkaXRNb2RlbElEKSB7IAotCQlDb2xsZWN0aW9uIGV4dGVuc2lvbnMgPSBuZXcgVHJlZVNldCgpOwotCQkKLQkJRWRpdE1vZGVsSW5mbyBuZXh0RWRpdE1vZGVsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKGVkaXRNb2RlbElEKTsKLQotCQlTdHJpbmcgcGFyZW50TW9kZWxJRCA9IG51bGw7Ci0JCU1hcCB2aXNpdGVkRWRpdE1vZGVscyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8qIGNvbGxlY3QgdGhlIHJlc291cmNlcyBmcm9tIHRoZSBwYXJlbnRzICovCi0JCXdoaWxlKG5leHRFZGl0TW9kZWxJbmZvICE9IG51bGwgJiYgKHBhcmVudE1vZGVsSUQgPSBuZXh0RWRpdE1vZGVsSW5mby5nZXRQYXJlbnRNb2RlbElEKCkpICE9IG51bGwpIHsKLQkJCWlmKHZpc2l0ZWRFZGl0TW9kZWxzLmNvbnRhaW5zS2V5KHBhcmVudE1vZGVsSUQpKSAKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMCxuZXcgT2JqZWN0IFtdIHtlZGl0TW9kZWxJRH0pKTsgCi0JCQl2aXNpdGVkRWRpdE1vZGVscy5wdXQocGFyZW50TW9kZWxJRCwgbnVsbCk7Ci0JCQlleHRlbnNpb25zLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxFeHRlbnNpb25zKHBhcmVudE1vZGVsSUQpKTsKLQkJCW5leHRFZGl0TW9kZWxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQocGFyZW50TW9kZWxJRCk7Ci0JCX0KLQkJCi0JCS8qIEdldCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgYWN0dWFsIGVkaXQgbW9kZWwgaWQgKi8KLQkJZXh0ZW5zaW9ucy5hZGRBbGwoZ2V0QWxsRWRpdE1vZGVsRXh0ZW5zaW9ucyhlZGl0TW9kZWxJRCkpOwotCQkKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCQotCXB1YmxpYyBJRWRpdE1vZGVsRmFjdG9yeSBmaW5kRWRpdE1vZGVsRmFjdG9yeUJ5S2V5KE9iamVjdCBlZGl0TW9kZWxJRCkgewotCQlJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJRWRpdE1vZGVsSW5mbyBlZGl0TWRsSW5mbyA9IChFZGl0TW9kZWxJbmZvKSBmYWN0b3J5Q29uZmlndXJhdGlvbnMuZ2V0KGVkaXRNb2RlbElEKTsKLQkJaWYgKGVkaXRNZGxJbmZvICE9IG51bGwpCi0JCQlmYWN0b3J5ID0gZWRpdE1kbEluZm8uZ2V0RWRpdE1vZGVsRmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdG9yeTsgCi0JfQotCQotCXB1YmxpYyBJRWRpdE1vZGVsRmFjdG9yeSBmaW5kRWRpdE1vZGVsRmFjdG9yeUJ5UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChmYWNldGVkUHJvamVjdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3Iga2V5cyA9IGZhY3RvcnlDb25maWd1cmF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHQoKTsKLQkJCWlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgoU3RyaW5nKWtleSk7Ci0JCQkJCWlmIChwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KSkKLQkJCQkJCXJldHVybiBmaW5kRWRpdE1vZGVsRmFjdG9yeUJ5S2V5KGtleSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRBbGxFZGl0TW9kZWxSZXNvdXJjZXMoU3RyaW5nIGVkaXRNb2RlbElEKSB7Ci0JCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXNvdXJjZXMuYWRkQWxsKGdldExvY2FsRWRpdE1vZGVsUmVzb3VyY2VzKGVkaXRNb2RlbElEKSk7Ci0JCXJlc291cmNlcy5hZGRBbGwoZ2V0RXh0ZW5kZWRFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0QWxsRWRpdE1vZGVsRXh0ZW5zaW9ucyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc291cmNlcy5hZGRBbGwoZ2V0TG9jYWxFZGl0TW9kZWxFeHRlbnNpb25zKGVkaXRNb2RlbElEKSk7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0TG9jYWxFZGl0TW9kZWxSZXNvdXJjZXMoU3RyaW5nIGVkaXRNb2RlbElEKSB7IAotCQlFZGl0TW9kZWxJbmZvIGVkaXRNZGxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoZWRpdE1vZGVsSUQpOwotICAJCXJldHVybiAoZWRpdE1kbEluZm8gIT0gbnVsbCkgPyBlZGl0TWRsSW5mby5nZXRFZGl0TW9kZWxSZXNvdXJjZXMoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IAotCX0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRMb2NhbEVkaXRNb2RlbEV4dGVuc2lvbnMoU3RyaW5nIGVkaXRNb2RlbElEKSB7IAotCQlFZGl0TW9kZWxJbmZvIGVkaXRNZGxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoZWRpdE1vZGVsSUQpOwotICAJCXJldHVybiAoZWRpdE1kbEluZm8gIT0gbnVsbCkgPyBlZGl0TWRsSW5mby5nZXRFZGl0TW9kZWxFeHRlbnNpb25zKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRFeHRlbmRlZEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKLQkJcmV0dXJuIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGVkaXRNb2RlbElEKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsS2V5Ci0JICogICAgICAgICAgICB0aGUgZWRpdE1vZGVsSUQgb2YgYSBnaXZlbiBFZGl0TW9kZWxGYWN0b3J5IGRlZmluZWQgaW4gdGhlIEV4dGVuc2lvbiBQb2ludAotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBJRWRpdE1vZGVsRmFjdG9yeSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBnaXZlbiBJRC4KLQkgKiBAcmV0dXJuIHRoZSBFZGl0TW9kZWxGYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIEVkaXRNb2RlbElECi0JICovCi0JcHJvdGVjdGVkIElFZGl0TW9kZWxGYWN0b3J5IGdldEVkaXRNb2RlbEZhY3RvcnlCeUtleShPYmplY3QgZWRpdE1vZGVsSUQpIHsKLQkJSUVkaXRNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCUVkaXRNb2RlbEluZm8gZWRpdE1kbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7Ci0JCWlmIChlZGl0TWRsSW5mbyAhPSBudWxsKQotCQkJZmFjdG9yeSA9IGVkaXRNZGxJbmZvLmdldEVkaXRNb2RlbEZhY3RvcnkoKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzIsIG5ldyBPYmplY3RbXXtlZGl0TW9kZWxJRH0pKTsKLQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0JCi0JLyoqCi0gICAgICogQHBhcmFtIGVkaXRNb2RlbElECi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBFZGl0TW9kZWxJbmZvIGdldEVkaXRNb2RlbEluZm9CeUlkKE9iamVjdCBlZGl0TW9kZWxJRCkgewotICAgICAgICB3YWl0Rm9ySW5pdGlhbGl6YXRpb25JZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gKEVkaXRNb2RlbEluZm8pIGZhY3RvcnlDb25maWd1cmF0aW9ucy5nZXQoZWRpdE1vZGVsSUQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJZiB3ZSBhcmUgbm90IGluaXRpYWxpemVkLCBibG9jayB1bnRpbCB0aGUgSU5TVEFOQ0UgaXMgcmVsZWFzZWQgKCBmcm9tIGdldEluc3RhbmNlKCkpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JJbml0aWFsaXphdGlvbklmTmVjZXNzYXJ5KCkgewotICAgICAgICAvKiBXZSBvbmx5IG5lZWQgdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlIChJTlNUQU5DRSksIHdlIGRvIG5vdCBuZWVkIAotICAgICAgICAgKiB0byBleGVjdXRlIGFueXRoaW5nIGluIHRoaXMgYmxvY2suIElmIHRoZSBSZWdpc3RyeSBpcyBub3QgaW5pdGFpbGl6ZWQsCi0gICAgICAgICAqIHRoZW4gaXQgd2lsbCBibG9jayB1bnRpbCB0aGUgc2VtYXBob3JlIGlzIHJlbGVhc2VkIChmcm9tIGdldEluc3RhbmNlKCkpLAotICAgICAgICAgKiBhbmQgdGhlbiByZWxlYXNlIGl0IGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuIAotICAgICAgICAgKi8KLQkJaWYoIWlzSW5pdGlhbGl6ZWQoKSkgCi0JCSAgICBzeW5jaHJvbml6ZWQoSU5TVEFOQ0UpIHsgfQotICAgIH0KLQotCXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxJbmZvIHsKLQotCQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRCA9IG51bGw7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50ID0gbnVsbDsKLQotCQlwcml2YXRlIElFZGl0TW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlwcml2YXRlIExpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gbnVsbDsKLQkJcHJpdmF0ZSBMaXN0IGVkaXRNb2RlbEV4dGVuc2lvbnMgPSBudWxsOwotCi0JCXByaXZhdGUgU3RyaW5nIHBhcmVudE1vZGVsSUQgPSBudWxsOwotCi0JCXByaXZhdGUgU3RyaW5nIHRvc3RyaW5nQ2FjaGUgPSBudWxsOwotCi0JCXB1YmxpYyBFZGl0TW9kZWxJbmZvKFN0cmluZyBlZGl0TW9kZWxJRCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0KLQkJCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJCXRoaXMuZWRpdE1vZGVsSUQgPSBlZGl0TW9kZWxJRDsKLQkJCXRoaXMucGFyZW50TW9kZWxJRCA9IHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFBBUkVOVF9NT0RFTF9BVFRSKTsKLQkJfQotCi0KLQkJcHVibGljIExpc3QgZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKCkgewotCQkJLyogdGhpcyBtZXRob2QgaXMgZ3VhcmRlZCAqLwotCQkJaW5pdGlhbGl6ZVJlc291cmNlcygpOwotCQkJcmV0dXJuIGVkaXRNb2RlbFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyBJRWRpdE1vZGVsRmFjdG9yeSBnZXRFZGl0TW9kZWxGYWN0b3J5KCkgewotLy8JCQkgRG8gbm90IGJsb2NrIGlmIHRoZSBmYWN0b3J5IGlzIG5vdCBudWxsCi0JCQlpZiAodGhpcy5mYWN0b3J5ID09IG51bGwpIHsKLQkJCSAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkgICAgICAvLyBhbm90aGVyIHRocmVhZCBjb3VsZCBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIGZhY3RvcnkKLQkJCSAgICAgIC8vIHdoaWxlIHRoaXMgdGhyZWFkIHdhcyB3YWl0aW5nIHRvIGVudGVyIHRoZSBzeW5jIGJsb2NrCi0JCQkgICAgICBpZih0aGlzLmZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlpZiAodGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXRoaXMuZmFjdG9yeSA9IChJRWRpdE1vZGVsRmFjdG9yeSkgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEZBQ1RPUllfQ0xBU1NfQVRUUik7Ci0JCQkJCQkJQm9vbGVhbiB2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZShMT0FEX1VOS05PV05fUkVTT1VSQ0VTX0FUVFIpKTsKLQkJCQkJCQl0aGlzLmZhY3Rvcnkuc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQkJZGlzY2FyZENvbmZpZ3VyYXRpb25FbGVtZW50SWZOZWNlc3NhcnkoKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMSk7Ci0JCQkJCX0KLQkJCSAgICAgIH0KLQkJCSAgICB9Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5mYWN0b3J5OwotCQl9Ci0KLQkJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VzKCkgewotCi0JCQlpZiAoZWRpdE1vZGVsUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCi0JCQkJCWVkaXRNb2RlbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZXNvdXJjZXMgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRDaGlsZHJlbihFZGl0TW9kZWxSZXNvdXJjZS5FRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZXNFeHRlbnNpb25zID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT04pOwotCQkJCQkvLyBzZXQgdGhlIGNvbmZpZ3VyYXRpb25FbGVtZW50IHRvIG51bGwtIGtlZXBzIGNvZGUgZnJvbSByZWVudGVyaW5nCi0JCQkJCWRpc2NhcmRDb25maWd1cmF0aW9uRWxlbWVudElmTmVjZXNzYXJ5KCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQllZGl0TW9kZWxSZXNvdXJjZXMuYWRkKG5ldyBFZGl0TW9kZWxSZXNvdXJjZShyZXNvdXJjZXNbal0pKTsKLQkJCQkJfQotCQkJCQlpZiAocmVzRXh0ZW5zaW9ucyA9PSBudWxsIHx8IHJlc0V4dGVuc2lvbnMubGVuZ3RoID09IDApIHsKLQkJCQkJCWVkaXRNb2RlbEV4dGVuc2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNFeHRlbnNpb25zW2ldLmdldEF0dHJpYnV0ZShFRElUX01PREVMX1JFU09VUkNFX0VYVEVOU0lPTl9OQU1FKTsKLQkJCQkJCQllZGl0TW9kZWxFeHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdE1vZGVsUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRpc2NhcmRDb25maWd1cmF0aW9uRWxlbWVudElmTmVjZXNzYXJ5KCkgewotCQkJaWYgKHRoaXMuZWRpdE1vZGVsUmVzb3VyY2VzICE9IG51bGwgJiYgdGhpcy5mYWN0b3J5ICE9IG51bGwpCi0JCQkJdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmICh0b3N0cmluZ0NhY2hlID09IG51bGwpCi0JCQkJdG9zdHJpbmdDYWNoZSA9ICJFZGl0TW9kZWxJRDogeyIgKyB0aGlzLmVkaXRNb2RlbElEICsgIn0sIFBhcmVudCBNb2RlbCBJRCB7IiArIHRoaXMucGFyZW50TW9kZWxJRCArICJ9LCBDb25maWd1cmF0aW9uIEVsZW1lbnQ6IFsiICsgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTQkCi0JCQlyZXR1cm4gdG9zdHJpbmdDYWNoZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudE1vZGVsSUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE1vZGVsSUQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50TW9kZWxJRDsKLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucygpIHsKLQkJCS8qIHRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgKi8KLQkJCWluaXRpYWxpemVSZXNvdXJjZXMoKTsKLQkJCXJldHVybiBlZGl0TW9kZWxFeHRlbnNpb25zOwotCQl9Ci0KLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbml0aWFsaXplZC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVnaXN0ZXJlZEVkaXRNb2RlbElEcygpIHsKLQkJcmV0dXJuIChTdHJpbmdbXSkgZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tmYWN0b3J5Q29uZmlndXJhdGlvbnMua2V5U2V0KCkuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjk5YmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgNSwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yOwotCi0KLQotcHVibGljIGNsYXNzIEVkaXRNb2RlbFJlc291cmNlIGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1VSSV9BVFRSID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0xPQURfQVRUUiA9ICJhdXRvbG9hZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX1JFU09VUkNFX0VMRU1FTlQgPSAiZWRpdE1vZGVsUmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlciA9IDE7Ci0JcHJpdmF0ZSBVUkkgdXJpOwotCXByaXZhdGUgYm9vbGVhbiBhdXRvbG9hZCA9IGZhbHNlOwotCS8vSW5kaWNhdGVzIGlmIHRoaXMgd2FzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgZWRpdCBtb2RlbCwKLQkvL2FzIG9wcG9zZWQgdG8gYW4gZXh0ZW5zaW9uCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29yZSA9IHRydWU7Ci0KLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb25JRDsKLQotCXByaXZhdGUgaW50IGxvYWRPcmRlcjsKLQotCXB1YmxpYyBFZGl0TW9kZWxSZXNvdXJjZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQkJU3RyaW5nIHN0clVyaSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEVESVRfTU9ERUxfVVJJX0FUVFIpOwotCQlpZiAoc3RyVXJpICE9IG51bGwpCi0JCQlFZGl0TW9kZWxSZXNvdXJjZS50aGlzLnVyaSA9IFVSSS5jcmVhdGVVUkkoc3RyVXJpKTsKLQotCQlTdHJpbmcgc3RyTG9hZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFVVE9fTE9BRF9BVFRSKTsKLQkJaWYgKHN0ckxvYWQgIT0gbnVsbCkKLQkJCWF1dG9sb2FkID0gQm9vbGVhbi52YWx1ZU9mKHN0ckxvYWQpLmJvb2xlYW5WYWx1ZSgpOwotCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbFJlc291cmNlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZXh0ZW5zaW9uSUQpIHsKLQkJdGhpcyhlbGVtZW50KTsKLQkJdGhpcy5leHRlbnNpb25JRCA9IGV4dGVuc2lvbklEOwotCQlpc0NvcmUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9Mb2FkKCkgewotCQlyZXR1cm4gYXV0b2xvYWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBleHRlbnNpb25JRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciNnZXRQcmlvcml0eSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJaWYgKGlzQ29yZSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJpb3JpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciB0aGlzIHJlc291cmNlIGlzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgZWRpdCBtb2RlbCBkZWZpbml0aW9uIGFzIG9wcG9zZWQgdG8gYW4KLQkgKiBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvcmUoKSB7Ci0JCXJldHVybiBpc0NvcmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgRWRpdE1vZGVsUmVzb3VyY2UpKQotCQkJcmV0dXJuIDE7Ci0JCUVkaXRNb2RlbFJlc291cmNlIHJlcyA9IChFZGl0TW9kZWxSZXNvdXJjZSkgbzsKLQkJaW50IHZhbHVlID0gZ2V0UHJpb3JpdHkoKSAtIHJlcy5nZXRQcmlvcml0eSgpOwotCQlpZiAodmFsdWUgPT0gMCkKLQkJCXJldHVybiBsb2FkT3JkZXIgLSByZXMubG9hZE9yZGVyOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2FkT3JkZXIuCi0JICovCi0JcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0JCXJldHVybiBsb2FkT3JkZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJldHJpZXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZiOGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmV0cmlldmVyIHsKLQlwcml2YXRlIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFN0cmluZyBlZGl0TW9kZWxJRDsKLQlwcml2YXRlIE1hcCBlZGl0TW9kZWxQYXJtczsKLQotCS8qKgotCSAqIEVkaXRNb2RlbFJldHJpZXZlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWxSZXRyaWV2ZXIoRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZWRpdE1vZGVsS2V5LCBNYXAgcGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJZWRpdE1vZGVsSUQgPSBlZGl0TW9kZWxLZXk7Ci0JCWVkaXRNb2RlbFBhcm1zID0gcGFybXM7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlyZXR1cm4gY29udGV4dC5nZXRFZGl0TW9kZWxGb3JSZWFkKGdldEVkaXRNb2RlbElEKCksIGFjY2Vzc29yS2V5LCBlZGl0TW9kZWxQYXJtcyk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGNvbnRleHQuZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZ2V0RWRpdE1vZGVsSUQoKSwgYWNjZXNzb3JLZXksIGVkaXRNb2RlbFBhcm1zKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRNb2RlbElEKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0V4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM5MTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcwotCSAqLwotCXB1YmxpYyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCi0JICovCi0JcHVibGljIEV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb2xsZWN0aW9uIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoKLQkgKiBvdmVycm9kZSBmcm9tIHRoZSBzdXBlciBjbGFzcywgY2hhbmdlZCBub3QgdG8gY2hlY2sgc3VwZXJ0eXBlcyBvZiB0aGUgRU9iamVjdCwgYmVjYXVzZSB0aGF0Ci0JICogd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBEeW5hbWljQWRhcHRlckZhY3RvcnkKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7Ci0JCUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKLQkJCUVDbGFzcyBlQ2xhc3MgPSBlT2JqZWN0LmVDbGFzcygpOwotCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCQlDb2xsZWN0aW9uIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXR5cGVzLmFkZChlUGFja2FnZSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQl0eXBlcy5hZGQodHlwZSk7Ci0JCQkJfQotCQkJCS8qIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCByZW1vdmUgdGhlIGRlbGVnYXRlIGFuZCB0cnkgYWdhaW4gKi8KLQkJCQlib29sZWFuIGF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKLQkJCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYXR0ZW1wdEFkYXB0QWdhaW4pIHsKLQkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSBmYWxzZTsKLQkJCQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlcyh0eXBlcyk7Ci0JCQkJCWlmIChkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVzdWx0ID0gZGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IocmUpOwotCQkJCQkJCWFkYXB0ZXJGYWN0b3JpZXMucmVtb3ZlKGRlbGVnYXRlQWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGFkYXB0KHRhcmdldCwgdHlwZSwgbmV3IEhhc2hTZXQoKSwgdGFyZ2V0LmdldENsYXNzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0ludmVydGVkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9JbnZlcnRlZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyNWE3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0ludmVydGVkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsQ29tbWFuZDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgODo1ODoyNCBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSW52ZXJ0ZWRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIHsKLQlwdWJsaWMgSW52ZXJ0ZWRDb21tYW5kKENvbW1hbmQgdGFyZ2V0Q29tbWFuZCkgewotCQlzdXBlcih0YXJnZXRDb21tYW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuY2FuVW5kbygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy9kb2VzIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBnZXRFZGl0TW9kZWxDb21tYW5kIG1ldGhvZCBjb21tZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFZGl0TW9kZWxDb21tYW5kIGdldEVkaXRNb2RlbENvbW1hbmQoKSB7Ci0JCXJldHVybiAoKEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCkgZ2V0VGFyZ2V0KCkpLmdldEVkaXRNb2RlbENvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGludmVyc2lvbkRlcHRoKCkgewotCQlpZiAoZ2V0RWRpdE1vZGVsQ29tbWFuZCgpID09IGdldFRhcmdldCgpKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAoKEludmVydGVkQ29tbWFuZCkgZ2V0VGFyZ2V0KCkpLmludmVyc2lvbkRlcHRoKCkgKyAxOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxQcmVmaXgoKSB7Ci0JCXJldHVybiBpbnZlcnNpb25EZXB0aCgpICUgMiA9PSAxID8gIlVuZG8gIiA6ICJSZWRvICI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlnZXRUYXJnZXQoKS51bmRvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZ2V0VGFyZ2V0KCkucmVkbygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUGFyZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9QYXJlbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODhjYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9QYXJlbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uQ29tcG9zZWRFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbENvbW1hbmQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDg6NTc6MzggQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFBhcmVudENvbW1hbmQgZXh0ZW5kcyBFZGl0TW9kZWxDb21tYW5kIHsKLQlwcml2YXRlIExpc3QgY2hpbGRyZW47Ci0JcHJpdmF0ZSBDb21wb3NlZEVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGFmZmVjdGVkTW9kZWxzOwotCi0JcHVibGljIFBhcmVudENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kLCBDb21wb3NlZEVkaXRNb2RlbCBhbkVkaXRNb2RlbCkgewotCQlzdXBlcih0YXJnZXRDb21tYW5kKTsKLQkJZWRpdE1vZGVsID0gYW5FZGl0TW9kZWw7Ci0JCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuY2FuRXhlY3V0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVBZmZlY3RlZE1vZGVscygpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gbnVsbDsKLQkJTGlzdCBlZGl0TW9kZWxzID0gZ2V0RWRpdE1vZGVsKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3IgaXQgPSBjb21wdXRlQWZmZWN0ZWRSZXNvdXJjZVNldHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlzZXQgPSAoUmVzb3VyY2VTZXQpIGl0Lm5leHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVscy5zaXplKCk7IGkrKykgewotCQkJCUVkaXRNb2RlbCBtb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRNb2RlbHMuZ2V0KGkpOwotCQkJCWlmIChtb2RlbC5nZXRSZXNvdXJjZVNldCgpID09IHNldCkgewotCQkJCQlnZXRBZmZlY3RlZE1vZGVscygpLmFkZChuZXcgRWRpdE1vZGVsUmV0cmlldmVyKG1vZGVsLmdldEVtZkNvbnRleHQoKSwgbW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgbW9kZWwuZ2V0UGFyYW1zKCkpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNldCBjb21wdXRlQWZmZWN0ZWRSZXNvdXJjZVNldHMoKSB7Ci0JCUl0ZXJhdG9yIG9iamVjdHMgPSBnZXRUYXJnZXQoKS5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOwotCQlTZXQgcmVzb3VyY2VTZXRzID0gbmV3IEhhc2hTZXQoKTsKLQkJT2JqZWN0IG8gPSBudWxsOwotCQlFT2JqZWN0IHJlZiA9IG51bGw7Ci0JCVJlc291cmNlU2V0IHNldCA9IG51bGw7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJbyA9IG9iamVjdHMubmV4dCgpOwotCQkJaWYgKCEobyBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJCWNvbnRpbnVlOwotCQkJcmVmID0gKEVPYmplY3QpIG87Ci0JCQlpZiAocmVmLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlzZXQgPSByZWYuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZiAoc2V0ICE9IG51bGwpCi0JCQkJCXJlc291cmNlU2V0cy5hZGQoc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VTZXRzOwotCX0KLQotCXByb3RlY3RlZCBDaGlsZENvbW1hbmQgY3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRNb2RlbFJldHJpZXZlciByZXRyaWV2ZXIpIHsKLQkJcmV0dXJuIG5ldyBDaGlsZENvbW1hbmQodGhpcywgZ2V0VGFyZ2V0KCksIHJldHJpZXZlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZ2V0VGFyZ2V0KCkuZXhlY3V0ZSgpOwotCQljb21wdXRlQWZmZWN0ZWRNb2RlbHMoKTsKLQkJcHVzaENoaWxkcmVuRm9yRXhlY3V0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVJbk1vZGVsKEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBjbWQpIHsKLQkJZ2V0RWRpdE1vZGVsKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEFmZmVjdGVkTW9kZWxzKCkgewotCQlpZiAoYWZmZWN0ZWRNb2RlbHMgPT0gbnVsbCkKLQkJCWFmZmVjdGVkTW9kZWxzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJcmV0dXJuIGFmZmVjdGVkTW9kZWxzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2VkRWRpdE1vZGVsIGdldEVkaXRNb2RlbCgpIHsKLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZlcnRDaGlsZHJlbigpIHsKLQkJaW52ZXJ0Q2hpbGRyZW5FeGNlcHQoKENoaWxkQ29tbWFuZCkgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW52ZXJ0Q2hpbGRyZW5FeGNlcHQoQ2hpbGRDb21tYW5kIGNhbGxlcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlDaGlsZENvbW1hbmQgY2hpbGRDbWQgPSAoQ2hpbGRDb21tYW5kKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoY2FsbGVyID09IG51bGwgfHwgY2hpbGRDbWQgIT0gY2FsbGVyKQotCQkJCWNoaWxkQ21kLmludmVydEFuZFB1c2goKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludmVydEZyb20oQ2hpbGRDb21tYW5kIGNhbGxlcikgewotCQlpbnZlcnRBbmRQdXNoKCk7Ci0JCWludmVydENoaWxkcmVuRXhjZXB0KGNhbGxlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVzaENoaWxkcmVuRm9yRXhlY3V0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRBZmZlY3RlZE1vZGVscygpLnNpemUoKTsgaSsrKSB7Ci0JCQlFZGl0TW9kZWxSZXRyaWV2ZXIgcmV0cmlldmVyID0gKEVkaXRNb2RlbFJldHJpZXZlcikgZ2V0QWZmZWN0ZWRNb2RlbHMoKS5nZXQoaSk7Ci0JCQlDaGlsZENvbW1hbmQgY29tbWFuZCA9IGNyZWF0ZUNoaWxkQ29tbWFuZChyZXRyaWV2ZXIpOwotCQkJZ2V0Q2hpbGRyZW4oKS5hZGQoY29tbWFuZCk7Ci0JCQljb21tYW5kLmV4ZWN1dGVJbk1vZGVsKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZ2V0VGFyZ2V0KCkucmVkbygpOwotCQlpbnZlcnRDaGlsZHJlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG9Gcm9tKENoaWxkQ29tbWFuZCBjaGlsZCkgewotCQlpbnZlcnRGcm9tKGNoaWxkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlnZXRUYXJnZXQoKS51bmRvKCk7Ci0JCWludmVydENoaWxkcmVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kb0Zyb20oQ2hpbGRDb21tYW5kIGNoaWxkKSB7Ci0JCWludmVydEZyb20oY2hpbGQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1JlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZjNzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcmVhZG9ubHkgdmVyc2lvbiBvZiB0aGUgZWRpdG1vZGVsIGFjY2VzcyByZWdpc3RyeSwgb25seSB1c2VzIGEgd2VhayBoYXNoIGRpY3Rpb25hcnksCi0gKiBhbmQgYmVjYXVzZSB0aGUgYWNjZXNzIGlzIHJlYWQgb25seSwgaXMgbGVzcyBjb25jZXJuZWQgd2l0aCB0aW1pbmcgb2YgYWNjZXNzL3JlbGVhc2UsIGFuZCB3aWxsIGJlCi0gKiBjbGVhbmVkIHVwIG9uIGdhcmJhZ2UgY29sbGVjdGlvbiBpZiBuZWVkZWQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkgZXh0ZW5kcyBDbGllbnRBY2Nlc3NSZWdpc3RyeSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zS2V5KGFjY2Vzc29yS2V5KSkgewotCQkJdGhpcy5yZWdpc3RyeS5wdXQoYWNjZXNzb3JLZXksIG51bGwpOwotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzAsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQkvKgotCQkgKiBFcnJvciBjb25kaXRpb246IFNvbWUgb25lIGhhcyBiZWVuIG5hdWdodHkgYW5kIG5vdCByZWxlYXNlZCB0aGUgcmVzb3VyY2UKLQkJICovCi0JCWlmICh0aGlzLnJlZ2lzdHJ5LmNvbnRhaW5zS2V5KGFjY2Vzc29yS2V5KSkgewotCQkJdGhpcy5yZWdpc3RyeS5yZW1vdmUoYWNjZXNzb3JLZXkpOwotCQl9IGVsc2UKLQkJCWNvbXBsYWluKGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb21wbGFpbihPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQotCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMSIpLCBhY2Nlc3NvcktleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvU25hcHNob3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvU25hcHNob3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4MWEzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1NuYXBzaG90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDMsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotCi0KLS8qKgotICogVGhlIFNuYXBzaG90IGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIGNhbGwgc3RhY2sgdHJhY2Ugb2YgYW55IG1ldGhvZCB0aGF0IGFjY2Vzc2VzIGEgUmVzb3VyY2UuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgU25hcHNob3QgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MDQxNDg4MDAwNjQyNzU3MzQ3TDsKLQotCXB1YmxpYyBTbmFwc2hvdCgpIHsKLQkJc3VwZXIoRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5TbmFwc2hvdF9FUlJPUl8wKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5UaHJvd2FibGUjcHJpbnRTdGFja1RyYWNlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YWNrVHJhY2VTdHJpbmcoKSB7Ci0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7Ci0JCXN1cGVyLnByaW50U3RhY2tUcmFjZShwcmludFdyaXRlcik7Ci0JCXJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1dyYXBwaW5nQ29tbWFuZFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1dyYXBwaW5nQ29tbWFuZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNThkNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9XcmFwcGluZ0NvbW1hbmRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkNvbXBvc2VkRWRpdE1vZGVsOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA5OjMxOjAyIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGluZ0NvbW1hbmRTdGFjayBleHRlbmRzIEJhc2ljQ29tbWFuZFN0YWNrIHsKLQlwcml2YXRlIENvbXBvc2VkRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQotCS8qKgotCSAqIFdyYXBwaW5nQ29tbWFuZFN0YWNrIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdyYXBwaW5nQ29tbWFuZFN0YWNrKENvbXBvc2VkRWRpdE1vZGVsIGFuRWRpdE1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWVkaXRNb2RlbCA9IGFuRWRpdE1vZGVsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCVBhcmVudENvbW1hbmQgcGFyZW50ID0gbmV3IFBhcmVudENvbW1hbmQoY29tbWFuZCwgZWRpdE1vZGVsKTsKLQkJc3VwZXIuZXhlY3V0ZShwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0Fic3RyYWN0RWRpdE1vZGVsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDYxZTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0Fic3RyYWN0RWRpdE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuSW52ZXJ0ZWRDb21tYW5kOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgQ29tbWFuZCB0YXJnZXQ7Ci0JcHJpdmF0ZSBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgb3duZXI7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldCA9IHRhcmdldENvbW1hbmQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IEVkaXRNb2RlbENvbW1hbmQgZ2V0RWRpdE1vZGVsQ29tbWFuZCgpOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBnZXRPdXRlcm1vc3RDb21tYW5kKCkgewotCQlyZXR1cm4gb3duZXIgPT0gbnVsbCA/IHRoaXMgOiBvd25lci5nZXRPdXRlcm1vc3RDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnZlcnRlZCBjb21tYW5kIG9uIHRoZSBvdXRlcm1vc3QgY29tbWFuZAotCSAqLwotCXB1YmxpYyBJbnZlcnRlZENvbW1hbmQgaW52ZXJ0ZWQoKSB7Ci0JCUFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBvdXRlciA9IGdldE91dGVybW9zdENvbW1hbmQoKTsKLQkJSW52ZXJ0ZWRDb21tYW5kIGNtZCA9IG5ldyBJbnZlcnRlZENvbW1hbmQob3V0ZXIpOwotCQlvdXRlci5zZXRPd25lcihjbWQpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyKEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBvd25lckNvbW1hbmQpIHsKLQkJb3duZXIgPSBvd25lckNvbW1hbmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkQWNjZXNzb3JLZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkQWNjZXNzb3JLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjOThlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEFjY2Vzc29yS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZEFjY2Vzc29yS2V5IHsKLQotCXByaXZhdGUgT2JqZWN0IGFjY2Vzc29yS2V5ID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBhZGRvbktleSA9IG51bGw7Ci0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zZWRBY2Nlc3NvcktleSBnZXRDb21wb3NlZEFjY2Vzc29yS2V5KE9iamVjdCBhY2Nlc3NvcktleSwgQ29tcG9zZWRFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgbmV3S2V5ID0gbmV3IENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIGVkaXRNb2RlbCk7Ci0JCWVkaXRNb2RlbC5jYWNoZUFjY2Vzc29yS2V5KG5ld0tleSk7Ci0JCXJldHVybiBuZXdLZXk7Ci0JfQotCi0KLQlwcml2YXRlIENvbXBvc2VkQWNjZXNzb3JLZXkoT2JqZWN0IGFjY2Vzc29yS2V5LCBPYmplY3QgYWRkb25LZXkpIHsKLQkJdGhpcy5hY2Nlc3NvcktleSA9IGFjY2Vzc29yS2V5OwotCQl0aGlzLmFkZG9uS2V5ID0gYWRkb25LZXk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAob3RoZXIgPT0gbnVsbCB8fCAhKG90aGVyIGluc3RhbmNlb2YgQ29tcG9zZWRBY2Nlc3NvcktleSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgb3RoZXJLZXkgPSAoQ29tcG9zZWRBY2Nlc3NvcktleSkgb3RoZXI7Ci0KLQkJcmV0dXJuIGFjY2Vzc29yS2V5LmVxdWFscyhvdGhlcktleS5hY2Nlc3NvcktleSkgJiYgYWRkb25LZXkuZXF1YWxzKG90aGVyS2V5LmFkZG9uS2V5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBhY2Nlc3NvcktleS5oYXNoQ29kZSgpIF4gYWRkb25LZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkRWRpdE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEVkaXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2I0ZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvc2VkRWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LldyYXBwaW5nQ29tbWFuZFN0YWNrOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA4OjI2OjMyIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NlZEVkaXRNb2RlbCBleHRlbmRzIEVkaXRNb2RlbCBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyIHsKLQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgY2hpbGRyZW5NYXAgPSBudWxsOwotCXByaXZhdGUgTGlzdCBjYWNoZWRLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ29tcG9zZWRFZGl0TW9kZWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoZWRpdE1vZGVsSUQsIGNvbnRleHQsIGZhbHNlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNoaWxkcmVuSWZOZWNlc3NhcnkoQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5KSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdLZXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjYWNoZUFjY2Vzc29yS2V5KENvbXBvc2VkQWNjZXNzb3JLZXkgbmV3S2V5KSB7Ci0JCWlmICghY2FjaGVkS2V5cy5jb250YWlucyhuZXdLZXkpKQotCQkJY2FjaGVkS2V5cy5hZGQobmV3S2V5KTsKLQl9Ci0KLQkvLyBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyAgVGhlIG9ubHkgZGlmZiBzZWVtcyB0byBiZSBpdCBkb2Vzbid0IHJlbGVhc2UgcmVzb3VyY2VzCi0vLwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotLy8JCWRpc3Bvc2luZyA9IHRydWU7Ci0vLwkJaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQotLy8JCQljb21tYW5kU3RhY2sucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIodGhpcyk7Ci0vLwkJaWYgKGhhc0xpc3RlbmVycygpKQotLy8JCQlub3RpZnlMaXN0ZW5lcnMobmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFLCB0aGlzKSk7Ci0vLwkJcmVsZWFzZVByZWxvYWRSZXNvdXJjZXMoKTsKLS8vCQlyZWxlYXNlSWRlbnRpZmllcnMoKTsKLS8vCQllbWZDb250ZXh0ID0gbnVsbDsgCi0vLwkJcmVzb3VyY2VzID0gbnVsbDsKLS8vCQlkaXNwb3NpbmcgPSBmYWxzZTsKLS8vCQlwcm9qZWN0ID0gbnVsbDsKLS8vCQljYWNoZWRLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JfQotCi0JcHVibGljIEVkaXRNb2RlbC5SZWZlcmVuY2UgYWRkQ2hpbGQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGFkZENoaWxkKGVkaXRNb2RlbElELCBwYXJhbXMsIENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcykpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwuUmVmZXJlbmNlIGFkZENoaWxkKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcywgQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5KSB7Ci0KLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVtZkNvbnRleHQoKS5nZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgY29tcG9zZWRBY2Nlc3NvcktleSwgcGFyYW1zKTsKLQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCi0JCWdldENoaWxkcmVuTWFwKCkucHV0KGVkaXRNb2RlbC5nZXRSZWZlcmVuY2UoKSwgZWRpdE1vZGVsKTsKLQkJZ2V0Q2hpbGRyZW4oKS5hZGQoZWRpdE1vZGVsKTsKLQotCQlyZXR1cm4gZWRpdE1vZGVsLmdldFJlZmVyZW5jZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKEVkaXRNb2RlbC5SZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5ID0gQ29tcG9zZWRBY2Nlc3NvcktleS5nZXRDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCB0aGlzKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGdldENoaWxkcmVuTWFwKCkucmVtb3ZlKHJlZmVyZW5jZSk7Ci0JCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3MoY29tcG9zZWRBY2Nlc3NvcktleSk7Ci0JCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQlnZXRDaGlsZHJlbigpLnJlbW92ZShlZGl0TW9kZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENvbnRhaW5lZFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbk1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRDb250YWluZWRFZGl0TW9kZWwoRWRpdE1vZGVsLlJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJcmV0dXJuIChFZGl0TW9kZWwpIGdldENoaWxkcmVuTWFwKCkuZ2V0KHJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDb21tYW5kU3RhY2suCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJhc2ljQ29tbWFuZFN0YWNrIGNyZWF0ZUNvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBXcmFwcGluZ0NvbW1hbmRTdGFjayh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIGFsbCBldmVudHMgdG8gdGhlIGxpc3RlbmVycyBmb3IgdGhpcyBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlpZiAoaGFzTGlzdGVuZXJzKCkpCi0JCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgbW9kZWxzID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbHMuc2l6ZSgpOyBpKyspIHsKLQkJCUVkaXRNb2RlbCBjaGlsZCA9IChFZGl0TW9kZWwpIG1vZGVscy5nZXQoaSk7Ci0JCQlhU2V0LmFkZEFsbChjaGlsZC5nZXRBZmZlY3RlZEZpbGVzKCkpOwotCQl9Ci0JCXJldHVybiBhU2V0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRDaGlsZHJlbk1hcCgpIHsKLQkJaWYgKGNoaWxkcmVuTWFwID09IG51bGwpCi0JCQljaGlsZHJlbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBjaGlsZHJlbk1hcDsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzIGFsb25nIHRvIGNoaWxkcmVuLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQllZGl0TW9kZWwuaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgc2F2ZSBpcyBuZWVkZWQgb24gdGhlIENvbW1hbmRTdGFjawotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUl0ZXJhdG9yIGVkaXRNb2RlbHMgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlZGl0TW9kZWxzLmhhc05leHQoKSkgewotCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRNb2RlbHMubmV4dCgpOwotCQkJaWYgKGVkaXRNb2RlbC5pc0RpcnR5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIHNhdmUgaXMgbmVlZGVkIG9uIHRoZSBDb21tYW5kU3RhY2sKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJSXRlcmF0b3IgZWRpdE1vZGVscyA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVkaXRNb2RlbHMuaGFzTmV4dCgpKSB7Ci0JCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgZWRpdE1vZGVscy5uZXh0KCk7Ci0JCQlpZiAoZWRpdE1vZGVsLmlzSW50ZXJyZXN0ZWRJblJlc291cmNlKGFSZXNvdXJjZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW1TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0JCQkoKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSkpLnByaW1TYXZlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgb25seSBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGNoaWxkcmVuIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgeW91Ci0JICoga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlDb21wb3NlZEFjY2Vzc29yS2V5IGNvbXBvc2VkQWNjZXNzb3JLZXkgPSBDb21wb3NlZEFjY2Vzc29yS2V5LmdldENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIHRoaXMpOwotCQlpZiAoZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMCkgewotCQkJY3JlYXRlQ2hpbGRyZW5JZk5lY2Vzc2FyeShjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJfSBlbHNlIHsKLQotCQkJTGlzdCB0ZW1wY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQlFZGl0TW9kZWwgbW9kZWwgPSAoRWRpdE1vZGVsKSB0ZW1wY2hpbGRyZW4uZ2V0KGkpOwotCQkJCW1vZGVsLmFjY2Vzcyhjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJCX0KLQkJfQotCQkvLyByZW1vdmluZyBmb3IgZGVmZWN0IDE5NzgsIGNoaWxkcmVuIHNob3VsZCBkbyBhbGwgdGhlIGFjY2Vzc2luZwotCQlzdXBlci5hY2Nlc3MoYWNjZXNzb3JLZXkpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGVhY2ggY2xpZW50IHdoZW4gdGhleSBhcmUgZmluaXNoZWQgd29ya2luZyB3aXRoIHRoZQotCSAqIEVkaXRNb2RlbC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZWxlYXNlQWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlMaXN0IHRlbXBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCUNvbXBvc2VkQWNjZXNzb3JLZXkgY29tcG9zZWRBY2Nlc3NvcktleSA9IENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFZGl0TW9kZWwgbW9kZWwgPSAoRWRpdE1vZGVsKSB0ZW1wY2hpbGRyZW4uZ2V0KGkpOwotCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyhjb21wb3NlZEFjY2Vzc29yS2V5KTsKLQkJfQotCQlyZW1vdmVLZXlGcm9tQ2FjaGUoY29tcG9zZWRBY2Nlc3NvcktleSk7Ci0JCS8vIFJlbW92aW5nIHRoaXMgY2FsbC4uLiBDaGlsZHJlbiBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgYWxsIHJlbGVhc2luZyBkZWZlY3QgMTk3OAotCQlzdXBlci5yZWxlYXNlQWNjZXNzKGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlGcm9tQ2FjaGUoQ29tcG9zZWRBY2Nlc3NvcktleSBrZXkpIHsKLQkJY2FjaGVkS2V5cy5yZW1vdmUoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBvbmUgc2hvdWxkIHNhdmUsIHRoZXkgYWxsIHNob3VsZCBzYXZlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoKSB7Ci0JCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoZWRpdE1vZGVsLnNob3VsZFNhdmUoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSWYgb25lIHNob3VsZCBzYXZlLCB0aGV5IGFsbCBzaG91bGQgc2F2ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBsaXN0LmdldChpKTsKLQkJCWlmIChlZGl0TW9kZWwuc2hvdWxkU2F2ZShvcGVyYXRpb25IYW5kbGVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5FZGl0TW9kZWwjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7Ci0JCQlMaXN0IGZpbGVzID0gZWRpdE1vZGVsLmdldE5vblJlc291cmNlRmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCkpCi0JCQkJcmVzdWx0LmFkZEFsbChmaWxlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvdW5kaW5nQ29tbWFuZFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3VuZGluZ0NvbW1hbmRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODhhODg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvdW5kaW5nQ29tbWFuZFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUaGlzIGNsYXNzIGRvZXMgbm90IGFjdHVhbGx5IGV4ZWN1dGUgYW55IGNvbW1hbmRzLiBJdCBtZXJlbHkgZ2F0aGVycyB0aGUgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQKLSAqIGFuZCBjb21wb3VuZHMgdGhlbSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGFjdHVhbENvbW1hbmRTdGFjay4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvdW5kaW5nQ29tbWFuZFN0YWNrIGltcGxlbWVudHMgQ29tbWFuZFN0YWNrIHsKLQlwcml2YXRlIENvbW1hbmRTdGFjayBhY3R1YWxDb21tYW5kU3RhY2s7Ci0JcHJpdmF0ZSBDb21tYW5kIGNvbXBvdW5kQ29tbWFuZDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tcG91bmRpbmdDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGFjdHVhbENvbW1hbmRTdGFjaykgewotCQl0aGlzLmFjdHVhbENvbW1hbmRTdGFjayA9IGFjdHVhbENvbW1hbmRTdGFjazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjZXhlY3V0ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAoY29tcG91bmRDb21tYW5kID09IG51bGwpCi0JCQljb21wb3VuZENvbW1hbmQgPSBjb21tYW5kOwotCQllbHNlCi0JCQljb21wb3VuZENvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUV4ZWN1dGlvbigpIHsKLQkJaWYgKGNvbXBvdW5kQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWFjdHVhbENvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjY2FuVW5kbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjY2FuUmVkbygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNnZXRVbmRvQ29tbWFuZCgpCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNnZXRSZWRvQ29tbWFuZCgpCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNnZXRNb3N0UmVjZW50Q29tbWFuZCgpCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0TW9zdFJlY2VudENvbW1hbmQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvL3JlZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQkvL2ZsdXNoCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2FkZENvbW1hbmRTdGFja0xpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihDb21tYW5kU3RhY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjcmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKENvbW1hbmRTdGFja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZGVmYXVsdAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0R5bmFtaWNBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRHluYW1pY0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTA1MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRHluYW1pY0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSwgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciwgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnkgTlVMTF9GQUNUT1JZID0gbmV3IEFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmlld0lEOwotCi0JLy9FYWNoIG9mIHRoZSB0d28gbWFwcyBiZWxvdyBhcmUga2V5ZWQgYnkgdGhlIHByb2plY3QKLQlwcml2YXRlIE1hcCBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlOwotCi0JcHJpdmF0ZSBNYXAgYWRhcHRlckZhY3Rvcmllc0J5VHlwZTsKLQotCXByaXZhdGUgU2V0IGFsbEZhY3RvcmllczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIElDaGFuZ2VOb3RpZmllcn0KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNwZWN0aW5nQWN0aXZpdGllcyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9fUFJPSkVDVCA9ICJOT19QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHVibGljIER5bmFtaWNBZGFwdGVyRmFjdG9yeShTdHJpbmcgdmlld0lELCBib29sZWFuIHJlc3BlY3RBY3RpdmllcykgewotCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKLQkJdGhpcy5yZXNwZWN0aW5nQWN0aXZpdGllcyA9IHJlc3BlY3RBY3RpdmllczsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBEeW5hbWljQWRhcHRlckZhY3RvcnkoU3RyaW5nIHZpZXdJRCkgewotCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlID0gbmV3IEhhc2hNYXAoKTsKLQkJYWRhcHRlckZhY3Rvcmllc0J5VHlwZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFsbEZhY3RvcmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeUZvclR5cGUodHlwZSkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJldHVybiBnZXRGYWN0b3J5Rm9yVHlwZSgoRU9iamVjdCkgdHlwZSk7Ci0KLQkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHR5cGUpOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEV4aXN0aW5nRmFjdG9yeUZvclR5cGUoYVByb2plY3QsIHR5cGUpOwotCQlpZiAoZmFjdG9yeSA9PSBOVUxMX0ZBQ1RPUlkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JUeXBlKGFQcm9qZWN0LCB0eXBlKTsKLQotCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgTlVMTF9GQUNUT1JZKTsKLQkJCWVsc2UKLQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgZmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBwLCBPYmplY3QgdHlwZSkgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQodHlwZSk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgZmFjdG9yeSB3YXMgbm90IGNhY2hlZCBieSB0eXBlLCBzbyB3ZSB3aWxsIHNlYXJjaCB0aGUgY2FjaGUgb2YgZmFjdG9yaWVzIGZvciB0aGUgcHJvamVjdAotCSAqIGFuZCBzZWUgaWYgaXQgY2FuIGJlIGZvdW5kIHRoZXJlCi0JICovCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBmaW5kRmFjdG9yeUZvclR5cGUoT2JqZWN0IHByb2plY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLmdldChwcm9qZWN0KTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJdGVyYXRvciBpdGVyID0gYU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSkpCi0JCQkJcmV0dXJuIGZhY3Rvcnk7Ci0JCX0KLQotCQkvLyBhZGFwdCB0aGUgcmVzb3VyY2UgdG8gaXRzIGNvbnRlbnRzCi0JCWlmIChnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkKLQkJCXJldHVybiBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclR5cGUoRU9iamVjdCBvYmopIHsKLQkJRUNsYXNzIGVDbGFzcyA9IG9iai5lQ2xhc3MoKTsKLQkJaWYgKGVDbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iaik7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJYVByb2plY3QgPSBOT19QUk9KRUNUOwotCQlBZGFwdGVyRmFjdG9yeSByZXN1bHQgPSBnZXRGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgZVBhY2thZ2UpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJU2V0IGZhaWxlZFBhY2thZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJZmFpbGVkUGFja2FnZVNldC5hZGQoZVBhY2thZ2UpOwotCQkJSXRlcmF0b3Igc3VwZXJ0eXBlcyA9IGVDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoc3VwZXJ0eXBlcy5oYXNOZXh0KCkpIHsKLQkJCQllQ2xhc3MgPSAoRUNsYXNzKSBzdXBlcnR5cGVzLm5leHQoKTsKLQkJCQlpZiAoZUNsYXNzICE9IG51bGwpIHsKLQkJCQkJZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKLQkJCQkJaWYgKGZhaWxlZFBhY2thZ2VTZXQuYWRkKGVQYWNrYWdlKSkgewotCQkJCQkJcmVzdWx0ID0gZ2V0RmFjdG9yeUZvclBhY2thZ2UoYVByb2plY3QsIGVQYWNrYWdlKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclBhY2thZ2UoT2JqZWN0IGFQcm9qZWN0LCBFUGFja2FnZSBhUGFja2FnZSkgewotCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBhUGFja2FnZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JQYWNrYWdlKGFQcm9qZWN0LCBhUGFja2FnZSk7Ci0JCWlmIChmYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KGFQcm9qZWN0LCBhUGFja2FnZSk7Ci0KLQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIE5VTExfRkFDVE9SWSk7Ci0JCQkJZWxzZQotCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIGZhY3RvcnkpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IocmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclR5cGVzKE9iamVjdCBwLCBMaXN0IHR5cGVzKSB7Ci0JCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocCk7Ci0JCWlmIChhTWFwID09IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRSZXNvdXJjZVR5cGVzKHR5cGVzKTsKLQotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoZmFjdG9yaWVzLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLm5leHQoKTsKLQkJCWlmIChpc0ZhY3RvcnlGb3JBbGxUeXBlcyhmYWN0b3J5LCB0eXBlcykpIHsKLQkJCQlyZXR1cm4gZmFjdG9yeTsKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdFJlc291cmNlVHlwZXMoTGlzdCB0eXBlcykgewotCQkvLyAgICAgIGFkYXB0IHRoZSByZXNvdXJjZSB0byBpdHMgY29udGVudHMKLQkJaWYgKGlzRmFjdG9yeUZvckFsbFR5cGVzKGdldFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwgdHlwZXMpKQotCQkJcmV0dXJuIGdldFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZhY3RvcnlGb3JUeXBlcyhPYmplY3QgcCwgTGlzdCB0eXBlcykgewotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoZmFjdG9yaWVzLmhhc05leHQoKSkgewotCQkJZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLm5leHQoKTsKLQkJCWlmIChpc0ZhY3RvcnlGb3JBbGxUeXBlcyhmYWN0b3J5LCB0eXBlcykpIHsKLQkJCQlhTWFwLnJlbW92ZShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmFjdG9yeUZvckFsbFR5cGVzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIExpc3QgdHlwZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZXMuZ2V0KGkpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RXhpc3RpbmdGYWN0b3J5Rm9yUGFja2FnZShPYmplY3QgcCwgRVBhY2thZ2UgYVBhY2thZ2UpIHsKLQkJaWYgKHAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNYXAgYU1hcCA9IChNYXApIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQWRhcHRlckZhY3RvcnkpIGFNYXAuZ2V0KGFQYWNrYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlckZhY3RvcnkoT2JqZWN0IHAsIEVQYWNrYWdlIGFQYWNrYWdlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNYXAgYU1hcCA9IGdldE9yQ3JlYXRlTWFwKHAsIGFkYXB0ZXJGYWN0b3JpZXNCeVBhY2thZ2UpOwotCi0JCWFNYXAucHV0KGFQYWNrYWdlLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybjsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpIHsKLQkJCSgoSUNoYW5nZU5vdGlmaWVyKSBhZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYWxsRmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0T3JDcmVhdGVNYXAoT2JqZWN0IHAsIE1hcCBjb250YWluZXIpIHsKLQkJTWFwIGFNYXAgPSAoTWFwKSBjb250YWluZXIuZ2V0KHApOwotCQlpZiAoYU1hcCA9PSBudWxsKSB7Ci0JCQlhTWFwID0gbmV3IEhhc2hNYXAoMTApOwotCQkJY29udGFpbmVyLnB1dChwLCBhTWFwKTsKLQkJfQotCQlyZXR1cm4gYU1hcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlckZhY3RvcnkoT2JqZWN0IHAsIE9iamVjdCB0eXBlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNYXAgYU1hcCA9IGdldE9yQ3JlYXRlTWFwKHAsIGFkYXB0ZXJGYWN0b3JpZXNCeVR5cGUpOwotCQlhTWFwLnB1dCh0eXBlLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKLQkJCXJldHVybjsKLQotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ2hhbmdlTm90aWZpZXIpIHsKLQkJCSgoSUNoYW5nZU5vdGlmaWVyKSBhZGFwdGVyRmFjdG9yeSkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYWxsRmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHRhcmdldDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vdGlmaWVyKSB7Ci0JCQlhZGFwdGVyID0gYWRhcHQoKE5vdGlmaWVyKSB0YXJnZXQsIHR5cGUpOwotCQl9Ci0KLQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXN1bHQgPSBhZGFwdCgoRU9iamVjdCkgdGFyZ2V0LCB0eXBlKTsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgcCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0YXJnZXQpOwotCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQlwID0gTk9fUFJPSkVDVDsKLQkJCXJlc3VsdCA9IGFkYXB0KHAsIHRhcmdldCwgdHlwZSwgbmV3IEhhc2hTZXQoKSwgdGFyZ2V0LmdldENsYXNzKCkpOwotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KEVPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCi0JCUVDbGFzcyBlQ2xhc3MgPSB0YXJnZXQuZUNsYXNzKCk7Ci0JCWlmIChlQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVQYWNrYWdlIGVQYWNrYWdlID0gZUNsYXNzLmdldEVQYWNrYWdlKCk7Ci0JCUFkYXB0ZXIgcmVzdWx0ID0gYWRhcHQodGFyZ2V0LCBlUGFja2FnZSwgdHlwZSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlTZXQgZmFpbGVkUGFja2FnZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmYWlsZWRQYWNrYWdlU2V0LmFkZChlUGFja2FnZSk7Ci0JCQlJdGVyYXRvciBzdXBlcnR5cGVzID0gZUNsYXNzLmdldEVBbGxTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChzdXBlcnR5cGVzLmhhc05leHQoKSkgewotCQkJCWVDbGFzcyA9IChFQ2xhc3MpIHN1cGVydHlwZXMubmV4dCgpOwotCQkJCWlmIChlQ2xhc3MgIT0gbnVsbCkgewotCQkJCQllUGFja2FnZSA9IGVDbGFzcy5nZXRFUGFja2FnZSgpOwotCQkJCQlpZiAoZmFpbGVkUGFja2FnZVNldC5hZGQoZVBhY2thZ2UpKSB7Ci0JCQkJCQlyZXN1bHQgPSBhZGFwdCh0YXJnZXQsIGVQYWNrYWdlLCB0eXBlKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBhZGFwdChFT2JqZWN0IHRhcmdldCwgRVBhY2thZ2UgZVBhY2thZ2UsIE9iamVjdCB0eXBlKSB7Ci0JCU9iamVjdCBhUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0YXJnZXQpOwotCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKLQkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKLQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXRGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgZVBhY2thZ2UpOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQ29kZSBib3Jyb3dlZCBmcm9tIHtAbGluayBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5fQotCSAqICAKLQkgKi8KLQlwcml2YXRlIEFkYXB0ZXIgYWRhcHQoT2JqZWN0IHAsIE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUsIENvbGxlY3Rpb24gZmFpbGVkUGFja2FnZXMsIENsYXNzIGphdmFDbGFzcykgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQWRhcHRlciByZXN1bHQgPSBudWxsOwotCi0JCVBhY2thZ2UgamF2YVBhY2thZ2UgPSBqYXZhQ2xhc3MuZ2V0UGFja2FnZSgpOwotCQlpZiAoZmFpbGVkUGFja2FnZXMuYWRkKGphdmFQYWNrYWdlKSkgewotCQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQl0eXBlcy5hZGQoamF2YVBhY2thZ2UpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXR5cGVzLmFkZCh0eXBlKTsKLQkJCX0KLQotCQkJLyogd2hlbiBhbiBlcnJvciBvY2N1cnMsIHJlbW92ZSB0aGUgZGVsZWdhdGUgYW5kIHRyeSBhZ2FpbiAqLwotCQkJYm9vbGVhbiBhdHRlbXB0QWRhcHRBZ2FpbiA9IHRydWU7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYXR0ZW1wdEFkYXB0QWdhaW4pIHsKLQkJCQlhdHRlbXB0QWRhcHRBZ2FpbiA9IGZhbHNlOwotCi0JCQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlcyhwLCB0eXBlcyk7Ci0JCQkJaWYgKGRlbGVnYXRlQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0ID0gZGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKHJlKTsKLQkJCQkJCXJlbW92ZUZhY3RvcnlGb3JUeXBlcyhwLCB0eXBlcyk7Ci0JCQkJCQlhdHRlbXB0QWRhcHRBZ2FpbiA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCUNsYXNzIHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGFkYXB0KHAsIHRhcmdldCwgdHlwZSwgZmFpbGVkUGFja2FnZXMsIGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gamF2YUNsYXNzLmdldEludGVyZmFjZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyArK2kpIHsKLQkJCQkJcmVzdWx0ID0gYWRhcHQocCwgdGFyZ2V0LCB0eXBlLCBmYWlsZWRQYWNrYWdlcywgaW50ZXJmYWNlc1tpXSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQotCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeUZvclR5cGUodGFyZ2V0KTsKLQotCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJcmV0dXJuIGZhY3RvcnkuYWRhcHROZXcodGFyZ2V0LCB0eXBlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHRBbGxOZXcoTm90aWZpZXIgdGFyZ2V0KSB7Ci0KLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlKHRhcmdldCk7Ci0KLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCWZhY3RvcnkuYWRhcHRBbGxOZXcodGFyZ2V0KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZChub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZShub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwgfHwgY2hhbmdlTm90aWZpZXIuaXNFbXB0eSgpIHx8IGNoYW5nZU5vdGlmaWVyLmdldCgwKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhbGxGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IGZhY3RvcnkgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWZhY3RvcnkgPSBpdGVyLm5leHQoKTsKLQkJCWRpc3Bvc2VGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRyID0gZ2V0RW5hYmxlbWVudElkZW50aWZpZXJzKCkuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCSgoSUVuYWJsZW1lbnRJZGVudGlmaWVyKSBpdHIubmV4dCgpKS5yZW1vdmVJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJaWYgKHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkKLQkJCXJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VGYWN0b3J5KE9iamVjdCBmYWN0b3J5KSB7Ci0JCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCSgoSURpc3Bvc2FibGUpIGZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy9Gb3dhcmQgdGhlIG5vdGlmaWNhdGlvbiBvbiB0byBhbGwgbXkgbGlzdGVuZXJzCi0JCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWRhcHRlckZhY3RvcmllcyhPYmplY3QgcHJvamVjdCkgewotCQlhZGFwdGVyRmFjdG9yaWVzQnlUeXBlLnJlbW92ZShwcm9qZWN0KTsKLQkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLnJlbW92ZShwcm9qZWN0KTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBmYWN0b3JpZXMgPSBhTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCU9iamVjdCBhZGFwdGVyRmFjdG9yeTsKLQkJd2hpbGUgKGZhY3Rvcmllcy5oYXNOZXh0KCkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yaWVzLm5leHQoKTsKLQkJCWFsbEZhY3Rvcmllcy5yZW1vdmUoYWRhcHRlckZhY3RvcnkpOwotCQkJZGlzcG9zZUZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeShPYmplY3QgcHJvamVjdCwgRVBhY2thZ2UgZVBhY2thZ2UpIHsKLQkJaWYgKGVQYWNrYWdlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzApOwotCi0JCXJldHVybiBjcmVhdGVBZGFwdGVyRmFjdG9yeShwcm9qZWN0LCBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvcnMoZVBhY2thZ2UsIHZpZXdJRCkpOwotCi0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeShPYmplY3QgcHJvamVjdCwgTGlzdCBkZXNjcmlwdG9ycykgewotCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBkZXNjcmlwdG9ycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlBZGFwdGVyRmFjdG9yeSBmYWN0ID0gbnVsbDsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBudWxsOwotCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JCWlmIChkZXNjcmlwdG9ycy5zaXplKCkgPT0gMSkgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCgwKTsKLQkJCWlkZW50aWZpZXIgPSBnZXRJZGVudGlmaWVyKHByb2plY3QsIGRlc2MpOwotCQkJYWRkTGlzdGVuZXJJZk5lY2Vzc2FyeShpZGVudGlmaWVyKTsKLQkJCWlmIChwcm9qZWN0LmVxdWFscyhOT19QUk9KRUNUKSB8fCAoaWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIuaXNFbmFibGVkKCkpKQotCQkJCXJldHVybiBkZXNjLmNyZWF0ZUluc3RhbmNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoZGVzY3JpcHRvcnMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldChpKTsKLQkJCWlkZW50aWZpZXIgPSBnZXRJZGVudGlmaWVyKHByb2plY3QsIGRlc2MpOwotCQkJYWRkTGlzdGVuZXJJZk5lY2Vzc2FyeShpZGVudGlmaWVyKTsKLQkJCWlmIChwcm9qZWN0LmVxdWFscyhOT19QUk9KRUNUKSB8fCAoaWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIuaXNFbmFibGVkKCkpKSB7Ci0JCQkJZmFjdCA9IGRlc2MuY3JlYXRlSW5zdGFuY2UoKTsKLQkJCQlpZiAoZmFjdCAhPSBudWxsKQotCQkJCQlmYWN0b3JpZXMuYWRkKGZhY3QpOwotCQkJfQotCQl9Ci0JCWlmIChmYWN0b3JpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIG5ldyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBkZXNjCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUVuYWJsZW1lbnRJZGVudGlmaWVyIGdldElkZW50aWZpZXIoT2JqZWN0IHByb2plY3QsIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjKSB7Ci0JCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLQkJaWYgKGlzUmVzcGVjdGluZ0FjdGl2aXRpZXMoKSAmJiBwcm9qZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlpZGVudGlmaWVyID0gSUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzYy5nZXRJRCgpLCAoSVByb2plY3QpIHByb2plY3QpOwotCQllbHNlIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlpZGVudGlmaWVyID0gRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihkZXNjLmdldElEKCksIChJUHJvamVjdCkgcHJvamVjdCk7Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZXNwZWN0aW5nQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIHJlc3BlY3RpbmdBY3Rpdml0aWVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVySWZOZWNlc3NhcnkoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIpIHsKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWRlbnRpZmllci5hZGRJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCWdldEVuYWJsZW1lbnRJZGVudGlmaWVycygpLmFkZChpZGVudGlmaWVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpc3RlbmluZ1RvKElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBnZXRFbmFibGVtZW50SWRlbnRpZmllcnMoKS5jb250YWlucyhpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVuYWJsZW1lbnRJZGVudGlmaWVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2V0IGdldEVuYWJsZW1lbnRJZGVudGlmaWVycygpIHsKLQkJaWYgKGVuYWJsZW1lbnRJZGVudGlmaWVycyA9PSBudWxsKQotCQkJZW5hYmxlbWVudElkZW50aWZpZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJcmV0dXJuIGVuYWJsZW1lbnRJZGVudGlmaWVyczsKLQl9Ci0KLQlwcml2YXRlIFNldCBlbmFibGVtZW50SWRlbnRpZmllcnM7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyI2lkZW50aWZpZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBpZGVudGlmaWVyRXZlbnQpIHsKLQkJaWYgKGlkZW50aWZpZXJFdmVudC5oYXNFbmFibGVkQ2hhbmdlZCgpIHx8IGlkZW50aWZpZXJFdmVudC5oYXNGdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZCgpKSB7Ci0JCQlPYmplY3QgcHJvamVjdCA9ICgoRW5hYmxlbWVudElkZW50aWZpZXIpIGlkZW50aWZpZXJFdmVudC5nZXRJZGVudGlmaWVyKCkpLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZW1vdmVBZGFwdGVyRmFjdG9yaWVzKHByb2plY3QpOwotCQkJCS8qCi0JCQkJICogZmluYWwgTm90aWZpZXIgbm90aWZpZXIgPSAoTm90aWZpZXIpIGdldENhY2hlZFJvb3RzKCkuZ2V0KHByb2plY3QpOwotCQkJCSAqLwotCQkJCS8qIGZvcmNlIGEgdmlld2VyIHJlZnJlc2ggKi8KLQkJCQlub3RpZnlDaGFuZ2VkKG5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5BREQsIG51bGwsIG51bGwpIHsKLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXROb3RpZmllcigpCi0JCQkJCSAqLwotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJCQkJCXJldHVybiBudWxsOyAvLyBub3RpZmllcjsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJLyogZWxzZSByZXBsYWNlIGVudGlyZSBzdHJ1Y3R1cmUgKi8KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCXJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWFiMzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VNRldvcmtiZW5jaEVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlBhc3N0aHJ1UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLlRocm93YWJsZTsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vdGhlIElEIGZvciB0aGlzIHBsdWdpbiAoYWRkZWQgYXV0b21hdGljYWxseSBieSBsb2dnaW5nIHF1aWNrZml4KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9GQUNUT1JJRVNfRVhURU5TSU9OX1BPSU5UID0gImVkaXRNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0VYVEVOU0lPTl9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiZWRpdE1vZGVsRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfRkFDVE9SWV9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiYWRhcHRlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luIHBsdWdpbjsgCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnR1cCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUV4dGVuZGVkRWNvcmVVdGlsLnNldEZpbGVOb3RGb3VuZERldGVjdG9yKG5ldyBFeHRlbmRlZEVjb3JlVXRpbC5GaWxlTm90Rm91bmREZXRlY3RvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzRmlsZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1Jlc291cmNlTm90Rm91bmQod3JhcHBlZEV4KSB8fCB3cmFwcGVkRXguZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb247Ci0JCQl9Ci0JCX0pOwotCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pbml0aWFsaXplRmlsZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVJc29sYXRlZFJlc291cmNlU2V0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBQYXNzdGhydVJlc291cmNlU2V0KHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlV29ya3NwYWNlUGFzc3RocnVSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIG5ldyBQYXNzdGhydVJlc291cmNlU2V0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBleGNlcHRpb24uZ2V0U3RhdHVzKCkgKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyhjcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSkpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODMxMThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVNhdmVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlSGFuZGxlckhlYWRsZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlSGFuZGxlclJlZ2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklPcGVyYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkNsaWVudEFjY2Vzc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FZGl0TW9kZWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LlJlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0TW9kZWwgaW1wbGVtZW50cyBDb21tYW5kU3RhY2tMaXN0ZW5lciwgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIsIFJlc291cmNlU3RhdGVWYWxpZGF0b3IsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwcml2YXRlIE1hcCBwYXJhbXM7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWRpdE1vZGVsSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlYWRPbmx5OwotCS8vIFRoZXNlIGFyZSB0aGUgY3VycmVudCByZXNvdXJjZSB1cmlzIHdlIG5lZWQgdG8gdHJhY2sKLQlwcm90ZWN0ZWQgTGlzdCBrbm93blJlc291cmNlVXJpczsKLQkvLyBUaGVzZSBhcmUgdGhlIGN1cnJlbnQgcmVzb3VyY2UgZXh0ZW5zaW9ucyB0byB0cmFjawotCXByb3RlY3RlZCBMaXN0IGtub3duUmVzb3VyY2VFeHRlbnNpb25zOwotCS8vIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGtub3duIHJlc291cmNlIHVyaXMsIHdoaWNoIHdlIGhhdmUgcmVxdWVzdGVkIGJlIGF1dG9sb2FkZWQKLQlwcm90ZWN0ZWQgTGlzdCBwcmVsb2FkUmVzb3VyY2VVcmlzOwotCS8vIFRoaXMgaXMgYSBtYXAgb2YgaWRlbnRpZmllcnMgdG8gcmVzb3VyY2VzIHRoYXQgd2UgbmVlZCB0byBsaXN0ZW4gdG8gaW4gb3JkZXIgdG8gbGlzdGVuIGZvcgotCS8vIHVwZGF0ZXMgdG8gdGhlIGVkaXQgbW9kZWwgcmVzb3VyY2VzCi0JcHJvdGVjdGVkIE1hcCByZXNvdXJjZUlkZW50aWZpZXJzOwotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbEV2ZW50IGRpcnR5TW9kZWxFdmVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcG9zaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3Igc3RhdGVWYWxpZGF0b3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXM7Ci0JcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVyKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXZlcnRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZXM7Ci0JcHJpdmF0ZSBDbGllbnRBY2Nlc3NSZWdpc3RyeSByZWdpc3RyeTsKLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dCBlbWZDb250ZXh0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQlwcml2YXRlIFJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb247Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoIWlzRGlzcG9zaW5nKCkgJiYgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQgJiYgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEKSB7Ci0JCQkJcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgbm90aWZpY2F0aW9uLmdldE9sZEJvb2xlYW5WYWx1ZSgpLCBub3RpZmljYXRpb24uZ2V0TmV3Qm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiByZWFkT25seSkgewotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRU1GIGNvbnRleHQgY2FuJ3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZWRpdE1vZGVsSUQgPSBlZGl0TW9kZWxJRDsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCQlpZiAocmVhZE9ubHkpCi0JCQl0aGlzLnJlZ2lzdHJ5ID0gbmV3IFJlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkoKTsKLQkJZWxzZQotCQkJdGhpcy5yZWdpc3RyeSA9IG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeSgpOwotCQl0aGlzLmVtZkNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLnByb2plY3QgPSBjb250ZXh0LmdldFByb2plY3QoKTsKLQkJaW5pdGlhbGl6ZUtub3duUmVzb3VyY2VVcmlzKCk7Ci0JCXByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoKTsKLQkJcHJvY2Vzc1ByZWxvYWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJlYWRPbmx5LCBib29sZWFuIGFjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KSB7Ci0JCXRoaXMoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHJlYWRPbmx5KTsKLQkJdGhpcy5hY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyA9IGFjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZWRpdE1vZGVsSUQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRNb2RlbElEKCkgewotCQlyZXR1cm4gZWRpdE1vZGVsSUQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NpbmcoKSB7Ci0JCXJldHVybiBkaXNwb3Npbmc7Ci0JfQotCi0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGJlIG1hZGUKLQkgKiBmaW5hbCBpbiB0aGUgbmV4dCByZWxlYXNlLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBkb0Rpc3Bvc2UoKSBhcwotCSAqIG5lY2Vzc2FyeSB0byBkaXNwb3NlIGFueSBhZGRpdGlvbmFsIGFydGlmYWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJaWYgKGRpc3Bvc2luZyB8fCBkaXNwb3NlZCkKLQkJCQlyZXR1cm47Ci0JCQlkaXNwb3NpbmcgPSB0cnVlOwotCQkKLQkJCWlmIChoYXNMaXN0ZW5lcnMoKSkKLQkJCQlub3RpZnlMaXN0ZW5lcnMobmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFLCB0aGlzKSk7Ci0JCQkKLQkJCXJlbGVhc2VSZXNvdXJjZXMoKTsKLQotCQkJaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQotCQkJCWNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcih0aGlzKTsKLQkJCWlmIChnZXRFbWZDb250ZXh0KCkgIT0gbnVsbCkKLQkJCQlnZXRFbWZDb250ZXh0KCkucmVtb3ZlRWRpdE1vZGVsKHRoaXMsIGlzUmVhZE9ubHkoKSk7Ci0JCQlyZWxlYXNlUHJlbG9hZFJlc291cmNlcygpOwotCQkJcmVsZWFzZUlkZW50aWZpZXJzKCk7Ci0JCQlkb0Rpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5sb2dFcnJvcihyZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbWZDb250ZXh0ID0gbnVsbDsKLQkJCXJlc291cmNlcyA9IG51bGw7Ci0JCQlwcm9qZWN0ID0gbnVsbDsKLQkJCWRpc3Bvc2VkID0gdHJ1ZTsKLQkJCWRpc3Bvc2luZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VJZGVudGlmaWVycygpIHsKLQkJaWYgKHJlc291cmNlSWRlbnRpZmllcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXRlciA9IHJlc291cmNlSWRlbnRpZmllcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlkZW50aWZpZXIgPSAoSUVuYWJsZW1lbnRJZGVudGlmaWVyKSBpdGVyLm5leHQoKTsKLQkJCWlkZW50aWZpZXIucmVtb3ZlSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpIHsKLQkJaWYgKGVtZkNvbnRleHQgPT0gbnVsbCB8fCAhZW1mQ29udGV4dC5oYXNSZXNvdXJjZVNldCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUHJlbG9hZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRSZXNvdXJjZVNldFN5bmNocm9uaXplcigpOwotCQlpZiAoc3luYyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWxvYWRSZXNvdXJjZVVyaXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlVUkkgdXJpID0gKFVSSSkgcHJlbG9hZFJlc291cmNlVXJpcy5nZXQoaSk7Ci0JCQkJc3luYy5kaXNhYmxlQXV0b2xvYWQodXJpKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwga25vd25SZXNvdXJjZUV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgZXh0ID0gKFN0cmluZykga25vd25SZXNvdXJjZUV4dGVuc2lvbnMuZ2V0KGkpOwotCQkJCXN5bmMuZGlzYWJsZUF1dG9sb2FkKGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKiAqKiBCRUdJTiBDb21tYW5kIFN0YWNrIE1hbmlwdWxhdGlvbiAqKiogKi8KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ29tbWFuZFN0YWNrLgotCSAqLwotCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjcmVhdGVDb21tYW5kU3RhY2soKSB7Ci0JCUJhc2ljQ29tbWFuZFN0YWNrIHN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0JCXJldHVybiBzdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSB7QGxpbmtvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrfSdzIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoamF2YS51dGlsLkV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCWlmIChkaXJ0eU1vZGVsRXZlbnQgPT0gbnVsbCkKLQkJCWRpcnR5TW9kZWxFdmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5ESVJUWSwgdGhpcyk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkKLQkJCW5vdGlmeUxpc3RlbmVycyhkaXJ0eU1vZGVsRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEZsdXNoIHRoZSBDb21tYW5kcyBmcm9tIHRoZSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmx1c2hDb21tYW5kU3RhY2soKSB7Ci0JCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCWdldENvbW1hbmRTdGFjaygpLnNhdmVJc0RvbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwdWJsaWMgQmFzaWNDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlpZiAoY29tbWFuZFN0YWNrID09IG51bGwpIHsKLQkJCWNvbW1hbmRTdGFjayA9IGNyZWF0ZUNvbW1hbmRTdGFjaygpOwotCQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kU3RhY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gIWxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqICoqIEVORCBDb21tYW5kIFN0YWNrIE1hbmlwdWxhdGlvbiAqKiogKi8KLQotCS8qKiAqKiBCRUdJTiBMaXN0ZW5lcnMgKioqICovCi0KLQkvKioKLQkgKiBBZGQKLQkgKiAKLQkgKiBAYUxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsKQotCQkJbGlzdGVuZXJzLmFkZChhTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YKLQkgKiAKLQkgKiBAYW5FdmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQkKLQkJTm90aWZ5UnVubmVyIG5vdGlmaWVyID0gbmV3IE5vdGlmeVJ1bm5lcihhbkV2ZW50KTsgCi0JCQotCQlPYmplY3RbXSBub3RpZnlMaXN0ID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOyAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlub3RpZmllci5zZXRMaXN0ZW5lciggKEVkaXRNb2RlbExpc3RlbmVyKSBub3RpZnlMaXN0W2ldICk7Ci0JCQlTYWZlUnVubmVyLnJ1bihub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUKLQkgKiAKLQkgKiBAYUxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUxpc3RlbmVyKEVkaXRNb2RlbExpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGFMaXN0ZW5lcik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKiAqKiBFTkQgTGlzdGVuZXJzICoqKiAqLwotCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUZpbGVFZGl0YWJsZShJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYUZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuc2V0UmVhZE9ubHkoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3Qgb2YgSUZpbGU7IGFueSByZWFkLW9ubHkgZmlsZXMgdGhhdCB3aWxsIGJlIHRvdWNoZWQgaWYgdGhpcyBlZGl0IG1vZGVsCi0JICogICAgICAgICBzYXZlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlYWRPbmx5QWZmZWN0ZWRGaWxlcygpIHsKLQkJSXRlcmF0b3IgYWZmZWN0ZWQgPSBnZXRBZmZlY3RlZEZpbGVzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChhZmZlY3RlZC5oYXNOZXh0KCkpIHsKLQkJCUlGaWxlIGFGaWxlID0gKElGaWxlKSBhZmZlY3RlZC5uZXh0KCk7Ci0JCQlpZiAoYUZpbGUuaXNSZWFkT25seSgpKQotCQkJCXJlc3VsdC5hZGQoYUZpbGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqICoqIEJFR0lOIFNhdmUgSGFuZGxlcnMgKioqICovCi0KLQlwcm90ZWN0ZWQgSVNhdmVIYW5kbGVyIGdldFNhdmVIYW5kbGVyKCkgewotCQlyZXR1cm4gU2F2ZUhhbmRsZXJSZWdpc3Rlci5nZXRTYXZlSGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgc2F2ZUlmTmVjZXNzYXJ5IG9yCi0JICogc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdCBkZXRlcm1pbmVzIG5vdCB0byBzYXZlLiBUaGlzIHByb3ZpZGVzIHN1YmNsYXNzZXMgd2l0aCBhbgotCSAqIG9wcG9ydHVuaXR5IHRvIGRvIHNvbWUgb3RoZXIgYWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlzYXZlKG51bGwsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yIHsKLQkJLy8gc2F2ZQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHtAbGluayAjcHJpbVNhdmV9Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBhY2Nlc3NvcktleSkgewotCQlhc3NlcnRQZXJtaXNzaW9uVG9TYXZlKGFjY2Vzc29yS2V5KTsKLQkJZ2V0U2F2ZUhhbmRsZXIoKS5hY2Nlc3MoKTsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQkJcHJpbVNhdmUoYU1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5TYXZlT3BlcmF0aW9uKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5oYW5kbGVTYXZlRmFpbGVkKGV4LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGV4KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFNhdmVIYW5kbGVyKCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgKGkuZS4sIG5vIG90aGVyIHJlZmVyZW5jZXMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJc2F2ZUlmTmVjZXNzYXJ5KG51bGwsIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBiZSBzYXZlZCAoaS5lLiwgbm8gb3RoZXIgcmVmZXJlbmNlcykuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmIChzaG91bGRTYXZlKCkpCi0JCQlzYXZlKG1vbml0b3IsIGFjY2Vzc29yS2V5KTsKLQkJZWxzZQotCQkJaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcwotCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKLQkgKiAKLQkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAotCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobnVsbCwgb3BlcmF0aW9uSGFuZGxlciwgYWNjZXNzb3JLZXkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSBpZiBuZWNlc3NhcnkuIElmIHR5cGljYWxseSBhIHNhdmUgd291bGQgbm90IG9jY3VyIGJlY2F1c2UgdGhpcyBlZGl0IG1vZGVsIGlzCi0JICogc2hhcmVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHVzaW5nIHRoZQotCSAqIAotCSAqIEBvcGVyYXRpb25IYW5kbGVyLiBJZiB0aGUgcHJvbXB0IHJldHVybnMgdHJ1ZSAodGhlIHVzZXIgd2FudHMgdG8gc2F2ZSkgdGhlIGVudGlyZSBlZGl0IG1vZGVsCi0JICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2F2ZWQuIFlvdSBtYXkgcGFzcyBpbiBhIGJvb2xlYW4gPGNvZGU+d2FzRGlydHk8L2NvZGU+IHRvCi0JICogICAgICAgICAgICAgICAgICAgIGluZGljYXRlIHdoZXRoZXIgdGhpcyBlZGl0IG1vZGVsIHdhcyBkaXJ0eSBwcmlvciB0byBtYWtpbmcgYW55IGNoYW5nZXMgYW5kCi0JICogICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBtZXRob2QuIHtAbGluayBFZGl0TW9kZWwjaXNEaXJ0eSgpfQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgYm9vbGVhbiB3YXNEaXJ0eSwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobnVsbCwgb3BlcmF0aW9uSGFuZGxlciwgd2FzRGlydHksIGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcwotCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKLQkgKiAKLQkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAotCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChtb25pdG9yLCBvcGVyYXRpb25IYW5kbGVyLCB0cnVlLCBhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKLQkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlCi0JICogCi0JICogQG9wZXJhdGlvbkhhbmRsZXIuIElmIHRoZSBwcm9tcHQgcmV0dXJucyB0cnVlICh0aGUgdXNlciB3YW50cyB0byBzYXZlKSB0aGUgZW50aXJlIGVkaXQgbW9kZWwKLQkgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzYXZlZC4gWW91IG1heSBwYXNzIGluIGEgYm9vbGVhbiA8Y29kZT53YXNEaXJ0eTwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGUgd2hldGhlciB0aGlzIGVkaXQgbW9kZWwgd2FzIGRpcnR5IHByaW9yIHRvIG1ha2luZyBhbnkgY2hhbmdlcyBhbmQKLQkgKiAgICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIG1ldGhvZC4ge0BsaW5rIEVkaXRNb2RlbCNpc0RpcnR5KCl9Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHksIE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCWlmIChzaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIsIHdhc0RpcnR5KSkKLQkJCXNhdmUobW9uaXRvciwgYWNjZXNzb3JLZXkpOwotCQllbHNlCi0JCQloYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFBlcm1pc3Npb25Ub1NhdmUoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJcmVnaXN0cnkuYXNzZXJ0QWNjZXNzKGFjY2Vzc29yS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5TYXZlT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHkpIHsKLQkJcmV0dXJuICF3YXNEaXJ0eSA/IHNob3VsZFNhdmUoKSA6IHNob3VsZFNhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHVyaSBmb3IKLQkgKiAKLQkgKiBAYVJlc291cmNlIGlzIG9uZSBvZiB0aGUga25vd24gcmVzb3VyY2UgdXJpcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlVXJpKGFSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUmVzb3VyY2VVcmkoVVJJIHJlc1VSSSkgewotCQlVUkkgdXJpOwotCQlMaXN0IHVyaVN0cmluZ3MgPSBnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaVN0cmluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCXVyaSA9IChVUkkpIHVyaVN0cmluZ3MuZ2V0KGkpOwotCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmVuZHNXaXRoKHJlc1VSSSwgdXJpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgYWRkIFVSSXMgKHR5cGUgVVJJKSBvZiBrbm93biByZXNvdXJjZXMuIFlvdSBtdXN0IGFkZCByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgcmVmZXJlbmNlcyB0byBvdGhlciBrbm93biByZXNvdXJjZXMgZmlyc3Qgc28gdGhleSB3aWxsIGJlIHJlbGVhc2VkIGZpcnN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVLbm93blJlc291cmNlVXJpcygpIHsKLQkJa25vd25SZXNvdXJjZVVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByZWxvYWRSZXNvdXJjZVVyaXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVkaXRNb2RlbFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gZWRpdE1vZGVsUmVzb3VyY2VzID0gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFZGl0TW9kZWxSZXNvdXJjZXMoZ2V0RWRpdE1vZGVsSUQoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBlZGl0TW9kZWxSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXMgPSAoRWRpdE1vZGVsUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJYWRkRWRpdE1vZGVsUmVzb3VyY2UocmVzKTsKLQkJfQotCQlDb2xsZWN0aW9uIHJlc291cmNlRXh0ZW5zaW9ucyA9IEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucyhnZXRFZGl0TW9kZWxJRCgpKTsKLQkJLyogYnVnIDE3MDY5MCAtIGluaXRpYWxpemUga25vd25SZXNvdXJjZUV4dGVuc2lvbnMgaWYgbmVjZXNzYXJ5LCBhbmQgY2hhbmdlIHJlZmVyZW5jZSBmcm9tIGl0ZXIgdG8gaXQgKi8KLQkJaWYgKGtub3duUmVzb3VyY2VFeHRlbnNpb25zID09IG51bGwpCi0JCXsKLQkJCWtub3duUmVzb3VyY2VFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICghcmVzb3VyY2VFeHRlbnNpb25zLmlzRW1wdHkoKSkKLQkJewotCQkJa25vd25SZXNvdXJjZUV4dGVuc2lvbnMuYWRkQWxsKHJlc291cmNlRXh0ZW5zaW9ucyk7Ci0JCQlJdGVyYXRvciBpdCA9IHJlc291cmNlRXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmMgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlzeW5jLmVuYWJsZUF1dG9sb2FkKGl0Lm5leHQoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFZGl0TW9kZWxSZXNvdXJjZShFZGl0TW9kZWxSZXNvdXJjZSByZXMpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzLmlzQ29yZSgpKSB7Ci0JCQkJZW5hYmxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gcmVzLmdldEVuYWJsZW1lbnRJZGVudGlmaWVyKGdldFByb2plY3QoKSk7Ci0JCQkJcmVnaXN0ZXJJbnRlcmVzdChpZGVudGlmaWVyLCByZXMpOwotCQkJCWVuYWJsZWQgPSBpZGVudGlmaWVyLmlzRW5hYmxlZCgpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ1dhcm5pbmcocmUpOwotCQl9Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQkJa25vd25SZXNvdXJjZVVyaXMuYWRkKHVyaSk7Ci0JCQlpZiAocmVzLmlzQXV0b0xvYWQoKSkgewotCQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQkJc3luYy5lbmFibGVBdXRvbG9hZCh1cmkpOwotCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMuYWRkKHVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW50ZXJlc3QoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIsIEVkaXRNb2RlbFJlc291cmNlIHJlcykgewotCQlnZXRFZGl0TW9kZWxSZXNvdXJjZXMoaWRlbnRpZmllcikuYWRkKHJlcyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEVkaXRNb2RlbFJlc291cmNlcyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgewotCQlpZiAocmVzb3VyY2VJZGVudGlmaWVycyA9PSBudWxsKQotCQkJcmVzb3VyY2VJZGVudGlmaWVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgdFJlc291cmNlcyA9IChMaXN0KSByZXNvdXJjZUlkZW50aWZpZXJzLmdldChpZGVudGlmaWVyKTsKLQkJaWYgKHRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJdFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCQlyZXNvdXJjZUlkZW50aWZpZXJzLnB1dChpZGVudGlmaWVyLCB0UmVzb3VyY2VzKTsKLQkJCWlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB0UmVzb3VyY2VzOwotCX0KLQotCi0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0S25vd25SZXNvdXJjZVVyaXMoKSB7Ci0JCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUtub3duUmVzb3VyY2VVcmlzKCk7Ci0KLQkJcmV0dXJuIGtub3duUmVzb3VyY2VVcmlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gcmVnaXN0cnkuc2l6ZSgpID4gMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2NhY2hlTm9uUmVzb3VyY2VWYWxpZGF0ZVN0YXRlKExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdGF0ZVZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZ2V0U3RhdGVWYWxpZGF0b3IoKSB7Ci0JCWlmIChzdGF0ZVZhbGlkYXRvciA9PSBudWxsKQotCQkJc3RhdGVWYWxpZGF0b3IgPSBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpOwotCQlyZXR1cm4gc3RhdGVWYWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNyZWF0ZVN0YXRlVmFsaWRhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcgotCSAqLwotCXByaXZhdGUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tBY3RpdmF0aW9uKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2xvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5sb3N0QWN0aXZhdGlvbihwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciN2YWxpZGF0ZVN0YXRlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJlc2VudGVyID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkudmFsaWRhdGVTdGF0ZShwcmVzZW50ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciNjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tTYXZlKHByZXNlbnRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrUmVhZE9ubHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrUmVhZE9ubHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlU2V0IGZyb20gdGhlIE5hdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCi0JCQlyZXNvdXJjZVNldCA9IGdldEVtZkNvbnRleHQoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmICghaXNSZXZlcnRpbmcgJiYgIWRpc3Bvc2luZyAmJiBoYXNMaXN0ZW5lcnMoKSkgewotCQkJaW50IGV2ZW50Q29kZSA9IG5ld1ZhbHVlID8gRWRpdE1vZGVsRXZlbnQuTE9BREVEX1JFU09VUkNFIDogRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0U7Ci0JCQlFZGl0TW9kZWxFdmVudCBldnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoZXZlbnRDb2RlLCB0aGlzKTsKLQkJCWV2dC5hZGRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldE9yQ3JlYXRlUmVzb3VyY2UoYVVyaSwgZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChyZXMgIT0gbnVsbCkKLQkJCXByb2Nlc3NSZXNvdXJjZShyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKSB7Ci0JCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKSB7Ci0JCQkJYWNjZXNzKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7Ci0JCQkJLy8gV2UgbmVlZCBhIGJldHRlciB3YXkgdG8gcGFzcyB0aGlzIHRocm91Z2ggdGhlIHNhdmUgb3B0aW9ucyBpbnN0ZWFkLgotCQkJCS8vIFdlIGFsc28gbmVlZCB0byBtYWtlIHRoaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgcHJvamVjdCB0YXJnZXQKLQkJCQkoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCX0gZWxzZSBpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSB7Ci0JCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGFSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7Ci0JCQl9Ci0KLQkJCWFkZFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZXNvdXJjZSBmb3IKLQkgKiAKLQkgKiBAYVVyaS4KLQkgKi8KLQkvLyBUT0RPIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgb25seSB1c2UgdGhlIGxhc3Qgc2VnbWVudCB3aGVuIGxvb2tpbmcgZm9yIGEgcmVzb3VyY2UuCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlKExpc3QgdFJlc291cmNlcywgVVJJIGFVcmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmVuZHNXaXRoKHJlc291cmNlLmdldFVSSSgpLCBhVXJpKSkKLQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcHJvY2Vzc1Jlc291cmNlKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEdldCBhIGNhY2hlZCBSZXNvdXJjZSwgZWl0aGVyIGxvY2FsIG9yIGluIHRoZSBSZXNvdXJjZVNldCwgYmVmb3JlIGNyZWF0aW5nIGEgUmVzb3VyY2UuIFRoaXMKLQkgKiBhcGkgaGFuZGxlcyB0aGUgY2FzZSB0aGF0IHRoZSBSZXNvdXJjZSBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBkZW1hbmQgbG9hZCB0aGF0IGZhaWxlZC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmksIGdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgotCSAqIAotCSAqIEBhVXJpLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRBbmRMb2FkTG9jYWxSZXNvdXJjZShVUkkgYVVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCWlmIChudWxsICE9IHJlc291cmNlICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsgLy8gcmVsb2FkIGl0Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgotCSAqIAotCSAqIEBhVXJpLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRMb2NhbFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSwgYVVyaSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgUmVhZE9ubHkgRWRpdE1vZGVsIG9yIGlmIHdlIHNob3VsZCBvbmx5IGFjY2VzcyB1bmtub3duIFVSSXMgYXMKLQkgKiBSZWFkT25seS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2Nlc3NGb3JSZWFkKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHkoKSB8fCAoYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgJiYgIWlzSW50ZXJyZXN0ZWRJblJlc291cmNlKGFSZXNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIChpLmUuLCBubyBvdGhlciByZWZlcmVuY2VzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlpbnQgY29kZSA9IGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCk7Ci0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogewotCQkJCWlmICghaXNSZXZlcnRpbmcgJiYgaGFzUmVzb3VyY2VSZWZlcmVuY2UoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpKQotCQkJCQlyZW1vdmVSZXNvdXJjZXMoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSA6Ci0JCQkJaWYgKCFwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSkpCi0JCQkJCXJldHVybjsKLQkJfQotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCWFuRXZlbnQuc2V0RWRpdE1vZGVsKHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYVJlc291cmNlIGlzIHJlZmVyZW5jZWQgYnkgbWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb3VyY2VSZWZlcmVuY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYW55IFJlc291cmNlIGluIHRoZSBsaXN0IG9mCi0JICogCi0JICogQHJlc291cmNlcyBpcyByZWZlcmVuY2VkIGJ5IG1lLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlUmVmZXJlbmNlKExpc3QgdFJlc291cmNlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChoYXNSZXNvdXJjZVJlZmVyZW5jZSgoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgUmVzb3VyY2Ugb2JqZWN0cyBpbgotCSAqIAotCSAqIEBhTGlzdC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gb25lIG9yIG1vcmUgUmVzb3VyY2Ugb2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQotCSAqICAgICAgICAgUmVzb3VyY2VTZXQgd2l0aG91dCB0aGUgcmVmZXJlbmNlIGNvdW50IGdvaW5nIHRvIHplcm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VzKExpc3QgYUxpc3QpIHsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGFMaXN0LmdldChpKTsKLQkJCWlmIChyZW1vdmVSZXNvdXJjZShyZXMpICYmIHJlcyBpbnN0YW5jZW9mIFJlZmVyZW5jZWRSZXNvdXJjZSkKLQkJCQlyZW1vdmVkUmVzb3VyY2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVkUmVzb3VyY2UoUmVmZXJlbmNlZFJlc291cmNlIHJlZmVyZW5jZWRSZXNvdXJjZSkgewotCQlpZiAoIWlzUmVhZE9ubHkoKSAmJiByZWZlcmVuY2VkUmVzb3VyY2Uud2FzUmV2ZXJ0ZWQoKSkgewotCQkJaXNSZXZlcnRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlyZXZlcnRlZChyZWZlcmVuY2VkUmVzb3VyY2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpc1JldmVydGluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXMgPSBnZXRMb2NhbFJlc291cmNlKHVyaSk7Ci0JCXJldHVybiByZW1vdmVSZXNvdXJjZShyZXMpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlhUmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBvc3QgcHJvY2VzcyBhIHJlbW92ZWQgUmVmZXJlbmNlZFJlc291cmNlLgotCSAqIAotCSAqIEBzZWUgSjJFRUVkaXRNb2RlbCNyZXZlcnRBbGxSZXNvdXJjZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJldmVydGVkKFJlZmVyZW5jZWRSZXNvdXJjZSByZXZlcnRlZFJlc291cmNlKSB7Ci0JCXJldmVydEFsbFJlc291cmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldmVydEFsbFJlc291cmNlcygpIHsKLQkJTGlzdCBzb21lUmVzb3VyY2VzID0gZ2V0U29ydGVkUmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29tZVJlc291cmNlcy5zaXplKCk7IGkrKykKLQkJCSgoUmVzb3VyY2UpIHNvbWVSZXNvdXJjZXMuZ2V0KGkpKS51bmxvYWQoKTsKLQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlQWxsKHNvbWVSZXNvdXJjZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbWVSZXNvdXJjZXMuc2l6ZSgpOyBpKyspCi0JCQkoKFJlc291cmNlKSBzb21lUmVzb3VyY2VzLmdldChpKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ3JvdXAgdGhlIHJlc291cmNlcyBieSBYTUkgZmlyc3QsIHRoZW4gWE1MCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U29ydGVkUmVzb3VyY2VzKCkgewotCi0JCUxpc3QgdGhlUmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWludCBzaXplID0gdGhlUmVzb3VyY2VzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlSZXNvdXJjZVtdIHNvcnRlZCA9IG5ldyBSZXNvdXJjZVtzaXplXTsKLQkJaW50IHhtbEluc2VydFBvcyA9IHNpemUgLSAxOwotCQlpbnQgeG1pSW5zZXJ0UG9zID0gMDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgdGhlUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UpCi0JCQkJc29ydGVkW3htbEluc2VydFBvcy0tXSA9IHJlczsKLQkJCWVsc2UKLQkJCQlzb3J0ZWRbeG1pSW5zZXJ0UG9zKytdID0gcmVzOwotCQl9Ci0KLQkJcmV0dXJuIEFycmF5cy5hc0xpc3Qoc29ydGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIFJlc291cmNlcyB0aGF0IHdlIGFyZSBpbnRlcnJlc3RlZCBpbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChMaXN0IGFTb21lUmVzb3VyY2VzKSB7Ci0JCUxpc3Qgc29tZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoYVNvbWVSZXNvdXJjZXMpOwotCQlpbnQgc2l6ZSA9IHNvbWVSZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXM7Ci0JCWJvb2xlYW4gcHJvY2Vzc2VkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIHNvbWVSZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKChyZXMgIT0gbnVsbCkgJiYgKGlzSW50ZXJyZXN0ZWRJblJlc291cmNlKHJlcykpKSB7Ci0JCQkJcHJvY2Vzc1Jlc291cmNlKHJlcyk7Ci0JCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2Vzc2VkOwotCX0KLQotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0IGdldEVtZkNvbnRleHQoKSB7Ci0JCWlmIChpc0Rpc3Bvc2VkKCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFZGl0IE1vZGVsIGFscmVhZHkgZGlzcG9zZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW1mQ29udGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRU1GIGNvbnRleHQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbWZDb250ZXh0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0KLQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmKHByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSB2YWx1ZSBvZiB0aGUgcHJvamVjdCBhdHRyaWJ1dGUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgRU1GV29ya2JlbmNoQ29udGV4dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCXJlZ2lzdHJ5LmFjY2VzcyhhY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogQWNjZXNzCi0JICogCi0JICogQGFSZXNvdXJjZSBmb3IgcmVhZCBvciB3cml0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2Nlc3MoUmVmZXJlbmNlZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoc2hvdWxkQWNjZXNzRm9yUmVhZChhUmVzb3VyY2UpKQotCQkJYVJlc291cmNlLmFjY2Vzc0ZvclJlYWQoKTsKLQkJZWxzZQotCQkJYVJlc291cmNlLmFjY2Vzc0ZvcldyaXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGVhY2ggY2xpZW50IHdoZW4gdGhleSBhcmUgZmluaXNoZWQgd29ya2luZyB3aXRoIHRoZQotCSAqIEVkaXRNb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlQWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgewotCi0JCXJlZ2lzdHJ5LnJlbGVhc2UoYWNjZXNzb3JLZXkpOwotCi0JCWlmICghaXNEaXNwb3NpbmcoKSkgewotCQkJYm9vbGVhbiBzaG91bGREaXNwb3NlID0gZmFsc2U7Ci0JCQlzaG91bGREaXNwb3NlID0gcmVnaXN0cnkuc2l6ZSgpID09IDA7Ci0JCQlpZiAoc2hvdWxkRGlzcG9zZSkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgZWFjaCBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQotCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKQotCQkJcmVsZWFzZSgoUmVmZXJlbmNlZFJlc291cmNlKSBhUmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgZWFjaCBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZWZlcmVuY2VkUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQlhUmVzb3VyY2UucmVsZWFzZUZyb21SZWFkKCk7Ci0JCWVsc2UKLQkJCWFSZXNvdXJjZS5yZWxlYXNlRnJvbVdyaXRlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgdFJlc291cmNlcyA9IGdldFNvcnRlZFJlc291cmNlcygpOwotCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0UmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgdFJlc291cmNlcy5nZXQoaSk7Ci0JCQlyZWxlYXNlKHJlc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2VzID09IG51bGwgfHwgIWdldFJlc291cmNlcygpLmNvbnRhaW5zKGFSZXNvdXJjZSkpCi0JCQlyZXR1cm47Ci0JCWdldFJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24oKS5hZGQoYVJlc291cmNlKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkgewotCQlpZiAocmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbiA9PSBudWxsKQotCQkJcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbiA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCXJldHVybiByZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uOwotCX0KLQotCi0KLQkvKioKLQkgKiBSZW1vdmUgbXkgcmVmZXJlbmNlIHRvIGFSZXNvdXJjZSwgcmVtb3ZlIGl0IGZyb20gdGhlIFJlc291cmNlU2V0LCBhbmQgZGVsZXRlIGl0cyBmaWxlIGZyb20KLQkgKiB0aGUgV29ya2JlbmNoLiBUaGlzIG9ubHkgaGFwcGVucyBpZiB0aGVyZSBpcyBjdXJyZW50bHkgYSByZWZlcmVuY2UgdG8KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1EZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKHByaW1GbHVzaFJlc291cmNlKGFSZXNvdXJjZSkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0RW1mQ29udGV4dCgpLmRlbGV0ZVJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3aGF0IHNob3VsZCB3ZSBkbyBoZXJlPwotCQkJfQotCQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSwgdGhpcyk7Ci0JCQkJZXZlbnQuYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAocHJpbUZsdXNoUmVzb3VyY2UoYVJlc291cmNlKSkgewotCQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSwgdGhpcyk7Ci0JCQkJZXZlbnQuYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgbW9mUmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9mUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSAoUmVzb3VyY2UpIG1vZlJlc291cmNlcy5nZXQoaSk7Ci0JCQlJRmlsZSBvdXRwdXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGFSZXNvdXJjZSk7Ci0JCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkJYVNldC5hZGQob3V0cHV0KTsKLQkJfQotCQlyZXR1cm4gYVNldDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCByZXNldEtub3duUmVzb3VyY2VVcmlzKCkgewotCi0JCWluaXRpYWxpemVLbm93blJlc291cmNlVXJpcygpOwotCi0JCXJldHVybiBrbm93blJlc291cmNlVXJpczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzExLzIwMDEgNDoxNDoyNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZVVSSXMoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVVSSXMoZmFsc2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZVVSSXMoYm9vbGVhbiBvbmx5RGlydHkpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWludCBkaXJ0eUNvdW50ID0gMDsKLQkJU3RyaW5nW10gdXJpcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlSZXNvdXJjZSByZXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKLQkJCWlmICghb25seURpcnR5KQotCQkJCXVyaXNbaV0gPSByZXMuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCWVsc2UgaWYgKHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCQl1cmlzW2ldID0gcmVzLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJZGlydHlDb3VudCsrOwotCQkJfQotCQl9Ci0JCWlmIChvbmx5RGlydHkgJiYgZGlydHlDb3VudCA+IDApIHsKLQkJCVN0cmluZ1tdIGRpcnR5ID0gbmV3IFN0cmluZ1tkaXJ0eUNvdW50XTsKLQkJCWludCBqID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh1cmlzW2ldICE9IG51bGwpIHsKLQkJCQkJZGlydHlbal0gPSB1cmlzW2ldOwotCQkJCQlqKys7Ci0JCQkJfQotCQkJfQotCQkJdXJpcyA9IGRpcnR5OwotCQl9Ci0JCXJldHVybiB1cmlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4dGVudCBvZiB0aGUgcmVzb3VyY2U7IGxvZ3MgYW4gZXJyb3IgYW5kIHJldHVybnMgbnVsbCBpZgotCSAqIHRoZSBleHRlbnQgaXMgZW1wdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0Um9vdChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJRUxpc3QgZXh0ZW50ID0gYVJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCWlmIChleHRlbnQuc2l6ZSgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIGV4dGVudC5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBmYWlsdXJlIG9mCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKFJlc291cmNlIGFSZXNvdXJjZSwgRXhjZXB0aW9uIGUpIHsKLQkJYVJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQlpZiAoaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGUpICYmIHNob3VsZFNhdmVSZWFkT25seShhUmVzb3VyY2UpKQotCQkJc2F2ZVJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCWVsc2UKLQkJCXByaW1IYW5kbGVTYXZlRmFpbGVkKGFSZXNvdXJjZSwgZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IG9mIG15IHJlc291cmNlcyBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FueVJlc291cmNlRGlydHkoKSB7Ci0JCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmICgoKFJlc291cmNlKSBsaXN0LmdldChpKSkuaXNNb2RpZmllZCgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIHNhdmUgaXMgbmVlZGVkIG9uIHRoZSBDb21tYW5kU3RhY2sKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gaXNBbnlSZXNvdXJjZURpcnR5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm4gU2F2ZUhhbmRsZXJIZWFkbGVzcy5pc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHlvdSBjYW4gb25seSByZWFkIHRoZSByZXNvdXJjZXMgYW5kIG5vdCB3cml0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seUZhaWx1cmUoRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWFkT25seVJlc291cmNlKCkgewotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJCUlGaWxlIGZpbGU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlUmVzb3VyY2UoVVJJKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VSZXNvdXJjZShTdHJpbmcgYVVyaSkgewotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShhVXJpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IG9mIG15IHJlc291cmNlcyBoYXMgYSByZWZlcmVuY2UgY291bnQgb2Ygb25lIGFuZCBpdCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1RvU2F2ZSgpIHsKLQkJcmV0dXJuICFpc1NoYXJlZCgpICYmIGlzRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbXkgcmVmZXJlbmNlIHRvIGFSZXNvdXJjZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIFJlc291cmNlU2V0LiBSZXR1cm4gdHJ1ZSBpZiBhUmVzb3VyY2UKLQkgKiB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltRmx1c2hSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGhhc1Jlc291cmNlUmVmZXJlbmNlKGFSZXNvdXJjZSkpIHsKLQkJCXJlbW92ZVJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlyZW1vdmVSZXNvdXJjZVNldFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBmYWlsdXJlIG9mCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltSGFuZGxlU2F2ZUZhaWxlZChSZXNvdXJjZSBhUmVzb3VyY2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCUV4Y2VwdGlvbiBuZXN0ZWQgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQotCQkJbmVzdGVkID0gKChJV0ZUV3JhcHBlZEV4Y2VwdGlvbikgZSkuZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCWVsc2UKLQkJCW5lc3RlZCA9IGU7Ci0KLQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQW5fZXJyb3Jfb2NjdXJyZWRfd2hpbGVfc2FfRVJST1JfIiksIG5lc3RlZCk7IC8vJE5PTi1OTFMtMSQgPSAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nLiIKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgZm9yIGEgc2F2ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRUb1NhdmUoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlcikgewotCQlpZiAob3BlcmF0aW9uSGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb3BlcmF0aW9uSGFuZGxlci5jYW5Db250aW51ZShFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZm9sbG93aW5nX3Jlc291cmNlc19uZV9VSV8iKSwgZ2V0UmVzb3VyY2VVUklzKHRydWUpKTsgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZm9sbG93aW5nIHJlc291cmNlcyBuZWVkIHRvIGJlIHNhdmVkIGJ1dCBhcmUgY3VycmVudGx5IHNoYXJlZCwgZG8geW91IHdhbnQgdG8gc2F2ZSBub3c/IgotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBmb3JjZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgUmVzb3VyY2VzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoaXNSZWFkT25seSgpKQotCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nCi0JCWRlbGV0ZVJlc291cmNlc0lmTmVjZXNzYXJ5KCk7Ci0JCVJlc291cmNlIHJlc291cmNlOwotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIHNhdmUKLQkJTGlzdCBsb2NhbFJlc291cmNlcyA9IGdldFNvcnRlZFJlc291cmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgbG9jYWxSZXNvdXJjZXMuZ2V0KGkpOwotCQkJc2F2ZVJlc291cmNlKHJlc291cmNlKTsKLQkJfQotCQlnZXRDb21tYW5kU3RhY2soKS5zYXZlSXNEb25lKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJRWRpdE1vZGVsRXZlbnQgZXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuU0FWRSwgdGhpcyk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVzb3VyY2VzSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uID09IG51bGwgfHwgcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbi5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJUmVzb3VyY2UgZGVhZHJlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLnNpemUoKTsgaSsrKSB7Ci0JCQlkZWFkcmVzID0gKFJlc291cmNlKSBnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkuZ2V0KGkpOwotCQkJcHJpbURlbGV0ZVJlc291cmNlKGRlYWRyZXMpOwotCi0JCQlnZXRSZXNvdXJjZXMoKS5yZW1vdmUoZGVhZHJlcyk7Ci0JCQlnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkucmVtb3ZlKGRlYWRyZXMpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqIFNhdmUKLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1TYXZlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFSZXNvdXJjZS5pc01vZGlmaWVkKCkpCi0JCQlhUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgbG9hZGVkID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJaWYgKCFsb2FkZWQuaXNFbXB0eSgpKQotCQkJcHJvY2Vzc1Jlc291cmNlc0lmSW50ZXJyZXN0ZWQobG9hZGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1ByZWxvYWRSZXNvdXJjZXMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlbG9hZFJlc291cmNlVXJpcy5zaXplKCk7IGkrKykgewotCQkJVVJJIHVyaSA9IChVUkkpIHByZWxvYWRSZXNvdXJjZVVyaXMuZ2V0KGkpOwotCQkJZ2V0UmVzb3VyY2UodXJpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhUmVzb3VyY2UgZnJvbSBteSBSZXNvdXJjZVNldC4gUmV0dXJuIHRydWUgaWYgYVJlc291cmNlIHdhcyByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVJlc291cmNlU2V0UmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWFSZXNvdXJjZS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCWFSZXNvdXJjZS51bmxvYWQoKTsKLQkJYVJlc291cmNlLmVTZXREZWxpdmVyKHRydWUpOwotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoYVJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCXByaW1TYXZlUmVzb3VyY2UocmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlU2F2ZUZhaWxlZChyZXNvdXJjZSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKCkgewotCQlyZXR1cm4gIWlzUmVhZE9ubHkoKSAmJiAhaXNTaGFyZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJcmV0dXJuIHNob3VsZFNhdmUoKSB8fCBwcm9tcHRUb1NhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZVJlYWRPbmx5KFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoYVJlc291cmNlKTsKLQkJaWYgKGFGaWxlID09IG51bGwgfHwgIWFGaWxlLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZ2V0U2F2ZUhhbmRsZXIoKS5zaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUoYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIEZvcmNlIGFsbCBvZiB0aGUga25vd24gcmVzb3VyY2UgVVJJcyB0byBiZSBsb2FkZWQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VMb2FkS25vd25SZXNvdXJjZXMoKSB7Ci0JCUxpc3QgdXJpcyA9IGdldEtub3duUmVzb3VyY2VVcmlzKCk7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMuc2l6ZSgpOyBpKyspIHsKLQkJCXVyaSA9IChVUkkpIHVyaXMuZ2V0KGkpOwotCQkJZ2V0UmVzb3VyY2UodXJpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB5b3Ugd2FudCB0byBleHRlbmQgdGhpcyBlZGl0IG1vZGVsIHRvIGhhbmRsZSBhIHJlc291cmNlCi0JICogd2l0aCBhIFVSSSBlcXVhbCB0byA8Y29kZT5hUmVsYXRpdmVVUkk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIG1hbmFnZUV4dGVuc2lvblJlc291cmNlVVJJKFN0cmluZyBhUmVsYXRpdmVVUkkpIHsKLQkJaWYgKGFSZWxhdGl2ZVVSSSAhPSBudWxsICYmIGFSZWxhdGl2ZVVSSS5sZW5ndGgoKSA+IDApIHsKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGFSZWxhdGl2ZVVSSSk7Ci0JCQlpZiAoIWlzSW50ZXJyZXN0ZWRJblJlc291cmNlVXJpKHVyaSkpIHsKLQkJCQlnZXRLbm93blJlc291cmNlVXJpcygpLmFkZCh1cmkpOwotCQkJCS8vIFByb2Nlc3MgdGhlIHJlc291cmNlIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLgotCQkJCXRyeSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IGdldEVtZkNvbnRleHQoKS5nZXRSZXNvdXJjZSh1cmkpOwotCQkJCQlpZiAocmVzICE9IG51bGwpCi0JCQkJCQlwcm9jZXNzUmVzb3VyY2UocmVzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBJZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBjYWNoZWQgUmVzb3VyY2Ugb3IgdHJ5IHRvIGxvYWQgdGhlIFJlc291cmNlIHByaW9yIHRvIGNyZWF0aW5nIGEgUmVzb3VyY2UuIFRoaXMgYXBpCi0JICogaGFuZGxlcyB0aGUgY2FzZSB0aGF0IHRoZSBSZXNvdXJjZSBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgdGhlIGxvYWQuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldE9yQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzKCkgewotCQlyZXR1cm4gYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXM7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgYXBpIHRvIGluZGljYXRlIHRoYXQgeW91IHdhbnQgYWxsIHVua25vd24gUmVzb3VyY2VzIHRvIGJlIGFjY2Vzc2VkIGZvciBSZWFkT25seS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzKGJvb2xlYW4gYikgewotCQlhY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyA9IGI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQlidWZmZXIuYXBwZW5kKCIgUiA9ICIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIiBXID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRSZWdpc3RyeSgpLnNpemUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIltJRDogXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldEVkaXRNb2RlbElEKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcIiBLbm93biBSZXNvdXJjZXM6IFsiKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IHVyaXMgPSBnZXRLbm93blJlc291cmNlVXJpcygpOwotCQlpZiAodXJpcyAhPSBudWxsKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKHVyaXMuc2l6ZSgpIC0gMSk7IGkrKykKLQkJCQlidWZmZXIuYXBwZW5kKHVyaXMuZ2V0KGkpICsgIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodXJpcy5nZXQoaSkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgibm9uZSIpOyAvLyROT04tTkxTLTEkCi0KLQotCQlidWZmZXIuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKCk7Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDbGllbnRBY2Nlc3NSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIHJlZ2lzdHJ5OwotCX0KLQotCXB1YmxpYyBjbGFzcyBSZWZlcmVuY2UgewotCi0JCXByb3RlY3RlZCBTdHJpbmcgdG9zdHJpbmcgPSBudWxsOwotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmICh0b3N0cmluZyA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkVkaXRNb2RlbC5SZWZlcmVuY2UgWyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZCgieyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChnZXRFZGl0TW9kZWxJRCgpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCJ9IHsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgifV0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRvc3RyaW5nID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdG9zdHJpbmc7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoKS5oYXNoQ29kZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgLSBieSBkZWZhdWx0IHRoaXMgd2lsbCByZXR1cm4gdGhlIGZpcnN0IHJvb3Qgb2JqZWN0IGZyb20gdGhlIGZpcnN0Ci0JICogcmVzb3VyY2UgcmVmZXJlbmNlZCBieSB0aGUga25vd24gcmVzb3VyY2UgVVJJcyBmb3IgdGhpcyBFZGl0TW9kZWwKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIEVPYmplY3Qgb3IgTnVsbAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFByaW1hcnlSb290T2JqZWN0KCkgewotCQlSZXNvdXJjZSByZXMgPSBnZXRQcmltYXJ5UmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsIHx8IHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIC0gYnkgZGVmYXVsdCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoZQotCSAqIGtub3duIHJlc291cmNlIFVSSXMgZm9yIHRoaXMgRWRpdE1vZGVsCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRQcmltYXJ5UmVzb3VyY2UoKSB7Ci0JCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsKQotCQkJZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJaWYgKGtub3duUmVzb3VyY2VVcmlzID09IG51bGwgfHwga25vd25SZXNvdXJjZVVyaXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVVJJIHVyaSA9IChVUkkpIGtub3duUmVzb3VyY2VVcmlzLmdldCgwKTsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSk7Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIjaWRlbnRpZmllckNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpZGVudGlmaWVyQ2hhbmdlZChFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGV2dCkgewotCQlpZiAoZXZ0Lmhhc0VuYWJsZWRDaGFuZ2VkKCkpIHsKLQkJCUVkaXRNb2RlbEV2ZW50IGVkaXRNb2RlbEV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LktOT1dOX1JFU09VUkNFU19BQk9VVF9UT19DSEFOR0UsIHRoaXMpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGVkaXRNb2RlbEV2ZW50KTsKLQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZCA9IGV2dC5nZXRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoaWQuaXNFbmFibGVkKCkpCi0JCQkJYWRkS25vd25SZXNvdXJjZXMoaWQpOwotCQkJZWxzZQotCQkJCXJlbW92ZUtub3duUmVzb3VyY2VzKGlkKTsKLQkJCWVkaXRNb2RlbEV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LktOT1dOX1JFU09VUkNFU19DSEFOR0VELCB0aGlzKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhlZGl0TW9kZWxFdmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlS25vd25SZXNvdXJjZXMoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkKSB7Ci0JCUxpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGlkKTsKLQkJRWRpdE1vZGVsUmVzb3VyY2UgZWRpdE1vZGVsUmVzb3VyY2UgPSBudWxsOwotCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luYyA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpIGdldFJlc291cmNlU2V0U3luY2hyb25pemVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWxSZXNvdXJjZSA9IChFZGl0TW9kZWxSZXNvdXJjZSkgZWRpdE1vZGVsUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChlZGl0TW9kZWxSZXNvdXJjZS5pc0F1dG9Mb2FkKCkgJiYgc3luYyAhPSBudWxsKSB7Ci0JCQkJc3luYy5kaXNhYmxlQXV0b2xvYWQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMucmVtb3ZlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCX0KLQkJCWtub3duUmVzb3VyY2VVcmlzLnJlbW92ZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlyZW1vdmVSZXNvdXJjZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCX0KLQotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgYWRkS25vd25SZXNvdXJjZXMoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkKSB7Ci0JCUxpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGlkKTsKLQkJRWRpdE1vZGVsUmVzb3VyY2UgZWRpdE1vZGVsUmVzb3VyY2UgPSBudWxsOwotCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luYyA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpIGdldFJlc291cmNlU2V0U3luY2hyb25pemVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQllZGl0TW9kZWxSZXNvdXJjZSA9IChFZGl0TW9kZWxSZXNvdXJjZSkgZWRpdE1vZGVsUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChlZGl0TW9kZWxSZXNvdXJjZS5pc0F1dG9Mb2FkKCkgJiYgc3luYyAhPSBudWxsKSB7Ci0JCQkJc3luYy5lbmFibGVBdXRvbG9hZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJcHJlbG9hZFJlc291cmNlVXJpcy5hZGQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCWdldFJlc291cmNlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKLQkJCX0KLQkJCWtub3duUmVzb3VyY2VVcmlzLmFkZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJhbXMuCi0JICovCi0JcHVibGljIE1hcCBnZXRQYXJhbXMoKSB7Ci0JCXJldHVybiBwYXJhbXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1zKE1hcCBwYXJhbXMpIHsKLQkJdGhpcy5wYXJhbXMgPSBwYXJhbXM7Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBOb3RpZnlSdW5uZXIgaW1wbGVtZW50cyBJU2FmZVJ1bm5hYmxlIHsgCi0JCQotCQlwcml2YXRlIGZpbmFsIEVkaXRNb2RlbEV2ZW50IGV2ZW50OwotCQlwcml2YXRlIEVkaXRNb2RlbExpc3RlbmVyIGxpc3RlbmVyOwotCQkKLQkJcHVibGljIE5vdGlmeVJ1bm5lcihFZGl0TW9kZWxFdmVudCBldmVudCkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChldmVudCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsgCi0JCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCAwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlpZihsaXN0ZW5lciAhPSBudWxsKQotCQkJCWxpc3RlbmVyLmVkaXRNb2RlbENoYW5nZWQoZXZlbnQpOyAKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzY2MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA4OjU3OjAwIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0TW9kZWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIHsKLQlwcm90ZWN0ZWQgRWRpdE1vZGVsQ29tbWFuZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsQ29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQpIHsKLQkJc3VwZXIodGFyZ2V0Q29tbWFuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGdldFRhcmdldCgpLmNhblVuZG8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBleGVjdXRlSW5Nb2RlbChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgY21kKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFZGl0TW9kZWxDb21tYW5kIGdldEVkaXRNb2RlbENvbW1hbmQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKS5nZXRMYWJlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGludmVydEFuZFB1c2goKSB7Ci0JCWV4ZWN1dGVJbk1vZGVsKHRoaXMuaW52ZXJ0ZWQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjBhODRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsRXZlbnQgewotCS8vVGhlc2UgYXJlIHRoZSBldmVudCBjb2Rlcy4KLQotCS8vIFVzZWQgd2hlbiB0aGUgZWRpdCBtb2RlbCBpcyBzYXZlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFID0gMTsKLQkvLyBVc2VkIHdoZW4gdGhlIGNvbW1hbmQgc3RhY2sgYmVjb21lcyBkaXJ0eS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJUWSA9IDI7Ci0JLy8gVXNlZCB3aGVuIGEgcmVmZXJlbmNlZCByZXNvdXJjZSBpcyByZW1vdmVkIGZyb20gdGhlIFJlc291cmNlU2V0LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfUkVTT1VSQ0UgPSAzOwotCS8vIFVzZWQgd2hlbiBhIHJlZmVyZW5jZWQgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlIFJlc291cmNlU2V0LgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEX1JFU09VUkNFID0gNDsKLQkvLyBVc2VkIHdoZW4gdGhlIGVkaXQgbW9kZWwgaXMgZGlzcG9zZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfRElTUE9TRSA9IDU7Ci0JLy8gVXNlZCB3aGVuIGEgUmVzb3VyY2UgaXMgbG9hZGVkIG9yIHRoZSBmaXJzdCBvYmplY3QKLQkvLyBpcyBhZGRlZCB0byB0aGUgY29udGVudHMgd2hlbiBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURFRF9SRVNPVVJDRSA9IDY7Ci0JLy8gVXNlZCB3aGVuIGEgUmVzb3VyY2UgaXMgdW5sb2FkZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5MT0FERURfUkVTT1VSQ0UgPSA3OwotCS8vIEluZGljYXRlcyB0aGF0IHRoZSBsaXN0IG9mIGtub3duIHJlc291cmNlcyBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIGlzIGFib3V0IHRvIGNoYW5nZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtOT1dOX1JFU09VUkNFU19BQk9VVF9UT19DSEFOR0UgPSA4OwotCS8vIEluZGljYXRlcyB0aGF0IHRoZSBsaXN0IG9mIGtub3duIHJlc291cmNlcyBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIGhhcyBjaGFuZ2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS05PV05fUkVTT1VSQ0VTX0NIQU5HRUQgPSA5OwotCi0JcHJpdmF0ZSBpbnQgZXZlbnRDb2RlOwotCXByaXZhdGUgRWRpdE1vZGVsIGVkaXRNb2RlbDsKLQlwcml2YXRlIExpc3QgY2hhbmdlZFJlc291cmNlczsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjU5IFBNKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWxFdmVudChpbnQgYW5FdmVudENvZGUsIEVkaXRNb2RlbCBtb2RlbCkgewotCQlzZXRFdmVudENvZGUoYW5FdmVudENvZGUpOwotCQlzZXRFZGl0TW9kZWwobW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpCi0JCQlnZXRDaGFuZ2VkUmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VzKENvbGxlY3Rpb24gc29tZVJlc291cmNlcykgewotCQlpZiAoc29tZVJlc291cmNlcyAhPSBudWxsKQotCQkJZ2V0Q2hhbmdlZFJlc291cmNlcygpLmFkZEFsbChzb21lUmVzb3VyY2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo0MyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjaGFuZ2VkUmVzb3VyY2VzID09IG51bGwpCi0JCQljaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA5OjAxOjA4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guRWRpdE1vZGVsCi0JICovCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWwoKSB7Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV2ZW50Q29kZSgpIHsKLQkJcmV0dXJuIGV2ZW50Q29kZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo0MyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2hhbmdlZFJlc291cmNlcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VkUmVzb3VyY2VzKGphdmEudXRpbC5MaXN0IG5ld0NoYW5nZWRSZXNvdXJjZXMpIHsKLQkJY2hhbmdlZFJlc291cmNlcyA9IG5ld0NoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjEvMDEgOTowMTowOCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RWRpdE1vZGVsCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5FZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0TW9kZWwoRWRpdE1vZGVsIG5ld0VkaXRNb2RlbCkgewotCQllZGl0TW9kZWwgPSBuZXdFZGl0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NDMgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0V2ZW50Q29kZQotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXZlbnRDb2RlKGludCBuZXdFdmVudENvZGUpIHsKLQkJZXZlbnRDb2RlID0gbmV3RXZlbnRDb2RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5N2JiZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi0gCi1wdWJsaWMgY2xhc3MgRWRpdE1vZGVsRmFjdG9yeSBpbXBsZW1lbnRzIElFZGl0TW9kZWxGYWN0b3J5IHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5ID0gdHJ1ZTsKLQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgY29udGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIGNvbnRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbmV3IEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgdHJ1ZSk7Ci0JCWVkaXRNb2RlbC5zZXRBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyhsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KTsKLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7Ci0JCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBuZXcgRWRpdE1vZGVsKGVkaXRNb2RlbElELCBjb250ZXh0LCBmYWxzZSk7Ci0JCWVkaXRNb2RlbC5zZXRBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyhsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KTsKLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhY2hlSUQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zKSB7Ci0JCXJldHVybiBlZGl0TW9kZWxJRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLklFZGl0TW9kZWxGYWN0b3J5I3NldExvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5sb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5ID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGxvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmZTllNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSA0OjQ1OjEzIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWRpdE1vZGVsTGlzdGVuZXIgewotCS8qKgotCSAqIEFuIGV2ZW50IG9jdXJyZWQgb24gdGhlIEoyRUVFZGl0TW9kZWwuCi0JICovCi0Jdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGE4ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0TW9kZWxOYXR1cmUgZXh0ZW5kcyBFTUZOYXR1cmUgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsTmF0dXJlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsS2V5LCBhY2Nlc3NvcktleSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbEtleSwgYWNjZXNzb3JLZXksIG51bGwpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRFbWZDb250ZXh0KCkgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldEVtZkNvbnRleHQoKS5nZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbEtleSwgYWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsS2V5LCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKLQkJRWRpdE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRFbWZDb250ZXh0KCkgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldEVtZkNvbnRleHQoKS5nZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxLZXksIGFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0IGdldEVtZkNvbnRleHQoKSB7Ci0JCXJldHVybiAoRU1GV29ya2JlbmNoQ29udGV4dCkgZ2V0RW1mQ29udGV4dEJhc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0lFZGl0TW9kZWxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9JRWRpdE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzMyMDlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0lFZGl0TW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRNb2RlbEZhY3RvcnkgewotCi0JcHVibGljIGFic3RyYWN0IEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0KTsKLQotCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcyk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0KTsKLQotCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpOwotCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcyk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KGJvb2xlYW4gdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTG9vc2VDb21wb3NlZEVkaXRNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTG9vc2VDb21wb3NlZEVkaXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE1ZjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIExvb3NlQ29tcG9zZWRFZGl0TW9kZWwgZXh0ZW5kcyBDb21wb3NlZEVkaXRNb2RlbCB7Ci0KLQlwdWJsaWMgTG9vc2VDb21wb3NlZEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihlZGl0TW9kZWxJRCwgY29udGV4dCk7Ci0KLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsLlJlZmVyZW5jZSBhZGRDaGlsZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWdldENoaWxkcmVuKCkuYWRkKGVkaXRNb2RlbCk7Ci0JCVJlZmVyZW5jZSByZWYgPSBlZGl0TW9kZWwuZ2V0UmVmZXJlbmNlKCk7Ci0JCWdldENoaWxkcmVuTWFwKCkucHV0KHJlZiwgZWRpdE1vZGVsKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWdldENoaWxkcmVuKCkucmVtb3ZlKGVkaXRNb2RlbCk7Ci0JCWdldENoaWxkcmVuTWFwKCkucmVtb3ZlKGVkaXRNb2RlbC5nZXRSZWZlcmVuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGVsTW9kaWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGVsTW9kaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiOWI3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RlbE1vZGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6NDA6MzUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsTW9kaWZpZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfUEFUVEVSTiA9ICJTZXQgezB9IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfUEFUVEVSTiA9ICJBZGQgezB9IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfUEFUVEVSTiA9ICJSZW1vdmUgezB9IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTU1BTkRfTEFCRUwgPSAiQ29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQlwcml2YXRlIExpc3QgaGVscGVyczsKLQlwcml2YXRlIExpc3QgZXh0ZW5kZWRIZWxwZXJzOwotCXByb3RlY3RlZCBMaXN0IGFkZGl0aW9uYWxDb21tYW5kczsKLQlwcm90ZWN0ZWQgaW50IHN0YXR1czsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19WQUxVRV9DSEFOR0UgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NIQU5HRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAyOwotCi0JLyoqCi0JICogSjJFRU1vZGVsTW9kaWZpZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxNb2RpZmllcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFTW9kZWxNb2RpZmllciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhRG9tYWluCi0JICogICAgICAgICAgICBFZGl0aW5nRG9tYWluCi0JICovCi0JcHVibGljIE1vZGVsTW9kaWZpZXIoRWRpdGluZ0RvbWFpbiBhRG9tYWluKSB7Ci0JCXNldEVkaXRpbmdEb21haW4oYURvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogQWRkCi0JICogCi0JICogQGFIZWxwZXIgdG8gdGhlIGxpc3Qgb2YgaGVscGVyIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwZXIoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlciAhPSBudWxsICYmICFnZXRIZWxwZXJzKCkuY29udGFpbnMoYUhlbHBlcikpCi0JCQlnZXRIZWxwZXJzKCkuYWRkKGFIZWxwZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFkZGl0aW9uYWxDb21tYW5kKENvbW1hbmQgYUNvbW1hbmQpIHsKLQkJaWYgKGFDb21tYW5kICE9IG51bGwgJiYgIWdldEFkZGl0aW9uYWxDb21tYW5kcygpLmNvbnRhaW5zKGFDb21tYW5kKSkKLQkJCWFkZGl0aW9uYWxDb21tYW5kcy5hZGQoYUNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgbW9kaWZpZXIgY2FuIGNyZWF0ZSBhIGNvbW1hbmQgdGhhdCB3aWxsIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBnZXRFZGl0aW5nRG9tYWluKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGV4ZWN1dGVXaXRoU3RhdHVzKCkgewotCQl0cnkgewotCQkJZXhlY3V0ZSgpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCXN0YXR1cyA9IC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGlzIG1vZGlmaWVyIHVzaW5nIHRoZSByZWNvcmRpbmcgbWVjaGFuaXNtIG9mIHRoZSBTdHJ1Y3RlZFRleHRVbmRvTWFuYWdlci4gSWYgdGhpcwotCSAqIG1vZGlmaWVyIGNhbm5vdCByZWNvcmQsIHRyeSB0byBleGVjdXRlIHVzaW5nIHRoZSBDb21tYW5kU3RhY2sgKGlmIGl0IGNhbiBleGVjdXRlIGNvbW1hbmRzKS4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhlY3V0aW9uIHdhcyBhdHRlbXB0ZWQuCi0JICogCi0JICogQHNlZSBjYW5FeGVjdXRlQ29tbWFuZCgpCi0JICogQHNlZSBjYW5SZWNvcmQoKQotCSAqIEBzZWUgcnVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJYWRkSGVscGVyKGFIZWxwZXIpOwotCQlyZXR1cm4gZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhpcyBtb2RpZmllciB1c2luZyB0aGUgcmVjb3JkaW5nIG1lY2hhbmlzbSBvZiB0aGUgU3RydWN0ZWRUZXh0VW5kb01hbmFnZXIuIElmIHRoaXMKLQkgKiBtb2RpZmllciBjYW5ub3QgcmVjb3JkLCB0cnkgdG8gZXhlY3V0ZSB1c2luZyB0aGUgQ29tbWFuZFN0YWNrIChpZiBpdCBjYW4gZXhlY3V0ZSBjb21tYW5kcykuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4ZWN1dGlvbiB3YXMgYXR0ZW1wdGVkLgotCSAqIAotCSAqIEBzZWUgY2FuRXhlY3V0ZUNvbW1hbmQoKQotCSAqIEBzZWUgY2FuUmVjb3JkKCkKLQkgKiBAc2VlIHJ1bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShMaXN0IHNvbWVIZWxwZXJzKSB7Ci0JCXNldEhlbHBlcnMoc29tZUhlbHBlcnMpOwotCQlyZXR1cm4gZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhpcyBtb2RpZmllciBieSBjcmVhdGluZyBhIENvbW1hbmQgdGhhdCBpcyBleGVjdXRlZCBvbiB0aGUgQ29tbWFuZFN0YWNrLiBJZiB0aGlzCi0JICogbW9kaWZpZXIgY2Fubm90IGV4ZWN1dGUgY29tbWFuZHMsIHRoZSBleGVjdXRpb24gd2lsbCBub3QgdGFrZSBwbGFjZS4gUmV0dXJuIHRydWUgaWYgdGhlCi0JICogZXhlY3V0aW9uIHdhcyBhdHRlbXB0ZWQuCi0JICogCi0JICogQHNlZSBjYW5FeGVjdXRlQ29tbWFuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGNhbkV4ZWN1dGVDb21tYW5kKCkpIHsKLQkJCXRyeSB7Ci0JCQkJQ29tbWFuZCBjb21tYW5kID0gY3JlYXRlQ29tbWFuZCgpOwotCQkJCXJlc3VsdCA9IGNvbW1hbmQgIT0gbnVsbDsKLQkJCQlpZiAocmVzdWx0KSB7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlyZWxlYXNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzZXRTdGF0dXMoRVJST1IpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCWlmIChnZXRFZGl0aW5nRG9tYWluKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDI6NTM6MTcgUE0pCi0JICogCi0JICogQHJldHVybiBFZGl0aW5nRG9tYWluCi0JICovCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDg6NDY6MzUgQU0pCi0JICogCi0JICogQHJldHVybiBKMkVFTW9kaWZpZXJIZWxwZXIKLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgZ2V0Rmlyc3RIZWxwZXIoKSB7Ci0JCWlmIChoZWxwZXJzICE9IG51bGwgJiYgZ2V0SGVscGVycygpLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKE1vZGlmaWVySGVscGVyKSBnZXRIZWxwZXJzKCkuZ2V0KDApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgODo0NjozNSBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldEhlbHBlcnMoKSB7Ci0JCWlmIChoZWxwZXJzID09IG51bGwpCi0JCQloZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gaGVscGVyczsKLQl9Ci0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QWRkaXRpb25hbENvbW1hbmRzKCkgewotCQlpZiAoYWRkaXRpb25hbENvbW1hbmRzID09IG51bGwpCi0JCQlhZGRpdGlvbmFsQ29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBhZGRpdGlvbmFsQ29tbWFuZHM7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBhbGwgbW9kZWwgYXJ0aWZhY3RzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCXNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCXNldEhlbHBlcnMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMjo1MzoxNyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RWRpdGluZ0RvbWFpbgotCSAqICAgICAgICAgICAgRWRpdGluZ0RvbWFpbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRpbmdEb21haW4oRWRpdGluZ0RvbWFpbiBuZXdFZGl0aW5nRG9tYWluKSB7Ci0JCWVkaXRpbmdEb21haW4gPSBuZXdFZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSA4OjQ2OjM1IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdIZWxwZXJzCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBlcnMoamF2YS51dGlsLkxpc3QgbmV3SGVscGVycykgewotCQloZWxwZXJzID0gbmV3SGVscGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1c0NvZGUpIHsKLQkJaWYgKHN0YXR1c0NvZGUgPiBzdGF0dXMpCi0JCQlzdGF0dXMgPSBzdGF0dXNDb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBBZGRDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoYUhlbHBlcik7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0JCWlmICh2YWx1ZUNoYW5nZWQoYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUsIGZhbHNlKSkgewotCQkJY29tbWFuZCA9IEFkZENvbW1hbmQuY3JlYXRlKGdldEVkaXRpbmdEb21haW4oKSwgYUhlbHBlci5nZXRPd25lcigpLCBhSGVscGVyLmdldEZlYXR1cmUoKSwgdmFsdWUpOwotCQkJKChBYnN0cmFjdENvbW1hbmQpIGNvbW1hbmQpLnNldExhYmVsKGNyZWF0ZUNvbW1hbmRMYWJlbChBRERfUEFUVEVSTiwgYUhlbHBlci5nZXRGZWF0dXJlKCkpKTsKLQkJCXNldFN0YXR1cyhWQUxVRV9DSEFOR0UpOwotCQl9IGVsc2UgewotCQkJc2V0U3RhdHVzKE5PX1ZBTFVFX0NIQU5HRSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suIFRoZSBkZWZhdWx0IGlzIHRvIHJldHVybiBudWxsLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY2hhaW5lZENvbW1hbmQgPSBjcmVhdGVDb21tYW5kKG51bGwsIGdldEhlbHBlcnMoKSk7Ci0JCWlmIChudWxsID09IGNoYWluZWRDb21tYW5kICYmIGFkZGl0aW9uYWxDb21tYW5kcyAhPSBudWxsICYmIGFkZGl0aW9uYWxDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCXNldFN0YXR1cyhFUlJPUik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQljaGFpbmVkQ29tbWFuZCA9IGFwcGVuZEFkZGl0aW9uYWxDb21tYW5kcyhjaGFpbmVkQ29tbWFuZCk7Ci0JCXJldHVybiBjaGFpbmVkQ29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbW1hbmQgY2hhaW5lZENvbW1hbmQsIExpc3QgaGVscGVyc0FyZykgewotCQlDb21tYW5kIGlubmVyQ2hhaW5lZENvbW1hbmQgPSBjaGFpbmVkQ29tbWFuZDsKLQkJaWYgKG51bGwgPT0gZXh0ZW5kZWRIZWxwZXJzKSB7Ci0JCQlleHRlbmRlZEhlbHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlpZiAoIWhlbHBlcnNBcmcuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGhlbHBlcnNBcmcuaXRlcmF0b3IoKTsKLQkJCUNvbW1hbmQgbmV4dENvbW1hbmQgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5leHRDb21tYW5kID0gY3JlYXRlQ29tbWFuZCgoTW9kaWZpZXJIZWxwZXIpIGl0Lm5leHQoKSk7Ci0JCQkJaWYgKGlubmVyQ2hhaW5lZENvbW1hbmQgPT0gbnVsbCkKLQkJCQkJaW5uZXJDaGFpbmVkQ29tbWFuZCA9IG5leHRDb21tYW5kOwotCQkJCWVsc2UgaWYgKG5leHRDb21tYW5kICE9IG51bGwpCi0JCQkJCWlubmVyQ2hhaW5lZENvbW1hbmQgPSBpbm5lckNoYWluZWRDb21tYW5kLmNoYWluKG5leHRDb21tYW5kKTsKLQkJCX0KLQkJfQotCQlpZiAoIWV4dGVuZGVkSGVscGVycy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvcHkuYWRkQWxsKGV4dGVuZGVkSGVscGVycyk7Ci0JCQlleHRlbmRlZEhlbHBlcnMuY2xlYXIoKTsKLQkJCWlubmVyQ2hhaW5lZENvbW1hbmQgPSBjcmVhdGVDb21tYW5kKGlubmVyQ2hhaW5lZENvbW1hbmQsIGNvcHkpOwotCQl9Ci0JCXJldHVybiBpbm5lckNoYWluZWRDb21tYW5kOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGFwcGVuZEFkZGl0aW9uYWxDb21tYW5kcyhDb21tYW5kIGNoYWluZWRDb21tYW5kKSB7Ci0JCUNvbW1hbmQgaW5uZXJDaGFpbmVkQ29tbWFuZCA9IGNoYWluZWRDb21tYW5kOwotCQlpZiAoYWRkaXRpb25hbENvbW1hbmRzICE9IG51bGwgJiYgIWFkZGl0aW9uYWxDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCUNvbW1hbmQgY29tbWFuZDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbENvbW1hbmRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJY29tbWFuZCA9IChDb21tYW5kKSBhZGRpdGlvbmFsQ29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmIChpbm5lckNoYWluZWRDb21tYW5kID09IG51bGwpCi0JCQkJCWlubmVyQ2hhaW5lZENvbW1hbmQgPSBjb21tYW5kOwotCQkJCWVsc2UKLQkJCQkJaW5uZXJDaGFpbmVkQ29tbWFuZCA9IGlubmVyQ2hhaW5lZENvbW1hbmQuY2hhaW4oY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlubmVyQ2hhaW5lZENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWlmIChhSGVscGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29tbWFuZCBjb21tYW5kMSwgY29tbWFuZDI7Ci0JCU1vZGlmaWVySGVscGVyIG93bmVySGVscGVyID0gYUhlbHBlci5nZXRPd25lckhlbHBlcigpOwotCQlpZiAoYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkgJiYgb3duZXJIZWxwZXIgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvL3dlIGFyZSB1bnNldHRpbmcgYSB2YWx1ZSBvbiBhbiBvd25lciB0aGF0IGRvZXMgbm90IGV4aXN0IHNvIGRvIG5vdAotCQkvLyBjcmVhdGUgdGhlIG93bmVyCi0JCWNvbW1hbmQxID0gY3JlYXRlQ29tbWFuZChvd25lckhlbHBlcik7Ci0JCWNvbW1hbmQyID0gcHJpbUNyZWF0ZUNvbW1hbmQoYUhlbHBlcik7Ci0KLQkJaWYgKGNvbW1hbmQxICE9IG51bGwpIHsKLQkJCWlmIChjb21tYW5kMiA9PSBudWxsKQotCQkJCWNvbW1hbmQyID0gY29tbWFuZDE7Ci0JCQllbHNlCi0JCQkJY29tbWFuZDIgPSBjb21tYW5kMi5jaGFpbihjb21tYW5kMSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQ29tbWFuZExhYmVsKFN0cmluZyBhUGF0dGVybiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZmVhdHVyZSA9PSBudWxsID8gREVGQVVMVF9DT01NQU5EX0xBQkVMIDogZmVhdHVyZS5nZXROYW1lKCk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoYVBhdHRlcm4sIG5ldyBPYmplY3RbXXtyZXBsYWNlbWVudH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gbnVsbC4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNYW55Q29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWlmIChhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkKLQkJCXJldHVybiBjcmVhdGVSZW1vdmVDb21tYW5kKGFIZWxwZXIpOwotCQlyZXR1cm4gY3JlYXRlQWRkQ29tbWFuZChhSGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBjcmVhdGVPYmplY3RGcm9tSGVscGVyKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJcmV0dXJuIGFIZWxwZXIuY3JlYXRlTmV3T2JqZWN0RnJvbUZlYXR1cmUoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBVc2VkIHRvIHJlbW92ZSBhbiBvYmplY3Qgb24gdW5zZXQuICBNYWtlcyB0aGUgb2JqZWN0IGEgcHJveHkgIAotCSAqIG9uIGV4ZWN1dGUgYW5kIHJlZG8gY29tbWFuZHMuICBVbmRvIHdpbGwgcmVtb3ZlIHRoZSBwcm94eS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgUHJveHlXcmFwcGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCQlwcm90ZWN0ZWQgQ29tbWFuZCBiYXNlQ29tbWFuZCA9IG51bGw7Ci0JCXByb3RlY3RlZCBFT2JqZWN0IGVPYmplY3QgPSBudWxsOwotCQlwcm90ZWN0ZWQgUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBQcm94eVdyYXBwaW5nQ29tbWFuZChDb21tYW5kIGJhc2VDb21tYW5kLCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJCXRoaXMuYmFzZUNvbW1hbmQgPSBiYXNlQ29tbWFuZDsKLQkJCXRoaXMuZU9iamVjdCA9IGVPYmplY3Q7Ci0JCQl0aGlzLnJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJcmV0dXJuIGJhc2VDb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShlT2JqZWN0LCByZXNvdXJjZSk7Ci0JCQliYXNlQ29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5jYW5VbmRvKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCWJhc2VDb21tYW5kLnVuZG8oKTsKLQkJCUV4dGVuZGVkRWNvcmVVdGlsLnJlbW92ZVByb3h5KGVPYmplY3QsIHJlc291cmNlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShlT2JqZWN0LCByZXNvdXJjZSk7Ci0JCQliYXNlQ29tbWFuZC5yZWRvKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQkJcmV0dXJuIGJhc2VDb21tYW5kLmdldFJlc3VsdCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGJhc2VDb21tYW5kLmdldExhYmVsKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBiYXNlQ29tbWFuZC5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQliYXNlQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZW1vdmUgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOwotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFIZWxwZXIuZ2V0RmVhdHVyZSgpOwotCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgZmVhdHVyZSwgdmFsdWUsIHRydWUpKSB7Ci0JCQlpZiAoaXNWYWx1ZUVxdWFsKGFIZWxwZXIsIHZhbHVlKSkgewotCQkJCWNvbW1hbmQgPSBSZW1vdmVDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgZmVhdHVyZSwgKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tbWFuZCA9IFJlbW92ZUNvbW1hbmQuY3JlYXRlKGdldEVkaXRpbmdEb21haW4oKSwgYUhlbHBlci5nZXRPd25lcigpLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQkoKEFic3RyYWN0Q29tbWFuZCkgY29tbWFuZCkuc2V0TGFiZWwoY3JlYXRlQ29tbWFuZExhYmVsKFJFTU9WRV9QQVRURVJOLCBmZWF0dXJlKSk7Ci0JCQlzZXRTdGF0dXMoVkFMVUVfQ0hBTkdFKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1cyhOT19WQUxVRV9DSEFOR0UpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbHVlRXF1YWwoTW9kaWZpZXJIZWxwZXIgYUhlbHBlciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBhSGVscGVyLmdldE93bmVyKCkuZUdldChhSGVscGVyLmdldEZlYXR1cmUoKSkgPT0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgU2V0Q29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlU2luZ2xlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOwotCQlDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkpIHsKLQkJCWNvbW1hbmQgPSBTZXRDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlKTsKLQkJCSgoQWJzdHJhY3RDb21tYW5kKSBjb21tYW5kKS5zZXRMYWJlbChjcmVhdGVDb21tYW5kTGFiZWwoU0VUX1BBVFRFUk4sIGFIZWxwZXIuZ2V0RmVhdHVyZSgpKSk7Ci0JCQlzZXRTdGF0dXMoVkFMVUVfQ0hBTkdFKTsKLQkJfSBlbHNlIHsKLQkJCXNldFN0YXR1cyhOT19WQUxVRV9DSEFOR0UpOwotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlVmFsdWVGcm9tSGVscGVyKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJRU9iamVjdCBuZXdPYmplY3QgPSBjcmVhdGVPYmplY3RGcm9tSGVscGVyKGFIZWxwZXIpOwotCQlzZXROZXdPYmplY3RBdHRyaWJ1dGVzKG5ld09iamVjdCwgYUhlbHBlcik7Ci0JCXJldHVybiBuZXdPYmplY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW51bVZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKCFhbk9iamVjdC5lSXNTZXQoYUZlYXR1cmUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCUVudW1lcmF0b3IgZXhpc3RpbmdFbnVtZXJhdG9yID0gKEVudW1lcmF0b3IpIGFuT2JqZWN0LmVHZXQoYUZlYXR1cmUpOwotCQlFbnVtZXJhdG9yIG5ld0VudW1lcmF0b3IgPSBnZXRFbnVtZXJhdG9yKGFGZWF0dXJlLCBhVmFsdWUpOwotCQlyZXR1cm4gZXhpc3RpbmdFbnVtZXJhdG9yICE9IG5ld0VudW1lcmF0b3I7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdG9yIGdldEVudW1lcmF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBFbnVtZXJhdG9yKQotCQkJcmV0dXJuIChFbnVtZXJhdG9yKSBhVmFsdWU7Ci0JCUVFbnVtIGFuRW51bSA9IChFRW51bSkgYUZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSBudWxsOwotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJbGl0ZXJhbCA9IGFuRW51bS5nZXRFRW51bUxpdGVyYWwoKFN0cmluZykgYVZhbHVlKTsKLQkJZWxzZSBpZiAoYVZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKLQkJCWxpdGVyYWwgPSBhbkVudW0uZ2V0RUVudW1MaXRlcmFsKCgoSW50ZWdlcikgYVZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJaWYgKGxpdGVyYWwgIT0gbnVsbCkKLQkJCXJldHVybiBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoYUhlbHBlci5tdXN0Q3JlYXRlVmFsdWUoKSkgewotCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlVmFsdWVGcm9tSGVscGVyKGFIZWxwZXIpOwotCQkJYUhlbHBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGFIZWxwZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW55VmFsdWVDaGFuZ2VkKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBpc1Vuc2V0KSB7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKLQkJaWYgKGlzVW5zZXQpCi0JCQlyZXR1cm4gbGlzdC5jb250YWlucyhhVmFsdWUpIHx8IChsaXN0ID09IGFWYWx1ZSAmJiAhbGlzdC5pc0VtcHR5KCkpOwotCQlyZXR1cm4gIWxpc3QuY29udGFpbnMoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4gVGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIG51bGwuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgcHJpbUNyZWF0ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlDb21tYW5kIGNvbW1hbmQgPSBkb0NyZWF0ZUNvbW1hbmQoYUhlbHBlcik7Ci0JCWlmIChhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkgewotCQkJT2JqZWN0IHZhbHVlID0gYUhlbHBlci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCAmJiAhKChFT2JqZWN0KSB2YWx1ZSkuZUlzUHJveHkoKSkgewotCQkJCWNvbW1hbmQgPSBuZXcgUHJveHlXcmFwcGluZ0NvbW1hbmQoY29tbWFuZCwgKEVPYmplY3QpIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBkb0NyZWF0ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgewotCQlpZiAoIWFIZWxwZXIuaXNDb21wbGV0ZSgpKSB7Ci0JCQlzZXRTdGF0dXMoRVJST1IpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQkJaWYgKGFIZWxwZXIuZ2V0RmVhdHVyZSgpLmlzTWFueSgpKQotCQkJY29tbWFuZCA9IGNyZWF0ZU1hbnlDb21tYW5kKGFIZWxwZXIpOwotCQllbHNlCi0JCQljb21tYW5kID0gY3JlYXRlU2luZ2xlQ29tbWFuZChhSGVscGVyKTsKLQotCQlpZiAobnVsbCAhPSBjb21tYW5kKSB7Ci0JCQlMaXN0IGxvY2FsSGVscGVycyA9IE1vZGlmaWVySGVscGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIZWxwZXJzKGFIZWxwZXIpOwotCQkJaWYgKG51bGwgIT0gbG9jYWxIZWxwZXJzKSB7Ci0JCQkJZXh0ZW5kZWRIZWxwZXJzLmFkZEFsbChsb2NhbEhlbHBlcnMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21tYW5kOwotCi0JfQotCi0JLyoqCi0JICogUnVuIHVzaW5nCi0JICogCi0JICogQGFIZWxwZXIuIFRoaXMgd2lsbCBzZXQgYSBNT0YgYXR0aWJ1dGUgdmFsdWUgdG8gdGhlIG93bmVyIG9mIHRoZSBoZWxwZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCWlmIChhSGVscGVyLmlzQ29tcGxldGUoKSkgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsdWUoYUhlbHBlcik7Ci0JCQlpZiAodmFsdWVDaGFuZ2VkKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkpCi0JCQkJc2V0T2JqZWN0QXR0cmlidXRlKGFIZWxwZXIuZ2V0T3duZXIoKSwgYUhlbHBlci5nZXRGZWF0dXJlKCksIHZhbHVlLCBhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGFyZSB1c2luZwotCSAqIHJlY29yZGFibGUgY29tbWFuZHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgdXBkYXRlIHRoZSBNT0YgbW9kZWwgZGlyZWN0bHkuCi0JICogQW55IG1vZGlmaWNhdGlvbiB3aWxsIGJlIHJlY29yZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCFnZXRIZWxwZXJzKCkuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGdldEhlbHBlcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkKLQkJCQlydW4oKE1vZGlmaWVySGVscGVyKSBpdC5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVuIHVzaW5nCi0JICogCi0JICogQGFIZWxwZXIncyBvd25lckhlbHBlciBmaXJzdCBiZWZvcmUgcnVubmluZyB3aXRoCi0JICogQGFIZWxwZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKLQkJaWYgKGFIZWxwZXIgIT0gbnVsbCkgewotCQkJcnVuKGFIZWxwZXIuZ2V0T3duZXJIZWxwZXIoKSk7Ci0JCQlwcmltUnVuKGFIZWxwZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmV3T2JqZWN0QXR0cmlidXRlcyhFT2JqZWN0IGFuT2JqZWN0LCBNb2RpZmllckhlbHBlciBhSGVscGVyKSB7Ci0JCUhhc2hNYXAgYXR0cmlidXRlcyA9IGFIZWxwZXIuZ2V0QXR0cmlidXRlcygpOwotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQl2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0KGZlYXR1cmUpOwotCQkJc2V0T2JqZWN0QXR0cmlidXRlKGFuT2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0QXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKSB7Ci0JCWlmIChhRmVhdHVyZS5pc01hbnkoKSkKLQkJCXNldE9iamVjdE1hbnlBdHRyaWJ1dGUoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIHNob3VsZFVuc2V0VmFsdWUpOwotCQllbHNlCi0JCQlzZXRPYmplY3RTaW5nbGVBdHRyaWJ1dGUoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIHNob3VsZFVuc2V0VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdEVudW1BdHRyaWJ1dGUoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCUVudW1lcmF0b3IgZW51bWVyYXRvciA9IGdldEVudW1lcmF0b3IoYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JCWFuT2JqZWN0LmVTZXQoYUZlYXR1cmUsIGVudW1lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdE1hbnlBdHRyaWJ1dGUoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIHNob3VsZFVuc2V0VmFsdWUpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIGFuT2JqZWN0LmVHZXQoYUZlYXR1cmUpOwotCQlpZiAoc2hvdWxkVW5zZXRWYWx1ZSkKLQkJCWxpc3QucmVtb3ZlKGFWYWx1ZSk7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkKGFWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0U2luZ2xlQXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKSB7Ci0JCWlmIChzaG91bGRVbnNldFZhbHVlKQotCQkJYW5PYmplY3QuZVVuc2V0KGFGZWF0dXJlKTsKLQkJZWxzZSBpZiAoYUZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVFbnVtKQotCQkJc2V0T2JqZWN0RW51bUF0dHJpYnV0ZShhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JCWVsc2UKLQkJCWFuT2JqZWN0LmVTZXQoYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2luZ2xlVmFsdWVDaGFuZ2VkKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBpc1Vuc2V0KSB7Ci0JCWlmIChhRmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUVudW0pCi0JCQlyZXR1cm4gZW51bVZhbHVlQ2hhbmdlZChhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSk7Ci0KLQkJT2JqZWN0IGV4aXN0aW5nVmFsdWUgPSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKLQkJaWYgKGV4aXN0aW5nVmFsdWUgPT0gbnVsbCAmJiBhVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGV4aXN0aW5nVmFsdWUgIT0gbnVsbCAmJiAhZXhpc3RpbmdWYWx1ZS5lcXVhbHMoYVZhbHVlKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYVZhbHVlICE9IG51bGwgJiYgIWFWYWx1ZS5lcXVhbHMoZXhpc3RpbmdWYWx1ZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gaXNVbnNldCkgewotCQlpZiAoYUZlYXR1cmUuaXNNYW55KCkpCi0JCQlyZXR1cm4gbWFueVZhbHVlQ2hhbmdlZChhbk9iamVjdCwgYUZlYXR1cmUsIGFWYWx1ZSwgaXNVbnNldCk7Ci0JCXJldHVybiBzaW5nbGVWYWx1ZUNoYW5nZWQoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIGlzVW5zZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFiYzgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVydGVyOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjIzOjM2IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZmllckhlbHBlciB7Ci0KLQlwcml2YXRlIEVPYmplY3Qgb3duZXI7Ci0JcHJpdmF0ZSBNb2RpZmllckhlbHBlciBvd25lckhlbHBlcjsKLQlwcml2YXRlIE93bmVyUHJvdmlkZXIgb3duZXJQcm92aWRlcjsKLQlwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCXByaXZhdGUgSGFzaE1hcCBhdHRyaWJ1dGVzOwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVYU0lUeXBlTmFtZTsKLQlwcml2YXRlIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBmZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0VUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fVU5TRVQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9CT1RIID0gMjsKLQotCS8qKgotCSAqIEoyRUVNb2RpZmllckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2RpZmllckhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFTW9kaWZpZXJIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXIoRU9iamVjdCBhbk93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJc2V0T3duZXIoYW5Pd25lcik7Ci0JCXNldEZlYXR1cmUoYUZlYXR1cmUpOwotCQlzZXRWYWx1ZShhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEoyRUVNb2RpZmllckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2RpZmllckhlbHBlcihNb2RpZmllckhlbHBlciBhbk93bmVySGVscGVyLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKLQkJc2V0T3duZXJIZWxwZXIoYW5Pd25lckhlbHBlcik7Ci0JCXNldEZlYXR1cmUoYUZlYXR1cmUpOwotCQlzZXRWYWx1ZShhVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEoyRUVNb2RpZmllckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2RpZmllckhlbHBlcihPd25lclByb3ZpZGVyIGFuT3duZXJQcm92aWRlciwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7Ci0JCXNldE93bmVyUHJvdmlkZXIoYW5Pd25lclByb3ZpZGVyKTsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JCXNldFZhbHVlKGFWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNoTWFwCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYUZlYXR1cmUgIT0gbnVsbCAmJiBhVmFsdWUgIT0gbnVsbCkKLQkJCWdldEF0dHJpYnV0ZXMoKS5wdXQoYUZlYXR1cmUsIGFWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoKS5jb252ZXJ0VmFsdWUobmV3VmFsdWUsIGdldEZlYXR1cmUoKSk7Ci0JfQotCi0JLy9DYWxsaW5nIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmFsdWUgdG8gYmUgcmVtb3ZlZCBvciB1bnNldCBmcm9tIHRoZSBvd25lci4KLQlwdWJsaWMgdm9pZCBkb1Vuc2V0VmFsdWUoKSB7Ci0JCXNob3VsZFVuc2V0VmFsdWUgPSB0cnVlOwotCQlpZiAodmFsdWUgIT0gU2V0Q29tbWFuZC5VTlNFVF9WQUxVRSAmJiBmZWF0dXJlICE9IG51bGwgJiYgIWZlYXR1cmUuaXNNYW55KCkpCi0JCQlwcmltU2V0VmFsdWUoU2V0Q29tbWFuZC5VTlNFVF9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNoTWFwCi0JICovCi0JcHVibGljIGphdmEudXRpbC5IYXNoTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeQotCSAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGdldFBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoKEVDbGFzc0ltcGwpIGdldEZlYXR1cmVUeXBlKCkpLmdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEZlYXR1cmVUeXBlKCkgewotCQlyZXR1cm4gZ2V0RmVhdHVyZSgpLmdldEVUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS8xMC8yMDAxIDQ6NTE6NTggUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1hbmRzLkZlYXR1cmVWYWx1ZUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgZ2V0RmVhdHVyZVZhbHVlQ29udmVydGVyKCkgewotCQlpZiAoZmVhdHVyZVZhbHVlQ29udmVydGVyID09IG51bGwpCi0JCQlmZWF0dXJlVmFsdWVDb252ZXJ0ZXIgPSBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuREVGQVVMVDsKLQkJcmV0dXJuIGZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdWYWx1ZVR5cGVOYW1lKCkgewotCQlpZiAoZ2V0VmFsdWVYU0lUeXBlTmFtZSgpICE9IG51bGwgJiYgZ2V0VmFsdWVYU0lUeXBlTmFtZSgpLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBnZXRWYWx1ZVhTSVR5cGVOYW1lKCk7Ci0JCXJldHVybiAoKChFQ2xhc3MpIGdldEZlYXR1cmVUeXBlKCkpLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IGdldE93bmVyKCkgewotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJT3duZXJQcm92aWRlciBwcm92aWRlciA9IGdldE93bmVyUHJvdmlkZXIoKTsKLQkJCUVPYmplY3QgcHJvdmlkZXJPd25lciA9IG51bGw7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkKLQkJCQlwcm92aWRlck93bmVyID0gcHJvdmlkZXIuZ2V0T3duZXIoKTsKLQkJCWlmIChwcm92aWRlck93bmVyID09IG51bGwgJiYgZ2V0T3duZXJIZWxwZXIoKSAhPSBudWxsKQotCQkJCXByb3ZpZGVyT3duZXIgPSAoRU9iamVjdCkgZ2V0T3duZXJIZWxwZXIoKS5nZXRWYWx1ZSgpOwotCQkJcmV0dXJuIHByb3ZpZGVyT3duZXI7Ci0JCX0KLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvOC8yMDAxIDI6NDc6NTQgUE0pCi0JICogCi0JICogQHJldHVybiBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1hbmRzLkoyRUVNb2RpZmllckhlbHBlcgotCSAqLwotCXB1YmxpYyBNb2RpZmllckhlbHBlciBnZXRPd25lckhlbHBlcigpIHsKLQkJaWYgKG93bmVySGVscGVyID09IG51bGwpIHsKLQkJCWlmIChnZXRPd25lclByb3ZpZGVyKCkgIT0gbnVsbCAmJiBnZXRPd25lclByb3ZpZGVyKCkuZ2V0T3duZXIoKSA9PSBudWxsKQotCQkJCXJldHVybiBnZXRPd25lclByb3ZpZGVyKCkuZ2V0T3duZXJIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gb3duZXJIZWxwZXI7Ci0JfQotCi0JcHVibGljIE1vZGlmaWVySGVscGVyIHByaW1HZXRPd25lckhlbHBlcigpIHsKLQkJcmV0dXJuIG93bmVySGVscGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvMTgvMjAwMSAxOjMxOjE0IFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS51aS5KMkVFT3duZXJQcm92aWRlcgotCSAqLwotCXB1YmxpYyBPd25lclByb3ZpZGVyIGdldE93bmVyUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBvd25lclByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgMzozOTozMSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZVhTSVR5cGVOYW1lKCkgewotCQlyZXR1cm4gdmFsdWVYU0lUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZXQgY2FsbGVkIGZyb20gdGhlIEoyRUVNb2RlbE1vZGlmaWVyIGJlZm9yZSBleGVjdXRpbmcgc28gaXQgaXMgbm90Ci0JICogbmVjZXNzYXJ5IHRvIGNhbGwgaXQgZGlyZWN0bHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpZiAoZ2V0T3duZXJIZWxwZXIoKSAhPSBudWxsKQotCQkJcmVzdWx0ID0gZ2V0T3duZXJIZWxwZXIoKS5pc0NvbXBsZXRlKCk7Ci0JCWlmICghbXVzdENyZWF0ZVZhbHVlKCkpCi0JCQlyZXN1bHQgPSBnZXRWYWx1ZSgpICE9IG51bGwgfHwgc2hvdWxkVW5zZXRWYWx1ZSgpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBnZXRGZWF0dXJlVHlwZSgpICE9IG51bGw7Ci0JCXJldHVybiByZXN1bHQgJiYgZ2V0RmVhdHVyZSgpICE9IG51bGwgJiYgKGdldE93bmVyKCkgIT0gbnVsbCB8fCBnZXRPd25lckhlbHBlcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG11c3RDcmVhdGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFZhbHVlKCkgPT0gbnVsbCAmJiBnZXRGZWF0dXJlKCkgIT0gbnVsbCAmJiAhc2hvdWxkVW5zZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbVNldFZhbHVlKGphdmEubGFuZy5PYmplY3QgbmV3VmFsdWUpIHsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdGZWF0dXJlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIG5ld0ZlYXR1cmUpIHsKLQkJZmVhdHVyZSA9IG5ld0ZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS8xMC8yMDAxIDQ6NTE6NTggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld0ZlYXR1cmVWYWx1ZUNvbnZlcnRlcgotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuajJlZS5jb21tYW5kcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoRmVhdHVyZVZhbHVlQ29udmVydGVyIG5ld0ZlYXR1cmVWYWx1ZUNvbnZlcnRlcikgewotCQlmZWF0dXJlVmFsdWVDb252ZXJ0ZXIgPSBuZXdGZWF0dXJlVmFsdWVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbmV3T3duZXIpIHsKLQkJb3duZXIgPSBuZXdPd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzgvMjAwMSAyOjQ3OjU0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdPd25lckhlbHBlcgotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuajJlZS5jb21tYW5kcy5KMkVFTW9kaWZpZXJIZWxwZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckhlbHBlcihNb2RpZmllckhlbHBlciBuZXdPd25lckhlbHBlcikgewotCQlvd25lckhlbHBlciA9IG5ld093bmVySGVscGVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvMTgvMjAwMSAxOjMxOjE0IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdPd25lclByb3ZpZGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLnVpLkoyRUVPd25lclByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJQcm92aWRlcihPd25lclByb3ZpZGVyIG5ld093bmVyUHJvdmlkZXIpIHsKLQkJb3duZXJQcm92aWRlciA9IG5ld093bmVyUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlwcmltU2V0VmFsdWUoY29udmVydFZhbHVlKG5ld1ZhbHVlKSk7Ci0JCX0gY2F0Y2ggKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZmVhdHVyZUV4Y2VwdGlvbikgewotCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5sb2dFcnJvcihmZWF0dXJlRXhjZXB0aW9uKTsKLQkJCXByaW1TZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyZWF0IGFuIGVtcHR5IFN0cmluZyBhcyBhIG51bGwgdmFsdWUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlRnJvbVdpZGdldChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJT2JqZWN0IGRhdGEgPSBuZXdWYWx1ZTsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwgJiYgbmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCWRhdGEgPSBudWxsOwotCQlzZXRWYWx1ZShkYXRhKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRvVW5zZXRWYWx1ZSgpOwotCQllbHNlCi0JCQlzaG91bGRVbnNldFZhbHVlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDM6Mzk6MzEgUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlWFNJVHlwZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVhTSVR5cGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3VmFsdWVYU0lUeXBlTmFtZSkgewotCQl2YWx1ZVhTSVR5cGVOYW1lID0gbmV3VmFsdWVYU0lUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKCkgewotCQlyZXR1cm4gc2hvdWxkVW5zZXRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVOZXdPYmplY3RGcm9tRmVhdHVyZSgpIHsKLQkJRUNsYXNzIG1ldGFDbGFzcyA9IChFQ2xhc3MpIGdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcihnZXROZXdWYWx1ZVR5cGVOYW1lKCkpOwotCQlyZXR1cm4gZ2V0RmFjdG9yeSgpLmNyZWF0ZShtZXRhQ2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyQ2hhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJDaGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjE0OGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJDaGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0KLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyQ2hhaW5lciB7Ci0KLQlNb2RpZmllckhlbHBlciBoZWxwZXI7Ci0KLQlwdWJsaWMgTW9kaWZpZXJIZWxwZXJDaGFpbmVyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFT2JqZWN0IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaGVscGVyID0gbmV3IE1vZGlmaWVySGVscGVyKCk7Ci0KLQkJaWYgKG93bmVyICE9IG51bGwpCi0JCQloZWxwZXIuc2V0T3duZXIob3duZXIpOwotCi0JCWhlbHBlci5zZXRGZWF0dXJlKGZlYXR1cmUpOwotCi0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJaGVscGVyLnNldFZhbHVlKHZhbHVlKTsKLQotCX0KLQotCXB1YmxpYyBNb2RpZmllckhlbHBlciBnZXRIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJCYXNlZE9uVHlwZShPYmplY3Qgb3duZXIpIHsKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCWhlbHBlci5zZXRPd25lcigoRU9iamVjdCkgb3duZXIpOwotCQllbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIE1vZGlmaWVySGVscGVyKQotCQkJaGVscGVyLnNldE93bmVySGVscGVyKChNb2RpZmllckhlbHBlcikgb3duZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQxYTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjcsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RpZmllckhlbHBlckZhY3RvcnkgewotCi0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZUhlbHBlcgotCSAqIEBwYXJhbSBhY3Rpb25GbGFnCi0JICogQHJldHVybgotCSAqLwotCU1vZGlmaWVySGVscGVyIGdldEhlbHBlcihNb2RpZmllckhlbHBlciBiYXNlSGVscGVyLCBpbnQgYWN0aW9uRmxhZyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQ3OGI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI3LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLQotICogSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJNb2RpZmllckhlbHBlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTiA9ICJhY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OX1NFVCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OX1VOU0VUID0gInVuc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTl9CT1RIID0gImJvdGgiOyAvL2RlZmF1bHQgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgSU5TVEFOQ0UgPSBudWxsOwotCS8vIEhhc2h0YWJsZSBtYXBwaW5nIGZlYXR1cmVzIHRvIGEgbGlzdCBvZiBGYWN0b3J5SG9sZGVycwotCXByaXZhdGUgSGFzaHRhYmxlIGZlYXR1cmVIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIGZhY3RvcnlIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJpdmF0ZSBjbGFzcyBGYWN0b3J5SG9sZGVyIHsKLQkJcHJpdmF0ZSBpbnQgYWN0aW9uVHlwZTsKLQkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQotCQlwdWJsaWMgRmFjdG9yeUhvbGRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgaW50IGFjdGlvblR5cGUpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQl0aGlzLmFjdGlvblR5cGUgPSBhY3Rpb25UeXBlOwotCQl9Ci0KLQkJcHVibGljIE1vZGlmaWVySGVscGVyRmFjdG9yeSBnZXRGYWN0b3J5KGludCBhY3Rpb25UeXBlQXJnKSB7Ci0JCQlpZiAodGhpcy5hY3Rpb25UeXBlID09IGFjdGlvblR5cGVBcmcgfHwgdGhpcy5hY3Rpb25UeXBlID09IE1vZGlmaWVySGVscGVyLkFDVElPTl9CT1RIKSB7Ci0JCQkJU3RyaW5nIGhhc2hLZXkgPSBnZXRGYWN0b3J5SGFzaChlbGVtZW50KTsKLQkJCQlNb2RpZmllckhlbHBlckZhY3RvcnkgZmFjdG9yeSA9IChNb2RpZmllckhlbHBlckZhY3RvcnkpIGZhY3RvcnlIYXNoLmdldChoYXNoS2V5KTsKLQkJCQlpZiAobnVsbCA9PSBmYWN0b3J5KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmYWN0b3J5ID0gKE1vZGlmaWVySGVscGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEZBQ1RPUllfQ0xBU1MpOwotCQkJCQkJZmFjdG9yeUhhc2gucHV0KGhhc2hLZXksIGZhY3RvcnkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhY3Rvcnk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKHN1cGVyLmVxdWFscyhvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlGYWN0b3J5SG9sZGVyIGhvbGRlciA9IChGYWN0b3J5SG9sZGVyKSBvYmo7Ci0JCQlyZXR1cm4gZ2V0RmFjdG9yeUhhc2goZWxlbWVudCkuZXF1YWxzKGdldEZhY3RvcnlIYXNoKGhvbGRlci5lbGVtZW50KSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkgKyBnZXRGYWN0b3J5SGFzaChlbGVtZW50KS5oYXNoQ29kZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZmllckhlbHBlclJlZ2lzdHJ5KCkgewotCQlyZWFkRXh0ZW5zaW9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9ucygpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVCk7Ci0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWFkRmFjdG9yeShlbGVtZW50c1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShGQUNUT1JZX0NMQVNTKTsKLQkJaWYgKG51bGwgPT0gZmFjdG9yeUNsYXNzTmFtZSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBGQUNUT1JZX0NMQVNTICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwYWNrYWdlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oUEFDS0FHRSk7Ci0JCWlmIChwYWNrYWdlcy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBQQUNLQUdFICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmb3IgKGludCBqID0gMDsgaiA8IHBhY2thZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQlyZWFkUGFja2FnZShlbGVtZW50LCBwYWNrYWdlc1tqXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFBhY2thZ2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZhY3RvcnlFbGVtZW50LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcGFja2FnZVVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBBQ0tBR0VfVVJJKTsKLQkJaWYgKG51bGwgPT0gcGFja2FnZVVSSSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBQQUNLQUdFX1VSSSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShwYWNrYWdlVVJJKTsKLQkJaWYgKG51bGwgPT0gZVBhY2thZ2UpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsIFBBQ0tBR0UgKyAiICIgKyBwYWNrYWdlVVJJICsgIiBjYW4gbm90IGJlIGZvdW5kLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0eXBlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVFlQRSk7Ci0JCWlmICh0eXBlcy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBUWVBFICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWFkVHlwZShmYWN0b3J5RWxlbWVudCwgZVBhY2thZ2UsIHR5cGVzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQsIEVQYWNrYWdlIGVQYWNrYWdlLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FKTsKLQkJaWYgKG51bGwgPT0gdHlwZU5hbWUpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgTkFNRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcih0eXBlTmFtZSk7Ci0JCWlmIChudWxsID09IGVDbGFzc2lmaWVyKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCBUWVBFICsgIiAiICsgdHlwZU5hbWUgKyAiIGNhbiBub3QgYmUgZm91bmQgaW4gIiArIFBBQ0tBR0UgKyAiICIgKyBlUGFja2FnZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcmV0dXJuOwotCQl9Ci0JCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmVhdHVyZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKEZFQVRVUkUpOwotCQlpZiAoZmVhdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgRkVBVFVSRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJcmVhZEZlYXR1cmUoZmFjdG9yeUVsZW1lbnQsIGVDbGFzcywgZmVhdHVyZXNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRGZWF0dXJlKElDb25maWd1cmF0aW9uRWxlbWVudCBmYWN0b3J5RWxlbWVudCwgRUNsYXNzIGVDbGFzcywgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRSk7Ci0JCWlmIChudWxsID09IGZlYXR1cmVOYW1lKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIE5BTUUgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBhY3Rpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShGRUFUVVJFX0FDVElPTik7Ci0JCWlmIChudWxsID09IGFjdGlvbikgewotCQkJYWN0aW9uID0gRkVBVFVSRV9BQ1RJT05fQk9USDsKLQkJfQotCQlpbnQgYWN0aW9uVHlwZSA9IC0xOwotCQlpZiAoYWN0aW9uLmVxdWFsc0lnbm9yZUNhc2UoRkVBVFVSRV9BQ1RJT05fQk9USCkpIHsKLQkJCWFjdGlvblR5cGUgPSBNb2RpZmllckhlbHBlci5BQ1RJT05fQk9USDsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzSWdub3JlQ2FzZShGRUFUVVJFX0FDVElPTl9TRVQpKSB7Ci0JCQlhY3Rpb25UeXBlID0gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1NFVDsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzSWdub3JlQ2FzZShGRUFUVVJFX0FDVElPTl9VTlNFVCkpIHsKLQkJCWFjdGlvblR5cGUgPSBNb2RpZmllckhlbHBlci5BQ1RJT05fVU5TRVQ7Ci0JCX0KLQkJaWYgKGFjdGlvblR5cGUgPT0gLTEpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJJbnZhbGlkICIgKyBGRUFUVVJFX0FDVElPTiArICI9IiArIGFjdGlvbiArICIgZGVmaW5lZC4gIFZhbGlkIHZhbHVlcyBhcmU6ICIgKyBGRUFUVVJFX0FDVElPTl9CT1RIICsgIiwgIiArIEZFQVRVUkVfQUNUSU9OX1NFVCArICIsIG9yICIgKyBGRUFUVVJFX0FDVElPTl9VTlNFVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJcmV0dXJuOwotCQl9Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJRUxpc3QgYWxsRmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgdGVtcEZlYXR1cmUgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGFsbEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChudWxsID09IGZlYXR1cmUgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl0ZW1wRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0ZW1wRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCWZlYXR1cmUgPSB0ZW1wRmVhdHVyZTsKLQkJCX0KLQkJfQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlsb2dFcnJvcihlbGVtZW50LCBGRUFUVVJFICsgIiAiICsgZmVhdHVyZU5hbWUgKyAiIGNhbiBub3QgYmUgZm91bmQgaW4gIiArIFRZUEUgKyAiICIgKyBlQ2xhc3MuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXJldHVybjsKLQkJfQotCQlMaXN0IGZhY3RvcnlIb2xkZXJMaXN0ID0gKExpc3QpIGZlYXR1cmVIYXNoLmdldChmZWF0dXJlKTsKLQkJaWYgKG51bGwgPT0gZmFjdG9yeUhvbGRlckxpc3QpIHsKLQkJCWZhY3RvcnlIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmVhdHVyZUhhc2gucHV0KGZlYXR1cmUsIGZhY3RvcnlIb2xkZXJMaXN0KTsKLQkJfQotCQlGYWN0b3J5SG9sZGVyIGZhY3RvcnlIb2xkZXIgPSBuZXcgRmFjdG9yeUhvbGRlcihmYWN0b3J5RWxlbWVudCwgYWN0aW9uVHlwZSk7Ci0JCWlmIChmYWN0b3J5SG9sZGVyTGlzdC5jb250YWlucyhmYWN0b3J5SG9sZGVyKSkgewotCQkJbG9nRXJyb3IoZWxlbWVudCwgIkR1cGxpY2F0ZSIgKyBGRUFUVVJFICsgIjoiICsgZmVhdHVyZU5hbWUgKyAiIGRlZmluZWQgZm9yICIgKyBGQUNUT1JZX0NMQVNTICsgIjoiICsgZmFjdG9yeUVsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJcmV0dXJuOwotCQl9Ci0JCWZhY3RvcnlIb2xkZXJMaXN0LmFkZChmYWN0b3J5SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRGYWN0b3J5SGFzaChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnlFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpICsgZmFjdG9yeUVsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTW9kaWZpZXJIZWxwZXJSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKG51bGwgPT0gSU5TVEFOQ0UpIHsKLQkJCUlOU1RBTkNFID0gbmV3IE1vZGlmaWVySGVscGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgTW9kaWZpZXJIZWxwZXJzCi0JICogCi0JICogQHBhcmFtIGJhc2VIZWxwZXIKLQkgKiBAcGFyYW0gYWN0aW9uRmxhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRIZWxwZXJzKE1vZGlmaWVySGVscGVyIGJhc2VIZWxwZXIpIHsKLQkJaW50IGFjdGlvbkZsYWcgPSBiYXNlSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSA/IE1vZGlmaWVySGVscGVyLkFDVElPTl9VTlNFVCA6IE1vZGlmaWVySGVscGVyLkFDVElPTl9TRVQ7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYmFzZUhlbHBlci5nZXRGZWF0dXJlKCk7Ci0JCUxpc3QgZmFjdG9yeUxpc3QgPSBnZXRGYWN0b3JpZXMoZmVhdHVyZSwgYWN0aW9uRmxhZyk7Ci0JCWlmIChudWxsID09IGZhY3RvcnlMaXN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBcnJheUxpc3QgaGVscGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBmYWN0b3J5TGlzdC5pdGVyYXRvcigpOwotCQlNb2RpZmllckhlbHBlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWZhY3RvcnkgPSAoTW9kaWZpZXJIZWxwZXJGYWN0b3J5KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgaGVscGVyID0gZmFjdG9yeS5nZXRIZWxwZXIoYmFzZUhlbHBlciwgYWN0aW9uRmxhZyk7Ci0JCQlpZiAobnVsbCAhPSBoZWxwZXIpIHsKLQkJCQloZWxwZXJzLmFkZChoZWxwZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBoZWxwZXJzOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRGYWN0b3JpZXMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBhY3Rpb25GbGFnKSB7Ci0JCUxpc3QgZmFjdG9yeUhvbGRlckxpc3QgPSAoTGlzdCkgZmVhdHVyZUhhc2guZ2V0KGZlYXR1cmUpOwotCQlpZiAobnVsbCA9PSBmYWN0b3J5SG9sZGVyTGlzdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTW9kaWZpZXJIZWxwZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY3RvcnlIb2xkZXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlmYWN0b3J5ID0gKChGYWN0b3J5SG9sZGVyKSBmYWN0b3J5SG9sZGVyTGlzdC5nZXQoaSkpLmdldEZhY3RvcnkoYWN0aW9uRmxhZyk7Ci0JCQlpZiAobnVsbCAhPSBmYWN0b3J5KSB7Ci0JCQkJZmFjdG9yeUxpc3QuYWRkKGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5TGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Pd25lclByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Pd25lclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODI0MzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vT3duZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNi8yMC8yMDAxIDEwOjI0OjQ2IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3duZXJQcm92aWRlciB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBFT2JqZWN0IHRoYXQgd2lsbCBzZXJ2ZSBhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBKMkVFTW9kaWZpZXJIZWxwZXIuCi0JICovCi0JRU9iamVjdCBnZXRPd25lcigpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgSjJFRU1vZGlmaWVySGVscGVyIGZvciB0aGUgb3duZXIgaWYgdGhlIG93bmVyIGRvZXMgbm90IHlldCBleGlzdC4KLQkgKi8KLQlNb2RpZmllckhlbHBlciBnZXRPd25lckhlbHBlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL1Byb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Qcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM3ODMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL1Byb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLkNvbnRlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsIGV4dGVuZHMgUHJvamVjdFJlc291cmNlU2V0SW1wbCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwoSVByb2plY3QgYVByb2plY3QpIHsKLQkJc3VwZXIoYVByb2plY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsI2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlSZXNvdXJjZSByZXN1bHQgPSBzdXBlci5jcmVhdGVSZXNvdXJjZSh1cmksIGNvbnRlbnRUeXBlKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlc3VsdCkpCi0JCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgQ29udGVudEhhbmRsZXIuVU5TUEVDSUZJRURfQ09OVEVOVF9UWVBFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL1Jlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZhZjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL1Jlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIGV4dGVuZHMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19FWFRFTlNJT04gPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfQVJDSElWRSA9ICJqYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTZXQgcmVjZW50bHlTYXZlZEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIE1hcCBpZ25vcmVkRmlsZXNDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBjbGFzcyBTYXZlZEZpbGVLZXkgewotCQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgcmVzOwotCQlwcml2YXRlIElGaWxlIHNhdmVkRmlsZTsKLQkJcHVibGljIFNhdmVkRmlsZUtleShSZXNvdXJjZSByZXMsIElGaWxlIHNhdmVkRmlsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucmVzID0gbmV3IFdlYWtSZWZlcmVuY2UocmVzKTsKLQkJCXRoaXMuc2F2ZWRGaWxlID0gc2F2ZWRGaWxlOwotCQl9Ci0JCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXMgPT0gbnVsbCA/IG51bGwgOiAoUmVzb3VyY2UpcmVzLmdldCgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCQlpbnQgcmVzdWx0ID0gMTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZ2V0T3V0ZXJUeXBlKCkuaGFzaENvZGUoKTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChnZXRSZXMoKSA9PSBudWxsKSA/IDAgOiBnZXRSZXMoKS5oYXNoQ29kZSgpKTsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChzYXZlZEZpbGUgPT0gbnVsbCkgPyAwIDogc2F2ZWRGaWxlLmhhc2hDb2RlKCkpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICh0aGlzID09IG9iaikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTYXZlZEZpbGVLZXkgb3RoZXIgPSAoU2F2ZWRGaWxlS2V5KSBvYmo7Ci0JCQlpZiAoIWdldE91dGVyVHlwZSgpLmVxdWFscyhvdGhlci5nZXRPdXRlclR5cGUoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGdldFJlcygpID09IG51bGwpIHsKLQkJCQlpZiAob3RoZXIuZ2V0UmVzKCkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmICghZ2V0UmVzKCkuZXF1YWxzKG90aGVyLmdldFJlcygpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoc2F2ZWRGaWxlID09IG51bGwpIHsKLQkJCQlpZiAob3RoZXIuc2F2ZWRGaWxlICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoIXNhdmVkRmlsZS5lcXVhbHMob3RoZXIuc2F2ZWRGaWxlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwcml2YXRlIFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBnZXRPdXRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLnRoaXM7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIGVtZiByZXNvdXJjZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSBzZXQgYXMgYSByZXN1bHQgb2YgYSBkZWx0YSAqLwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkTG9hZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMaXN0IGF1dG9sb2FkUmVzb3VyY2VzVVJJcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgTGlzdCBhdXRvbG9hZFJlc291cmNlc0V4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJc3VwZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7Ci0JfQotCQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIucmVzb3VyY2VDaGFuZ2VkKGV2ZW50KTsKLQkJdHJ5IHsKLQkJCWFjY2VwdERlbHRhKGV2ZW50KTsKLQkJCW5vdGlmeUV4dGVuZGVyc0lmTmVjZXNzYXJ5KCk7Ci0JCQlwcm9jZXNzRGVmZXJyZWRSZXNvdXJjZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlkZWZlcnJlZFJlbW92ZVJlc291cmNlcy5jbGVhcigpOwotCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCWRlZmVycmVkTG9hZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmVycmVkUmVtb3ZlZFJlc291cmNlcygpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgZGVmZXJyZWRSZW1vdmVSZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCXJlc291cmNlLnVubG9hZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmVycmVkVW5sb2FkZWRSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcnJlZFVubG9hZFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmdldChpKTsKLQkJCXJlc291cmNlLnVubG9hZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWZlcnJlZExvYWRSZXNvdXJjZXMoKSB7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVycmVkTG9hZFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJdXJpID0gKFVSSSkgZGVmZXJyZWRMb2FkUmVzb3VyY2VzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmxvZ0Vycm9yKGV4KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0RGVsdGEoZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc1RyZWVMb2NrZWQoKSkgewotCQkJcHJpbUFjY2VwdERlbHRhKGRlbHRhLCBldmVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJcHJpbUFjY2VwdERlbHRhKGRlbHRhLCBldmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgcHJvamVjdCwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltQWNjZXB0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRQcm9qZWN0RGVsdGEgPSBudWxsOwotCQkJCWRlbHRhLmFjY2VwdChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIudGhpcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUVNRldvcmtiZW5jaEVkaXRQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJvamVjdCBpcyBnb2luZyBhd2F5IHNvIHdlIG5lZWQgdG8gY2xlYW51cCBvdXJzZWxmIGFuZCB0aGUgUmVzb3VyY2VTZXQuIFRPRE8gTmVlZCB0bwotCSAqIHB1c2ggdXAgdGhpcyBjb2RlIHRvIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGluIG5leHQgcmVsZWFzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoSkVNVXRpbFBsdWdpbi5pc0FjdGl2YXRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkKLQkJCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5yZWxlYXNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLnJlbW92ZUNhY2hlZFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0RlZmVycmVkUmVzb3VyY2VzKCkgewotCQlwcm9jZXNzRGVmZXJyZWRSZW1vdmVkUmVzb3VyY2VzKCk7Ci0JCXByb2Nlc3NEZWZlcnJlZFVubG9hZGVkUmVzb3VyY2VzKCk7Ci0JCXByb2Nlc3NEZWZlcnJlZExvYWRSZXNvdXJjZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkvLyBvbmx5IHJlc3BvbmQgdG8gcHJvamVjdCBjaGFuZ2VzCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJaWYgKGlzSW50ZXJyZXN0ZWRJblByb2plY3QocCkpIHsKLQkJCQkJY3VycmVudFByb2plY3REZWx0YSA9IGRlbHRhOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBpc0ludGVycmVzdGVkSW5GaWxlKChJRmlsZSkgcmVzb3VyY2UpKSB7Ci0JCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQkJCXJlbW92ZWRSZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQkJCWFkZGVkUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpICE9IDApCi0JCQkJCQkJY2hhbmdlZFJlc291cmNlKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKQotCQkJCQkJCW1vdmVkUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFF1ZXVlIHVwIHRoZSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byA8Y29kZT5hRmlsZTwvY29kZT4sIGZvciByZW1vdmFsCi0JICogZnJvbSB0aGUgY2FjaGUgb2YgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwb3N0IFJldHVybiB0cnVlIGlmIGEgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHdhcyBxdWV1ZWQgdXAgdG8gYmUgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVkUmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIHByb2Nlc3NSZXNvdXJjZShhRmlsZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUXVldWUgdXAgdGhlIDxjb2RlPlJlc291cmNlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFGaWxlPC9jb2RlPiwgZm9yIHJlbG9hZC4KLQkgKiAKLQkgKiBAcG9zdCBSZXR1cm4gdHJ1ZSBpZiBhIDxjb2RlPlJlc291cmNlPC9jb2RlPiB3YXMgcXVldWVkIHVwIHRvIGJlIHJlbG9hZGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZGVkUmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJYm9vbGVhbiBkaWRQcm9jZXNzID0gZmFsc2U7Ci0JCUxpc3QgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKGFGaWxlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWlmIChyZWNlbnRseVNhdmVkRmlsZXNDb250YWlucyhyZXNvdXJjZSkpIHsKLQotCQkJCQkvKgotCQkJCQkgKiBUaGUgSUZpbGUgd2FzIGp1c3QgYWRkZWQgdG8gdGhlIHdvcmtzcGFjZSBidXQgd2UgaGF2ZSBhCi0JCQkJCSAqIGNoYW5nZWQgcmVzb3VyY2UgaW4gbWVtb3J5LiBOZWVkIHRvIGRlY2lkZSBpZiBpdCBzaG91bGQKLQkJCQkJICogYmUgdW5sb2FkZWQuCi0JCQkJCSAqLwotCQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7Ci0JCQkJCQkJUmVmZXJlbmNlZFJlc291cmNlIHJlZlJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlc291cmNlOwotCQkJCQkJCWlmIChyZWZSZXMuc2hvdWxkRm9yY2VSZWZyZXNoKCkpIHsKLQkJCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJZGlkUHJvY2VzcyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogVW5sb2FkIGlmIGZvdW5kIGFuZCBpcyBub3QgbW9kaWZpZWQgYnV0IGluY29uc2lzdGVudC4gKi8KLQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXNvdXJjZSkpIHsKLQkJCQkJCQlpZiAoIVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzQ29uc2lzdGVudCgoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZSkpIHsKLQkJCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJZGlkUHJvY2VzcyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCWRpZFByb2Nlc3MgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogUHJvY2VzcyBhdXRvbG9hZCByZXNvdXJjZXMgb24gYWRkZWQgZmlsZSAqLwotCQkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlpZiAoKGF1dG9sb2FkUmVzb3VyY2VzVVJJcy5jb250YWlucyh1cmkpKSB8fCAoYXV0b2xvYWRSZXNvdXJjZXNFeHRzLmNvbnRhaW5zKGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKSkpKSB7Ci0JCQkJCQkJZGVmZXJyZWRMb2FkUmVzb3VyY2VzLmFkZCh1cmkpOwotCQkJCQkJCWRpZFByb2Nlc3MgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaWRQcm9jZXNzOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzQ29udGFpbnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY2VudGx5U2F2ZWRGaWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTYXZlZEZpbGVLZXkga2V5ID0gKFNhdmVkRmlsZUtleSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGtleS5nZXRSZXMoKSAhPSBudWxsICYmIChrZXkuZ2V0UmVzKCkuZ2V0VVJJKCkuZXF1YWxzKHJlc291cmNlLmdldFVSSSgpKSAmJiBrZXkuZ2V0UmVzKCkuZ2V0Q2xhc3MoKS5lcXVhbHMocmVzb3VyY2UuZ2V0Q2xhc3MoKSkpKQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1Jlc291cmNlKElGaWxlIGFGaWxlLCBib29sZWFuIGlzUmVtb3ZlKSB7Ci0JCUxpc3QgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKGFGaWxlKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKChyZXNvdXJjZSAhPSBudWxsKSkgewotCQkJCWlmIChyZWNlbnRseVNhdmVkRmlsZXNDb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlc291cmNlKSkgewotCQkJCQkJCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZTsKLQkJCQkJCQlpZiAoIXJlZlJlcy5zaG91bGRGb3JjZVJlZnJlc2goKSkKLQkJCQkJCQkJY29udGludWU7IC8vIERvIG5vdCBkbyBhbnl0aGluZwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGlzUmVtb3ZlKQotCQkJCQlkZWZlcnJlZFJlbW92ZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCWVsc2UgaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlc291cmNlKSkgewotCQkJCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc0NvbnNpc3RlbnQoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2UpKQotCQkJCQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZvciBub3csIGRvIHRoZSBzYW1lIGFzIGlmIHRoZSA8Y29kZT5hRmlsZTwvY29kZT4gd2FzIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZWRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudHMgb2YgPGNvZGU+YUZpbGU8L2NvZGU+IGhhdmUgY2hhbmdlZCBpbiB0aGUgV29ya2JlbmNoIGFuZCB3ZSBtYXkgbmVlZCB0byB1cGRhdGUKLQkgKiBvdXIgY2FjaGVkIHJlc291cmNlcy4KLQkgKiAKLQkgKiBXZSB3aWxsIHByb2Nlc3MgdGhpcyByZXNvdXJjZSB0byBiZSByZWZyZXNoZWQgYW5kIG5vdCByZW1vdmVkLgotCSAqIAotCSAqIEBwb3N0IFJldHVybiB0cnVlIGlmIGEgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHdhcyBhY3R1YWxseSByZW1vdmVkLgotCSAqLwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hhbmdlZFJlc291cmNlKElGaWxlIGFGaWxlKSB7Ci0JCS8vUHJvY2VzcyByZXNvdXJjZSBhcyBhIHJlZnJlc2guCi0JCXJldHVybiBwcm9jZXNzUmVzb3VyY2UoYUZpbGUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKLQkJCi0JCXJldHVybiByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldFJlc291cmNlcyhJRmlsZSBhRmlsZSkgewotCi0JCUxpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgYUZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKGFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCUlQYXRoIGFGaWxlUGF0aCA9IG5ldyBQYXRoKGFGaWxlU3RyaW5nKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQlpZiAoIWFGaWxlUGF0aC5pc0VtcHR5KCkpCi0JCXsKLQkJCWFGaWxlU3RyaW5nID0gYUZpbGVQYXRoLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGFGaWxlU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJewotCQkJTGlzdCBhbGxSZXNvdXJjZXMgPSBudWxsOwotCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0SW1wbCkgewotCSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZVNldEltcGwgcHJvalJlc1NldCA9KFByb2plY3RSZXNvdXJjZVNldEltcGwpcmVzb3VyY2VTZXQ7Ci0JICAgICAgICAgICAgYWxsUmVzb3VyY2VzID0gcHJvalJlc1NldC5nZXRJbW11dGFibGVSZXNvdXJjZXMoKTsKLQkgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgICAgYWxsUmVzb3VyY2VzID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCk7Ci0JICAgICAgICB9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlVUkkgcmVzVVJJID0gcmVzLmdldFVSSSgpOwotCQkJCVN0cmluZyByZXNVUklTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZXNVUkkucGF0aCgpICE9IG51bGwpIHsKLQkJCQkJSVBhdGggcmVzVVJJUGF0aDsKLQkJCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUGxhdGZvcm1SZXNvdXJjZVVSSShyZXNVUkkpKQotCQkJCQkJcmVzVVJJUGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUocmVzVVJJLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMik7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlc1VSSVBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHJlc1VSSS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCQlyZXNVUklTdHJpbmcgPSByZXNVUklQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQotCQkJCWlmIChyZXNVUklTdHJpbmcubGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJaWYgKGFGaWxlU3RyaW5nLmVxdWFscyhyZXNVUklTdHJpbmcpKQotCQkJCQkvL2lmICghcmVzVVJJU3RyaW5nLmVxdWFscygiIikgJiYgYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmluZGV4T2YocmVzVVJJU3RyaW5nKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYSBNT0YgcmVzb3VyY2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJlU2F2ZShJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJcmVjZW50bHlTYXZlZEZpbGVzQWRkKGFGaWxlLG51bGwpOwotCQkJaWdub3JlZEZpbGVzQ2FjaGUucmVtb3ZlKGFGaWxlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHdyaXRpbmcgdG8gYW4gSUZpbGUgZnJvbSBhIE1PRiByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTYXZlKElGaWxlIGFGaWxlLCBSZXNvdXJjZSByZXMpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwpIHsKLQkJCXJlY2VudGx5U2F2ZWRGaWxlc0FkZChhRmlsZSwgcmVzKTsKLQkJCWlnbm9yZWRGaWxlc0NhY2hlLnJlbW92ZShhRmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc0FkZChJRmlsZSBmaWxlLCBSZXNvdXJjZSByZXMpIHsKLQkJcmV0dXJuIHJlY2VudGx5U2F2ZWRGaWxlcy5hZGQobmV3IFNhdmVkRmlsZUtleShyZXMsIGZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgcHJlU2F2ZSBpZiB0aGUgc2F2ZSBmYWlscwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZWNlbnRseVNhdmVkTGlzdChJRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJcmVjZW50bHlTYXZlZEZpbGVzRm9yY2VSZW1vdmUoYUZpbGUpOwotCQkJaWdub3JlZEZpbGVzQ2FjaGUucmVtb3ZlKGFGaWxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzUmVtb3ZlKElGaWxlIGZpbGUpIHsKLQkJCi0JCWJvb2xlYW4gcmVtb3ZlZEZyb21MaXN0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNlbnRseVNhdmVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU2F2ZWRGaWxlS2V5IGtleSA9IChTYXZlZEZpbGVLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChrZXkuc2F2ZWRGaWxlICE9IG51bGwgJiYga2V5LnNhdmVkRmlsZS5lcXVhbHMoZmlsZSkpIHsKLQkJCQlMaXN0IHJlc291cmNlcyA9IGdldFJlc291cmNlcyhmaWxlKTsKLQkJCQlpZiAoa2V5LmdldFJlcygpID09IG51bGwgfHwgcmVzb3VyY2VzLmNvbnRhaW5zKGtleS5nZXRSZXMoKSkgKSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQlyZW1vdmVkRnJvbUxpc3QgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVtb3ZlZEZyb21MaXN0OwotCX0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc0ZvcmNlUmVtb3ZlKElGaWxlIGZpbGUpIHsKLQkJCi0JCWJvb2xlYW4gcmVtb3ZlZEZyb21MaXN0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNlbnRseVNhdmVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU2F2ZWRGaWxlS2V5IGtleSA9IChTYXZlZEZpbGVLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChrZXkuc2F2ZWRGaWxlICE9IG51bGwgJiYga2V5LnNhdmVkRmlsZS5lcXVhbHMoZmlsZSkpIHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCXJlbW92ZWRGcm9tTGlzdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWRGcm9tTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgd3JpdGluZyB0byBhbiBJRmlsZSBmcm9tIGEgTU9GIHJlc291cmNlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFNhdmUoSUZpbGUgYUZpbGUpIHsKLQkJLy9UT0RPIHJlbW92ZSB0aGlzIG1ldGhvZAotCX0KLQotCS8qKgotCSAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5hUHJvamVjdDwvY29kZT4gaGFzIHRoZSBwcm9qZWN0TmF0dXJlSUQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlyZXR1cm4gYVByb2plY3QuZXF1YWxzKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogT3B0aW1pemVkIG5vdCB0byBiZSBub3QgaW50ZXJyZXN0ZWQgaW4gZmlsZXMgd2l0aCBhbiBleHRlbnNpb24gb2YgLmphdmEgb3IgLmNsYXNzIG9yIGlmIHRoZQotCSAqIGZpbGUgaGFzIGp1c3QgYmVlbiBzYXZlZCBieSBvdXIgb3duIGludGVybmFsIG1lY2hhbmlzbS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5GaWxlKElGaWxlIGFGaWxlKSB7Ci0JCVN0cmluZyBleHRlbnNpb24gPSBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmIChDTEFTU19FWFRFTlNJT04uZXF1YWxzKGV4dGVuc2lvbikgfHwgSkFWQV9FWFRFTlNJT04uZXF1YWxzKGV4dGVuc2lvbikgfHwgSkFWQV9BUkNISVZFLmVxdWFscyhleHRlbnNpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocmVjZW50bHlTYXZlZEZpbGVzUmVtb3ZlKGFGaWxlKSkgewotCQkJCWNhY2hlSWdub3JlZChhRmlsZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAhaGFzSWdub3JlZChhRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGlnbm9yZWQgdGhpcyA8Y29kZT5maWxlPC9jb2RlPiBhbmQgdGhhdCBpdHMgbW9kaWZpY2F0aW9uCi0JICogc3RhbXAgaXMgdGhlIHNhbWUgYXMgd2hlbiB3ZSBwcm9jZXNzZWQgaXQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0lnbm9yZWQoSUZpbGUgZmlsZSkgewotCQlMb25nIGNhY2hlZFN0YW1wID0gKExvbmcpIGlnbm9yZWRGaWxlc0NhY2hlLmdldChmaWxlKTsKLQkJaWYgKGNhY2hlZFN0YW1wID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWxvbmcgc3RhbXAgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCXJldHVybiBjYWNoZWRTdGFtcC5sb25nVmFsdWUoKSA9PSBzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIG9mIHRoZSA8Y29kZT5maWxlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZUlnbm9yZWQoSUZpbGUgZmlsZSkgewotCQlsb25nIHN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOwotCQlpZ25vcmVkRmlsZXNDYWNoZS5wdXQoZmlsZSwgbmV3IExvbmcoc3RhbXApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVBdXRvbG9hZChVUkkgdXJpKSB7Ci0JCVVSSSBub3JtYWxpemVkID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWF1dG9sb2FkUmVzb3VyY2VzVVJJcy5hZGQobm9ybWFsaXplZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzYWJsZUF1dG9sb2FkKFVSSSB1cmkpIHsKLQkJVVJJIG5vcm1hbGl6ZWQgPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJYXV0b2xvYWRSZXNvdXJjZXNVUklzLnJlbW92ZShub3JtYWxpemVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI2luaXRpYWxpemUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0JcHVibGljIHZvaWQgZW5hYmxlQXV0b2xvYWQoU3RyaW5nIGV4dGVuc2lvbikgewotCQlhdXRvbG9hZFJlc291cmNlc0V4dHMuYWRkKGV4dGVuc2lvbik7Ci0JCQotCX0KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQXV0b2xvYWQoU3RyaW5nIGV4dGVuc2lvbikgewotCQlhdXRvbG9hZFJlc291cmNlc0V4dHMucmVtb3ZlKGV4dGVuc2lvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQljdXJyZW50UHJvamVjdERlbHRhID0gbnVsbDsKLQkJZXh0ZW5kZXJzID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9JVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L0lWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjU5MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L0lWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxOCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aSBUaGlzIGlzIHRoZSBhYnN0cmFjdGlvbiBsYXllciBmb3IgdmFsaWRhdGUgZWRpdAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0ZUVkaXRDb250ZXh0IGV4dGVuZHMgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19LRVkgPSAiVmFsaWRhdGVFZGl0Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIHNldEVkaXRNb2RlbChFZGl0TW9kZWwgZlZhbGlkYXRvcik7Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKEVkaXRNb2RlbCBmVmFsaWRhdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjhiYzYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIGNvbnRyb2xsZWQgcmVzb3VyY2VzIG9yIGZpbGVzIGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlIE1PRiBSZXNvdXJjZXMgdGhhdCBhcmUgYmVpbmcgbWFuYWdlZC4gU3luY2hyb25pemF0aW9uCi0JICogY2hlY2tpbmcgd2lsbCBvbmx5IHdvcmsgaWYgeW91IGFyZSB1c2luZyB0aGUgZW1mLndvcmtiZW5jaCBwbHVnaW4gYXBpcyBmb3IgbG9hZGluZyByZXNvdXJjZXMuCi0JICogVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHlvdSBnZXQgYW4gaW5zdGFuY2Ugb2YgYSA8Y29kZT5SZWZlcmVuY2VkUmVzb3VyY2U8L2NvZGU+LiBUaGlzCi0JICogcmVzb3VyY2UgdHlwZSBpcyBjYXBhYmxlIG9mIGNhY2hpbmcgaXRzIGxhc3Qga25vd24gc3luY2hyb25pemF0aW9uIHN0YW1wIHRoYXQgbWF5IGJlIHVzZWQgdG8KLQkgKiB0ZXN0IGlmIHRoZSByZXNvdXJjZSBpcyBjb25zaXRlbnQgd2l0aCB0aGUgdW5kZXJseWluZyBJRmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgSUZpbGVzIHRoYXQgYXJlIG5vdCBNT0YgUmVzb3VyY2VzIHRoYXQgYXJlIGFsc28gYmVpbmcKLQkgKiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlMaXN0IGdldE5vblJlc291cmNlRmlsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN1YnNldCBvZiB0aGUgTGlzdCBmcm9tIGdldE5vblJlc291cmNlRmlsZXMoKSB0aGF0IGFyZSBpbmNvbnNpc3RlbnQgd2l0aCB0aGUKLQkgKiB1bmRlcmx5aW5nIGphdmEuaW8uRmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2dldE5vblJlc291cmNlRmlsZXMoKQotCSAqLwotCUxpc3QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCi0JLyoqCi0JICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBwcm92aWRlciB0byBjYWNoZSB0aGUgc3luY2hyb25pemF0aW9uIHN0YW1wIGZvciB0aGUgTGlzdCBvZgotCSAqIDxjb2RlPnJvTm9uUmVzb3VyY2VGaWxlczwvY29kZT4uIFRoaXMgc3RhbXAgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgaW5jb25zaXN0ZW50Ci0JICogZmlsZXMuIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgb2YgSUZpbGVzIHRoYXQgYXJlIG5vdCBNT0YgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSByb05vblJlc291cmNlRmlsZXMKLQkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2dldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKQotCSAqLwotCXZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzMzdjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIHsKLQlzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpFTVV0aWxQbHVnaW4uSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gaXMgYWN0aXZhdGVkIChiZWNvbWVzCi0JICogYWN0aXZlKS4gVGhpcyB3aWxsIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQKLQkgKiBmcm9tIHRoZSBsYXN0IGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gVGhlIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gc2hvdWxkIGJlIHByZXBhcmVkIHRvCi0JICogcHJvbXB0IHRoZSB1c2VyIGlmIHRoZXkgd291bGQgbGlrZSB0byByZWZyZXNoIHdpdGggdGhlIGNvbnRlbnRzIG9uIGRpc2sgaWYgd2UgYXJlIGRpcnR5LgotCSAqLwotCXZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IGxvb3NlcyBhY3RpdmF0aW9uLiBUaGlzIHdpbGwKLQkgKiBjaGVjayB0aGUgdGltZXN0YW1wcyBvZiB0aGUgdW5kZXJseWluZyBmaWxlcyB0byBzZWUgaWYgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QKLQkgKiBjYWNoZWQgbW9kaWZpZWQgdmFsdWUuIFRoZSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IHNob3VsZCBiZSBwcmVwYXJlZCB0byBwcm9tcHQgdGhlIHVzZXIgaWYKLQkgKiB0aGV5IHdvdWxkIGxpa2UgdG8gcmVmcmVzaCB3aXRoIHRoZSBjb250ZW50cyBvbiBkaXNrIGlmIHdlIGFyZSBkaXJ0eS4KLQkgKi8KLQl2b2lkIGxvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgdGhlIGZpbGVzIGFyZSBhYm91dCB0byBiZSBtb2RpZmllZCBhZnRlciBhCi0JICogPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBiZWNvbWVzIGFjdGl2ZS4gVGhlIHJldHVybmVkIElTdGF0dXMgbWF5IGhhdmUgYW4gRVJST1Igc3RhdHVzIHdoaWNoCi0JICogc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KLQkgKi8KLQlJU3RhdHVzIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB0aGUgPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBzYXZpbmcgdGhlIG1vZGlmaWVkCi0JICogY29udGVudHMuIFRoaXMgd2lsbCBjaGVjayB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIHVuZGVybHlpbmcgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUKLQkgKiBzeW5jaHJvbml6ZWQuIElmIHRydWUgaXMgcmV0dXJuZWQsIHRoZSBzYXZlIGNhbiBwcm9jZWVkLgotCSAqLwotCWJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgcmVhZCBvbmx5IGZpbGVzLgotCSAqLwotCWJvb2xlYW4gY2hlY2tSZWFkT25seSgpOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBiNmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwgaW1wbGVtZW50cyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIHsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHJvdGVjdGVkIE1hcCBsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwOwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2hlY2tpbmdDb25zaXN0ZW5jeTsKLQotCWNsYXNzIFJlZnJlc2hSdW5uYWJsZSBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjZXB0aW9uOwotCQlMaXN0IGZpbGVzOwotCQlMaXN0IHJlc291cmNlczsKLQotCQlSZWZyZXNoUnVubmFibGUoTGlzdCBzb21lRmlsZXMsIExpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzKSB7Ci0JCQlmaWxlcyA9IHNvbWVGaWxlczsKLQkJCXJlc291cmNlcyA9IGluY29uc2lzdGVudFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyBDb3JlRXhjZXB0aW9uIGdldFRocm93bkV4Y2VwdGlvbigpIHsKLQkJCXJldHVybiB0aHJvd25FeGNlcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQlwcmVwYXJlUmVzb3VyY2VzRm9yUmVmcmVzaChyZXNvdXJjZXMpOwotCQkJCXByaW1SZWZyZXNoRmlsZXMoZmlsZXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3duRXhjZXB0aW9uID0gZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbChSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciBhUHJvdmlkZXIpIHsKLQkJcHJvdmlkZXIgPSBhUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciA8Y29kZT5hTGlzdGVuZXI8L2NvZGU+IGlzIGFjdGl2YXRlZCAoYmVjb21lcyBhY3RpdmUpLgotCSAqIFRoaXMgd2lsbCBjaGVjayB0aGUgdGltZXN0YW1wcyBvZiB0aGUgdW5kZXJseWluZyBmaWxlcyB0byBzZWUgaWYgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlCi0JICogbGFzdCBjYWNoZWQgbW9kaWZpZWQgdmFsdWUuIDxjb2RlPmFMaXN0ZW5lcjwvY29kZT4gc2hvdWxkIGJlIHByZXBhcmVkIHRvIHByb21wdCB0aGUgdXNlciBpZgotCSAqIHRoZXkgd291bGQgbGlrZSB0byByZWZyZXNoIHdpdGggdGhlIGNvbnRlbnRzIG9uIGRpc2sgaWYgd2UgYXJlIGRpcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljaGVja0NvbnNpc3RlbmN5KHByZXNlbnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tDb25zaXN0ZW5jeShwcmVzZW50ZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrU2F2ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJlc2VudGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcHJvdmlkZXIuaXNEaXJ0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IGluY29uc2lzdGVudFJlc291cmNlcyA9IGdldEluY29uc2lzdGVudFJlc291cmNlcygpOwotCQlMaXN0IGluY29uc2lzdGVudEZpbGVzID0gZ2V0RmlsZXMoaW5jb25zaXN0ZW50UmVzb3VyY2VzKTsKLQkJaW5jb25zaXN0ZW50RmlsZXMgPSBhZGRPdGhlckluY29uc2lzdGVudEZpbGVzKGluY29uc2lzdGVudEZpbGVzKTsKLQkJaWYgKGluY29uc2lzdGVudEZpbGVzID09IG51bGwgfHwgaW5jb25zaXN0ZW50RmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBwcmVzZW50ZXIucHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShpbmNvbnNpc3RlbnRGaWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrUmVhZE9ubHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gY2hlY2tSZWFkT25seVJlc291cmNlcygpOwotCQlpZiAoIXJlc3VsdCkKLQkJCXJlc3VsdCA9IGNoZWNrUmVhZE9ubHlOb25SZXNvdXJjZUZpbGVzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNoZWNrUmVhZE9ubHlOb25SZXNvdXJjZUZpbGVzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlYWRPbmx5Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJTGlzdCBmaWxlcyA9IHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKTsKLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjaGVja1JlYWRPbmx5UmVzb3VyY2VzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1JlYWRPbmx5UmVzb3VyY2VzKCkgewotCQlMaXN0IHJlc291cmNlcyA9IHByb3ZpZGVyLmdldFJlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHNpemUgPSByZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbnNpc3RlbmN5KFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpc0NoZWNraW5nQ29uc2lzdGVuY3kgfHwgcHJlc2VudGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlzQ2hlY2tpbmdDb25zaXN0ZW5jeSA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlMaXN0IGluY29uc2lzdGVudFJlc291cmNlcyA9IGdldEluY29uc2lzdGVudFJlc291cmNlcygpOwotCQkJTGlzdCBpbmNvbnNpc3RlbnRGaWxlcyA9IGdldEZpbGVzKGluY29uc2lzdGVudFJlc291cmNlcyk7Ci0JCQlpbmNvbnNpc3RlbnRGaWxlcyA9IGFkZE90aGVySW5jb25zaXN0ZW50RmlsZXMoaW5jb25zaXN0ZW50RmlsZXMpOwotCQkJaWYgKGluY29uc2lzdGVudEZpbGVzID09IG51bGwgfHwgaW5jb25zaXN0ZW50RmlsZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCWJvb2xlYW4gc2hvdWxkUmVmcmVzaEZpbGVzID0gdHJ1ZTsKLQkJCS8vRGVmZWN0IDIwODY1NCAmIDIwOTYzMSB3YW50IHByb21wdCBubyBtYXR0ZXIgd2hhdC4KLQkJCWlmIChhbnlGaWxlQ2hhbmdlZFNpbmNlTGFzdFJlZnJlc2hQcm9tcHQoaW5jb25zaXN0ZW50RmlsZXMpKSB7Ci0JCQkJY2xlYXJMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCk7Ci0JCQkJc2hvdWxkUmVmcmVzaEZpbGVzID0gcHJlc2VudGVyLnByb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKGluY29uc2lzdGVudEZpbGVzKTsKLQkJCX0gZWxzZQotCQkJCXJldHVybjsKLQkJCWlmIChzaG91bGRSZWZyZXNoRmlsZXMpCi0JCQkJcmVmcmVzaEZpbGVzKGluY29uc2lzdGVudEZpbGVzLCBpbmNvbnNpc3RlbnRSZXNvdXJjZXMpOwotCQkJZWxzZQotCQkJCWNhY2hlTGFzdE5vblJlZnJlc2hGaWxlU3RhbXBzKGluY29uc2lzdGVudEZpbGVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzQ2hlY2tpbmdDb25zaXN0ZW5jeSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNhY2hlTGFzdE5vblJlZnJlc2hGaWxlU3RhbXBzLgotCSAqIAotCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZUxhc3ROb25SZWZyZXNoRmlsZVN0YW1wcyhMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCWlmIChpbmNvbnNpc3RlbnRGaWxlcyAhPSBudWxsICYmICFpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCU1hcCBtYXAgPSBnZXRMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCk7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCWxvbmcgc3RhbXAgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCWZpbGUgPSAoSUZpbGUpIGluY29uc2lzdGVudEZpbGVzLmdldChpKTsKLQkJCQlzdGFtcCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCQltYXAucHV0KGZpbGUsIG5ldyBMb25nKHN0YW1wKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY2FjaGVWYWxpZGF0ZVN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FjaGVWYWxpZGF0ZVN0YXRlKElTdGF0dXMgYVN0YXR1cywgTGlzdCByZWFkT25seVJlc291cmNlcywgTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKLQkJaWYgKGFTdGF0dXMuaXNPSygpKSB7Ci0JCQlpZiAocmVhZE9ubHlSZXNvdXJjZXMgIT0gbnVsbCAmJiAhcmVhZE9ubHlSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJUmVmZXJlbmNlZFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkT25seVJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJCQlyZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZWFkT25seVJlc291cmNlcy5nZXQoaSk7Ci0JCQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLnNldFN5bmhyb25pemF0aW9uU3RhbXAocmVzLCBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzKSk7Ci0JCQkJfQotCQkJfQotCQkJcHJvdmlkZXIuY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUocm9Ob25SZXNvdXJjZUZpbGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckxhc3ROb25SZWZyZXNoU3RhdGVNYXAoKSB7Ci0JCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwICE9IG51bGwpCi0JCQlsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFueUZpbGVDaGFuZ2VkU2luY2VMYXN0UmVmcmVzaFByb21wdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jb25zaXN0ZW50RmlsZXMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYW55RmlsZUNoYW5nZWRTaW5jZUxhc3RSZWZyZXNoUHJvbXB0KExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJaWYgKGluY29uc2lzdGVudEZpbGVzID09IG51bGwgfHwgaW5jb25zaXN0ZW50RmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobGFzdE5vblJlZnJlc2hTdGF0ZU1hcCA9PSBudWxsIHx8IGxhc3ROb25SZWZyZXNoU3RhdGVNYXAuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWludCBzaXplID0gaW5jb25zaXN0ZW50RmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJTG9uZyBzdGFtcCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBpbmNvbnNpc3RlbnRGaWxlcy5nZXQoaSk7Ci0JCQlzdGFtcCA9IChMb25nKSBnZXRMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCkuZ2V0KGZpbGUpOwotCQkJaWYgKHN0YW1wID09IG51bGwgfHwgKHN0YW1wLmxvbmdWYWx1ZSgpICE9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGFkZE90aGVySW5jb25zaXN0ZW50RmlsZXMoTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgewotCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCQlMaXN0IG5vblJlc0ZpbGVzID0gZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOwotCQlpZiAobm9uUmVzRmlsZXMgIT0gbnVsbCkKLQkJCWluY29uc2lzdGVudEZpbGVzLmFkZEFsbChub25SZXNGaWxlcyk7Ci0JCXJldHVybiBpbmNvbnNpc3RlbnRGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpIHsKLQkJTGlzdCBmaWxlcyA9IHByb3ZpZGVyLmdldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwgJiYgIWZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmaWxlczsKLQkJLy9EZXRlcm1pbmUgY29uc2lzdGVuY3kgYmFzZWQgb24gdGhlIHN5bmNocm9uaXphdGlvbiBvZiB0aGUgSUZpbGUKLQkJZmlsZXMgPSBwcm92aWRlci5nZXROb25SZXNvdXJjZUZpbGVzKCk7Ci0JCWlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGluY29uc2lzdGVudCA9IG51bGw7Ci0JCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZpbGUgPSAoSUZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpICYmICFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCWlmIChpbmNvbnNpc3RlbnQgPT0gbnVsbCkKLQkJCQkJaW5jb25zaXN0ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWluY29uc2lzdGVudC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJaW5jb25zaXN0ZW50ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJcmV0dXJuIGluY29uc2lzdGVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRJbmNvbnNpc3RlbnRSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgbW9mUmVzb3VyY2VzID0gcHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCk7Ci0JCUxpc3QgaW5jb25zaXN0ZW50ID0gbnVsbDsKLQkJaW50IHNpemUgPSBtb2ZSZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgbW9mUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXMpKSB7Ci0JCQkJcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzOwotCQkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNDb25zaXN0ZW50KHJlZlJlcykgJiYgKHJlZlJlcy5pc0xvYWRlZCgpICYmICFyZWZSZXMuaXNOZXcoKSkpIHsKLQkJCQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQotCQkJCQkJaW5jb25zaXN0ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpbmNvbnNpc3RlbnQuYWRkKHJlZlJlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpbmNvbnNpc3RlbnQgPT0gbnVsbCkKLQkJCWluY29uc2lzdGVudCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBpbmNvbnNpc3RlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RmlsZXMoTGlzdCByZWZSZXNvdXJjZXMpIHsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QocmVmUmVzb3VyY2VzLnNpemUoKSk7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZlJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlZlJlc291cmNlcy5nZXQoaSk7Ci0JCQlmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZWZSZXMpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYXQgbGVhc3QgdGhlIGZpcnN0IHRpbWUgYSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyCi0JICogYmVjb21lcyBhY3RpdmUgYW5kIGlzIGFib3V0IHRvIGVkaXQgaXRzIGNvbnRlbnRzLiBUaGUgcmV0dXJuZWQgSVN0YXR1cyBtYXkgaGF2ZSBhbiBFUlJPUgotCSAqIHN0YXR1cyB3aGljaCBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdCByb1Jlc291cmNlcywgbm9uUmVzUk9GaWxlcywgcm9GaWxlcyA9IG51bGw7Ci0JCUxpc3RbXSByZWFkT25seSA9IHNlbGVjdFJlYWRPbmx5UmVzb3VyY2VzKHByb3ZpZGVyLmdldFJlc291cmNlcygpKTsKLQkJcm9SZXNvdXJjZXMgPSByZWFkT25seVswXTsKLQkJcm9GaWxlcyA9IHJlYWRPbmx5WzFdOwotCQlub25SZXNST0ZpbGVzID0gc2VsZWN0UmVhZE9ubHlGaWxlcyhwcm92aWRlci5nZXROb25SZXNvdXJjZUZpbGVzKCkpOwotCQlpZiAobm9uUmVzUk9GaWxlcyAhPSBudWxsKSB7Ci0JCQlpZiAocm9GaWxlcyA9PSBudWxsKQotCQkJCXJvRmlsZXMgPSBub25SZXNST0ZpbGVzOwotCQkJZWxzZQotCQkJCXJvRmlsZXMuYWRkQWxsKG5vblJlc1JPRmlsZXMpOwotCQl9Ci0JCWlmIChyb0ZpbGVzID09IG51bGwgfHwgcm9GaWxlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gT0tfU1RBVFVTOwotCQlJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlW3JvRmlsZXMuc2l6ZSgpXTsKLQkJcm9GaWxlcy50b0FycmF5KGZpbGVzKTsKLQkJT2JqZWN0IGN0eCA9IHByZXNlbnRlciAhPSBudWxsID8gcHJlc2VudGVyLmdldFZhbGlkYXRlRWRpdENvbnRleHQoKSA6IG51bGw7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgY3R4KTsKLQkJY2FjaGVWYWxpZGF0ZVN0YXRlKHJlc3VsdCwgcm9SZXNvdXJjZXMsIG5vblJlc1JPRmlsZXMpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQljaGVja0NvbnNpc3RlbmN5KHByZXNlbnRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHNlbGVjdFJlYWRPbmx5RmlsZXMuCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gcm9GaWxlcwotCSAqLwotCXByaXZhdGUgTGlzdCBzZWxlY3RSZWFkT25seUZpbGVzKExpc3QgZmlsZXMpIHsKLQkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZpbGVzOwotCQlpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLQkJTGlzdCByZWFkT25seSA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJaWYgKHJlYWRPbmx5ID09IG51bGwpCi0JCQkJCXJlYWRPbmx5ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCQlyZWFkT25seS5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWRPbmx5OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZWxlY3RSZWFkT25seVJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEBwYXJhbSByb0ZpbGVzCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0W10gc2VsZWN0UmVhZE9ubHlSZXNvdXJjZXMoTGlzdCByZXNvdXJjZXMpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IExpc3RbXXtyZXNvdXJjZXMsIG51bGx9OwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaW50IHNpemUgPSByZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlMaXN0IHJlYWRPbmx5ID0gbnVsbDsKLQkJTGlzdCByb0ZpbGVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJaWYgKHJlYWRPbmx5ID09IG51bGwpCi0JCQkJCXJlYWRPbmx5ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCQlyZWFkT25seS5hZGQocmVzKTsKLQkJCQlpZiAocm9GaWxlcyA9PSBudWxsKQotCQkJCQlyb0ZpbGVzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJCQlyb0ZpbGVzLmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IExpc3RbXXtyZWFkT25seSwgcm9GaWxlc307Ci0JfQotCi0JcHJvdGVjdGVkIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKFJlZmVyZW5jZWRSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGaWxlcyhMaXN0IHNvbWVGaWxlcywgTGlzdCBpbmNvbnNpdGVudFJlc291cmNlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZWZyZXNoUnVubmFibGUgcnVubmFibGUgPSBuZXcgUmVmcmVzaFJ1bm5hYmxlKHNvbWVGaWxlcywgaW5jb25zaXRlbnRSZXNvdXJjZXMpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsKLQkJaWYgKHJ1bm5hYmxlLmdldFRocm93bkV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQl0aHJvdyBydW5uYWJsZS5nZXRUaHJvd25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmVmcmVzaEZpbGVzKExpc3Qgc29tZUZpbGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWludCBzaXplID0gc29tZUZpbGVzLnNpemUoKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBzb21lRmlsZXMuZ2V0KGkpOwotCQkJaWYgKCFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCWVsc2UKLQkJCQlyZWZyZXNoUmVzb3VyY2UoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgUmVzb3VyY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+ZmlsZTwvY29kZT4gdG8gZm9yY2UgYQotCSAqIHJlZnJlc2guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlc291cmNlKElGaWxlIGZpbGUpIHsKLQkJUmVzb3VyY2UgcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKGZpbGUpOwotCQlpZiAocmVzICE9IG51bGwpCi0JCQlyZXMudW5sb2FkKCk7Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgdGhlIHJlc291cmNlcyB0byBub3QgYmUgZGlydHkgdG8gZW5zdXJlIHRoYXQgdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVpcgotCSAqIFJlc291cmNlU2V0IHdoZW4gdGhlaXIgZmlsZSBpcyByZWZyZXNoZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlc291cmNlc0ZvclJlZnJlc2goTGlzdCByZWZSZXNvdXJjZXMpIHsKLQkJUmVmZXJlbmNlZFJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZWZSZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVzLnNldEZvcmNlUmVmcmVzaCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3ROb25SZWZyZXNoU3RhdGVNYXAuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTWFwCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRMYXN0Tm9uUmVmcmVzaFN0YXRlTWFwKCkgewotCQlpZiAobGFzdE5vblJlZnJlc2hTdGF0ZU1hcCA9PSBudWxsKQotCQkJbGFzdE5vblJlZnJlc2hTdGF0ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzU0NWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHsKLQkvKioKLQkgKiBQcmVzZW50IHRvIHRoZSB1c2VyIHRoYXQgdGhlIDxjb2RlPmluY29uc2lzdGVudEZpbGVzPC9jb2RlPiB3aWxsIG5lZWQgdG8gYmUgcmVmcmVzaGVkIGluCi0JICogdGhlIHdvcmtiZW5jaC4gUmV0dXJuIHRydWUgaWYgdGhlIHJlZnJlc2ggc2hvdWxkIG9jY3VyLiBUaGUgTGlzdCB3aWxsIGJlIGEgbGlzdCBvZiBJRmlsZXMuCi0JICogCi0JICogQHBhcmFtIGluY29uc2lzdGVudEZpbGVzCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlUmVmcmVzaChMaXN0IGluY29uc2lzdGVudEZpbGVzKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGV4dCAoU2hlbGwpIHRoYXQgd291bGQgYmUgcGFzc2VkIHRvIHRoZSB2YWxpZGF0ZUVkaXQgbWV0aG9kLiBJZiB0aGlzIG1ldGhvZAotCSAqIHJldHVybnMgbnVsbCwgYSBwcm9tcHQgdG8gY2hlY2sgb3V0IGNvZGUgd2lsbCBub3QgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZUVkaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGVbXSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JT2JqZWN0IGdldFZhbGlkYXRlRWRpdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFByZXNlbnQgYSBkaWFsb2cgdG8gdGhlIHVzZXIgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBpcyBhYm91dCB0byBzYXZlIGFuZCBvdmVyd3JpdGUgdGhlCi0JICogbGlzdCBvZiA8Y29kZT5pbmNvbnNpdGVudEZpbGVzPC9jb2Rlcz4uICBSZXR1cm4gdHJ1ZSBpZgotCSAqIHRoZSBvdmVyd3JpdGUgc2hvdWxkIHByb2NlZWQuICBUaGUgbGlzdCBvZiA8Y29kZT5pbmNvbnNpdGVudEZpbGVzPC9jb2Rlcz4gd2lsbAotCSAqIGJlIGEgbGlzdCBvZiBJRmlsZXMuIAotCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShMaXN0IGluY29uc2lzdGVudEZpbGVzKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55IGFjdGlvbiB0aGF0IGlzIGFib3V0IHRvIGVkaXQgYW55IGNvbnRlbnRzIG9mIGFueSBJRmlsZS4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVN0YXRlKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjOGVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvVmFsaWRhdGVFZGl0SGVhZGxlc3NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxOCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkgSGVhZGxlc3MgVmFsaWRhdGUgRWRpdCBDb250ZXh0IEltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQgaW1wbGVtZW50cyBJVmFsaWRhdGVFZGl0Q29udGV4dCB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIGZNZXNzYWdlVXAgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgRWRpdE1vZGVsIGZWYWxpZGF0b3IgPSBudWxsOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQjdmFsaWRhdGVTdGF0ZSgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZSgpIHsKLQkJLy8gRm9yIG5vdyBkbyBub3RoaW5nIGluIGhlYWRsZXNzIHN0YXRlCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIjZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyI3Byb21wdEZvckluY29uc2lzdGVudEZpbGVPdmVyd3JpdGUoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyI3Byb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb21wdEZvckluY29uc2lzdGVudEZpbGVSZWZyZXNoKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZhbGlkYXRlRWRpdExpc3RlbmVyI3NldE5lZWRzU3RhdGVWYWxpZGF0aW9uKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oYm9vbGVhbiBuZWVkc1N0YXRlVmFsaWRhdGlvbikgewotCQlmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSBuZWVkc1N0YXRlVmFsaWRhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dCNzZXRFZGl0TW9kZWwob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRNb2RlbChFZGl0TW9kZWwgZlZhbGlkYXRvcikgewotCQl0aGlzLmZWYWxpZGF0b3IgPSBmVmFsaWRhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0I3ZhbGlkYXRlU3RhdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlzZXRFZGl0TW9kZWwoZWRpdE1vZGVsKTsKLQkJcmV0dXJuIHZhbGlkYXRlU3RhdGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA5OTI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3YmE0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LmVudiBwbHVnaW4uCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgbWFzdGVyIHN3aXRjaCBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQgcGx1Z2luLgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9kZWJ1Zz10cnVlCi0KLSMgVHVybiBvbiBkaWZmZXJlbnQgdHJhY2luZyBsZXZlbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS9pbmZvPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2Uvd2FybmluZz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2Vycm9yPXRydWUKLQotIyBUdXJuIG9uIGRhdGEgZmxvdyB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2RhdGE9dHJ1ZQotCi0jIFR1cm4gb24gY29tbWFuZCB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2NvbW1hbmQ9dHJ1ZQotCi0jIFR1cm4gb24gZW1pdHRlciB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2VtaXR0ZXI9dHJ1ZQotCi0jIFR1cm4gb24gd2ViIHNlcnZpY2UgYW50IHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2Uvd3NfYW50PXRydWUKLQotIyBUdXJuIG9uIHdlYiBzZXJ2aWNlIGRldGFpbGVkIGNvbW1hbmQgZW5naW5lIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2Uvd3NfZHRfY21kX2VuZ2luZT10cnVlCi0KLSMgVHVybiBvbiB3ZWIgc2VydmljZSBmcmFtZXdvcmsgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19mcmFtZXdvcms9dHJ1ZQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzJlYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3YTRlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI01vbiBKdW4gMDggMTU6MzU6NDUgRURUIDIwMDkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9ZXJyb3IKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVVbmNoZWNrZWRFeGNlcHRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0M2NkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjQwOjI2IEVTVCAyMDA2Ci1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY5N2M2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjQwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucGx1Z2luLkVudmlyb25tZW50UGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQudXJpLmZpbGU7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDtidW5kbGUtdmVyc2lvbj0iWzMuMS4zMDAsNC4wLjApIgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUgCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YzQwMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTAxYWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9RW52aXJvbm1lbnQgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Q1OGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9DaG9pY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgSVN0YXR1c0hhbmRsZXIgaW50ZXJmYWNlLgotICogSXQgYWxsb3dzIGNvZGUgdGhhdCBpcyByZXBvcnRpbmcgc3RhdHVzIHRvIHNwZWNpZnkgY2hvaWNlcyB0byB0aGUgdXNlcgotICogd2hpY2ggdGhpcyByZXBvcnRpbmcgY29kZSBjYW4gcmVhY3QgdG8uIAotICoKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENob2ljZSB7Ci0KLSAgcHJpdmF0ZSBjaGFyICAgc2hvcnRjdXQgPSAnICc7IAotICBwcml2YXRlIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0JICovCi0JcHVibGljIENob2ljZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotCSAqIEBwYXJhbSBzaG9ydGN1dCB0aGUgc2luZ2xlIGxldHRlciBzaG9ydGN1dCBmb3IgdGhpcyBjaG9pY2UuCi0JICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZm9yIHRoaXMgY2hvaWNlLgotCSAqLwotCXB1YmxpYyBDaG9pY2UoY2hhciBzaG9ydGN1dCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotICAgKiBAcGFyYW0gc2hvcnRjdXQgdGhlIHNpbmdsZSBsZXR0ZXIgc2hvcnRjdXQgZm9yIHRoaXMgY2hvaWNlLgotICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBjaG9pY2UuCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjaG9pY2UuCi0JICovCi0JcHVibGljIENob2ljZShjaGFyIHNob3J0Y3V0LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLnNob3J0Y3V0ID0gc2hvcnRjdXQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG9ydGN1dC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBjaGFyCi0JICovCi0JcHVibGljIGNoYXIgZ2V0U2hvcnRjdXQoKSB7Ci0JCXJldHVybiBzaG9ydGN1dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG9ydGN1dC4KLQkgKiBAcGFyYW0gc2hvcnRjdXQgVGhlIHNob3J0Y3V0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3J0Y3V0KGNoYXIgc2hvcnRjdXQpIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzMmQzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIGZvciBjb25kaXRpb25zIHJhaXNlZCBieSB0aGUgSUVudmlyb25tZW50LgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5Nzg5ODMyNzU4OTk0MDIwMzZMOwotICAKLSAgLyoqCi0gICAqIFRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIElTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIEVudmlyb25tZW50RXhjZXB0aW9uICgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIEVudmlyb25tZW50RXhjZXB0aW9uICggSVN0YXR1cyBzdGF0dXMgKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzID09IG51bGwgPyBudWxsIDogc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NhZTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZS5Db25zb2xlRWNsaXBzZUVudmlyb25tZW50OwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgY29uc29sZSBlbnZpcm9ubWVudC4gIEl0IGFsc28gY29udGFpbnMgc3RhdGljCi0gKiBjb252aWVuY2VzIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuIElMb2cgb2JqZWN0IGFzIHdlbGwgYXMgYW4gRWNsaXBzZSBhbmQKLSAqIEZpbGUgU2NoZW1lLgotICogCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRTZXJ2aWNlCi17Ci0gIHN0YXRpYyBwcml2YXRlIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGFuIEVjbGlwc2UgY29uc29sZSBlbnZpcm9ubWVudC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSUVudmlyb25tZW50IGdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKQotICB7Ci0gICAgaWYoIGVudmlyb25tZW50ID09IG51bGwgKSBlbnZpcm9ubWVudCA9IG5ldyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50KCk7Ci0gICAgCi0gICAgcmV0dXJuIGVudmlyb25tZW50OyAKLSAgfSAgCi0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhbiBFY2xpcHNlIGxvZ2dlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSUxvZyBnZXRFY2xpcHNlTG9nKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IGdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICAKLSAgICByZXR1cm4gZW52aXJvbm1lbnQuZ2V0TG9nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGFuIEVjbGlwc2Ugc2NoZW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJVVJJU2NoZW1lIGdldEVjbGlwc2VTY2hlbWUoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklTY2hlbWUgICBzY2hlbWUgICAgICA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgc2NoZW1lID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpLm5ld1VSSVNjaGVtZSggInBsYXRmb3JtIiApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7ICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc2NoZW1lOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgRmlsZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElVUklTY2hlbWUgZ2V0RmlsZVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzY2hlbWUgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCkubmV3VVJJU2NoZW1lKCAiZmlsZSIgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNjaGVtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTUwM2JlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBbiBJRW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIG1lYW5zIGZvciBnZXR0aW5nIGEgCi0gKiA8b2w+Ci0gKiA8bGk+QSBsb2cgZm9yIHdyaXRpbmcgbWVzc2FnZXMgdG8gYSBsb2dnaW5nIGZhY2lsaXR5LDwvbGk+Ci0gKiA8bGk+QSBwcm9ncmVzcyBtb25pdG9yIGZvciByZWNlaXZpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24sPC9saT4KLSAqIDxsaT5BIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsPC9saT4KLSAqIDxsaT5BIGZhY3RvcnkgZm9yIHRoZSBoYW5kbGluZyBvZiBVUklzIChyZXNvdXJjZXMpLjwvbGk+Ci0gKiA8L29sPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVudmlyb25tZW50Ci17Ci0gIC8qKgotICAgKiBSZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIGxvZ2dpbmcgZmFjaWxpdHkuCi0gICAqLwotICBwdWJsaWMgSUxvZyBnZXRMb2cgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzdGF0dXMgaGFuZGxlci4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIHN0YXR1cyBoYW5kbGVyLgotICAgKi8KLSAgcHVibGljIElTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBJVVJJIGZhY3RvcnkuCi0gICAqIEhpbnQ6IEltcGxlbWVudGVycyBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIEZhY3RvcnkgdGhleSByZXR1cm4KLSAgICogaGFzIGEgcmVmZXJlbmNlIHRvIHRoaXMgSUVudmlyb25tZW50IHNvIHRoYXQgSVVSSSBvYmplY3RzIGNhbgotICAgKiByZXBvcnQgcHJvZ3Jlc3MgYW5kIGFubm91bmNlIHN0YXR1cy4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIFVSSSBmYWN0b3J5LgotICAgKi8KLSAgcHVibGljIElVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkgKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxZmNhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogSUxvZyBvYmplY3RzIHByb3ZpZGUgYSBtZWFucyBmb3IgbG9nZ2luZyBpbmZvcm1hdGlvbiBmb3IgRkZEQyBldGMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nCi17Ci0gIC8qKgotICAgKiBUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIE9rLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSAwOwotICAKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgaW5mb3JtYXRpb25hbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSAxOwotICAKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotICAKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgaW5kaWNhdGVzIHRoYXQgYSBsb2dnaW5nIG1lc3NhZ2UgaXMgYW4gZXJyb3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBsb2dnaW5nIGlzIGVuYWJsZWQuCi0gICAqIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRvIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGF0dGVtcHRpbmcKLSAgICogYSBjYWxsIHRvIG9uZSBvZiB0aGUgPGNvZGU+bG9nPC9jb2RlPiBtZXRob2RzLCBhcyB0aGV5IHdpbGwKLSAgICogcXVpZXRseSBkbyBub3RoaW5nIGlmIGxvZ2dpbmcgaXMgZGlzYWJsZWQuIFRoaXMgbWV0aG9kIGNhbiBiZQotICAgKiB1c2VmdWwsIGhvd2V2ZXIsIGFueXdoZXJlIHRoZSBjb3N0IG9mIGJ1aWxkaW5nIHVwIHRoZSBwYXJhbWV0ZXJzCi0gICAqIHRvIGEgbG9nIG1ldGhvZCBtaWdodCBiZSBoaWdoIGFuZCBiZXN0IGF2b2lkZWQgZXhjZXB0IHdoZW4gbG9nZ2luZwotICAgKiBpcyBlbmFibGVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgbG9nZ2luZyBpcyBlbmFibGVkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkICgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlYnVnIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICogCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlYnVnIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCAoU3RyaW5nIG9wdGlvbik7Ci0KLSAgLyoqCi0gICAqIExvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIFRocm93YWJsZSB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlICk7Ci0gIAotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgVGhyb3dhYmxlIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLQotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgU3RhdHVzIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzICk7Ci0gIAotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIFN0YXR1cyB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBJU3RhdHVzIHN0YXR1cyApOwotCi0gIC8qKgotICAgKiBMb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgT2JqZWN0IHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBvcHRpb24gdGhpcyBkZWJ1ZyBvcHRpb24gc3RyaW5nLgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0ICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkyYTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBQcm9jZXNzZXMgc3RhdHVzIGV2ZW50cyByYWlzZWQgYnkgdGhlIGNhbGxlciBhbmQgcmV0dXJucyBhbgotICogaW5kaWNhdGlvbiBvZiBjaG9pY2VzIG1hZGUgYnkgdGhlIHJlY2lwaWVudCBvZiB0aGUgc3RhdHVzIGFuZAotICogbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gKiBwcm9jZXNpbmcuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhdHVzSGFuZGxlcgotewotICAvKioKLSAgICogUmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBzZXQgb2YgcG9zc2libGUgcmVzcG9uc2VzLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHRvIHJlcG9ydC4KLSAgICogQHBhcmFtIGNob2ljZXMgdGhlIGNob2ljZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBjaG9pY2UgbWFkZSBieSB0aGUgdXNlci9oYW5kbGVyLgotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQgKCBJU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcyApOwotICAKLSAgLyoqCi0gICAqIFJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSAgICogY29udGludWUgb3IgYWJvcnQuCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyB0byByZXBvcnQuCi0gICAqIEB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGhhbmRsZXIgZGVjaWRlcyB0aGUgY2FsbGVyCi0gICAqIHNob3VsZCBzdG9wIHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQgKCBJU3RhdHVzIHN0YXR1cyApIHRocm93cyBTdGF0dXNFeGNlcHRpb247Ci0gIAotICAvKioKLSAgICogUmVwb3J0IHRoZSBnaXZlbiBFcnJvciBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBzdGF0dXMgdG8gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoIElTdGF0dXMgc3RhdHVzICk7Ci0gIAotICAvKioKLSAgICogUmVwb3J0IHRoZSBnaXZlbiBJbmZvIFN0YXR1cy4gIE5vIHVzZXIgZmVlZGJhY2sgaXMgcHJvdmlkZWQuCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIGluZm8gc3RhdHVzIHRvIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oIElTdGF0dXMgc3RhdHVzICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFmMWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9OdWxsU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsU3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIElTdGF0dXNIYW5kbGVyCi17Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5DaG9pY2VbXSkKLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0KElTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLSAgewotICAJQ2hvaWNlIHJlc3VsdCA9IG51bGw7Ci0gIAkKLSAgCS8vIEFsd2F5cyB0YWtlIHRoZSBmaXJzdCBjaG9pY2UgaWYgYXZhaWxhYmxlLgotICAgIGlmKCBjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5sZW5ndGggPiAwICkKLSAgICB7Ci0gICAgCXJlc3VsdCA9IGNob2ljZXNbMF07Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLklTdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChJU3RhdHVzIHN0YXR1cykgdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbgotICB7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJlcG9ydCBhbmQgZXJyb3IuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJlcG9ydEVycm9yU3RhdHVzKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhJU3RhdHVzIHN0YXR1cykKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvU3RhdHVzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMWI4Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCBieSBTdGF0dXNIYW5kbGVycyB0byB0ZWxsIHRoZWlyCi0gKiBjYWxsZXJzIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhdHVzRXhjZXB0aW9uIGV4dGVuZHMgRW52aXJvbm1lbnRFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0gICAqICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MTgxNDExNjAzMjIxMTk5OTJMOwotCi0gIC8qKgotICAgKiBUaGUgQ2hvaWNlIHRoYXQgbGVhZCB0byB0aGUgZXhjZXB0aW9uIGJlaW5nIHRocm93biwKLSAgICogaWYgYW55IChpZS4gbWF5IGJlIG51bGwpLgotICAgKi8KLSAgcHJvdGVjdGVkIENob2ljZSBjaG9pY2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy4KLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNFeGNlcHRpb24oIElTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKCBzdGF0dXMgKTsgIAotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlLgotICAgKiBUaGUgQ2hvaWNlIG1heSBiZSBudWxsLgotICAgKiBAcGFyYW0gY2hvaWNlIHRoZSBjaG9pY2UgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiAoIENob2ljZSBjaG9pY2UgKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmNob2ljZSA9IGNob2ljZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UKLSAgICogYW5kIHN0YXR1cyBvYmplY3QuIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKiBAcGFyYW0gY2hvaWNlIHRoZSBjaG9pY2UgZm9yIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiAoIElTdGF0dXMgc3RhdHVzLCBDaG9pY2UgY2hvaWNlICkKLSAgewotICAgIHN1cGVyKHN0YXR1cyk7Ci0gICAgdGhpcy5jaG9pY2UgPSBjaG9pY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBDaG9pY2Ugb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgZ2V0Q2hvaWNlICgpCi0gIHsKLSAgICByZXR1cm4gY2hvaWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGE2M2JkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBIElVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUkkKLXsKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIElVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgSVVSSVNjaGVtZSBmb3IgdGhlIHNjaGVtZSBvZiB0aGlzIElVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIGdldFVSSVNjaGVtZSAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkgZXhpc3RzCi0gICAqIGFuZCBpcyBhIGxlYWYuIFJldHVybnMgdHJ1ZSBhbHdheXMgZm9yIG5vbi1oaWVyYXJjaGljYWwgc2NoZW1lcy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZiAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSAgICogYW5kIGlzIHJlYWRhYmxlLiBBIHJlYWRhYmxlIGxlYWYgcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgYW4KLSAgICogaW5wdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgb24gdGhlIHJlc291cmNlLiBBIHJlYWRhYmxlIGZvbGRlcgotICAgKiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGZvbGRlciwgaWYgYW55LAotICAgKiBjYW4gYmUgZGV0ZXJtaW5lZCB2aWEgdGhlIGxpc3QoKSBvciB2aXNpdCgpIG1ldGhvZHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJIGV4aXN0cwotICAgKiBhbmQgaXMgd3JpdGFibGUuIEEgd3JpdGFibGUgbGVhZiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBhbgotICAgKiBvdXRwdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgb24gdGhlIHJlc291cmNlLiBBIHdyaXRhYmxlIGZvbGRlcgotICAgKiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBuZXcgcmVzb3VyY2VzIGNhbiBiZSBjcmVhdGVkIGluIHRoZSBmb2xkZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBJVVJJIGJlbG9uZ3MgdG8gYSBoaWVyYXJjaGljYWwgc2NoZW1lLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqIHRoaXMuaXNIaWVyYXJjaGljYWwoKSA9PSB0aGlzLmdldFVSSVNjaGVtZSgpLmlzSGllcmFyY2hpY2FsKCkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoaXMgSVVSSSBpcyBhIHJlbGF0aXZlIElVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgSVVSSSBvZiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhpcyBJVVJJLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBwYXJlbnQgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHBhcmFtIHJlbGF0aXZlVVJJIGEgcmVsYXRpdmUgVVJJLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcsIG5vcm1hbGl6ZWQgSVVSSSBmb3JtZWQgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbgotICAgKiByZWxhdGl2ZSBJVVJJIHRvIHRoaXMgSVVSSS4gQm90aCBVUklzIG11c3QgYmUgaGllcmFyY2hpY2FsLgotICAgKiBUaGUgcmVzdWx0aW5nIElVUkkgd2lsbCBhbHdheXMgYmUgaGllcmFyY2hpY2FsLiBUaGUgZ2l2ZW4KLSAgICogSVVSSSBtdXN0IGJlIHJlbGF0aXZlLiBUaGlzIElVUkkgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLgotICAgKiB0aGUgcmVzdWx0aW5nIElVUkkgd2lsbCBiZSBlcXVpdmFsZW50bHkgcmVsYXRpdmUgb3IgYWJzb2x1dGUuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHJlbGF0aXZlVVJJIGlzIG5vdCByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBJVVJJIGFwcGVuZCAoIElVUkkgcmVsYXRpdmVVUkkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIEdldHMgYW4gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgZnJvbSB0aGUgcmVzb3VyY2UKLSAgICogaWRlbnRpZmllZCBieSB0aGlzIGxlYWYgb3Igbm9uLWhpZXJhcmNoaWNhbCBJVVJJLgotICAgKiAKLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYSBzdHJlYW0gZm9yIHRoaXMgVVJJIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIEdldHMgYW4gT3V0cHV0U3RyZWFtIGZvciB3cml0aW5nIHRvIHRoZSByZXNvdXJjZQotICAgKiBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIElVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGEgc3RyZWFtIGZvciB0aGlzIFVSSSBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotICAgKiB0aGUgSVVSSS4gT24gY29tcGxldGlvbiwgdGhpcy5pc0xlYWYoKSA9PSB0cnVlLiBJZiBhIGxlYWYKLSAgICogcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gSWYgYQotICAgKiBub24tbGVhZiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyB1bmRlciB0aGlzIElVUkksIGNyZWF0aW9uCi0gICAqIHdpbGwgZmFpbCBhbmQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdG91Y2hpbmcgdGhpcyBsZWFmIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgZm9sZGVyIHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gICAqIHRoZSBJVVJJLiBUaGUgc2NoZW1lIG9mIHRoZSBJVVJJIG11c3QgYmUgaGllcmFyY2hpY2FsLgotICAgKiBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IGZhbHNlLiBJZiBhIGZvbGRlciByZXNvdXJjZQotICAgKiBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBJZiBhIGxlYWYgcmVzb3VyY2UKLSAgICogYWxyZWFkeSBleGlzdHMgdW5kZXIgdGhpcyBJVVJJLCBjcmVhdGlvbiB3aWxsIGZhaWwgYW5kIGFuCi0gICAqIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHRvdWNoaW5nIHRoaXMgZm9sZGVyIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hGb2xkZXIgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogRXJhc2VzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGVyYXNpbmcgdGhpcyByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJlbmFtZXMgb3IgbW92ZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJCi0gICAqIHRvIHRoZSBuZXcgSVVSSS4KLSAgICogQHBhcmFtIG5ld1VSSSB0aGUgbmV3IFVSSSBuYW1lIGZvciB0aGlzIFVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHJlbmFtaW5nIHRoaXMgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUgKCBJVVJJIG5ld1VSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZpc2l0cyB0aGlzIHJlc291cmNlIGFuZCBpdHMgZGVjZW5kYW50cyBpbiBwcmUtb3JkZXIgZmFzaGlvbi4KLSAgICogRm9yIGVhY2ggcmVzb3VyY2UsIHdoZXRoZXIgYSBmb2xkZXIgb3IgYSBsZWFmLCB0aGUgZ2l2ZW4KLSAgICogSVVSSVZpc2l0b3IncyB2aXNpdCgpIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgSVVSSSBvZiB0aGUKLSAgICogcmVzb3VyY2UuIElmIElVUklWaXNpdG9yLnZpc2l0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHZpc2l0aW5nCi0gICAqIGFsZ29yaXRobSB3aWxsICJwcnVuZSIgdGhlIGRlY2VuZGFudHMgb2YgdGhlIHJlc291cmNlIGFuZAotICAgKiBjYXJyeSBvbiB2aXNpdGluZyB0aGUgcmVzdCBvZiB0aGUgdHJlZS4gSWYgSVVSSVZpc2l0b3IudmlzaXQoKQotICAgKiByZXR1cm5zIHRydWUsIHRoZSB2aXNpdGluZyBhbGdvcml0aG0gd2lsbCBjb250aW51ZSBpdHMgd2FsawotICAgKiBkb3duIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzLgotICAgKiBAcGFyYW0gdXJpVmlzaXRvciB0aGUgdmlzaXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHJlc291cmNlIHZpc2l0ZWQuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB2aXNpdGluZyB0aGlzIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIElVUklWaXNpdG9yIHVyaVZpc2l0b3IgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBBcyBmb3IgdmlzaXQoSVVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gICAqIGFjY2VwdGVkIGJ5IHRoZSBnaXZlbiBmaWx0ZXIgYXJlIHZpc2l0ZWQuIElmIGEgZm9sZGVyIHJlc291cmNlCi0gICAqIGZhaWxzIHRvIGJlIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIsIHRoaXMgd2lsbCBub3QgcHJldmVudCB0aGUKLSAgICogdmlzaXRpbmcgYWxnb3JpdGhtIGZyb20gd2Fsa2luZyB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cy4KLSAgICogSXQgcmVtYWlucyB0aGUgam9iIG9mIHRoZSB2aXNpdG9yIHRvIGNob29zZSB3aGV0aGVyIG9yIG5vdCB0bwotICAgKiBwcnVuZSBhIGJyYW5jaCBieSByZXR1cm5pbmcgZmFsc2Ugb3IgdHJ1ZS4KLSAgICogQHBhcmFtIHVyaVZpc2l0b3IgdGhlIHZpc2l0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCByZXNvdXJjZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gdXJpRmlsdGVyIHRoZSByZXNvdXJjZSBmaWx0ZXIuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB2aXNpdGluZyB0aGlzIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIElVUklWaXNpdG9yIHVyaVZpc2l0b3IsIElVUklGaWx0ZXIgdXJpRmlsdGVyICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgVVJJcyBmb3IgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSAgICogaGllcmFyY2hpY2FsLCBub24tbGVhZiBJVVJJLiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsCi0gICAqIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgbG9jYXRpbmcgdGhlIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdCAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBBcyBmb3IgbGlzdCgpLCBleGNlcHQgb25seSBVUklzIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBnaXZlbgotICAgKiBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLAotICAgKiB0aG91Z2ggaXQgbWF5IHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5LgotICAgKiBAcGFyYW0gdXJpRmlsdGVyIHRoZSBjaGlsZCBmaWx0ZXIuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlsdGVyZWQgY2hpbGRyZW4gZm9yIHRoaXMgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgbG9jYXRpbmcgdGhlIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdCAoIElVUklGaWx0ZXIgdXJpRmlsdGVyICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzVVJMKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSAgICogaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgSVVSSSBjYW4gYmUgY29udmVydGVkIGludG8gYSBVUkwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBVUkwgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBJVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSByZXByZXNlbnRhYmxlIGFzIFVSTHMuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyByZXR1cm5pbmcgdGhpcyBVUkwuCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBhc0ZpbGUoKSBtZXRob2QgaXMgZmFpciBnYW1lLAotICAgKiBpbiBvdGhlciB3b3JkcywgaWYgdGhpcyBJVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIEZpbGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIGEgRmlsZSBvYmplY3QgZm9yIHRoZSByZXNvdXJjZSB1bmRlciB0aGlzIElVUkkuCi0gICAqIFRoZXJlIGFyZSBtYW55IFVSSXMgYW5kIFVSSVNjaGVtZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kCi0gICAqIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gICAqIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIGJhY2tlZCBieSBwaHlzaWNhbCBmaWxlcy4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHJldHVybmluZyB0aGlzIEZpbGUuCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBJVVJJIGFzIGEgc3RyaW5nLgotICAgKiBFcXVpdmFsZW50IHRvIHRvU3RyaW5nKCkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nICgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg3MzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElVUkkgYW5kIElVUklTY2hlbWUgb2JqZWN0cy4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUklGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAqIEBwYXJhbSB1cmkgdGhlIHVyaSB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIHRoZSBuZXcgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJpIHBhcmFtZXRlciBpcyBub3QgYSB2YWxpZCBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBTdHJpbmcgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJIGZvciB0aGUgZ2l2ZW4gVVJMLgotICAgKiBAcGFyYW0gdXJsIHRoZSB1cmwgdG8gdXNlIHRvIGNyZWF0ZSB0aGlzIFVSSQotICAgKiBAcmV0dXJuIHRoZSBuZXcgVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJsIHBhcmFtZXRlciBpcyBub3QgYSB2YWxpZCB1cmwuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBVUkwgdXJsICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBubyBjb2xvbnMsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGludGVycHJldHRlZAotICAgKiBhcyB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lLiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgY29sb24sIHRoZW4gdGhlCi0gICAqIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gICAqIG5hbWUgb2YgdGhlIHNjaGVtZSwgbWVhbmluZyB0aGUgY2FsbGVyIGNhbiBwYXNzIGluIGFueSBJVVJJIHN0cmluZyBpbgotICAgKiBvcmRlciB0byBnZXQgYSBJVVJJU2NoZW1lIG9iamVjdC4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWVPclVSSSB0aGUgc2NoZW1lIG9yIFVSSSBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgc2NoZW1lLgotICAgKiBAcmV0dXJuIHRoZSBuZXcgU2NoZW1lLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBzY2hlbWVPclVyaSBwYXJhbWV0ZXIgZG9lcyBub3QgY29udGFpbgotICAgKiBhIHZhbGlkIHNjaGVtZSBvciBVUkkgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIG5ld1VSSVNjaGVtZSAoIFN0cmluZyBzY2hlbWVPclVSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTg1YzJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBvciBsaXN0IFVSSXMuCi0gKiBSZWZlciB0byB7QGxpbmsgSVVSSSNnZXRDaGlsZHJlbn0uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJRmlsdGVyCi17Ci0gIC8qKgotICAgKiBGaWx0ZXJzIHRoZSBnaXZlbiBJVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSB0byBmaWx0ZXIuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWF0Y2hlcyB0aGUgZmlsdGVyLAotICAgKiBmYWxzZSBpZiBpdCBkb2VzIG5vdC4KLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBvciByZWplY3RlZC4KLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhpcyB1cmkgaXMgYWNjZXB0ZWQuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIElmIHRoZSBmaWx0ZXIgZmFpbHMgdG8gYW5hbHl6ZSB0aGUgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzICggSVVSSSB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NzYwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBBIElVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSAqIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLiBFeGFtcGxlcyBpbmNsdWRlICJmaWxlIiwgImh0dHAiCi0gKiBhbmQgInBsYXRmb3JtIiAoRWNsaXBzZSkuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJU2NoZW1lCi17Ci0gIC8qKgotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gYmUgY3JlYXRlZC4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IElVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZSB1cmkgc3BlY2lmaWVkIGlzIG5vdCB2YWxpZCBvcgotICAgKiBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBTdHJpbmcgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHBhcmFtIHVybCB0aGUgdXJsIHVzZWQgdG8gY3JlYXRlIHRoZSBVUkkuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBJVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJsIHNwZWNpZmllZCBpcyBub3QgdmFsaWQgb3IKLSAgICogY2FuIG5vdCBiZSBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJICggVVJMIHVybCApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgSVVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgdGhlIHVyaSBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gICAqIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSSAoIElVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9wZXIgbmFtZSBvZiB0aGUgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCAoKTsKLQotICAvKioKLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRvIGNoZWNrIGZvciB2YWxpZGl0eS4KLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGdpdmVuIElVUkkgc2F0aXNmaWVzIHRoZQotICAgKiBncmFtbWF0aWNhbCByZXF1aXJlbWVudHMgb2YgdGhlIHNjaGVtZS4gQWJzb2x1dGUgVVJJcyBtdXN0Ci0gICAqIGJlZ2luIHdpdGggIjxzY2hlbWU+OiIuIFJlbGF0aXZlIFVSSXMgbXVzdCBlaXRoZXIgbm90IGNvbnRhaW4KLSAgICogYSBjb2xvbiwgIjoiLCBvciBpdCBtdXN0IGJlZ2luIHdpdGggIi4vIi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCBJVVJJIHVyaSApOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdG8gY2hlY2sgZm9yIHZhbGlkaXR5LgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGdpdmVuCi0gICAqIElVUkkgaXMgdmFsaWQuIFRoZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBvZiB0aGUgU3RhdHVzIG9iamVjdAotICAgKiB3aWxsIGRlc2NyaWJlIHRoaXMuCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSAoIElVUkkgdXJpICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmEzZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBVUklzLgotICogUmVmZXIgdG8ge0BsaW5rIElVUkkjdmlzaXR9LgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSVZpc2l0b3IKLXsKLSAgLyoqCi0gICAqIFZpc2l0cyB0aGUgZ2l2ZW4gSVVSSS4KLSAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2UgdG8gdmlzaXQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cyBzaG91bGQgYmUgdmlzaXRlZCwKLSAgICogb3IgZmFsc2UgaWYgdGhleSBzaG91bGQgbm90IGJlIHZpc2l0ZWQuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIElmIHRoZSB2aXNpdCBtZXRob2QgZmFpbHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB2aXNpdCAoIElVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzNjNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9TaW1wbGVVUklGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlU2NoZW1lOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElVUklGYWN0b3J5IGludGVyZmFjZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVVJJRmFjdG9yeSBpbXBsZW1lbnRzIElVUklGYWN0b3J5Ci17Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgIHNjaGVtZXNfID0gbmV3IEhhc2h0YWJsZSgpOyAgCi0gIAotICAvKioKLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRvIGJlIGNyZWF0ZWQuCi0gICAqIEByZXR1cm4gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVyaSwgZmFsc2UgKTsKLSAgICAKLSAgICByZXR1cm4gc2NoZW1lLm5ld1VSSSggdXJpICk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHVybCB0aGUgdXJsIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB1cmkuCi0gICAqIEByZXR1cm4gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJIGZvciB0aGUgZ2l2ZW4gVVJMLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVybC50b1N0cmluZygpLCBmYWxzZSApOwotICAgIAotICAgIHJldHVybiBzY2hlbWUubmV3VVJJKCB1cmwgKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2NoZW1lT3JVUkkgdGhlIHNjaGVtZSBuYW1lIG9yIFVSSSBmcm9tIHdoaWNoIHRoaXMgc2NoZW1lIGlzIAotICAgKiB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuCi0gICAqIElmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gY29sb25zLCB0aGUgZW50aXJlIHN0cmluZyBpcyBpbnRlcnByZXR0ZWQKLSAgICogYXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtZS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhIGNvbG9uLCB0aGVuIHRoZQotICAgKiBzdWJzdHJpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgZmlyc3QgY29sb24gaXMgaW50ZXJwcmV0dGVkIGFzIHRoZQotICAgKiBuYW1lIG9mIHRoZSBzY2hlbWUsIG1lYW5pbmcgdGhlIGNhbGxlciBjYW4gcGFzcyBpbiBhbnkgSVVSSSBzdHJpbmcgaW4KLSAgICogb3JkZXIgdG8gZ2V0IGEgSVVSSVNjaGVtZSBvYmplY3QuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGlzIFVSSSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgSVVSSVNjaGVtZSBuZXdVUklTY2hlbWUoU3RyaW5nIHNjaGVtZU9yVVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJU2NoZW1lKCBzY2hlbWVPclVSSSwgdHJ1ZSApOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGEgc2NoZW1lIGZvciBhIHBhcnRpY3VsYXIgcHJvdG9jb2wuCi0gICAqIAotICAgKiBAcGFyYW0gcHJvdG9jb2wgdGhlIHByb3RvY29sLgotICAgKiBAcGFyYW0gc2NoZW1lIHRoZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlclNjaGVtZSggU3RyaW5nIHByb3RvY29sLCBJVVJJU2NoZW1lIHNjaGVtZSApCi0gIHsKLSAgICBzY2hlbWVzXy5wdXQoIHByb3RvY29sLCBzY2hlbWUgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBJVVJJU2NoZW1lIG5ld1VSSVNjaGVtZShTdHJpbmcgc2NoZW1lT3JVUkksIGJvb2xlYW4gY2hlY2tGb3JTY2hlbWUgKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJVVJJU2NoZW1lIG5ld1NjaGVtZSA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHNjaGVtZU9yVVJJID09IG51bGwgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAvLyROT04tTkxTLTEkIAotICAgICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX05VTExfQVJHX1NQRUNJRklFRCwgIm5ld1VSSVNjaGVtZSIpLCBudWxsICkgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBpbnQgY29sb24gICAgPSBzY2hlbWVPclVSSS5pbmRleE9mKCc6Jyk7Ci0gICAgaW50IHNsYXNoICAgID0gc2NoZW1lT3JVUkkuaW5kZXhPZignLycpOwotICAgIAotICAgIC8vIEEgcHJvdG9jb2wgd2FzIHNwZWNpZmllZC4gIE5vdGU6IGEgY29sb24gYXBwZWFyaW5nIGFmdGVyIGEgcGF0aCBpcyBub3QKLSAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByb3RvY29sIGZvciB0aGlzIElVUkkuCi0gICAgaWYoICggY2hlY2tGb3JTY2hlbWUgJiYgY29sb24gPT0gLTEgKSB8fAotICAgICAgICAoIGNvbG9uICE9IC0xICYmIHNsYXNoID09IC0xKSB8fCAKLSAgICAgICAgKCBjb2xvbiAhPSAtMSAmJiBjb2xvbiA8IHNsYXNoICkgKQotICAgIHsKLSAgICAgIC8vIElmIGNvbG9uIGlzIC0xIHRoZW4gd2Ugd2lsbCB0cmVhdCB0aGUgZW50aXJlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgcHJvdG9jb2wuCi0gICAgICBpZiggY29sb24gPT0gLTEgKSBjb2xvbiA9IHNjaGVtZU9yVVJJLmxlbmd0aCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgcHJvdG9jb2wgPSBzY2hlbWVPclVSSS5zdWJzdHJpbmcoMCwgY29sb24gKTsKLSAgICAgIG5ld1NjaGVtZSAgICAgICA9IChJVVJJU2NoZW1lKXNjaGVtZXNfLmdldCggcHJvdG9jb2wgKTsKLSAgICAgIAotICAgICAgaWYoIG5ld1NjaGVtZSA9PSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAvLyROT04tTkxTLTEkIAotICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfU0NIRU1FX05PVF9GT1VORCwgc2NoZW1lT3JVUkkgKSwgbnVsbCApICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoIHNjaGVtZU9yVVJJLnN0YXJ0c1dpdGgoICIvIikgKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0FCU09MVVRFX1BBVEhfV0lUSE9VVF9TQ0hFTUUsIHNjaGVtZU9yVVJJICksIG51bGwgKSApOwotICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBuZXdTY2hlbWUgPSBuZXcgUmVsYXRpdmVTY2hlbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ld1NjaGVtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjc1NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLgotICogRXZlcnkgVVJJRXhjZXB0aW9uIGNhcnJpZXMgYSBJVVJJIGFuZCBhIFN0YXR1cywgZWFjaCBvZiB3aGljaCBtYXkKLSAqIGJlIG51bGwuIFRoZSBnZXRNZXNzYWdlKCkgbWV0aG9kIGFzIGluaGVyaXRlZCBmcm9tIEV4Y2VwdGlvbiB3aWxsCi0gKiByZXR1cm4gdGhlIG1lc3NhZ2UgZnJvbSB0aGUgVVJJRXhjZXB0aW4ncyBTdGF0dXMgb2JqZWN0LCBpZiBhbnkuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVSSUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTgxMzAyNzE0MjQ3NTYwMThMOwotCi0gIC8qKgotICAgKiBBIFN0YXR1cyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBleGNlcHRpb24sCi0gICAqIGlmIGFwcGxpY2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgSVN0YXR1cyBzdGF0dXM7Ci0KLSAgLyoqCi0gICAqIFRoZSBJVVJJIGZvciB3aGljaCB0aGUgZXhjZXB0aW9uIG9jY3VyZWQsCi0gICAqIGlmIGFwcGxpY2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgSVVSSSB1cmk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgVVJJRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy4KLSAgICogVGhlIHN0YXR1cyBtYXkgYmUgbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBVUklFeGNlcHRpb24gKCBJU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgVVJJRXhjZXB0aW9uIGZvciB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBJVVJJLAotICAgKiBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIElTdGF0dXMgc3RhdHVzLCBJVVJJIHVyaSApCi0gIHsKLSAgICBzdXBlcihzdGF0dXMgIT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiBudWxsKTsKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgICB0aGlzLnVyaSA9IHVyaTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIFN0YXR1cyBvYmplY3QgaW5zaWRlIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzICgpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgSVVSSSBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgSVVSSSBnZXRVUkkgKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyZjMwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9Db25zb2xlRWNsaXBzZUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQudXJpLmZpbGUuRmlsZVNjaGVtZTsKLQotCi0vKioKLSAqICBUaGlzIGNsYXNzIGlzIGludGVuZGVkIGZvciB1c2UgaW4gYSBoZWFkbGVzcyBFY2xpcHNlIGVudmlyb25tZW50LiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50IGltcGxlbWVudHMgSUVudmlyb25tZW50Ci17Ci0JcHJpdmF0ZSBTaW1wbGVVUklGYWN0b3J5ICB1cmlGYWN0b3J5XyAgICAgID0gbnVsbDsKLQlwcml2YXRlIElTdGF0dXNIYW5kbGVyICAgICBzdGF0dXNIYW5kbGVyXyAgID0gbnVsbDsKLQkgIAotCXB1YmxpYyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50KCkKLQl7Ci0JICB0aGlzKCBuZXcgTnVsbFN0YXR1c0hhbmRsZXIoKSApOwkKLQl9Ci0JCi0JcHVibGljIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoIElTdGF0dXNIYW5kbGVyICBzdGF0dXNIYW5kbGVyICkKLQl7Ci0JICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLQkgIHN0YXR1c0hhbmRsZXJfICAgPSBzdGF0dXNIYW5kbGVyOwotCSAgICAKLQkgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAicGxhdGZvcm0iLCBuZXcgRWNsaXBzZVNjaGVtZSggdGhpcyApICk7IC8vJE5PTi1OTFMtMSQKLQkgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIG5ldyBGaWxlU2NoZW1lKCkgKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkJCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldExvZygpCi0JICovCi0JcHVibGljIElMb2cgZ2V0TG9nKCkgCi0JewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMb2coKTsKLQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldFN0YXR1c0hhbmRsZXIoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzSGFuZGxlciBnZXRTdGF0dXNIYW5kbGVyKCkgCi0JewotCQlyZXR1cm4gc3RhdHVzSGFuZGxlcl87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldFVSSUZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBJVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5KCkgCi0JewotCQlyZXR1cm4gdXJpRmFjdG9yeV87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZUxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZUxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg2ZjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjEgICAxMDAzNjQgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucGx1Z2luLkVudmlyb25tZW50UGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZyBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyAKLXsKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nIGxvZ2dlcjsKLQkKLQlwdWJsaWMgRWNsaXBzZUxvZygpIAotCXsKLQkJUGx1Z2luIHBsdWdpbiA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCQotICAgIGxvZ2dlciA9IHBsdWdpbi5nZXRMb2coKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjaXNFbmFibGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSAKLSAgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLkVudmlyb25tZW50LklMb2cjaXNFbmFibGVkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFN0cmluZyBvcHRpb24pIHsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHMoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkrIG9wdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0KSAKLQl7Ci0JCQotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQljYXNlIElMb2cuRVJST1IgOgotCQkJCXsKLQkJCQkJaWYgKGlzRW5hYmxlZCgiZXJyb3IiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiRSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIG9iamVjdDsKLQkJCQkJCWxvZyggc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwgKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJY2FzZSBJTG9nLldBUk5JTkcgOgotCQkJCXsKLQkJCQkJaWYgKGlzRW5hYmxlZCgid2FybmluZyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKQotCQkJCQkJCQkrICJXICIgKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkrICI6IG9iamVjdD0iICsgb2JqZWN0OyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlLCBudWxsICk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWNhc2UgSUxvZy5JTkZPIDoKLQkJCQl7Ci0JCQkJCWlmIChpc0VuYWJsZWQoImluZm8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSsgb2JqZWN0OwotCQkJCQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWxvZyhzZXZlcml0eSwgbWVzc2FnZU51bSwgY2FsbGVyLCBtZXRob2QsIChPYmplY3Qpc3RhdHVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlTnVtLCBjYWxsZXIsIG1ldGhvZCwgKE9iamVjdCludWxsICk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QpIAotCXsKLQkJaWYgKGlzRW5hYmxlZChvcHRpb24pKQotCQl7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiICsgY2FsbGVyIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIgKyBvYmplY3Q7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9nKHNldmVyaXR5LCBtZXNzYWdlLCBudWxsICk7Ci0JCX0JCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUpIAotCXsKLQkJaWYgKGlzRW5hYmxlZChvcHRpb24pKSAKLQkJewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIiArIGNhbGxlciAvLyROT04tTkxTLTEkCi0JCQkJCSsgIjo6IiArIG1ldGhvZDsgLy8kTk9OLU5MUy0xJAotCQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZSwgdGhyb3dhYmxlICk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzKSAKLQl7Ci0JCWxvZ2dlci5sb2coIHN0YXR1cyApOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlTnVtU3RyaW5nKGZpbmFsIGludCBtZXNzYWdlTnVtKSB7Ci0JCVN0cmluZyBtZXNzYWdlTnVtU3RyaW5nID0gIklXQUIiOyAvLyROT04tTkxTLTEkCi0JCWludCBpbm5lck1lc3NhZ2VOdW0gPSBtZXNzYWdlTnVtOwotCQlpZiAoaW5uZXJNZXNzYWdlTnVtID4gOTk5OSB8fCBpbm5lck1lc3NhZ2VOdW0gPCAwKQotCQkJaW5uZXJNZXNzYWdlTnVtID0gOTk5OTsgLy9kZWZhdWx0IG1lc3NhZ2UgbnVtYmVyCi0JCW1lc3NhZ2VOdW1TdHJpbmcgKz0gKG5ldyBJbnRlZ2VyKGlubmVyTWVzc2FnZU51bSkpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBtZXNzYWdlTnVtU3RyaW5nOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjICkKLQl7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKCBzZXZlcml0eSwgImlkIiwgMCwgbWVzc2FnZSwgZXhjICk7IC8vJE5PTi1OTFMtMSQKLQkJbG9nZ2VyLmxvZyggc3RhdHVzICk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZVNjaGVtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWI2NWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVVSSTsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVNjaGVtZSBpbXBsZW1lbnRzIElVUklTY2hlbWUKLXsKLSAgcHJpdmF0ZSBJRW52aXJvbm1lbnQgICAgICBlbnZpcm9ubWVudF87Ci0gIAotICBwdWJsaWMgRWNsaXBzZVNjaGVtZSggSUVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIGVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgLyoqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChJVVJJIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAKLSAgICBpZiggdXJpID09IG51bGwgKSByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgPSB1cmkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIGlmKCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJyZWxhdGl2ZSIpICkgcmV0dXJuIHNjaGVtZS5pc1ZhbGlkKCB1cmkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaS50b1N0cmluZygpICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuZXdVUkkgPSBudWxsOwotICAgIAotICAgIGlmKCB1cmkgIT0gbnVsbCAmJiB1cmkuc3RhcnRzV2l0aCggInBsYXRmb3JtOiIpICkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIC8vIFRoZSBwbGF0Zm9ybSBoYXMgYmVlbiBzcGVjaWZpZWQgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgIG5ld1VSSSA9IHVyaTsKLSAgICB9Ci0gICAgZWxzZSBpZiggdXJpID09IG51bGwgfHwgdXJpLmluZGV4T2YoICI6IikgIT0gLTEgKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy8gVGhlIHBsYXRmb3JtIHVyaSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIHNvbWUgb3RoZXIgcHJvdG9jb2wuIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfSU5WQUxJRF9QTEFURk9STV9VUkwsdXJpKSwgbnVsbCApICk7Ci0gICAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gc2NoZW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgc28gd2Ugd2lsbCBhZGQgaXQuCi0gICAgICBuZXdVUkkgPSAicGxhdGZvcm06L3Jlc291cmNlIiArIHVyaTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBpZiggbmV3VVJJID09IG51bGwgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaSApOwotICAgIH0KLSAgICByZXR1cm4gbmV3IEVjbGlwc2VVUkkoIG5ld1VSSSwgZW52aXJvbm1lbnRfICk7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShJVVJJIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSSggdXJpID09IG51bGwgPyBudWxsIDogdXJpLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUkkoIHVybCA9PSBudWxsID8gbnVsbCA6IHVybC50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElVUkkgdXJpKQotICB7Ci0gICAgSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUklTY2hlbWUgc2NoZW1lID0gdXJpLmdldFVSSVNjaGVtZSgpOwotICAgICAgCi0gICAgICBpZiggc2NoZW1lLnRvU3RyaW5nKCkuZXF1YWxzKCAicmVsYXRpdmUiKSApIHJldHVybiBzY2hlbWUudmFsaWRhdGUoIHVyaSApOyAvLyROT04tTkxTLTEkCi0gICAgICAKLSAgICAgIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaS50b1N0cmluZygpICk7Ci0gICAgICBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgc3RhdHVzID0gZXhjLmdldFN0YXR1cygpOyAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlICJwbGF0Zm9ybTovcmVzb3VyY2UiIElQYXRoIGdpdmVuIGEgdXJsCi0gICAqIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24gCi0gIHsKLSAgICBTdHJpbmcgcmVzb3VyY2VGaWxlID0gbnVsbDsKLSAgICBVUkwgICAgdXJsICAgICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKCB1cmkgKTsgCi0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7IAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfSU5WQUxJRF9QTEFURk9STV9VUkwsIHVyaSApLCBleGMgKSApOwotICAgIH0KLSAgICAKLSAgICBpZiggdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpICkgIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb3VyY2VVUkwgPSB1cmwuZ2V0RmlsZSgpOwotICAgICAgCi0gICAgICBpZiAocmVzb3VyY2VVUkwuc3RhcnRzV2l0aCgiL3Jlc291cmNlIikpICAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHJlc291cmNlRmlsZSA9IHJlc291cmNlVVJMLnN1YnN0cmluZygxMCk7ICAgLy8gb21pdCB0aGUgIi9yZXNvdXJjZSIgcG9ydGlvbgotICAgICAgfQotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfSU5WQUxJRF9QTEFURk9STV9VUkwsdXJsLmdldEZpbGUoKSApLCBudWxsICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc291cmNlRmlsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIGFuIGFic29sdXRlIElQYXRoCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcGxhdGZvcm0gSVVSSSBmb3IgdGhpcyBwYXRoLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkxGcm9tUGF0aCggSVBhdGggYWJzb2x1dGVQYXRoICkKLSAgewotICAgIHJldHVybiAicGxhdGZvcm06L3Jlc291cmNlIiArIGFic29sdXRlUGF0aDsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMGY5YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVVSSTsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVVSSSBleHRlbmRzIFJlbGF0aXZlVVJJCi17Ci0gIHByaXZhdGUgSUVudmlyb25tZW50ICAgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIEVjbGlwc2VTY2hlbWUgIHNjaGVtZV87Ci0gIHByaXZhdGUgRmlsZSAgICAgICAgICAgZmlsZV87Ci0gIAotICBwdWJsaWMgRWNsaXBzZVVSSSggU3RyaW5nIHVyaSwgSUVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIHN1cGVyKCB1cmkgKTsKLSAgICAKLSAgICBlbnZpcm9ubWVudF8gID0gZW52aXJvbm1lbnQ7Ci0gICAgc2NoZW1lXyAgICAgICA9IG5ldyBFY2xpcHNlU2NoZW1lKCBlbnZpcm9ubWVudCApOwotICAgIGZpbGVfICAgICAgICAgPSBnZXRGaWxlKCk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2VyYXNlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgCi0gICAgewotICAgICAgSVJlc291cmNlIGZpbGUgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgKSAKLSAgICAgIHsKLSAgICAgICAgaWYoIGZpbGUgaW5zdGFuY2VvZiBJRmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlUmVzb3VyY2VVdGlscy5kZWxldGVGaWxlKCAoSUZpbGUpZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZmlsZSBpbnN0YW5jZW9mIElGb2xkZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVJlc291cmNlVXRpbHMuZGVsZXRlRm9sZGVyKCAoSUZvbGRlcilmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gZXhjICkgCi0gICAgeyAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeSAKLSAgICB7Ci0gICAgICAvLyBJZiBhIGNsYXNzIGNhc3QgZXhjZXB0aW9uIGlzIHRocm93IGl0IHdpbGwgYmUgcHJvcG9nYXRlZCBhcwotICAgICAgLy8gYSBVUklFeGNlcHRpb24uCi0gICAgICBJRmlsZSBmaWxlID0gKElGaWxlKWdldFJlc291cmNlKCk7Ci0KLSAgICAgIC8vY2FsbCBnZXRDb250ZW50cyBvbiB0aGUgZWNsaXBzZSBGaWxlIG9iamVjdAotICAgICAgaWYoIGZpbGUgIT0gbnVsbCApIAotICAgICAgewotICAgICAgICByZXR1cm4gZmlsZS5nZXRDb250ZW50cygpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVGhyb3dhYmxlIGV4YyApIAotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGZvbGRlciBleGlzdHMuCi0gICAgSVVSSSBwYXJlbnQgPSBwYXJlbnQoKTsKLSAgICAKLSAgICBpZiggIXBhcmVudC5pc1ByZXNlbnQoKSApCi0gICAgewotICAgICAgcGFyZW50KCkudG91Y2hGb2xkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGdldE91dFN0cmVhbSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2dldFVSSVNjaGVtZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJVVJJU2NoZW1lIGdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1lXzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc0xlYWYoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc0xlYWYoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgCi0gICAgICAgICAgcmVzb3VyY2UuZXhpc3RzKCkgJiYgCi0gICAgICAgICAgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBJVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSApCi0gICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIElVUkkgZG9lcyBub3QgZXhpc3QuCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc1JlYWRhYmxlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgSVVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc1JlbGF0aXZlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgCi0gICAgICAgICAgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgJiYgCi0gICAgICAgICAgIXJlc291cmNlLmdldFJlc291cmNlQXR0cmlidXRlcygpLmlzUmVhZE9ubHkoKSApCi0gICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIElVUkkgZG9lcyBub3QgZXhpc3QuCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNsaXN0KCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlICAgID0gZ2V0UmVzb3VyY2UoKTsKLSAgICBJVVJJW10gICAgIHVyaUNoaWxkcmVuID0gbmV3IElVUklbMF07Ci0gICAgCi0gICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICB7Ci0gICAgICBJRm9sZGVyICAgICBmb2xkZXIgICA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlW10gY2hpbGRyZW4gICAgPSBmb2xkZXIubWVtYmVycygpOyAgCi0gIAotICAgICAgICB1cmlDaGlsZHJlbiA9IG5ldyBJVVJJW2NoaWxkcmVuLmxlbmd0aF07Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIElQYXRoIHBhdGggPSBjaGlsZHJlbltpbmRleF0uZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICB1cmlDaGlsZHJlbltpbmRleF0gPSBuZXcgRWNsaXBzZVVSSSggc2NoZW1lXy5nZXRVUkxGcm9tUGF0aChwYXRoKSwgZW52aXJvbm1lbnRfICApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdXJpQ2hpbGRyZW47Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLklVUklGaWx0ZXIpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJVVJJW10gbGlzdChJVVJJRmlsdGVyIHVyaUZpbHRlcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICBJVVJJW10gICAgIHJlc3VsdCAgID0gbmV3IElVUklbMF07Ci0gICAgCi0gICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICAgewotICAgICAgSUZvbGRlciAgICAgZm9sZGVyICAgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuICAgID0gZm9sZGVyLm1lbWJlcnMoKTsgICAgICAgCi0gICAgICAgIFZlY3RvciAgICAgIHVyaUNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNoaWxkcmVuW2luZGV4XS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgIElVUkkgICB1cmkgID0gbmV3IEVjbGlwc2VVUkkoIHNjaGVtZV8uZ2V0VVJMRnJvbVBhdGgocGF0aCksIGVudmlyb25tZW50XyApOwotICAgICAgICAgIAotICAgICAgICAgIGlmKCB1cmlGaWx0ZXIuYWNjZXB0cyggdXJpICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVyaUNoaWxkcmVuLmFkZCggdXJpICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSAoSVVSSVtdKXVyaUNoaWxkcmVuLnRvQXJyYXkoIG5ldyBJVVJJWzBdICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI3JlbmFtZShvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIHJlbmFtZShJVVJJIG5ld1VSSSApIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGlmKCBuZXdVUkkgPT0gbnVsbCB8fCAhKG5ld1VSSSBpbnN0YW5jZW9mIEVjbGlwc2VVUkkpICkgcmV0dXJuOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEVjbGlwc2VVUkkgbmV3RWNsaXBzZVVSSSA9IChFY2xpcHNlVVJJKW5ld1VSSTsKLSAgICAgIElQYXRoICAgICAgbmV3UGF0aCAgICAgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIG5ld0VjbGlwc2VVUkkudXJpXyApICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJUmVzb3VyY2UgIHJlc291cmNlICAgICAgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIHJlc291cmNlLm1vdmUoIG5ld1BhdGgsIHRydWUsIG51bGwgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgdG91Y2hGb2xkZXIoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgIAotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICB7IAotICAgICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICAgIHsKLSAgICAgICAgSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaWYoIGZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19FUlJPUl9GT0xERVJfSEFTX0NISUxEUkVOLCBmb2xkZXIudG9TdHJpbmcoKSApLCBudWxsICksCi0gICAgICAgICAgICAgICAgdGhpcyApOwotCQkJCQkJCQkKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvLz8/PyBOb3Qgc3VyZSB3aGF0IHRvIGRvIGlmIHRvdWNoaW5nIGEgZm9sZGVyIGFuZCB0aGUgSVVSSSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZvbGRlci4KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIElQYXRoIG5ld1BhdGggPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLm1ha2VGb2xkZXJQYXRoKCBuZXdQYXRoLAotCQkJICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIHRvdWNoTGVhZigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgCi0gICAgaWYoIHJlc291cmNlICE9IG51bGwgKQotICAgIHsKLSAgICAgIC8vIFRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBzbyBkbyBub3RoaW5nLgotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgcGFyZW50IGZvciB0aGlzIGxlYWYgYW5kIGNyZWF0ZSBpdCBpZiByZXF1aXJlZC4KLSAgICAgIElVUkkgcGFyZW50ID0gcGFyZW50KCk7Ci0gICAgICAKLSAgICAgIGlmKCAhcGFyZW50LmlzUHJlc2VudCgpICkKLSAgICAgIHsgIAotICAgICAgICBwYXJlbnQoKS50b3VjaEZvbGRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IGFuIG91dHB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBmaWxlIGFuZCBpbW1lZGlhdGVseSBjbG9zZSBpdC4KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgY3JlYXRlIGEgMCBieXRlIGZpbGUuCi0gICAgICAgIGdldE91dFN0cmVhbSgpLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsgICAgCi0gICAgSVBhdGggIHBhdGggICAgICAgICAgICAgPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKHVyaV8pICk7Ci0gICAgU3RyaW5nIGFic29sdXRlUGF0aG5hbWUgPSBwYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0gICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGFic29sdXRlUGF0aG5hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHByaXZhdGUgT3V0cHV0U3RyZWFtIGdldE91dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElQYXRoICAgICAgICBmaWxlICAgPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICBPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAKLSAgICBzdHJlYW0gPSBGaWxlUmVzb3VyY2VVdGlscy5uZXdGaWxlT3V0cHV0U3RyZWFtICggZmlsZSwKLSAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsgICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgSVVSSS4KLSAgICogVGhlcmUgYXJlIG1hbnkgVVJJcyBhbmQgVVJJU2NoZW1lcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QKLSAgICogd2lsbCBmYWlsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkKLSAgICogaW4gY2FzZXMgd2hlcmUgVVJJcyBhcmUga25vd24gdG8gYmUgYmFja2VkIGJ5IHBoeXNpY2FsIGZpbGVzLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgRmlsZSBhc0ZpbGUgKCkKLSAgewotICAJcmV0dXJuIGZpbGVfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlKCkgCi0gIHsKLSAgCXJldHVybiBmaWxlXyAhPSBudWxsOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNVUkwoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgVVJMIGFzVVJMKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdXJsID0gbmV3IFVSTCggdXJpXyApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHVybDsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNVUkwoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMKCkKLSAgewotICAgIFVSTCB0aGVVUkwgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHRoZVVSTCA9IGFzVVJMKCk7ICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdGhlVVJMICE9IG51bGwgOwotICB9Ci0KLSAgcHJpdmF0ZSBGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgU3RyaW5nIHBsYXRmb3JtUmVzID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBGaWxlICAgcmVzdWx0ICAgICAgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlfLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXMpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZCh1cmlfLnN1YnN0cmluZyhwbGF0Zm9ybVJlcy5sZW5ndGgoKSwgdXJpXy5sZW5ndGgoKSkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9GaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM1MGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci0KLQotCi0vKioKLSogVGhpcyBjbGFzcyBkZWZpbmVzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4KLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfS4KLSovCi1wdWJsaWMgY2xhc3MgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtCi17Ci0KLSAgSVBhdGggICAgICAgICAgICAgICAgIGZGaWxlUGF0aDsKLSAgSVN0YXR1c0hhbmRsZXIgICAgICAgICBmU3RhdHVzSGFuZGxlcjsKLSAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0gIGJvb2xlYW4gICAgICAgICAgICAgICBmT3BlbjsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byB0aGUKLSAgKiBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPi4gVGhlIHdvcmtzcGFjZSBpcyBuZWl0aGVyIGV4YW1pbmVkIG5vcgotICAqIGFsdGVyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4gQWxsIHJlc291cmNlIGNyZWF0aW9uIGlzIGRlZmVycmVkCi0gICogdW50aWwgbGF0ZXIgaW4gdGhlIHN0cmVhbSdzIGxpZmVjeWNsZSwgc3VjaCBhcyBkdXJpbmcgd3JpdGluZwotICAqIG9yIGNsb3N1cmUuCi0gICogPGI+Tm90ZTo8L2I+IFRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBjcmVhdGluZyBhIHN0cmVhbSB0aGF0Ci0gICogd3JpdGVzIHRvIGFuIElGaWxlIGlzIHRvIGNhbGwgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZAotICAqIHtAbGluayBGaWxlUmVzb3VyY2VVdGlscyNuZXdGaWxlT3V0cHV0U3RyZWFtIEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0oKX0KLSAgKiBhbmQgd29yayB3aXRoIHRoZSByZXN1bHRpbmcgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KLSAgKiBEaXJlY3QgY29uc3RydWN0aW9uIG9mIGEgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgKiBAcGFyYW0gZmlsZSBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZSByZXNvdXJjZSB0byBjcmVhdGUuIFRoZSBwcm9qZWN0IGltcGxpZWQgYnkgdGhlCi0gICogcGF0aG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqLwotICBwdWJsaWMgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtICggCi0gIAkJCUlQYXRoICAgICAgICAgICBmaWxlUGF0aCwgCi0gIAkJCUlTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlcgotICAJCQkpCi0gIHsKLSAgICBmRmlsZVBhdGggPSBmaWxlUGF0aDsKLSAgICBmU3RhdHVzSGFuZGxlciA9IHN0YXR1c0hhbmRsZXI7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBmT3BlbiA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgKiBDbG9zZXMgdGhlIHN0cmVhbS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoZSBzdHJlYW0uCi0gICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZQotICAqIGFuZCBhIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiB3aWxsCi0gICogYmUgdGhyb3duIGVpdGhlciBub3cgb3IgZHVyaW5nIGFuIGVhcmxpZXIge0BsaW5rICN3cml0ZSB3cml0ZX0uCi0gICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgY2xvc2UgKCkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIWZPcGVuKSByZXR1cm47Ci0gICAgZk9wZW4gPSBmYWxzZTsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgYnl0ZVtdIGJ1ZmZlciA9IGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLSAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSB0ZW1wSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKGZGaWxlUGF0aCwgdGVtcElucHV0U3RyZWFtLCBmU3RhdHVzSGFuZGxlcik7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBGbHVzaGVzIHRoZSBzdHJlYW0uIFRoaXMgZG9lcyBub3QgaW1wbHkgdGhlIEZpbGUgcmVzb3VyY2UKLSAgKiB3aWxsIGJlIGNyZWF0ZWQgb3IgYmVjb21lIHZpc2libGUgd2l0aGluIHRoZSB3b3JrYmVuY2guCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCBmbHVzaCAoKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgfQotCi0gIC8qKgotICAqIFdyaXRlcyBhbGwgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgdG8gdGhlIHN0cmVhbS4KLSAgKiBAcGFyYW0gYiBUaGUgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBiICkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGFycmF5IGJlZ2lubmluZyBhdCBzb21lIG9mZnNldAotICAqIGFuZCBjb250aW51aW5nIGZvciBzb21lIG51bWJlciBvZiBieXRlcyAobGVuKSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkgdG8gYmVnaW4gd3JpdGluZy4KLSAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuICkKLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYixvZmYsbGVuKTsKLSAgfQotCi0gIC8qKgotICAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0uCi0gICogQHBhcmFtIGIgVGhlIGJ5dGUgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCB3cml0ZSAoIGludCBiICkKLSAgewotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYik7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlVXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjZiMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDgwNzExICAgMjQwNDA4IHJra2xhaUBjYS5pYm0uY29tIC0gUmF5bW9uZCBMYWksIHN1cHBvcnQgY2FzZS1pbnNlbnNpdGl2ZSBwbGF0Zm9ybSBtYWtlRmlsZSB3aGVuIGEgZmlsZSB3aXRoIHZhcmlhbnQgY2FzZSBleGlzdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci0KLQotCi0vKioKLSogVGhpcyBjbGFzcyBjb250YWlucyB1c2VmdWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEVjbGlwc2UgcmVzb3VyY2VzLgotKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlUmVzb3VyY2VVdGlscwotewotICAvLwotICAvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZSBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZSgpLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlIHdvcmtzcGFjZV8gPSBudWxsOwotICAvLwotICAvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZVJvb3QgaGFuZ2luZyBhcm91bmQuIFNlZSBnZXRXb3Jrc3BhY2VSb290KCkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2VSb290IHJvb3RfID0gbnVsbDsKLQotIC8qKgotICAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLSAgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlUm9vdCBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCAoKQotICB7Ci0gICAgaWYgKHJvb3RfID09IG51bGwpCi0gICAgewotICAgICAgcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIH0KLSAgICByZXR1cm4gcm9vdF87Ci0gIH0KLQotIC8qKgotICAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2Ugb2JqZWN0LgotICAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2Ugb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlICgpCi0gIHsKLSAgICBpZiAod29ya3NwYWNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyb290XyA9PSBudWxsKQotICAgICAgewotICAgICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHdvcmtzcGFjZV8gPSByb290Xy5nZXRXb3Jrc3BhY2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHdvcmtzcGFjZV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGFuIGFycmF5IG9mIHRocmVlIGNvbW1vbiBjaG9pY2VzLiAoaWUuIFllcywgeWVzIGFsbCwgYW5kIGNhbmNlbCApCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENob2ljZVtdIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpIAotICB7Ci0gICAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ1knLCBNZXNzYWdlcy5MQUJFTF9ZRVMgKSk7Ci0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ0EnLCBNZXNzYWdlcy5MQUJFTF9ZRVNfVE9fQUxMICkpOwotICAgIGNob2ljZXMuYWRkKG5ldyBDaG9pY2UoICdDJywgTWVzc2FnZXMuTEFCRUxfQ0FOQ0VMICkpOwotICAgIAotICAgIHJldHVybiAoQ2hvaWNlW10pY2hvaWNlcy50b0FycmF5KG5ldyBDaG9pY2VbY2hvaWNlcy5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfQotICAqIG9mIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRobmFtZSBvciBudWxsIGlmIG5vIHN1Y2ggcmVzb3VyY2UgZXhpc3RzLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGhuYW1lIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotICAqLwotICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UgKCBTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSApCi0gIHsKLSAgICBpZiAoYWJzb2x1dGVQYXRobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmluZFJlc291cmNlKG5ldyBQYXRoKGFic29sdXRlUGF0aG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIElSZXNvdXJjZX0KLSAgKiBvZiB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aCBvciBudWxsIGlmIG5vIHN1Y2ggcmVzb3VyY2UgZXhpc3RzLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIDxjb2RlPklQYXRoPC9jb2RlPiBvZiB0aGUgcmVzb3VyY2UuCi0gICogQHJldHVybiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlICggSVBhdGggYWJzb2x1dGVQYXRoICkKLSAgewotICAgIGlmIChhYnNvbHV0ZVBhdGggPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGFic29sdXRlUGF0aCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb3BpZXMgYSBmaWxlIGZyb20gYSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24KLSAgICogdG8gYW4gRWNsaXBzZSBmb2xkZXIuCi0gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gc291cmNlUGF0aCBUaGUgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbjwvY29kZT4KLSAgICogaW5zdGFsbCBsb2NhdGlvbiwgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4KLSAgICogSWYgbnVsbCwgdGhlbiB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoCi0gICAqIChpZS4gbnVsbCBpcyBlcXVpdmFsZW50IHRvICIuIikuCi0gICAqIEBwYXJhbSBwYXRobmFtZSBUaGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gY29weS4KLSAgICogVGhlIHBhdGhuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBhYnNvbHV0ZSBFY2xpcHNlIHBhdGggb2YgdGhlIGZvbGRlciB0bwotICAgKiB3aGljaCB0aGUgZmlsZSB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lIG9mIHRoZQotICAgKiBmaWxlIGlzIHByZXNlcnZlZC4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIGNyZWF0ZUZvbGRlcnMgVGhlIGludGVybWVkaWF0ZSBmb2xkZXIgY3JlYXRpb24gcG9saWN5LCBvbmUgb2YKLSAgICoge0BsaW5rICNDUkVBVEUgQ1JFQVRFfSBvciB7QGxpbmsgI0RPTlRfQ1JFQVRFIERPTlRfQ1JFQVRFfS4KLSAgICogPHVsPgotICAgKiA8bGk+PGNvZGU+Q1JFQVRFPC9jb2RlPiAtCi0gICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAgKiBkbyBub3QgZXhpc3QsIHRoZXkgd2lsbCBiZSBjcmVhdGVkLgotICAgKiA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+IC0KLSAgICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICAqIGRvIG5vdCBleGlzdCwgdGhlIG1ldGhvZCB3aWxsIHRocm93IGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uCi0gICAqIDwvdWw+Ci0gICAqIEBwYXJhbSBvdmVyd3JpdGVGaWxlIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLSAgICoge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfSBvciB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLSAgICogPHVsPgotICAgKiA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPiAtCi0gICAqIElmIGEgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYSBmaWxlLAotICAgKiBpdCB3aWxsIGJlIHJlcGxhY2VkLgotICAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZpbGUsCi0gICAqIHRoZW4gbm8gZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYW5kCi0gICAqIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0gICAqIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4gLQotICAgKiBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cywKLSAgICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgICogPC91bD4KLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0gICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgICogbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLSAgICovCi0gICBzdGF0aWMgcHVibGljIHZvaWQgY29weUZpbGUoIFBsdWdpbiBwbHVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHNvdXJjZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCB0YXJnZXRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yICkKLSAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICAgdHJ5Ci0gICAgIHsKLSAgICAgICBJUGF0aCB0YXJnZXQgPSB0YXJnZXRQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0gICAgICAgSVBhdGggc291cmNlID0gc291cmNlUGF0aCA9PSBudWxsID8gcGF0aG5hbWUgOiBzb3VyY2VQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0gICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShzb3VyY2UpOwotICAgICAgIGNyZWF0ZUZpbGUodGFyZ2V0LCBpbnB1dCwgc3RhdHVzTW9uaXRvcik7Ci0gICAgIH0KLSAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgIHsKLSAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuTVNHX0VSUk9SX0lPLGUpKTsKLSAgICAgfQotICAgfQotICAgCi0gIC8qKgotICAgKiBEZWxldGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4KLSAgICogVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gICAqIEBwYXJhbSBmaWxlIC0gdGhlIElGaWxlIHRvIGJlIGRlbGV0ZWQKLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotICAgKiBAcGFyYW0gc3RhdHVzTW9uaXRvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZC4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoIElGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yKQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZmlsZS5leGlzdHMoKSkKLSAgICB7ICAgICAgCi0gICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLSAgICAgIGlmIChmaWxlLmlzUmVhZE9ubHkoKSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotICAgICAgICBmaWxlc1swXSA9IGZpbGU7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICkKLSAgICAgICAgewotICAgICAgICAgIHN0YXR1c01vbml0b3IucmVwb3J0RXJyb3IoIHN0YXR1cyApOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBmaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLSAgICB9Ci0gICAgLy9BdCB0aGlzIHBvaW50LCBlaXRoZXIgdGhlIGZpbGUgZGlkIG5vdCBleGlzdCBvciB3ZSBzdWNjZXNzZnVsbHkgZGVsZXRlZAotICAgIC8vIGl0LiBSZXR1cm4gc3VjY2Vzcy4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWxldGVzIGEgZm9sZGVyIHVuZGVyIGEgY29udGFpbmVyLgotICAgKiBAcGFyYW0gZm9sZGVyIC0gdGhlIElGb2xkZXIgdG8gYmUgZGVsZXRlZAotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0gICAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZm9sZGVyIGRvZXMgbm90IGV4aXN0IG9yIGlmIGl0IGV4aXN0cyBhbmQgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgYWxvbmcgd2l0aCBpdHMgbWVtYmVycy4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVGb2xkZXIoIElGb2xkZXIgZm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1c0hhbmRsZXIgc3RhdHVzTW9uaXRvciApCi0gICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICB7Ci0gICAgIGlmICghZm9sZGVyLmV4aXN0cygpKSByZXR1cm4gdHJ1ZTsKLQotICAgICBib29sZWFuICAgICBkZWxldGVkICAgPSB0cnVlOwotICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBmb2xkZXIubWVtYmVycygpOwotICAgICAKLSAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykKLSAgICAgewotICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLSAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICB7Ci0gICAgICAgICBkZWxldGVkID0gZGVsZXRlRmlsZSgoSUZpbGUpcmVzb3VyY2UsIHN0YXR1c01vbml0b3IpOwotICAgICAgIH0KLSAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGb2xkZXIoIChJRm9sZGVyKXJlc291cmNlLCBzdGF0dXNNb25pdG9yKTsKLSAgICAgICB9Ci0KLSAgICAgICBpZiggIWRlbGV0ZWQgKSBicmVhazsKLSAgICAgfQotICAgICAKLSAgICAgaWYoIGRlbGV0ZWQgKQotICAgICB7Ci0gICAgICAgZm9sZGVyLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgfQotICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgKiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4KLSAgKiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotICAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLSAgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QgaXMgdGhyb3duLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgotICAqIFRoZSBwcm9qZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqIEByZXR1cm4gVGhlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBJRmlsZX0KLSAgKiBoYW5kbGUgb2YgdGhlIGZpbGUuCi0gICogQHRocm93cyBDb3JlRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICogd2l0aCBhIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0gICogbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLSAgICBJUGF0aCAgICAgICAgICAgYWJzb2x1dGVQYXRoLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBJU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gIHsgICAgCi0gICAgaWYgKCFhYnNvbHV0ZVBhdGguaXNBYnNvbHV0ZSgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIlJlc291cmNlVXRpbHMiLDAsIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9OT1RfQUJTT0xVVEUsIGFic29sdXRlUGF0aC50b1N0cmluZygpICksbnVsbCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAxKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwiUmVzb3VyY2VVdGlscyIsMCxOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfRU1QVFksIGFic29sdXRlUGF0aC50b1N0cmluZygpICksbnVsbCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAyKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwiUmVzb3VyY2VVdGlscyIsMCxOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUiwgYWJzb2x1dGVQYXRoLnRvU3RyaW5nKCkgKSxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgSUNvbnRhaW5lciBwYXJlbnQgICA9IG1ha2VGb2xkZXJQYXRoKGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHN0YXR1c0hhbmRsZXIpOwotICAgIFN0cmluZyAgICAgZmlsZU5hbWUgPSBhYnNvbHV0ZVBhdGgubGFzdFNlZ21lbnQoKTsKLSAgICAKLSAgICByZXR1cm4gbWFrZUZpbGUocGFyZW50LCBmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIHN0YXR1c0hhbmRsZXIpOwotICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4KLSAgKiBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPnJlbGF0aXZlUGF0aDwvY29kZT4KLSAgKiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4KLSAgKiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotICAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLSAgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QgaXMgdGhyb3duLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgotICAqIFRoZSBwcm9qZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAqIHtAbGluayAjQ1JFQVRFIENSRUFURX0gb3Ige0BsaW5rICNET05UX0NSRUFURSBET05UX0NSRUFURX0uCi0gICogPHVsPgotICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgKiBkbyBub3QgZXhpc3QsIHRoZXkgd2lsbCBiZSBjcmVhdGVkLgotICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGRvIG5vdCBleGlzdCwgdGhlIG1ldGhvZCB3aWxsIHRocm93IGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZSBUaGUgcG9saWN5IGZvciBleGlzdGluZyBmaWxlcywgb25lIG9mCi0gICoge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfSBvciB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLSAgKiA8dWw+Ci0gICogPGxpPjxjb2RlPk9WRVJXUklURTwvY29kZT4gLQotICAqIElmIGEgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICogaXQgd2lsbCBiZSByZXBsYWNlZC4KLSAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZpbGUsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4gLQotICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDwvdWw+Ci0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZSAoCi0gICAgSVByb2plY3QgICAgICAgIHByb2plY3QsCi0gICAgSVBhdGggICAgICAgICAgIHJlbGF0aXZlUGF0aCwKLSAgICBJbnB1dFN0cmVhbSAgICAgaW5wdXRTdHJlYW0sCi0gICAgSVN0YXR1c0hhbmRsZXIgICBzdGF0dXNNb25pdG9yICkKLSAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgewotICAgIElQYXRoIGFic29sdXRlUGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocmVsYXRpdmVQYXRoKTsKLSAgICByZXR1cm4gY3JlYXRlRmlsZShhYnNvbHV0ZVBhdGgsIGlucHV0U3RyZWFtLCBzdGF0dXNNb25pdG9yKTsKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZXMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRvIHRoZQotICAqIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+LiBBY3R1YWwgY2hhbmdlcyB0byB0aGUgd29ya3NwYWNlCi0gICogbWF5IG9jY3VyIGR1cmluZyBjcmVhdGlvbiBvZiB0aGUgc3RyZWFtLCB3aGlsZSB3cml0aW5nIHRvCi0gICogdGhlIHN0cmVhbSwgb3Igd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KLSAgKiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcKLSAgKiBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aWxsIGJlIHRocm93bgotICAqIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3RyZWFtCi0gICogaWYgdGhlIGZpbGUgcmVzb3VyY2UgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICogQHBhcmFtIGZpbGUgVGhlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBJRmlsZX0KLSAgKiBoYW5kbGUgb2YgdGhlIGZpbGUgcmVzb3VyY2UgdG8gY3JlYXRlLiBUaGUgcHJvamVjdCBpbXBsaWVkIGJ5IHRoZQotICAqIHBhdGhuYW1lIG9mIHRoZSBmaWxlIG11c3QgYWxyZWFkeSBleGlzdCwKLSAgKiB0aGF0IGlzLCB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgcHJvamVjdHMuCi0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIEFuIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gdGllZCB0byB0aGUgZmlsZSByZXNvdXJjZS4KLSAgKiBBY3R1YWwgY2hlY2tzIG9mIG9yIGNoYW5nZXMgdG8gdGhlIHdvcmtzcGFjZSBtYXkgb2NjdXIgYXMgZWFybHkgZHVyaW5nCi0gICogc3RyZWFtIGNyZWF0aW9uLCBjbG9zdXJlLCBvciBhbnkgdGltZSBpbiBiZXR3ZWVuLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICogUmVhc29ucyBpbmNsdWRlOgotICAqIDxvbD4KLSAgKiA8bGk+VGhlIHByb2plY3Qgb2YgdGhlIGdpdmVuIGZpbGUncyBwYXRoIGRvZXMgbm90IGV4aXN0LgotICAqIDxsaT5BIG5vbi1maWxlIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUKLSAgKiBhbHJlYWR5IGV4aXN0cy4KLSAgKiA8bGk+QSBmaWxlIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUKLSAgKiBhbHJlYWR5IGV4aXN0cywgYW5kIDxjb2RlPm92ZXJ3cml0ZUZpbGU8L2NvZGU+IGlzIGZhbHNlLgotICAqIDxsaT5PbmUgb3IgbW9yZSBpbnRlcm1lZGlhdGUgZm9sZGVycyB0byB0aGUgZ2l2ZW4gZmlsZQotICAqIGRvIG5vdCBleGlzdCwgYW5kIDxjb2RlPmNyZWF0ZUZvbGRlcnM8L2NvZGU+IGlzIGZhbHNlLgotICAqIDwvb2w+Ci0gICovCi0KLSAgcHVibGljIHN0YXRpYyBPdXRwdXRTdHJlYW0gbmV3RmlsZU91dHB1dFN0cmVhbSAoCi0gICAgICAgSVBhdGggICAgICAgICAgICBmaWxlLAotICAgICAgIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXIgKQotIAotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0oZmlsZSwgc3RhdHVzSGFuZGxlcik7Ci0gIH0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gTmF1Z2h0eSBiaXRzLi4uCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vCi0gIC8vIENyZWF0ZXMgYSBwYXRoIG9mIGZvbGRlcnMuCi0gIC8vIERvIG5vdCBjYWxsIHdpdGggYW4gYWJzb2x1dGVQYXRoIG9mIGxlc3MgdGhhbiBvbmUgc2VnbWVudC4KLSAgLy8KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBwYXRoIG9mIGZvbGRlcnMuCi0gICAqIERvIG5vdCBjYWxsIHdpdGggYW4gYWJzb2x1dGVQYXRoIG9mIGxlc3MgdGhhbiBvbmUgc2VnbWVudC4KLSAgICogQHBhcmFtIHJlc291cmNlQ29udGV4dCB0aGUgcmVzb3VyY2UgY29udGV4dCBmb3IgbWFraW5nIGZvbGRlcnMuCi0gICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggdGhlIHBhdGggb2YgZm9sZGVycyB0aGF0IHdpbGwgYmUgY3JlYXRlZC4KLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byBiZSB1c2VkLgotICAgKiBAcGFyYW0gc3RhdHVzSGFuZGxlciB0aGUgc3RhdHVzIGhhbmRsZXIuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgSUNvbnRhaW5lciBvZiB0aGUgY3JlYXRlZCBmb2xkZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElDb250YWluZXIgbWFrZUZvbGRlclBhdGggKAotICAgIElQYXRoICAgICAgICAgICAgYWJzb2x1dGVQYXRoLAotICAgIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8PSAxKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChhYnNvbHV0ZVBhdGguc2VnbWVudCgwKSk7Ci0gICAgfQotICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSBtYWtlRm9sZGVyUGF0aChhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBzdGF0dXNIYW5kbGVyICk7Ci0gICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotICAgICAgCi0gICAgICByZXR1cm4gbWFrZUZvbGRlcihwYXJlbnQsZm9sZGVyTmFtZSwgc3RhdHVzSGFuZGxlciApOwotICB9Ci0gIC8vCi0gIC8vIENyZWF0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0gICAgSUNvbnRhaW5lciAgICAgICBwYXJlbnQsCi0gICAgU3RyaW5nICAgICAgICAgICBmb2xkZXJOYW1lLAotICAgIElTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSBjaGlsZCAgPSBwYXJlbnQuZmluZE1lbWJlcihmb2xkZXJOYW1lKTsKLSAgICAKLSAgICBpZiggY2hpbGQgPT0gbnVsbCApCi0gICAgeyAgICAgIAotICAgICAgSUZvbGRlciBmb2xkZXIgPSBwYXJlbnQuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlck5hbWUpKTsKLSAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSx0cnVlLG51bGwpOwotICAgICAgcmV0dXJuIGZvbGRlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiggY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgIHsKLSAgICAgIHJldHVybiAoSUZvbGRlciljaGlsZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAKLSAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlVXRpbHMiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIDAsIAotCQkJCQlOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GT0xERVIsIHBhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmb2xkZXJOYW1lKS50b1N0cmluZygpKSwKLQkJCW51bGwgKSApOwotICAgIH0KLSAgfQotCi0gIC8vCi0gIC8vIENyZWF0ZXMgYSBmaWxlIHVuZGVyIGEgY29udGFpbmVyLgotICAvLyBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLSAgLy8KLSBwcml2YXRlIHN0YXRpYyBJRmlsZSBtYWtlRmlsZSAoCi0JCSBJQ29udGFpbmVyICAgICAgIHBhcmVudCwKLQkJIFN0cmluZyAgICAgICAgICAgZmlsZU5hbWUsCi0JCSBJbnB1dFN0cmVhbSAgICAgIGlucHV0U3RyZWFtLAotCQkgSVN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlciApCi0KLSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotIHsKLQkgU3RyaW5nIGlubmVyRmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKCBuZXcgUGF0aChpbm5lckZpbGVOYW1lKSApOwotCi0JIC8vIGNyZWF0ZSB0aGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0JIGlmICghZmlsZS5leGlzdHMoKSkgewotCQkgdHJ5IHsKLQkJCSBmaWxlLmNyZWF0ZSggaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOyAgICAKLQkJCSByZXR1cm4gZmlsZTsKLQkJIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZUV4Y2VwdGlvbikgewotCQkJIC8vIHRoaXMgZXJyb3Igb25seSBoYXBwZW5zIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbTsgc28gaWdub3JlIHRoZSBjYXNlcy4KLQkJCSBpZiAoY29yZUV4Y2VwdGlvbi5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLkNBU0VfVkFSSUFOVF9FWElTVFMpIHsKLQkJCQkgYm9vbGVhbiBmb3VuZElnbm9yaW5nQ2FzZSA9IGZhbHNlOwotCi0JCQkJIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogcGFyZW50Lm1lbWJlcnMoKSkgewotCQkJCQkgaWYgKHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGlubmVyRmlsZU5hbWUpKSB7Ci0JCQkJCQkgLy8gZm91bmQgdGhlIGZpbGUKLQkJCQkJCSBmb3VuZElnbm9yaW5nQ2FzZSA9IHRydWU7Ci0JCQkJCQkgaW5uZXJGaWxlTmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCQkJCSBmaWxlID0gcGFyZW50LmdldEZpbGUoIG5ldyBQYXRoKGlubmVyRmlsZU5hbWUpKTsKLQkJCQkJCSBicmVhazsKLQkJCQkJIH0KLQkJCQkgfQotCi0JCQkJIC8vIGNhbid0IGZpbmQgdGhlIGZpbGUgY2F1c2luZyB0aGUgQ0FTRV9WQVJJQU5UX0VYSVNUUyBleGNlcHRpb247IHRocm93IHRoZSBleGNlcHRpb24KLQkJCQkgaWYgKCFmb3VuZElnbm9yaW5nQ2FzZSkKLQkJCQkJIHRocm93IGNvcmVFeGNlcHRpb247Ci0JCQkgfSBlbHNlIHsKLQkJCQkgLy8gdGhyb3cgb3RoZXIgZXhjZXB0aW9ucwotCQkJCSB0aHJvdyBjb3JlRXhjZXB0aW9uOwotCQkJIH0KLQkJIH0KLQkgfQotCi0JIC8vIGZpbGUgZXhpc3RzOyBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGUKLQkgaWYoIGZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLQkgeyAgICAgICAgCi0JCSAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLQkJIGlmKCBmaWxlLmdldFJlc291cmNlQXR0cmlidXRlcygpLmlzUmVhZE9ubHkoKSApCi0JCSB7Ci0JCQkgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLQkJCSBmaWxlc1swXSA9IGZpbGU7Ci0KLQkJCSBJU3RhdHVzIHN0YXR1cyA9IGdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcyxudWxsKTsKLQotCQkJIHRyeQotCQkJIHsKLQkJCQkgc3RhdHVzSGFuZGxlci5yZXBvcnQoIHN0YXR1cyApOwotCQkJIH0KLQkJCSBjYXRjaCggU3RhdHVzRXhjZXB0aW9uIGV4YyApCi0JCQkgewotCQkJCSByZXR1cm4gbnVsbDsKLQkJCSB9Ci0JCSB9Ci0KLQkJIC8vQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhpc3RpbmcgZmlsZS4KLQkJIGZpbGUuc2V0Q29udGVudHMoIGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsICk7Ci0KLQkJIHJldHVybiBmaWxlOwotCi0JIH0KLQkgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIAotCQkJIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsCi0JCQkJCSAiUmVzb3VyY2VVdGlscyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJIDAsIAotCQkJCQkgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRklMRSwgcGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGlubmVyRmlsZU5hbWUpKSwKLQkJCQkJIG51bGwgKSApOwotIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzhhM2UwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlLmVudmlyb25tZW50IjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX05VTExfQVJHX1NQRUNJRklFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1NDSEVNRV9OT1RfRk9VTkQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19BQlNPTFVURV9QQVRIX1dJVEhPVVRfU0NIRU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfVVJJX05PVF9SRUxBVElWRTsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9VTkVYUEVDVEVEX0VSUk9SOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0lOVkFMSURfRklMRV9VUkw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9QQVRIX05PVF9BQlNPTFVURTsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9QQVRIX0VNUFRZOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU47IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfSU87IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9ZRVM7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9ZRVNfVE9fQUxMOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0FOQ0VMOyAKLSAgCi0gIHN0YXRpYwotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyggQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL2Vudmlyb25tZW50LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkwOGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL2Vudmlyb25tZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgZm9yIFNpbXBsZVVSSUZhY3RvcnkKLSMKLU1TR19OVUxMX0FSR19TUEVDSUZJRUQ9TnVsbCBzcGVjaWZpZWQgYXMgYXJndW1lbnQgdG8gezB9LgotTVNHX1NDSEVNRV9OT1RfRk9VTkQ9U2NoZW1lIG5vdCBmb3VuZCBmb3IgVVJJIHswfS4KLU1TR19BQlNPTFVURV9QQVRIX1dJVEhPVVRfU0NIRU1FPUFic29sdXRlIHBhdGggc3BlY2lmaWVkIHdpdGhvdXQgYSBzY2hlbWUgZm9yIFVSSSB7MH0uCi0KLSMKLSMgQ29tbW9uIE1lc3NhZ2VzCi0jCi1NU0dfVVJJX05PVF9SRUxBVElWRT1VUkw6IHswfSBpcyBub3QgcmVsYXRpdmUuCi1NU0dfRVJST1JfVU5FWFBFQ1RFRF9FUlJPUj1VbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cmVkLgotTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMPUludmFsaWQgVVJMOiB7MH0gZm9yIGFuIEVjbGlwc2UgcGxhdGZvcm0uCi1NU0dfSU5WQUxJRF9GSUxFX1VSTD1JbnZhbGlkIFVSTDogezB9IGZvciB0aGUgZmlsZSBwcm90b2NvbAotCi0jCi0jIE1lc3NhZ2VzIGZvciBSZXNvdWNlVXRpbHMKLSMKLU1TR19FUlJPUl9QQVRIX05PVF9BQlNPTFVURT1QYXRoIHswfSBpcyBub3QgYWJzb2x1dGUgZm9yIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9QQVRIX0VNUFRZPVBhdGggezB9IGlzIGVtcHR5IHdoaWxlIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9QQVRIX05PVF9GT0xERVI9UGF0aCB7MH0gaXMgbm90IGEgZm9sZGVyIGZvciBjcmVhdGluZyBhIGZpbGUuCi1NU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZPTERFUj1SZXNvdXJjZSB7MH0gaXMgbm90IGEgZm9sZGVyLgotTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFPVRoZSBmb2xsb3dpbmcgcGF0aCBpcyBub3QgYSByZXNvdXJjZTogezB9LgotTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU49Q2FuIG5vdCBjcmVhdGUgZm9sZGVyOiB7MH0gdGhhdCBhbHJlYWR5IGhhcyBjaGlsZHJlbi4KLU1TR19FUlJPUl9JTz1BbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UgInswfSIuCi0KLUxBQkVMX1lFUz1ZZXMKLUxBQkVMX1lFU19UT19BTEw9WWVzIEFsbAotTEFCRUxfQ0FOQ0VMPUNhbmNlbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3BsdWdpbi9FbnZpcm9ubWVudFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3BsdWdpbi9FbnZpcm9ubWVudFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzMwNDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9wbHVnaW4vRW52aXJvbm1lbnRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDEwMDM2NCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW47Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnBsdWdpbi5FbnZpcm9ubWVudFBsdWdpbi4KLSovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsJCi0JLyoqCi0JICogVGhlIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVudmlyb25tZW50UGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgRWNsaXBzZSBwbGF0Zm9ybSBvbmx5LgotCSAqLwotCXB1YmxpYyBFbnZpcm9ubWVudFBsdWdpbigpCi0JewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgRW52aXJvbm1lbnRQbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVTY2hlbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmI5ODcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVNjaGVtZSBpbXBsZW1lbnRzIElVUklTY2hlbWUKLXsKLQotICBAT3ZlcnJpZGUKLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJyZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNIaWVyYXJjaGljYWwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNWYWxpZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoSVVSSSB1cmkpCi0gIHsKLSAgICByZXR1cm4gIXVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgoICIvIiApOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKElVUkkgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLm5ldC5VUkwpCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJsLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSN2YWxpZGF0ZShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElVUkkgdXJpKQotICB7Ci0gICAgSVN0YXR1cyByZXN1bHQgPSBudWxsOwotICAgIAotICAgIGlmKCBpc1ZhbGlkKCB1cmkgKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsICIiLG51bGwgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3JlbGF0aXZlL1JlbGF0aXZlVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3NzQwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZS5NZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVVUkkgaW1wbGVtZW50cyBJVVJJCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpXzsKLSAgCi0gIHB1YmxpYyBSZWxhdGl2ZVVSSSggU3RyaW5nIHVyaSApCi0gIHsKLSAgICB1cmlfID0gdXJpOyAgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXBwZW5kKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIElVUkkgYXBwZW5kKElVUkkgcmVsYXRpdmVVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGlmKCAhcmVsYXRpdmVVUkkuaXNSZWxhdGl2ZSgpKSAKLSAgICAgeyAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX1VSSV9OT1RfUkVMQVRJVkUsIHJlbGF0aXZlVVJJLnRvU3RyaW5nKCkgKSwgbnVsbCApICk7Ci0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIG5ld1VSSSA9IHVyaV8gKyAiLyIgKyByZWxhdGl2ZVVSSS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcmV0dXJuIGdldFVSSVNjaGVtZSgpLm5ld1VSSSggbmV3VVJJICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSgpIAotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNTdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBhc1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvU3RyaW5nKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBVUkwgYXNVUkwoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNlcmFzZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldE91dHB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldFVSSVNjaGVtZSgpCi0gICAqLwotICBwdWJsaWMgSVVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVNjaGVtZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzSGllcmFyY2hpY2FsKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzTGVhZigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUHJlc2VudCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWxhdGl2ZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdCgpCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IElVUklbMF07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSUZpbHRlcikKLSAgICovCi0gIHB1YmxpYyBJVVJJW10gbGlzdChJVVJJRmlsdGVyIHVyaUZpbHRlcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBJVVJJWzBdOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3BhcmVudCgpCi0gICAqLwotICBwdWJsaWMgSVVSSSBwYXJlbnQoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgbGFzdFNsYXNoICA9IHVyaV8ubGFzdEluZGV4T2YoICcvJyApOwotICAgIGludCBmaXJzdFNsYXNoID0gdXJpXy5pbmRleE9mKCAnLycgKTsKLSAgICAKLSAgICAvLyBJZiB0aGVyZSBpcyBhIHBhcmVudCwgdGhlbiBpdCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaAotICAgIC8vIGFuZCBlbmQgd2l0aCBhIHNsYXNoLgotICAgIGlmKCBsYXN0U2xhc2ggPT0gLTEgfHwgZmlyc3RTbGFzaCA9PSAtMSApIHJldHVybiBudWxsOwotICAgICAgICAKLSAgICByZXR1cm4gZ2V0VVJJU2NoZW1lKCkubmV3VVJJKCB1cmlfLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3JlbmFtZShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbmFtZShJVVJJIG5ld1VSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdXJpXyA9IG5ld1VSSS50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hMZWFmKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3Zpc2l0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJVmlzaXRvciwgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJVVJJVmlzaXRvciB1cmlWaXNpdG9yLCBJVVJJRmlsdGVyIHVyaUZpbHRlcikKLSAgICB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGNvbnRpbnVlVmlzaXQgPSB0cnVlOwotICAgIAotICAgIC8vIElmIHRoZSBmaWx0ZXIgYWNjZXB0cyB0aGlzIHdlIHdpbGwgdmlzaXQgaXQuCi0gICAgaWYoIHVyaUZpbHRlci5hY2NlcHRzKCB0aGlzICkgKQotICAgIHsKLSAgICAgIGNvbnRpbnVlVmlzaXQgPSB1cmlWaXNpdG9yLnZpc2l0KCB0aGlzICk7ICAKLSAgICB9Ci0gICAgICAgCi0gICAgSVVSSVtdIGNoaWxkcmVuICA9IGxpc3QoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNvbnRpbnVlVmlzaXQ7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNoaWxkcmVuW2luZGV4XS52aXNpdCggdXJpVmlzaXRvciwgdXJpRmlsdGVyICk7Ci0gICAgfSAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdmlzaXQob3JnLmVjbGlwc2UuZW52LnVyaS5VUklWaXNpdG9yKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoSVVSSVZpc2l0b3IgdXJpVmlzaXRvcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBjb250aW51ZVZpc2l0ID0gdXJpVmlzaXRvci52aXNpdCggdGhpcyApOyAgCi0gICAgCi0gICAgSVVSSVtdIGNoaWxkcmVuICA9IGxpc3QoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNvbnRpbnVlVmlzaXQ7IGluZGV4KysgKQotICAgICB7Ci0gICAgICBjaGlsZHJlbltpbmRleF0udmlzaXQoIHVyaVZpc2l0b3IgKTsKLSAgICB9ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVTY2hlbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzMyYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3VyaS9maWxlL0ZpbGVTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2UuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlU2NoZW1lIGV4dGVuZHMgUmVsYXRpdmVTY2hlbWUKLXsKLSAgQE92ZXJyaWRlCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI2lzVmFsaWQob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSVVSSSB1cmkpCi0gIHsgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiggdXJpID09IG51bGwgKSByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSB1cmkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICBpZiggc2NoZW1lLnRvU3RyaW5nKCkuZXF1YWxzKCAicmVsYXRpdmUiKSApIHJldHVybiBzY2hlbWUuaXNWYWxpZCggdXJpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOwotICAgICAgCi0gICAgaWYoIHVyaVN0cmluZyAhPSBudWxsICYmIHVyaVN0cmluZy5zdGFydHNXaXRoKCAiZmlsZToiICkgKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICB9ICAKLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgSVVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5ld1VSSSA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKCAiZmlsZToiKSApIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICAvLyBUaGUgZmlsZSBwcm90b2NvbCBoYXMgYmVlbiBzcGVjaWZpZWQgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgIG5ld1VSSSA9IHVyaTsKLSAgICB9Ci0gICAgZWxzZSBpZiggdXJpID09IG51bGwgfHwgdXJpLmluZGV4T2YoICI6IikgIT0gLTEgKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy8gVGhlIGZpbGUgdXJpIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gc29tZSBvdGhlciBwcm90b2NvbC4gCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19JTlZBTElEX0ZJTEVfVVJMLHVyaSksIG51bGwgKSApOwotICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiggdXJpLnN0YXJ0c1dpdGgoICIvIikgKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgLy8gVGhlIGZpbGUgc2NoZW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgc28gd2Ugd2lsbCBhZGQgaXQuCi0gICAgICBuZXdVUkkgPSAiZmlsZToiICsgdXJpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIGlmKCBuZXdVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgRmlsZVVSSSggbmV3VVJJICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgSVVSSSBuZXdVUkkoSVVSSSB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUkkoIHVyaSA9PSBudWxsID8gbnVsbCA6IHVyaS50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubmV0LlVSTCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUkkoIHVybCA9PSBudWxsID8gbnVsbCA6IHVybC50b1N0cmluZygpICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvdXJpL2ZpbGUvRmlsZVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWIzZDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQudXJpLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVVSSTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZVVSSSBleHRlbmRzIFJlbGF0aXZlVVJJIAotewotICBwcml2YXRlIEZpbGUgZmlsZV8gPSBudWxsOwotICAKLSAgcHVibGljIEZpbGVVUkkoIFN0cmluZyB1cmkgKQotICB7Ci0gICAgc3VwZXIoIHVyaSApOwotICAgIAotICAgIGlmKCBnZXRVUklTY2hlbWUoKS5pc1ZhbGlkKCB0aGlzICkgKQotICAgIHsKLSAgICAgIGZpbGVfID0gbmV3IEZpbGUoIHVyaS5zdWJzdHJpbmcoIDUsIHVyaS5sZW5ndGgoKSApICk7Ci0gICAgfQotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNGaWxlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIEZpbGUgYXNGaWxlKCkgCi0gIHsKLSAgICByZXR1cm4gZmlsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNlcmFzZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIGVyYXNlKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgZGVsZXRlRmlsZSggZmlsZV8gKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBkZWxldGVGaWxlKCBGaWxlIGZpbGUgKQotICB7Ci0gICAgaWYoIGZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZmlsZS5saXN0RmlsZXMoKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIEZpbGUgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07Ci0gICAgICAgIAotICAgICAgICBpZiggY2hpbGQuaXNEaXJlY3RvcnkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWxldGVGaWxlKCBjaGlsZCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGZpbGUuZGVsZXRlKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlXyApOyAgCi0gICAgfQotICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIEZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIHBhcmVudCA9IGZpbGVfLmdldFBhcmVudEZpbGUoKTsKLSAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgIAotICAgICAgc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGZpbGVfICk7ICAKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldFVSSVNjaGVtZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBJVVJJU2NoZW1lIGdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVTY2hlbWUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlKCkKLSAgewotICAgIHJldHVybiBmaWxlXyAhPSBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNVUkwoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMKCkKLSAgewotICAgIHJldHVybiBmaWxlXyAhPSBudWxsOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNVUkwoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgVVJMIGFzVVJMKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdXJsID0gZmlsZV8gPT0gbnVsbCA/IG51bGwgOiBmaWxlXy50b1VSTCgpOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJCAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdXJsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzTGVhZigpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uaXNGaWxlKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNQcmVzZW50KCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkKLSAgewotICAgIHJldHVybiBmaWxlXy5leGlzdHMoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlYWRhYmxlKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uY2FuUmVhZCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5jYW5Xcml0ZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3QoKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgSVVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gY2hpbGRyZW4gPSBmaWxlXy5saXN0RmlsZXMoKTsKLSAgICBJVVJJW10gIFVSSXMgICAgID0gbmV3IElVUklbMF07Ci0gICAgCi0gICAgaWYoIGNoaWxkcmVuICE9IG51bGwgKQotICAgIHsKLSAgICAgIGludCAgIGxlbmd0aCAgID0gY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgCi0gICAgICBVUklzID0gbmV3IElVUklbbGVuZ3RoXTsKLSAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBVUklzW2luZGV4XSA9IG5ldyBGaWxlVVJJKCAiZmlsZToiICsgY2hpbGRyZW5baW5kZXhdLmdldEFic29sdXRlUGF0aCgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFVSSXM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSUZpbHRlcikKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIElVUklbXSBsaXN0KElVUklGaWx0ZXIgdXJpRmlsdGVyKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gICBjaGlsZHJlbiA9IGZpbGVfLmxpc3RGaWxlcygpOwotICAgIGludCAgICAgIGxlbmd0aCAgID0gY2hpbGRyZW4gPT0gbnVsbCA/IDAgOiBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgVmVjdG9yICAgVVJJcyAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgaWYoY2hpbGRyZW4gIT0gbnVsbCl7Ci0JICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotCSAgICB7Ci0JICAgICAgSVVSSSBuZXdVUkkgPSBuZXcgRmlsZVVSSSggImZpbGU6IiArIGNoaWxkcmVuW2luZGV4XS5nZXRBYnNvbHV0ZVBhdGgoKSApOyAvLyROT04tTkxTLTEkCi0JICAgICAgCi0JICAgICAgaWYoIHVyaUZpbHRlci5hY2NlcHRzKCBuZXdVUkkpICkKLQkgICAgICB7Ci0JICAgICAgICBVUklzLmFkZCggbmV3VVJJICk7Ci0JICAgICAgfSAKLQkgICAgfQotICAgIH0KLSAgICByZXR1cm4gKElVUklbXSlVUklzLnRvQXJyYXkoIG5ldyBJVVJJWzBdICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgdm9pZCByZW5hbWUoSVVSSSBuZXdVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHVyaV8gPSBuZXdVUkkudG9TdHJpbmcoKTsKLSAgICAgIFVSTCBuZXdVUkwgPSBuZXcgVVJMKCB1cmlfICk7Ci0gICAgICBmaWxlXy5yZW5hbWVUbyggbmV3IEZpbGUoIG5ld1VSTC5nZXRQYXRoKCkgKSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJCAgICAgIAotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBAT3ZlcnJpZGUKLXB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgZmlsZV8ubWtkaXJzKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hMZWFmKCkKLSAgICovCi0gIEBPdmVycmlkZQotcHVibGljIHZvaWQgdG91Y2hMZWFmKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBmb2xkZXJzIGFyZSBjcmVhdGVkLgotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIGZpbGVfLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgLy8kTk9OLU5MUy0xJCAgICAgIAotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0MDU1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3dHBfdWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWE3YTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd3RwX3VpLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4ODVmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2E0ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI01vbiBKdW4gMDggMTU6MzU6NDUgRURUIDIwMDkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9ZXJyb3IKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVVbmNoZWNrZWRFeGNlcHRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5ZmU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjEwMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZWY5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSB3dHBfdWkvLFwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgxOWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DdXQ9Q3V0Ci1GTEVYSUJMRV9QUk9KRUNUX1BSRUZFUkVOQ0U9SjJFRSBQcm9qZWN0IE1vZHVsZXMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1XVFAgVUkgUGx1Zy1pbgotV1RQX1VJX0FjdGlvbj1XVFAgVUkgQWN0aW9uCi1FeHRlbmRlZF9WaWV3ZXJzPUV4dGVuZGVkIFZpZXdlcnMKLUV4dGVuZGFibGVfV2l6YXJkPUV4dGVuZGFibGUgV2l6YXJkCi1FeHRlbmRhYmxlX1dpemFyZF9QYWdlPUV4dGVuZGFibGUgV2l6YXJkIFBhZ2UKLURhdGFNb2RlbFdpemFyZD1EYXRhTW9kZWxXaXphcmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRkMWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ3dHB1aUFjdGlvbiIgbmFtZT0iJVdUUF9VSV9BY3Rpb24iIHNjaGVtYT0ic2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuZGVkVmlld2VyIiBuYW1lPSIlRXh0ZW5kZWRfVmlld2VycyIgc2NoZW1hPSJzY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5kYWJsZVdpemFyZCIgbmFtZT0iJUV4dGVuZGFibGVfV2l6YXJkIiBzY2hlbWE9InNjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndpemFyZFBhZ2VHcm91cCIgbmFtZT0iJUV4dGVuZGFibGVfV2l6YXJkX1BhZ2UiIHNjaGVtYT0ic2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvbiIgbmFtZT0iJURhdGFNb2RlbFdpemFyZCIgc2NoZW1hPSJzY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QiLz4KLQkgCSAKLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJNZW51RW5hYmxlciIgCi0JIG5hbWU9Ik1lbnVFbmFibGVyIgotCSBzY2hlbWE9InNjaGVtYS9tZW51RW5hYmxlci5leHNkIi8+Ci0JIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuTWVudUVuYWJsZW1lbnRQcm9wZXJ0eVRlc3RlciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLk1lbnVFbmFibGVtZW50UHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuYWN0aW9ucyIKLSAgICAgICAgICBwcm9wZXJ0aWVzPSJzaG93IgotICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgPC9leHRlbnNpb24+Ci0gIAkgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iVUlUZXN0ZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnVpVGVzdGVyIj4KLSAgICAgIDx1aVRlc3RlcgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuVUlUZXN0ZXJJbXBsIj4KLSAgICAgIDwvdWlUZXN0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy5zYXZlSGFuZGxlciIKLSAgICAgICAgIG5hbWU9IlNhdmUgSGFuZGxlciAtIEhlYWRsZXNzIENvbnRleHQgQ2xhc3MiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAga2V5PSJzYXZlSGFuZGxlciIKLSAgICAgICAgICAgIGNvbnRleHQ9IlVJIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuU2F2ZUhhbmRsZXJVSSI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLkVuYWJsZW1lbnREZXRlcm1pbmF0aW9uIgotICAgICAgICAgbmFtZT0iVUkgRW5hYmxlbWVudCBEZXRlcm1pbmF0aW9uIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkVuYWJsZW1lbnREZXRlcm1pbmF0aW9uIgotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5VSUVuYWJsZW1lbnRNYW5hZ2VyIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiPgotICAgICAgPFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbCI+Ci0gICAgICA8L1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFscy5PcGVyYXRpb25FeHRlbnNpb24iPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbi51aS5Qb3N0UGFzdGVBY3Rpb25PcGVyYXRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuUGFzdGVBY3Rpb25PcGVyYXRpb24iLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgIGtleT0iSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJIgotICAgICAgICAgIGNvbnRleHQ9IlVJIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmRjYTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuY29tbW9uLnVpIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLSAgCQk8Y29weSBmaWxlPSIke3BsdWdpbmRpcn0vcGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke291dHB1dERpcn0iLz4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQxMjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RDb250ZW50c0xhYmVsID0gUHJvamVjdCBsb2NhdGlvbgotV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV91c2VEZWZhdWx0TGFiZWwgPSBVc2UgJmRlZmF1bHQgbG9jYXRpb24KLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCA9ICZMb2NhdGlvbjoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy93dHBjb21tb251aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvcHJvcGVydHlfZmlsZXMvd3RwY29tbW9udWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1ZWEwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy93dHBjb21tb251aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JQWN0aW9uV1RQT3BlcmF0aW9uX1VJXzA9Tm8gYWN0aW9uIGF2YWlsYWJsZSBmb3IgZXhlY3V0aW9uLgotV1RQQWN0aW9uRGlhbG9nX1VJXzA9U2VsZWN0IHRoZSBvcHRpb25hbCBkZXBlbmRlbnQgYWN0aW9ucyB5b3Ugd291bGQgbGlrZSB0byBleGVjdXRlLgotV1RQT3B0aW9uYWxPcGVyYXRpb25EYXRhTW9kZWxfVUlfMD1Sb290IHRyZWUgY2FuIG5vdCBiZSBzZWxlY3RlZC4KLVdUUE9wdGlvbmFsT3BlcmF0aW9uRGF0YU1vZGVsX1VJXzE9Tm8gb3BlcmF0aW9ucyBhcmUgc2VsZWN0ZWQuCi1NYXN0ZXJEZXNjcmlwdG9yX0VSUk9SXzI9SVdBRTAwMDVFIFdUUFVJT3BlcmF0aW9uIGVsZW1lbnRzIHJlcXVpcmUgZXhhY3RseSBvbmUgPHNlbGVjdGlvbkVuYWJsZW1lbnQgLz4uCi1XVFBPcGVyYXRpb25BY3Rpb25fVUlfMD1PcGVyYXRpb24gU3RhdHVzCi1XVFBPcGVyYXRpb25BY3Rpb25fVUlfMT1Qcm9ibGVtIGV4ZWN1dGluZyBvcGVyYXRpb24uCi1UaW1lclF1ZXVlX0VSUk9SXzA9SVdBRTAwMDZFIENhbid0IHN0YXJ0IGEgVGltZXJRdWV1ZSB0aGF0IGlzIGFscmVhZHkgcnVubmluZwotRXh0ZW5kZWRXaXphcmRQYWdlX0VSUk9SXzA9SVdBRTAwMDdFIENhbm5vdCBtb2RpZnkgaWQgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBzZXQuCi1FeHRlbmRlZFdpemFyZFBhZ2VfRVJST1JfMT1JV0FFMDAwOEUgVGhlIGlkIGNhbm5vdCBiZSBudWxsCi1NYXN0ZXJEZXNjcmlwdG9yX1VJXzE9Tm8gXCIgezB9IFwiIGF0dHJpYnV0ZSBkZWZpbmVkCi1UaW1lcl9VSV8wPUludmFsaWQgZGVsYXk6IHswfQotVGltZXJfVUlfMT1JbnZhbGlkIGluaXRpYWwgZGVsYXk6IHswfQotV1RQV2l6YXJkX1VJXzA9V2l6YXJkIEVycm9yOiB7MH0KLVdUUFdpemFyZF9VSV8xPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIHswfSBmaW5pc2hlZC4KLVdUUFdpemFyZF9VSV8yPVdpemFyZCBXYXJuaW5nOiB7MH0KLUV4dGVuZGFibGVXaXphcmRfVUlfMD1XaXphcmQgcGFnZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiB7MH0gezF9Ci1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8wPUVsZW1lbnQ6IHswfSBkb2VzIG5vdCBhbGxvdyBwYWdlIGluc2VydGlvbiBhZnRlci4KLVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzE9ezB9IHdpbGwgbm90IGJlIGNyZWF0ZWQKLVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzI9Q2lyY3VsYXIgZGVwZW5kZW5jeSwgZWxlbWVudDogezB9IGNoZWNrOiB7MX0KLVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzM9RWRpdG9yIGRvZXMgbm90IGFsbG93IHBhZ2UgaW5zZXJ0aW9ucwotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfND1QYXJlbnQgQ2xhc3MgTm90IEZvdW5kIEVycm9yOiB7MH0gXHJcbiBmb3IgYXR0cmlidXRlOiB7MX0gaW4gcGx1Z2luIHsyfSBcclxuUGFnZSBub3QgY3JlYXRlZAotRGVsZXRlX1VJXzA9RGVsZXRlCi1OYW1lXz1Qcm9qZWN0IG5hJm1lOgotQnJvd3NlXz1Ccm93JnNlLi4uCi1Qcm9qZWN0X2xvY2F0aW9uXz1Qcm9qZWN0IExvY2F0aW9uOgotTVVMVElQTEVfTU9EVUxFX1BSRUZfVEVYVD1BbGxvdyBNdWx0aXBsZSBtb2R1bGVzIHBlciBwcm9qZWN0Ci1EZWZEaXJEaWFsb2dMYWJlbF89U2VsZWN0IHRoZSBsb2NhdGlvbiBkaXJlY3RvcnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL0RhdGFNb2RlbFdpemFyZEV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL0RhdGFNb2RlbFdpemFyZEV4dGVuc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM3NWI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9IkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvbiIgbmFtZT0iRGF0YSBNb2RlbCBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEFuIGV4dGVuc2lvbiB0byBhIHNwZWNpZmljIERhdGEgTW9kZWwgV2l6YXJkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJEYXRhTW9kZWxXaXphcmQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkRhdGFNb2RlbFdpemFyZCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGRhdGEgbW9kZWwgd2l6YXJkIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBkYXRhIG1vZGVsIHdpemFyZCBjbGFzcyBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0OTkyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJleHRlbmRhYmxlV2l6YXJkIiBuYW1lPSJFeHRlbmRhYmxlIFdpemFyZCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGRlY2xhcmVzIGEgZGF0YSBtb2RlbCB3aXphcmQgYXMgYSB2YWxpZCBleHRlbmRhYmxlIHdpemFyZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4dGVuZGFibGVXaXphcmQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuZGFibGVXaXphcmQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgcmVxdWlyZWQgaWQgZm9yIHRoZSBkYXRhIG1vZGVsIHdpemFyZCBpbnN0YW5jZSB0byBiZSBleHRlbmRlZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZFBhZ2UuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkUGFnZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTBhOWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkUGFnZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9IndpemFyZFBhZ2VHcm91cCIgbmFtZT0iRXh0ZW5kYWJsZSBXaXphcmQgUGFnZSIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGFsbG93cyB5b3UgdG8gYWRkIGFuIGRhdGEgbW9kZWwgd2l6YXJkIHBhZ2UgdG8gYSBwcmVkZWZpbmVkIGV4dGVuc2FibGUgZGF0YSBtb2RlbCB3aXphcmQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFBhZ2UiLz4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFBhZ2VHcm91cCIvPg0KLSAgICAgICAgICAgIDwvY2hvaWNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZUdyb3VwIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aXphcmRJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGlzIG11c3QgbWF0Y2ggdGhlIGlkIGRlZmluZWQgaW4gdGhlIGV4dGVuZGFibGVXaXphcmQgZWxlbWVudCBpbiB0aGUgZXh0ZW5kYWJsZVdpemFyZCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgdG8gc3BlY2lmeSB3aGV0aGVyIHRoaXMgcGFnZSBhbGxvd3MgZXh0ZW5kZWQgcGFnZXMgYWZ0ZXIgaXRzZWxmLCBkZWZhdWx0IGl0IHRydWUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFnZUdyb3VwSW5zZXJ0aW9uSUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgSWYgdGhpcyBwYWdlIGlzIHRvIGltbWVkaWF0ZWx5IGFmdGVyIGFub3RoZXIgcGFnZSwgdGhpcyBtdXN0IG1hdGNoIHRoZSBwYWdlSUQgb2YgdGhlIHBhZ2UgdG8gaW5zZXJ0IGFmdGVyLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWdlR3JvdXBJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIGZvciB0aGUgcGFnZSBncm91cCBJRA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY3RvcnkiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2l6YXJkSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG1hdGNoIHRoZSBpZCBkZWZpbmVkIGluIHRoZSBleHRlbmRhYmxlV2l6YXJkIGVsZW1lbnQgaW4gdGhlIGV4dGVuZGFibGVXaXphcmQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhpcyBjbGFzcyBpcyBhbiBpbnN0YW5jb2YgY29tLmlibS53dHAuY29tbW9uLnVpLndpemFyZC5leHRlbnNpb25zLldpemFyZEV4dGVuc2lvbkZhY3RvcnkNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBpbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcGluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0NCi0NCi0NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwaW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwaW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRlZFZpZXdlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGVkVmlld2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODkwOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGVkVmlld2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9ImV4dGVuZGVkVmlld2VyIiBuYW1lPSJFeHRlbmRlZCBWaWV3ZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBleHRlbmRlZFZpZXdlciBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHRoZSBjb250cmlidXRpb24gb2YgbmV3IGZ1bmN0aW9uIHRvIGFuIGV4aXN0aW5nIHZpZXdlci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4dGVuZGVkVmlld2VyIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbmRlZFZpZXdlciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld2VySUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSByZXF1aXJlZCBpZCBmb3IgdGhlIGV4dGVuZGVkVmlld2VyIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmVudFZpZXdlcklEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkIHVzZWQgdG8gc3BlY2lmeSBhIHBhcmVudCB2aWV3ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeUNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBmYWN0b3J5IGNsYXNzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIG9wdGlvbmFsIHBhdGggdG8gYW4gaWNvbiBpbWFnZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHJlcXVpcmVkIGxhYmVsIGRlc2NyaXB0aW9uIGZvciB0aGUgZXh0ZW5kZWQgdmlld2VyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBzZXR0aW5nIHRvIGFzc29jaWF0ZSB0aGUgZXh0ZW5kZWQgdmlld2VyIHdpdGggYSBzcGVjaWZpYyBmdW5jdGlvbiBncm91cCBpZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvbWVudUVuYWJsZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9tZW51RW5hYmxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzJmMTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9tZW51RW5hYmxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGlkPSJNZW51RW5hYmxlciIgbmFtZT0iTWVudUVuYWJsZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVmaW5lcyBleHRlbnNpb24gcG9pbnQgZm9yIHNldHRpbmcgZW5hYmxlbWVudCBjb25kaXRpb24gZm9yIGEgbWVudSBpdGVtLiBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIGluCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuTWVudUVuYWJsZW1lbnRQcm9wZXJ0eVRlc3Rlci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1lbnVlbmFibGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtZW51ZW5hYmxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3NOYW1lIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBJUHJvcGVydHlUZXN0ZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4yIE02Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtleHRlbnNpb24KLSAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuTWVudUVuYWJsZXImcXVvdDsmZ3Q7Ci0gICAgICZsdDttZW51ZW5hYmxlcgotICAgICAgICAgY2xhc3NOYW1lPSZxdW90O29yZy5lY2xpcHNlLmZvby5CYXJQcm9wZXJ0eVRlc3RlciZxdW90OyZndDsKLSAgICAgJmx0Oy9tZW51ZW5hYmxlciZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotCi1UaGUgY2xhc3Mgc3BlY2lmaWVkIGluIGNsYXNzTmFtZSBzaG91bGQgaW1wbGVtZW50IElQcm9wZXJ0eVRlc3RlciBpbnRlcmZhY2UKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gCi0gIENvbnRyaWJ1dG9yczoKLSAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS93dHB1aUFjdGlvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODg2MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9Ind0cHVpQWN0aW9uIiBuYW1lPSJXVFAgVUkgQWN0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGZvciBXVFAgT3BlcmF0aW9ucyB3aGljaCBuZWVkIHRvIGJlIHRpZWQgdG8gYSBnZW5lcmljIFVJIGFjdGlvbiwgc3VjaCBhcyBDVVQsIENPUFksIFBBU1RFLCBERUxFVEUsIGFuZCBSRU5BTUUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hc3Rlck9wZXJhdGlvbiIvPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2xhdmVPcGVyYXRpb24iLz4NCi0gICAgICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1hc3Rlck9wZXJhdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgQSBtYXN0ZXJPcGVyYXRpb24gZW5hYmxlcyBhbiBleGlzdGluZyBXVFAgT3BlcmF0aW9uIHRvIGJlIHVzZWQgaW4gYSBVSSBhY3Rpb24uIEdlbmVyaWMgSWRzIGFnZ3JlZ2F0ZSBhIHNldCBvZiBtYXN0ZXJPcGVyYXRpb25zIGZvciB0aGUgc2FtZSBBYnN0cmFjdCBhY3Rpb24gKGxpa2UgYSAmcXVvdDtDVVQmcXVvdDsgb3BlcmF0aW9uKS4gV1RQIE9wZXJhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgZXh0ZW5kaWJsZSwgc28gZm9yIGFueSBtYXN0ZXJPcGVyYXRpb24gZGVmaW5lZCwgdGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgcHJlfHBvc3Qgb3BlcmF0aW9ucy4gVGhlc2UgcHJlfHBvc3Qgb3BlcmF0aW9uIGNhbiBoYXZlIHNsYXZlT3BlcmF0aW9uIGVsZW1lbnRzIGRlZmluZWQgd2hpY2ggaW5kaWNhdGUgdGhlIHByZXxwb3N0IG9wZXJhdGlvbiBtYXkgYmUgcnVuIGluZGVwZW5kZW50bHkuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VsZWN0aW9uRW5hYmxlbWVudCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbmRlZEdlbmVyaWNJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIEdlbmVyaWMgQWN0aW9uIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8uIChlLmcuIFRoZSBpZCBmb3IgQ1VULCBDT1BZLCBQQVNURSwgREVMRVRFLCBSRU5BTUUpLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG9mIHlvdXIgb3BlcmF0aW9uLiBZb3VyIG9wZXJhdGlvbiBtdXN0IGJlIGEgV1RQT3BlcmF0aW9uIGFuZCBtdXN0IHByb3ZpZGUgYSBuby1hcmd1bWVudHMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkLCB0aGUgZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHJldHVybmVkIGJ5IHRoZSBkYXRhTW9kZWwgd2lsbCBiZSB1c2VkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgbmFtZSB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9wdWxhdG9yQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHBvcHVsYXRvckNsYXNzIGtub3dzIGhvdyB0byBwcm92aWRlIGEgV1RQIE9wZXJhdGlvbiBEYXRhIE1vZGVsIGJhc2VkIG9uIGEgZ2l2ZW4gc2VsZWN0aW9uLiBUaGUgZ2V0RGVmYXVsdE9wZXJhdGlvbigpIG1ldGhvZCBvZiB0aGUgZGF0YSBtb2RlbCB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIG9wZXJhdGlvbkNsYXNzIGlzIHByb3ZpZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbHdheXNFeGVjdXRlIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIHRvIGRldGVybWluZSBleGVjdXRpb24gY29udGV4dA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZUlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgdG8gZGVmaW5lIGFuIG92ZXJyaWRhYmxlIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGlkZW50aWZpY2F0aW9uIGZvciBvcGVyYXRpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InNlbGVjdGlvbkVuYWJsZW1lbnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoZSBzZWxlY3Rpb25FbmFibGVtZW50IGVsZW1lbnQgYWxsb3dzIHlvdSB0byBmaWx0ZXIgd2hpY2gga2luZHMgb2Ygc2VsZWN0aW9uIHlvdXIgb2JqZWN0IGlzIGFwcGxpY2FibGUgdG8gdXNpbmcgU3RhbmRhcmQgRWNsaXBzZSBBY3Rpb24gRXhwcmVzaW9ucy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2xhdmVPcGVyYXRpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoZSBzbGF2ZU9wZXJhdGlvbiBlbGVtZW50IGRlZmluZXMgZGlzcGxheSBpbmZvcm1hdGlvbiBmb3Igb3BlcmF0aW9ucyB3aGljaCBleHRlbmQgYSBkZWNsYXJlZCBtYXN0ZXIgb3BlcmF0aW9uLiBJZiBhIHByZXxwb3N0IG9wZXJhdGlvbiBvZiBhIG1hc3RlciBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzbGF2ZU9wZXJhdGlvbiBlbGVtZW50LCB0aGVuIHRoZSBwcmV8cG9zdCBvcGVyYXRpb24gd2lsbCBiZSBjb25zaWRlciByZXF1aXJlZCwgYW5kIG5vdCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG9mIHlvdXIgb3BlcmF0aW9uLiBZb3VyIG9wZXJhdGlvbiBtdXN0IGJlIGEgV1RQT3BlcmF0aW9uIGFuZCBtdXN0IHByb3ZpZGUgYSBuby1hcmd1bWVudHMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gRm9yIHNsYXZlIG9wZXJhdGlvbnMsIHRoZSBkYXRhIG1vZGVsIG9mIHRoZSBtYXN0ZXIgb3BlcmF0aW9uIHdpbGwgYmUgcHJvdmlkZWQuIFRoZXJlZm9yZSwgc2xhdmVzIGNhbm5vdCBvdmVycmlkZSB0aGUgZGF0YSBtb2RlbCB1c2luZyBhIHNlcGVyYXRlIHBvcHVsYXRvckNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgbmFtZSB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im9yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdENsYXNzIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbmQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdFN0YXRlIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0Q2xhc3MiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG9iamVjdCBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZGFwdGFibGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyB0byBzcGVjaWZ5IHRoZSBvYmplY3QgY2xhc3MgYXMgYWRhcHRhYmxlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJhbmQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0U3RhdGUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIG9iamVjdCBzdGF0ZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIGFuIG9iamVjdCBzdGF0ZSBuYW1lIHRvIGNoZWNrIHRoZSBzZWxlY3RlZCBvYmplY3QmYXBvcztzIHZhbHVlIGlzIG1hdGNoaW5nIHdpdGgNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDshLS0gVGhlIGV4YW1wbGVzIGluIHRoaXMgc2VjdGlvbiBoYXZlIGJlZW4gY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXkgcmVmZXJlbmNlIG9ubHkgZXh0ZW5zaW9uIHBvaW50IElEcy4gVGhlc2UgZXhhbXBsZXMgbXVzdCBiZSBjb3JyZWN0ZWQgYmVmb3JlIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAtLSZndDsNCi0mbHQ7IS0tDQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlY2xhcmVzIHR3byBNYXN0ZXIgT3BlcmF0aW9ucyAoJmx0O2NvZGUmZ3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmbHQ7L2NvZGUmZ3Q7IGFuZCAmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQiZsdDsvY29kZSZndDspIHdoaWNoIGFyZSBhdHRhY2hlZCB0byB0aGUgR2VuZXJpYyBJRCAmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5XVFBPcHRpb25hbE9wZXJhdGlvblRlc3QmbHQ7L2NvZGUmZ3Q7LiANCi1UaGUgc2NlbmFyaW8gaGFzIE1hc3RlciBBIHdoaWNoIGhhcyBhcyBhIHByZS1vcGVyYXRpb24gb2YgU2xhdmUgQSBhbmQgYSBwb3N0LW9wZXJhdGlvbiBvZiBTbGF2ZSBDLiBTbGF2ZSBBIGlzIG1hZGUgb3B0aW9uYWwgYnkgdGhlICZsdDtjb2RlJmd0O3NsYXZlT3BlcmF0aW9uJmx0Oy9jb2RlJmd0OyBlbGVtZW50LCB3aGlsZSBTbGF2ZSBDIHdpbGwgYWx3YXlzIGJlIHJ1biAobm8gJmx0O2NvZGUmZ3Q7c2xhdmVPcGVyYXRpb24mbHQ7L2NvZGUmZ3Q7IGlzIGdpdmVuIHRvIHJ1biBpdCBzZXBlcmF0ZWx5KS4gU2xhdmUgQSBmdXJ0aGVyIGhhcyBhbiBvcHRpb25hbCBwcmUtb3BlcmF0aW9uIChTbGF2ZSBCKSB0aGF0IGNhbiBiZSBleGVjdXRlZCBpbmRlcGVudGx5IG9mIGVpdGhlciBTbGF2ZSBBIG9yIE1hc3RlciBBLg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkud3RwdWlBY3Rpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O21hc3Rlck9wZXJhdGlvbg0KLSAgICAgICAgICAgIHBvcHVsYXRvckNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5BY21lT3BlcmF0aW9uUG9wdWxhdG9yJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslbWFzdGVyX2FfbmFtZSZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7DQotICAgICAgICAgICAgZXh0ZW5kZWRHZW5lcmljSWQ9JnF1b3Q7Y29tLmFjbWUudWkuV1RQT3B0aW9uYWxPcGVyYXRpb25UZXN0JnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JW1hc3Rlcl9hX2Rlc2NyaXB0aW9uJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvbWFzdGVyT3BlcmF0aW9uJmd0OyANCi0gICAmbHQ7c2xhdmVPcGVyYXRpb24NCi0gICAgICAgICAgICBuYW1lPSZxdW90O1NsYXZlIEEmcXVvdDsNCi0gICAgICAgICAgICBvcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvc2xhdmVPcGVyYXRpb24mZ3Q7IA0KLSAgICAgICZsdDtzbGF2ZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7U2xhdmUgQiZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkImcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9zbGF2ZU9wZXJhdGlvbiZndDsgICAgICANCi0gICAgICAmbHQ7bWFzdGVyT3BlcmF0aW9uDQotICAgICAgICAgICAgcG9wdWxhdG9yQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLkFjbWVPcGVyYXRpb25Qb3B1bGF0b3ImcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90O0VBUiBQcm9qZWN0IEFjdGlvbiZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25CJnF1b3Q7DQotICAgICAgICAgICAgZXh0ZW5kZWRHZW5lcmljSWQ9JnF1b3Q7Y29tLmFjbWUudWkuV1RQT3B0aW9uYWxPcGVyYXRpb25UZXN0JnF1b3Q7Jmd0Ow0KLSAgICAgICAgICAgICZsdDtzZWxlY3Rpb25FbmFibGVtZW50Jmd0OyANCi0gICAgICAgICAgICAgJmx0O29iamVjdFN0YXRlIG5hbWU9JnF1b3Q7cHJvamVjdE5hdHVyZSZxdW90OyB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUmcXVvdDsgLyZndDsNCi0gICAgICAgICAgICAmbHQ7L3NlbGVjdGlvbkVuYWJsZW1lbnQmZ3Q7DQotICAgICAgJmx0Oy9tYXN0ZXJPcGVyYXRpb24mZ3Q7ICAgDQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7ICAgDQotLS0mZ3Q7DQotJmx0OyEtLQ0KLUZvciBlYWNoIG9mIHRoZSBzbGF2ZU9wZXJhdGlvbnMgcmVmZXJlbmNlZCBhYm92ZSwgeW91IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgV1RQIE9wZXJhdGlvbiBFeHRlbnNpb24gZGVjbGFyZWQgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0OyANCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9JnF1b3Q7d3RwdWlBY2l0b24uQWNtZS5FeHRlbnNpb25zJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkV4dGVuZGFibGVPcGVyYXRpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O2V4dGVuZGFibGVPcGVyYXRpb24NCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvZXh0ZW5kYWJsZU9wZXJhdGlvbiZndDsNCi0gICAgICAmbHQ7ZXh0ZW5kYWJsZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvZXh0ZW5kYWJsZU9wZXJhdGlvbiZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiZxdW90OyZndDstLSZndDsNCi0gICAgICAmbHQ7IS0tIE1hZGUgb3B0aW9uYWwgYnkgdGhlIGFib3ZlIGRlY2xhcmF0aW9uIC0tJmd0Ow0KLSAgICAgICZsdDshLS0mbHQ7b3BlcmF0aW9uRXh0ZW5zaW9uDQotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvb3BlcmF0aW9uRXh0ZW5zaW9uJmd0Oy0tJmd0Ow0KLSAgICAgICZsdDshLS0gTWFkZSBvcHRpb25hbCBieSB0aGUgYWJvdmUgZGVjbGFyYXRpb24gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQiZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7LS0mZ3Q7ICAgDQotICAgICAgJmx0OyEtLSBOb24tb3B0aW9uYWwgb3BlcmF0aW9uLCB3aWxsIGFsd2F5cyBydW4gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQyZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvb3BlcmF0aW9uRXh0ZW5zaW9uJmd0OyAgDQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IA0KLSZsdDsvcHJlJmd0Ow0KLS0tJmd0Ow0KLSZsdDshLS0NCi1JbiBnZW5lcmFsLCB1c2VycyBleHRlbmRpbmcgZXhpc3RpbmcgYWN0aW9ucyBvbmx5IG5lZWQgdG8gZGVjbGFyZSB0aGUgZm9sbG93aW5nOiANCi0tLSZndDsNCi0mbHQ7IS0tDQotJmx0O3ByZSZndDsNCi0gJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24mcXVvdDsmZ3Q7LS0mZ3Q7IA0KLSAmbHQ7IS0tIFRoZSBhY3Rpb24gcmVmZXJlbmNlZCBtdXN0IGJlIGRlY2xhcmVkIGFzIGV4dGVuc2libGUgYnkgdGhlICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkV4dGVuZGFibGVPcGVyYXRpb24gZXh0ZW5zaW9uIHBvaW50IC0tJmd0OyAgICAgICAgIA0KLSAgICAgICZsdDshLS0mbHQ7b3BlcmF0aW9uRXh0ZW5zaW9uDQotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Li4uWU9VUiBDTEFTUy4uLiZxdW90OyAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlkPSZxdW90Oy4uLklEIE9GIEVYSVNUSU5HIE9QRVJBVElPTi4uLiZxdW90OyZndDsgDQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7IA0KLSAmbHQ7L2V4dGVuc2lvbiZndDsgICAgICANCi0mbHQ7L3ByZSZndDsgICAgICANCi0tLSZndDsNCi0mbHQ7IS0tDQotQW5kIGlmIHlvdXIgb3BlcmF0aW9uIGlzIG9wdGlvbmFsIGRlY2xhcmUgdGhlIHNsYXZlT3BlcmF0aW9uOg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0OyANCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLnd0cHVpQWN0aW9uJnF1b3Q7Jmd0OyANCi0gICAmbHQ7c2xhdmVPcGVyYXRpb24NCi0gICAgICAgICAgICBuYW1lPSZxdW90Oy4uTkFNRSBPRiBZT1VSIE9QRVJBVElPTi4uLiZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90Oy4uLkRFU0NSSVBUSU9OIE9GIFlPVVIgQUNUSU9OLi4uJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Li4uWU9VUiBDTEFTUy4uLiZxdW90OyZndDsNCi0gICAgICAmbHQ7L3NsYXZlT3BlcmF0aW9uJmd0OyANCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgICAgICANCi0mbHQ7L3ByZSZndDsNCi0tLSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjMzM2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9BZGRhYmxlUGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWRkYWJsZVBhZ2VHcm91cCBleHRlbmRzICBJRE1QYWdlR3JvdXAKLXsKLSAgcHVibGljIHZvaWQgYWRkUGFnZSggSVdpemFyZFBhZ2UgcGFnZSApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFN5bmNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMThhYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5UaW1lZE1vZGlmeUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxTeW5jaEhlbHBlciBpbXBsZW1lbnRzIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGludXggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIkxpbnV4Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCXByb3RlY3RlZCBNYXAgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2g7Ci0JcHJvdGVjdGVkIE1hcCBwcm9wZXJ0eVRvV2lkZ2V0SGFzaDsKLQlwcm90ZWN0ZWQgTWFwIHdpZGdldFRvRGVwQ29udHJvbHM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLQlwcm90ZWN0ZWQgV2lkZ2V0IGN1cnJlbnRXaWRnZXQ7Ci0JcHJvdGVjdGVkIFdpZGdldCBjdXJyZW50V2lkZ2V0RnJvbUV2ZW50OyAvLyBUT0RPIE00IHNlZSBpZiB0aGlzIHNob3VsZCBiZSBzZXQgd2l0aCBmb3IKLQkvLyBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVNb2RpZnlFdmVudCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBjbGFzcyBNb2RpZnlUZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCXJldHVybjsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gdGV4dCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHRleHQpOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1vZGlmeVRleHRMaXN0ZW5lciBtb2RpZnlUZXh0TGlzdGVuZXI7Ci0JcHJpdmF0ZSBUaW1lZE1vZGlmeUxpc3RlbmVyIHRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIGNsYXNzIENvbWJvTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCXJldHVybjsKLQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gY29tYm8pCi0JCQkJcmV0dXJuOwotCi0JCQl0cnkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBjb21ibzsKLQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGNvbWJvKTsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRhdGFNb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJLy8gT24gYSBjb21ibyBzZWxlY3Rpb24gbGludXggZmlyZXMgMiBldmVudHM7Ci0JCQkJLy8gdGhlIGZpcnN0IGNsZWFycyB0aGUgdmFsdWUgd2hpY2ggbmVlZHMgdG8gYmUgaWdub3JlZCB3aGVuIHRoZSB0eXBlIGlzIG5vdCBTdHJpbmcKLQkJCQkvLyB0aGUgc2Vjb25kIHNldHMgdGhlIG5ldyB2YWx1ZQotCQkJCWlmIChpc0xpbnV4ICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID09IDAgJiYgZGVzY3JpcHRvcnMubGVuZ3RoICE9IDAgJiYgIShkZXNjcmlwdG9yc1swXS5nZXRQcm9wZXJ0eVZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSkpIHsKLQkJCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGNvbWJvLmdldFRleHQoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBjb21ibykKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGNvbWJvKTsKLQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID49IDApIHsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRhdGFNb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpKSB7Ci0JCQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbWJvTGlzdGVuZXIgY29tYm9MaXN0ZW5lcjsKLQotCXByaXZhdGUgY2xhc3MgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBidXR0b24pCi0JCQkJcmV0dXJuOwotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHdpZGdldFRvUHJvcGVydHlIYXNoLmdldChidXR0b24pOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgQm9vbGVhbihidXR0b24uZ2V0U2VsZWN0aW9uKCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgY2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXB1YmxpYyBEYXRhTW9kZWxTeW5jaEhlbHBlcihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gbW9kZWw7Ci0JCWRhdGFNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94Vmlld2VyTGlzdGVuZXIgY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBDaGVja0JveFZpZXdlckxpc3RlbmVyIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGV2ZW50LmdldFNvdXJjZSgpOwotCQkJQ2hlY2tib3hUYWJsZVZpZXdlciBjaGVja0JveFRhYmxlVmlld2VyOwotCQkJQ2hlY2tib3hUcmVlVmlld2VyIGNoZWNrQm94VHJlZVZpZXdlcjsKLQkJCU9iamVjdFtdIGl0ZW1zID0gbnVsbDsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBDaGVja2JveFRhYmxlVmlld2VyKSB7Ci0JCQkJY2hlY2tCb3hUYWJsZVZpZXdlciA9IChDaGVja2JveFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCQkJaXRlbXMgPSBjaGVja0JveFRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJfSBlbHNlIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBDaGVja2JveFRyZWVWaWV3ZXIpIHsKLQkJCQljaGVja0JveFRyZWVWaWV3ZXIgPSAoQ2hlY2tib3hUcmVlVmlld2VyKSB2aWV3ZXI7Ci0JCQkJaXRlbXMgPSBjaGVja0JveFRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQkJc2V0UHJvcGVydHlJdGVtcyhwcm9wZXJ0eU5hbWUsIGl0ZW1zKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCWludCBmbGFnID0gZXZlbnQuZ2V0RmxhZygpOwotCQlpZiAoZmxhZyA9PSBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHKQotCQkJc2V0RW5hYmxlbWVudChwcm9wZXJ0eU5hbWUsIGV2ZW50LmlzUHJvcGVydHlFbmFibGVkKCkpOwotCQllbHNlCi0JCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgZmxhZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWN1cnJlbnRQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWN1cnJlbnRQcm9wZXJ0eSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eUl0ZW1zKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCWN1cnJlbnRQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGl0ZW1zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWN1cnJlbnRQcm9wZXJ0eSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBVSSB0byBoYXZlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBkZWZpbmVkIGluIHRoZSBtb2RlbAotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAbGluayBJRGF0YU1vZGVsTGlzdGVuZXIgZm9yIHRoZSBmbGFnIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaFVJV2l0aE1vZGVsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5VG9XaWRnZXRIYXNoICYmIHByb3BlcnR5VG9XaWRnZXRIYXNoLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0VGhyZWFkKCkpewotCQkJCWRvU3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIGZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkb1N5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBmbGFnKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcnVuIG9uIHRoZSBVSSB0aHJlYWQKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIGZsYWcKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9TeW5jaFVJV2l0aE1vZGVsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnKSB7Ci0JCXRyeSB7Ci0JCQljdXJyZW50V2lkZ2V0ID0gKFdpZGdldCkgcHJvcGVydHlUb1dpZGdldEhhc2guZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCAhPSBudWxsICYmIGN1cnJlbnRXaWRnZXQgIT0gY3VycmVudFdpZGdldEZyb21FdmVudCkgewotCQkJCS8vV2UgbXVzdCBob2xkIGEgY29weSBpbiBhIHRlbXAgdmFyaWFibGUgYmVjYXVzZSBzZXR0aW5nIHRoZSB3aWRnZXQgdmFsdWUKLQkJCQkvL21heSB0cmlnZ2VyIGFuIGV2ZW50IHRoYXQgd2lsbCBjYXVzZSB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgYWdhaW4uCi0JCQkJV2lkZ2V0IHdpZGdldCA9IGN1cnJlbnRXaWRnZXQ7Ci0JCQkJdHJ5IHsKLQkJCQkJaWdub3JlTW9kaWZ5RXZlbnQgPSB0cnVlOwotCQkJCQlpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRleHQpCi0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUZXh0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChDb21ibykgY3VycmVudFdpZGdldCk7Ci0JCQkJCX0gZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKEJ1dHRvbikgY3VycmVudFdpZGdldCk7Ci0JCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBMYWJlbCkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKExhYmVsKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChMaXN0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRhYmxlKQotCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVGFibGUpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVHJlZSkKLQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRyZWUpIGN1cnJlbnRXaWRnZXQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlnbm9yZU1vZGlmeUV2ZW50ID0gZmFsc2U7Ci0JCQkJfQotCQkJCS8vUGFzcyB0aGUgY29weSBvZiB0aGUgY3VycmVudFdpZGdldAotCQkJCXNldEVuYWJsZW1lbnQoKENvbnRyb2wpIHdpZGdldCwgZGF0YU1vZGVsLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJY3VycmVudFdpZGdldCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlbWVudChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoY29udHJvbC5pc0VuYWJsZWQoKSAhPSBlbmFibGVkKQotCQkJY29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlzZXREZXBlbmRlbnRDb250cm9sRW5hYmxlbWVudChjb250cm9sLCBlbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW5hYmxlbWVudChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKHByb3BlcnR5VG9XaWRnZXRIYXNoICE9IG51bGwpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5nZXQocHJvcGVydHlOYW1lKTsKLQkJCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQkJc2V0RW5hYmxlbWVudChjb250cm9sLCBlbmFibGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREZXBlbmRlbnRDb250cm9sRW5hYmxlbWVudChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAod2lkZ2V0VG9EZXBDb250cm9scyAhPSBudWxsKSB7Ci0JCQlDb250cm9sW10gZGVwZW5kZW50cyA9IChDb250cm9sW10pIHdpZGdldFRvRGVwQ29udHJvbHMuZ2V0KGNvbnRyb2wpOwotCQkJaWYgKGRlcGVuZGVudHMgIT0gbnVsbCkgewotCQkJCUNvbnRyb2wgZGVwID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGVwID0gZGVwZW5kZW50c1tpXTsKLQkJCQkJaWYgKGRlcC5pc0VuYWJsZWQoKSAhPSBlbmFibGVkKQotCQkJCQkJZGVwLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIEJ1dHRvbiBidXR0b24pIHsKLQkJaWYgKChidXR0b24uZ2V0U3R5bGUoKSAmIFNXVC5DSEVDSykgPT0gU1dULkNIRUNLIHx8IChidXR0b24uZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgPT0gU1dULlJBRElPKSB7Ci0JCQlib29sZWFuIGNoZWNrZWQgPSBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpICE9IGNoZWNrZWQpIHsKLQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKGNoZWNrZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIENvbWJvIGNvbWJvKSB7Ci0JCWlmIChmbGFnID09IERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcgfHwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJLy8gRGlzcGxheSBwcm9wZXJ0aWVzIHNob3VsZCBvbmx5IGZpcmUgaWYgdGhlIGNvbnRlbnRzIGNoYW5nZS4KLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCQljb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0KLQkJU3RyaW5nIG5ld1RleHQgPSBkYXRhTW9kZWwuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSkuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpOwotCQlpbnQgc2VsSW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsSW5kZXggPCAwIHx8ICFuZXdUZXh0LmVxdWFscyhjb21iby5nZXRJdGVtKHNlbEluZGV4KSkpIHsKLQkJCVN0cmluZ1tdIGl0ZW1zID0gY29tYm8uZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXRlbXNbaV0uZXF1YWxzKG5ld1RleHQpKSB7Ci0JCQkJCWNvbWJvLnNlbGVjdChpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQljb21iby5zZXRUZXh0KG5ld1RleHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBUZXh0IHRleHQpIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKCFuZXdUZXh0LmVxdWFscyh0ZXh0LmdldFRleHQoKSkpIHsKLQkJCXRleHQuc2V0VGV4dChuZXdUZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBUYWJsZSB0YWJsZSkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IChPYmplY3RbXSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlzZXRUYWJsZUl0ZW1zQ2hlY2tlZCh0YWJsZS5nZXRJdGVtcygpLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJamF2YS51dGlsLkxpc3QgZWxlbWVudExpc3QgPSBBcnJheXMuYXNMaXN0KGVsZW1lbnRzKTsKLQkJVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZUl0ZW1zW2ldOwotCQkJaWYgKGVsZW1lbnRMaXN0LmNvbnRhaW5zKGl0ZW0uZ2V0RGF0YSgpKSkKLQkJCQlpdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0JCQllbHNlCi0JCQkJaXRlbS5zZXRDaGVja2VkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlSXRlbXNDaGVja2VkKFRhYmxlSXRlbVtdIHRhYmxlSXRlbXMsIGJvb2xlYW4gYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspCi0JCQl0YWJsZUl0ZW1zW2ldLnNldENoZWNrZWQoYik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRyZWUgdHJlZSkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IChPYmplY3RbXSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlqYXZhLnV0aWwuTGlzdCBlbGVtZW50TGlzdCA9IEFycmF5cy5hc0xpc3QoZWxlbWVudHMpOwotCQlUcmVlSXRlbVtdIHRyZWVJdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlzZXRUcmVlSXRlbXNHcmV5KHRyZWVJdGVtcywgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0cmVlSXRlbXMubGVuZ3RoID4gMCkKLQkJCXNldFRyZWVJdGVtQ2hlY2tlZCh0cmVlSXRlbXMsIGVsZW1lbnRMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmVlSXRlbXNHcmV5KFRyZWVJdGVtW10gdHJlZUl0ZW1zLCBib29sZWFuIGIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlSXRlbXNbaV07Ci0JCQlpdGVtLnNldEdyYXllZChiKTsKLQkJCXNldFRyZWVJdGVtc0dyZXkodHJlZUl0ZW1zW2ldLmdldEl0ZW1zKCksIGIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUl0ZW1DaGVja2VkKFRyZWVJdGVtW10gdHJlZUl0ZW1zLCBqYXZhLnV0aWwuTGlzdCBpdGVtcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGl0ZW1zLmNvbnRhaW5zKHRyZWVJdGVtc1tpXS5nZXREYXRhKCkpKXsKLQkJCQl0cmVlSXRlbXNbaV0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQl0cmVlSXRlbXNbaV0uc2V0R3JheWVkKGZhbHNlKTsKLQkJCX1lbHNlewotCQkJCXRyZWVJdGVtc1tpXS5zZXRHcmF5ZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlUcmVlSXRlbVtdIGNoaWxkZXJuSXRlbXMgPSB0cmVlSXRlbXNbaV0uZ2V0SXRlbXMoKTsKLQkJCWlmIChjaGlsZGVybkl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQl0cmVlSXRlbXNbaV0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQkJc2V0VHJlZUl0ZW1DaGVja2VkKGNoaWxkZXJuSXRlbXMsIGl0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBMYWJlbCBsYWJlbCkgewotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIW5ld1RleHQuZXF1YWxzKGxhYmVsLmdldFRleHQoKSkpIHsKLQkJCWxhYmVsLnNldFRleHQobmV3VGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgTGlzdCBsaXN0KSB7Ci0JCU9iamVjdCBuZXdDb250ZW50cyA9IGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAobmV3Q29udGVudHMgPT0gbnVsbCkgewotCQkJbGlzdC5zZXRJdGVtcyhuZXcgU3RyaW5nWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobmV3Q29udGVudHMgaW5zdGFuY2VvZiBqYXZhLnV0aWwuTGlzdCkgewotCQkJamF2YS51dGlsLkxpc3QgbW9kZWxDb250ZW50cyA9IChqYXZhLnV0aWwuTGlzdCkgbmV3Q29udGVudHM7Ci0JCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbW9kZWxDb250ZW50cy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbENvbnRlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJaXRlbXNbaV0gPSBtb2RlbENvbnRlbnRzLmdldChpKS50b1N0cmluZygpOwotCQkJfQotCQkJbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCX0gZWxzZSBpZiAobmV3Q29udGVudHMgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJbGlzdC5zZXRJdGVtcygoU3RyaW5nW10pIG5ld0NvbnRlbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQWxsVUlXaXRoTW9kZWwoKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5VG9XaWRnZXRIYXNoKSB7Ci0JCQlDb2xsZWN0aW9uIGtleXMgPSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5rZXlTZXQoKTsKLQkJCWlmICgha2V5cy5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBwcm9wZXJ0eU5hbWVzID0ga2V5cy5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBudWxsOwotCQkJCXdoaWxlIChwcm9wZXJ0eU5hbWVzLmhhc05leHQoKSkgewotCQkJCQlwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0eU5hbWVzLm5leHQoKTsKLQkJCQkJc3luY2hVSVdpdGhNb2RlbChwcm9wZXJ0eU5hbWUsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hDb21wb3NpdGUoV2lkZ2V0IHdpZGdldCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcENvbnRyb2xzKSB7Ci0JCWlmIChudWxsID09IHdpZGdldFRvUHJvcGVydHlIYXNoKQotCQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAocHJvcGVydHlUb1dpZGdldEhhc2ggPT0gbnVsbCkKLQkJCXByb3BlcnR5VG9XaWRnZXRIYXNoID0gbmV3IEhhc2hNYXAoKTsKLQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2gucHV0KHdpZGdldCwgcHJvcGVydHlOYW1lKTsKLQkJcHJvcGVydHlUb1dpZGdldEhhc2gucHV0KHByb3BlcnR5TmFtZSwgd2lkZ2V0KTsKLQkJaWYgKGRlcENvbnRyb2xzICE9IG51bGwpIHsKLQkJCWlmICh3aWRnZXRUb0RlcENvbnRyb2xzID09IG51bGwpCi0JCQkJd2lkZ2V0VG9EZXBDb250cm9scyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl3aWRnZXRUb0RlcENvbnRyb2xzLnB1dCh3aWRnZXQsIGRlcENvbnRyb2xzKTsKLQkJfQotCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaFRleHQoVGV4dCB0ZXh0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hUZXh0KHRleHQsIHByb3BlcnR5TmFtZSwgZmFsc2UsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaFRleHQoVGV4dCB0ZXh0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIGlzVGltZU1vZGlmaWVkLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUodGV4dCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChpc1RpbWVNb2RpZmllZCkKLQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0VGltZWRMaXN0ZW5lcigpKTsKLQkJZWxzZQotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRNb2RpZnlUZXh0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hMYWJlbChMYWJlbCBsYWJlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCXN5bmNoQ29tcG9zaXRlKGxhYmVsLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jaCB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPmxpc3Q8L2NvZGU+IHRvIHRoZSBMaXN0IGVsZW1lbnRzIHJldHVybmVkIGZyb20KLQkgKiB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaExpc3QoTGlzdCBsaXN0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUobGlzdCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgdG8gc3luY2ggdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgQ29tYm8gd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZS4gVGhlCi0JICogcG9zc2libGUgdmFsdWVzIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcmUgZGV0ZXJtaW5lZCBieSByZXR1cm4gb2YKLQkgKiBJRGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpLgotCSAqIAotCSAqIEBwYXJhbSBjb21ibwotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gZGVwZW5kZW50Q29udHJvbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaENvbWJvKENvbWJvIGNvbWJvLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUoY29tYm8sIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobnVsbCA9PSBjb21ib0xpc3RlbmVyKSB7Ci0JCQljb21ib0xpc3RlbmVyID0gbmV3IENvbWJvTGlzdGVuZXIoKTsKLQkJfQotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgdG8gc3luYyB0aGUgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjaGVja2JveCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHlOYW1lLiBUaGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBtdXN0IGNvbnRhaW4gYSBqYXZhLmxhbmcuQm9vbGVhbiB0eXBlZCBPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGNoZWNrYm94Ci0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBkZXBlbmRlbnRDb250cm9scwotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tib3goQnV0dG9uIGNoZWNrYm94LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUoY2hlY2tib3gsIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobnVsbCA9PSBjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQljaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCQljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaENoZWNrQm94VGFibGVWaWV3ZXIoQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCXN5bmNoQ29tcG9zaXRlKHRhYmxlVmlld2VyLmdldENvbnRyb2woKSwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNoZWNrQm94Vmlld2VyU3RhdGVMaXN0ZW5lcikgewotCQkJY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyID0gbmV3IENoZWNrQm94Vmlld2VyTGlzdGVuZXIoKTsKLQkJfQotCQl0YWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIoY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaENoZWNrQm94VHJlZVZpZXdlcihDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXN5bmNoQ29tcG9zaXRlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKG51bGwgPT0gY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKSB7Ci0JCQljaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIgPSBuZXcgQ2hlY2tCb3hWaWV3ZXJMaXN0ZW5lcigpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGNoZWNrQm94Vmlld2VyU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hSYWRpbyhCdXR0b24gcmFkaW8sIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQkvLyBVc2VzIGNoZWNrYm94IHN5bmNoZXIKLQkJc3luY2hDaGVja2JveChyYWRpbywgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JfQotCi0JcHJpdmF0ZSBUaW1lZE1vZGlmeUxpc3RlbmVyIGdldFRpbWVkTGlzdGVuZXIoKSB7Ci0JCWlmICh0aW1lZE1vZGlmeUxpc3RlbmVyID09IG51bGwpCi0JCQl0aW1lZE1vZGlmeUxpc3RlbmVyID0gbmV3IFRpbWVkTW9kaWZ5TGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVdpZGdldCB3ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gdyB8fCB3LmlzRGlzcG9zZWQoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHdpZGdldFRvUHJvcGVydHlIYXNoLmdldCh3KTsKLQkJCQkJc2V0VGV4dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgKFRleHQpIHcpOwotCQkJCX0KLQkJCX0pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCQkJcmV0dXJuOwotCQkJCQlzdXBlci5tb2RpZnlUZXh0KGUpOwotCQkJCX0KLQkJCX07Ci0JCXJldHVybiB0aW1lZE1vZGlmeUxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRleHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBUZXh0IHRleHQpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXh0LmdldFRleHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlUZXh0TGlzdGVuZXIgZ2V0TW9kaWZ5VGV4dExpc3RlbmVyKCkgewotCQlpZiAobnVsbCA9PSBtb2RpZnlUZXh0TGlzdGVuZXIpCi0JCQltb2RpZnlUZXh0TGlzdGVuZXIgPSBuZXcgTW9kaWZ5VGV4dExpc3RlbmVyKCk7Ci0JCXJldHVybiBtb2RpZnlUZXh0TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRhdGFNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJY2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0JCWN1cnJlbnRXaWRnZXQgPSBudWxsOwotCQltb2RpZnlUZXh0TGlzdGVuZXIgPSBudWxsOwotCQlwcm9wZXJ0eVRvV2lkZ2V0SGFzaCA9IG51bGw7Ci0JCXRpbWVkTW9kaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl3aWRnZXRUb0RlcENvbnRyb2xzID0gbnVsbDsKLQkJd2lkZ2V0VG9Qcm9wZXJ0eUhhc2ggPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZGJiZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBidWcgMjEzOTI3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aS5XYXJuaW5nRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlBhZ2VHcm91cE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJRE1QYWdlSGFuZGxlciB7Ci0JCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIEFkZGFibGVQYWdlR3JvdXAgcm9vdFBhZ2VHcm91cDsKLQlwcml2YXRlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiByb290T3BlcmF0aW9uOwotCi0JcHJpdmF0ZSBQYWdlR3JvdXBNYW5hZ2VyIHBhZ2VHcm91cE1hbmFnZXI7Ci0JcHJpdmF0ZSBQYWdlRXh0ZW5zaW9uTWFuYWdlciBwYWdlRXh0ZW5zaW9uTWFuYWdlcjsKLQotCS8vIHByaXZhdGUgSVdpemFyZFBhZ2UgZmlyc3RwYWdlOwotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkKCkgewotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB3aXphcmQgSUQgdGhhdCBjbGllbnRzIHNob3VsZCBleHRlbmQgdG8gYWRkIHRvIHRoaXMgd2l6YXJkCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldElEKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRoZSByb290IG9wZXJhdGlvbiBmb3IgdGhpcyB3aXphcmQuCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBnZXRSb290T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbilnZXREYXRhTW9kZWwoKS5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBmaW5hbGl6ZWQgdG8gaGFuZGxlIHRoZSBhZGRpbmcgb2YgZXh0ZW5kZWQgcGFnZXMuIENsaWVudHMgc2hvdWxkIG92ZXJyaWRlCi0JICogZG9BZGRQYWdlcygpIHRvIGFkZCB0aGVpciBwYWdlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRQYWdlcygpIHsKLQkJaW5pdCgpOwotCQlkb0FkZFBhZ2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHBhZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JfQotCi0JLy8gVE9ETyBtYWtlIHRoaXMgZmluYWwKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnJlc2V0KCk7Ci0JCXJldHVybiBnZXROZXh0UGFnZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gY29udHJvbCB0aGUgcGFnZSBvcmRlcmluZyBzaG91bGQgZG8gc28gYnkgb3ZlcnJpZGluZwotCSAqIGdldE5leHRQYWdlKFN0cmluZywgU3RyaW5nKSBhbmQgZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqIAotCSAqIEBsaW5rICNnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiBAbGluayAjZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCS8vIFRPRE8gbWFrZSB0aGlzIGZpbmFsCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQotCQlJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCi0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpOwotCi0JCS8vIElmIGFuIGVycm9yIG9jY3VyZWQgdGhlbiB0aGUgY3VycmVudCBwYWdlIGFuZCB0aGUgbmV4dCBwYWdlIHdpbGwgYmUgdGhlIHNhbWUuCi0JCWlmIChjdXJyZW50UGFnZSAhPSBuZXh0UGFnZSAmJiBuZXh0UGFnZSAhPSBudWxsKSB7Ci0JCQluZXh0UGFnZS5zZXRXaXphcmQodGhpcyk7Ci0JCQluZXh0UGFnZS5zZXRQcmV2aW91c1BhZ2UoY3VycmVudFBhZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnJlbnRQYWdlID09IG5leHRQYWdlID8gbnVsbCA6IG5leHRQYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkTmV4dFBhZ2VOYW1lKSB7Ci0JCXJldHVybiBleHBlY3RlZE5leHRQYWdlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHdpc2hpbmcgdG8gY29udHJvbCB0aGUgcGFnZSBvcmRlcmluZyBzaG91bGQgZG8gc28gYnkgb3ZlcnJpZGluZwotCSAqIGdldE5leHRQYWdlKFN0cmluZywgU3RyaW5nKSBhbmQgZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqIAotCSAqIEBsaW5rICNnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiBAbGluayAjZ2V0UHJldmlvdXNQYWdlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCS8vIFRPRE8gbWFrZSB0aGlzIGZpbmFsCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXJldHVybiBwYWdlICE9IG51bGwgPyBwYWdlLmdldFByZXZpb3VzUGFnZSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lKSB7Ci0JCXJldHVybiBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAoIXN1cGVyLmNhbkZpbmlzaCgpIHx8ICFnZXREYXRhTW9kZWwoKS5pc1ZhbGlkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBQYWdlR3JvdXBNYW5hZ2VyIGdldFBhZ2VHcm91cE1hbmFnZXIoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBNYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgUGFnZUV4dGVuc2lvbk1hbmFnZXIgZ2V0UGFnZUV4dGVuc2lvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBwYWdlRXh0ZW5zaW9uTWFuYWdlcjsKLQl9Ci0KLQkvLyBUT0RPIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMuIFBlcmhhcHMgaW4gdGhlIFBhZ2VHcm91cE1hbmFnZXIKLQkvLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0QWZ0ZXJGaW5pc2hFcnJvcigpIHsKLQkJLy8gSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8gRGF0YU1vZGVsV2l6YXJkUGFnZSB3dHBQYWdlID0gKERhdGFNb2RlbFdpemFyZFBhZ2UpIHBhZ2VzW2ldOwotCQkvLyB3dHBQYWdlLnZhbGlkYXRlUGFnZSh0cnVlKTsKLQkJLy8gfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhlY3V0aW5nKCkgewotCQlyZXR1cm4gZXhlY3V0aW5nOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZXhlY3V0aW5nID0gZmFsc2U7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQl0cnkgewotCQkJZXhlY3V0aW5nID0gdHJ1ZTsKLQkJCWlmIChwcmVQZXJmb3JtRmluaXNoKCkpIHsKLQkJCQlzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCi0JCQkJZmluYWwgSVN0YXR1cyBzdCA9IHJ1bk9wZXJhdGlvbnMoKTsKLQotCQkJCWlmIChzdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJV1RQVUlQbHVnaW4ubG9nKHN0KTsKLQkJCQkJVGhyb3dhYmxlIHQgPSBzdC5nZXRFeGNlcHRpb24oKSA9PSBudWxsID8gbmV3IENvcmVFeGNlcHRpb24oc3QpIDogc3QuZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgdCwgMCwgZmFsc2UpOwotCQkJCX0gZWxzZSBpZihzdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyl7Ci0JCQkJCVdhcm5pbmdEaWFsb2cub3Blbldhcm5pbmcoZ2V0U2hlbGwoKSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8yLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBzdC5nZXRNZXNzYWdlKCksIHN0LCBJU3RhdHVzLldBUk5JTkcpOwotCQkJCX0KLQotCQkJCXBvc3RQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCVdUUFVJUGx1Z2luLmxvZyhleGMpOwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMCwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8xLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBleGMsIDAsIGZhbHNlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGluZyA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIHJ1bk9wZXJhdGlvbnMoKSB7Ci0JCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKLQkJY2xhc3MgQ2F0Y2hUaHJvd2FibGVSdW5uYWJsZVdpdGhQcm9ncmVzcyBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCQlwdWJsaWMgVGhyb3dhYmxlIGNhdWdodCA9IG51bGw7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHJvb3RPcGVyYXRpb24gPT0gbnVsbCkgewotCQkJCQkJLy9UaGlzIHdpbGwgYmUgdGhlIHR5cGljYWwgY2FzZSBiZWNhdXNlIG1vc3Qgd2l6YXJkcyB3aWxsCi0JCQkJCQkvL25vdCBpbml0aWFsaXplIHRoZSByb290IG9wZXJhdGlvbiBkdXJpbmcgaW5pdC4KLQkJCQkJCXJvb3RPcGVyYXRpb24gPSBnZXRSb290T3BlcmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJc3RhdHVzWzBdID0gcm9vdE9wZXJhdGlvbi5leGVjdXRlKHBtLCBudWxsKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQljYXVnaHQgPSBlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDYXRjaFRocm93YWJsZVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IENhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MoKTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHJ1bkZvcmtlZCgpLCBpc0NhbmNlbGFibGUoKSwgcnVubmFibGUpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJcnVubmFibGUuY2F1Z2h0ID0gZTsKLQkJfQotCQlpZiAocnVubmFibGUuY2F1Z2h0ICE9IG51bGwpIHsKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKHJ1bm5hYmxlLmNhdWdodCk7Ci0JCQlzdGF0dXNbMF0gPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJpZCIsIDAsIHJ1bm5hYmxlLmNhdWdodC5nZXRNZXNzYWdlKCksIHJ1bm5hYmxlLmNhdWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgcnVubmFibGUuY2F1Z2h0LCAwLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1c1swXTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnVuZG9BbGxDdXJyZW50T3BlcmF0aW9ucygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIGNhbiBvdmVycmlkZSB0byBwZXJmb3JtIGFueSB0YXNrcyBwcmlvciB0byBydW5uaW5nIHRoZSBvcGVyYXRpb24uIFJldHVybiB0cnVlIHRvCi0JICogaGF2ZSB0aGUgb3BlcmF0aW9uIHJ1biBhbmQgZmFsc2UgdG8gc3RvcCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZVBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBlcmZvcm0gYW55IGFjdGlvbnMgbmVjZXNzYXJ5IGFmdGVyIHBlcmZvcm1pbmcgRmluaXNoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlwYWdlR3JvdXBNYW5hZ2VyLnN0b3JlRGVmYXVsdFNldHRpbmdzKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmRQYWdlKQotCQkJKChEYXRhTW9kZWxXaXphcmRQYWdlKSBwYWdlKS5zdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCX0KLQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgaWYgdGhleSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHdoZW4gc3RvcmluZyB0aGUgZGVmYXVsdAotCSAqIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqIEBwYXJhbSBwYWdlSW5kZXgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncyhJV2l6YXJkUGFnZSBwYWdlLCBpbnQgcGFnZUluZGV4KSB7Ci0JCXN0b3JlRGVmYXVsdFNldHRpbmdzKHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIHRoZSBydW5uaW5nIG9wZXJhdGlvbiBpcyBhbGxvd2VkIHRvIGJlIGNhbmNlbGxlZC4gVGhlIGRlZmF1bHQKLQkgKiBpcyBmYWxzZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcmV0dXJuIGZhbHNlIGlmIHRoZSBydW5uaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcnVuIGZvcmtlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuRm9ya2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQl0aGlzLmRhdGFNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlpZiAobnVsbCA9PSBkYXRhTW9kZWwpIHsKLQkJCWRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGdldERlZmF1bHRQcm92aWRlcigpKTsKLQkJfQotCi0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobnVsbCAhPSByb290UGFnZUdyb3VwKSB7Ci0JCQlMaXN0IHBhZ2VzID0gcm9vdFBhZ2VHcm91cC5nZXRQYWdlcyhkYXRhTW9kZWwpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhZ2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQl7Ci0JCQkJT2JqZWN0IHBhZ2UgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBJV2l6YXJkUGFnZSkKLQkJCQl7Ci0JCQkJCSgoSVdpemFyZFBhZ2UpcGFnZSkuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobnVsbCAhPSBkYXRhTW9kZWwpIHsKLQkJCWRhdGFNb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gYSBTaW1wbGVQYWdlR3JvdXAuIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gb3ZlcnJpZGVkIHRoaXMgbWV0aG9kIHRvCi0JICogcmV0dXJuIGEgZGlmZmVyZW50IHJvb3QgcGFnZSBncm91cCBmb3IgdGhlIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEFkZGFibGVQYWdlR3JvdXAgY3JlYXRlUm9vdFBhZ2VHcm91cCgpIHsKLQkJU3RyaW5nIGlkID0gZ2V0V2l6YXJkSUQoKTsKLQkJLy8gRm9yIHRoZSByb290IHBhZ2UgZ3JvdXAgdGhlIHdpemFyZCBpZCBhbmQgdGhlIGdyb3VwIGlkIGFyZSB0aGUgc2FtZS4KLQkJU2ltcGxlUGFnZUdyb3VwIHBhZ2VHcm91cCA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoaWQsIGlkKTsKLQkJcGFnZUdyb3VwLnNldFBhZ2VIYW5kbGVyKHRoaXMpOwotCQlyZXR1cm4gcGFnZUdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVudmlyb25tZW50IGNyZWF0ZUVudmlyb25tZW50KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyb290UGFnZUdyb3VwLmFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXJvb3RQYWdlR3JvdXAgPSBjcmVhdGVSb290UGFnZUdyb3VwKCk7Ci0JCWlmIChuZWVkc1RvUnVuT3BlcmF0aW9uc0JlZm9yZUZpbmlzaCgpKSB7Ci0JCQlyb290T3BlcmF0aW9uID0gZ2V0Um9vdE9wZXJhdGlvbigpOwotCQkJcGFnZUdyb3VwTWFuYWdlciA9IG5ldyBQYWdlR3JvdXBNYW5hZ2VyKHJvb3RPcGVyYXRpb24sIHJvb3RQYWdlR3JvdXApOwotCQl9IGVsc2UgewotCQkJcGFnZUdyb3VwTWFuYWdlciA9IG5ldyBQYWdlR3JvdXBNYW5hZ2VyKGdldERhdGFNb2RlbCgpLCByb290UGFnZUdyb3VwKTsKLQkJfQotCQlwYWdlRXh0ZW5zaW9uTWFuYWdlciA9IG5ldyBQYWdlRXh0ZW5zaW9uTWFuYWdlcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcmV0dXJuIHRydWUgaWYgdGhleSByZXF1aXJlIHRoZSBydW5uaW5nCi0JICogb2YgdGhlIG9wZXJhdGlvbiBkdXJpbmcgcGFnZSB0dXJuaW5nLgotCSAqIAotCSAqIEByZXR1cm4gQSBib29sZWFuIGRlZmF1bHRlZCB0byBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1RvUnVuT3BlcmF0aW9uc0JlZm9yZUZpbmlzaCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLm5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHx8IGdldFBhZ2VHcm91cE1hbmFnZXIoKS5oYXNNdWx0aXBsZVBhZ2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzc2ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsV2l6YXJkRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIgcmVhZGVyOwotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIERhdGFNb2RlbFdpemFyZCBieSB0aGUgc3BlY2lmaWVkIGlkIGFuZAotCSAqIGNvbnN0cnVjdHMgYSBuZXcgRGF0YU1vZGVsV2l6YXJkIHVzaW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBJRGF0YU1vZGVsCi0JICogbG9va2VkIHVwIHdpdGggdGhlIHNhbWUgaWQuIElmIHRoZSBEYXRhTW9kZWxXaXphcmQgaXMgbm90IGZvdW5kIHRoZW4gYQotCSAqIFJ1bnRpbWVFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBEYXRhTW9kZWxXaXphcmQKLQkgKiBAcmV0dXJuIGEgbmV3IERhdGFNb2RlbFdpemFyZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkIGNyZWF0ZVdpemFyZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGNyZWF0ZVdpemFyZChEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChpZCkpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgdXNpbmcgdGhlIGlkIHJldHVyZWQgZnJvbQotCSAqIDxjb2RlPmRhdGFNb2RlbC5nZXRJRCgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBhIG5ldyBEYXRhTW9kZWxXaXphcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFdpemFyZCBjcmVhdGVXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIGxvYWRXaXphcmQoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgbG9hZFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAobnVsbCA9PSByZWFkZXIpIHsKLQkJCXJlYWRlciA9IG5ldyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyLmdldFdpemFyZChkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNsYXNzIGFzIHRoZSBpZC4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bwotCSAqIDxjb2RlPmNyZWF0ZVdpemFyZChjbGFzc0lELmdldE5hbWUoKSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc0lECi0JICogICAgICAgICAgICB0aGUgY2xhc3Mgd2hvc2UgbmFtZSBpcyB0aGUgaWQgb2YgdGhlIERhdGFNb2RlbFdpemFyZAotCSAqIEByZXR1cm4gYSBuZXcgRGF0YU1vZGVsV2l6YXJkCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgY3JlYXRlV2l6YXJkKENsYXNzIGRhdGFNb2RlbFByb3ZpZGVySUQpIHsKLQkJcmV0dXJuIGNyZWF0ZVdpemFyZChkYXRhTW9kZWxQcm92aWRlcklELmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZkNzVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5WYWxpZGF0aW9uU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyLCBJRGF0YU1vZGVsTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5FWFQgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRVZJT1VTID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT01QT1NJVEVfQk9SREVSID0gU1dULk5VTEw7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uU3RhdHVzIHN0YXR1cyA9IG5ldyBWYWxpZGF0aW9uU3RhdHVzKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGlzRmlyc3RUaW1lVG9QYWdlID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQlwcml2YXRlIE1hcCB2YWxpZGF0aW9uTWFwOwotCXByaXZhdGUgU3RyaW5nW10gdmFsaWRhdGlvblByb3BlcnR5TmFtZXM7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCXByaXZhdGUgU3RyaW5nIGluZm9wb3BJRDsKLQlwcml2YXRlIERhdGFNb2RlbFdpemFyZCB3aXphcmQ7Ci0JcHJpdmF0ZSBJV2l6YXJkUGFnZSBwcmV2aW91c1BhZ2U7Ci0KLQkvKioKLQkgKiBKMkVFV2l6YXJkUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJbW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCXN5bmNoSGVscGVyID0gaW5pdGlhbGl6ZVN5bmNoSGVscGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERhdGFNb2RlbFN5bmNoSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIoZG0pOwotCX0KLQotCS8qKgotCSAqIEoyRUVXaXphcmRQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkgewotCQlzdXBlcihwYWdlTmFtZSwgdGl0bGUsIHRpdGxlSW1hZ2UpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgZGlhbG9nIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuIFRoaXMKLQkgKiBtZXRob2QgaGFzIGJlZW4gYWJzdHJhY3QgYW5kIGl0IHVzZXMgdGhlIHRlbXBsYXRlIHBhdHRlcm4gdG8gZ2V0IHRoZSBjb3JyZWN0IGl0ZW1zIHNldHVwIGluCi0JICogdGhlIGNvcnJlY3Qgb3JkZXIuIFNlZSB0aGUgc2V0IG9mIG1ldGhvZHMgYmVsb3cgdGhhdCBhcmUgY2FsbGVkIGluIHRoaXMgbWV0aG9kLgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGNyZWF0ZWQgY29udHJvbCBjYW4gYmUgYWNjZXNzZWQgdmlhCi0JICogPGNvZGU+Z2V0Q29udHJvbDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRvcCA9IGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWFkZEV4dGVuZGVkQ29udHJvbHModG9wKTsKLQkJc2V0Q29udHJvbCh0b3ApOwotCQlzZXR1cEluZm9wb3AodG9wKTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlbmRlZENvbnRyb2xzKENvbXBvc2l0ZSB0b3ApIHsKLQkJSVdpemFyZCBfd2l6YXJkID0gZ2V0V2l6YXJkKCk7Ci0JCWlmIChfd2l6YXJkIGluc3RhbmNlb2YgRGF0YU1vZGVsV2l6YXJkKSB7Ci0JCQlQYWdlRXh0ZW5zaW9uTWFuYWdlciBwYWdlRXh0ZW5zaW9uTWFuYWdlciA9ICgoRGF0YU1vZGVsV2l6YXJkKSBfd2l6YXJkKS5nZXRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpOwotCQkJcGFnZUV4dGVuc2lvbk1hbmFnZXIuY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKHRvcCwgbW9kZWwsIGdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9PSBudWxsIHx8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSAwKQotCQkJdmFsaWRhdGlvbk1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJZWxzZSB7Ci0JCQl2YWxpZGF0aW9uTWFwID0gbmV3IEhhc2hNYXAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspCi0JCQkJdmFsaWRhdGlvbk1hcC5wdXQodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQkvLyBUT0RPIHdoeSBpcyB0aGF0IGxhc3QgZ2V0TmV4dFBhZ2UoKSBjYWxsIGhlcmU/Pz8KLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCkgJiYgKChudWxsICE9IHdpemFyZCAmJiB3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLmhhc05leHRQYWdlKCkgfHwgbnVsbCAhPSBnZXROZXh0UGFnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV2l6YXJkUGFnZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRXaXphcmQoSVdpemFyZCBuZXdXaXphcmQpIHsKLQkJc3VwZXIuc2V0V2l6YXJkKG5ld1dpemFyZCk7Ci0JCWlmIChuZXdXaXphcmQgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmQpIHsKLQkJCXdpemFyZCA9IChEYXRhTW9kZWxXaXphcmQpIG5ld1dpemFyZDsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoKSB7Ci0JCXJldHVybiBwcmV2aW91c1BhZ2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJc3VwZXIuc2V0UHJldmlvdXNQYWdlKHBhZ2UpOwotCQlwcmV2aW91c1BhZ2UgPSBwYWdlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHNob3VsZCByZXR1cm4gdGhlIG1vZGVsIHByb3BlcnR5IG5hbWVzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQgb24gdGhpcyBwYWdlIGluIHRoZQotCSAqIG9yZGVyIHRoYXQgdGhleSBzaG91bGQgcHJlc2VudCB0aGVpciBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvcCBsZXZlbCBDb21wb3NpdGUgZm9yIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0IHVwIGluZm8gcG9wIGhvb2tzIGlmIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEluZm9wb3AoQ29udHJvbCBwYXJlbnQpIHsKLQkJaWYgKGdldEluZm9wb3BJRCgpICE9IG51bGwpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgZ2V0SW5mb3BvcElEKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhpcyBwYWdlLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwcm92aWRlIGFwcHJvcHJpYXRlCi0JICogZGVmYXVsdHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gc3RvcmVkCi0JICogYW5kIG5lZWQgdG8gYmUgcmVzdG9yZWQuCi0JICogCi0JICogQHNlZSBzdG9yZURlZmF1bHRTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgTGlzdGVuZXJzIHRvIGNvbnRyb2xzIGF0IHRoaXMgcG9pbnQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXZlbnRzLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRvIGFkZCBsaXN0ZW5lcnMgdG8gaXRzIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSBpcyBiZWluZyBtYWRlIGN1cnJlbnQgYW5kIHZpc2libGUuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKLQkJdHJ5IHsKLQkJCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgbW92aW5nIGJhY2sgb25lIHBhZ2UuCi0JCQlpZiAobnVsbCAhPSB3aXphcmQgJiYgd2l6YXJkLmdldFByZXZpb3VzUGFnZSh3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLmdldEN1cnJlbnRQYWdlKCkpID09IHRoaXMpIHsKLQkJCQl3aXphcmQuZ2V0UGFnZUdyb3VwTWFuYWdlcigpLm1vdmVCYWNrT25lUGFnZSgpOwotCQkJfQotCi0JCQl2YWxpZGF0ZVBhZ2Uoc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaXNGaXJzdFRpbWVUb1BhZ2UgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiB0cnVlIHVubGVzcyBpdCBpcyB0aGUgZmlyc3QgdGltZSBlbnRlcmluZyB0aGlzIHBhZ2UgaW4KLQkgKiB3aGljaCBjYXNlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHBhZ2UgYW5kIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vdC4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiB0aGV5IGRvIG5vdCB3YW50IHRoaXMgZGVmYXVsdCBiZWhhdmlvci4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKSB7Ci0JCXJldHVybiAhaXNGaXJzdFRpbWVUb1BhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gdHJ1ZSB1bmxlc3MgaXQgaXMgdGhlIGZpcnN0IHRpbWUgZW50ZXJpbmcgdGhpcyBwYWdlIGluCi0JICogd2hpY2ggY2FzZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBwYWdlIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBub3QuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgdGhleSBkbyBub3Qgd2FudCB0aGlzIGRlZmF1bHQgYmVoYXZpb3IuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB1c2Ugc2hvd1ZhbGlkYXRvaW5FcnJvcnNPbkVudGVyIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZU9uRW50ZXIoKSB7Ci0JCXJldHVybiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGl0aW5nIHRoZSBwYWdlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJcmV0dXJuIHN0YXR1cy5oYXNFcnJvcihrZXkpOwotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhbiBldmVudCB0aGF0IHRoZSByZWNlaXZlciBoYXMgcmVnaXN0ZXJlZCBmb3Igb2NjdXJzLiBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGlzCi0JICogbWV0aG9kLCBpdCBtdXN0IGNhbGwgc3VwZXIuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBwYWdlIGJhc2VkIG9uIHRoZSBsYXN0IGVycm9yIGluIHRoZSBWYWxpZGF0aW9uU3RhdHVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yID0gc3RhdHVzLmdldExhc3RFcnJNc2coKTsKLQkJaWYgKGVycm9yID09IG51bGwpIHsKLQkJCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCXNldEVycm9yTWVzc2FnZSgoU3RyaW5nKSBudWxsKTsKLQkJCVN0cmluZyB3YXJuaW5nID0gc3RhdHVzLmdldExhc3RXYXJuaW5nTXNnKCk7Ci0JCQlpZiAod2FybmluZyA9PSBudWxsKSB7Ci0JCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKQotCQkJCQlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBpbmZvID0gc3RhdHVzLmdldExhc3RJbmZvTXNnKCk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pCi0JCQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfSBlbHNlIGlmICghaW5mby5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkgewotCQkJCQkJc2V0TWVzc2FnZShpbmZvLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXdhcm5pbmcuZXF1YWxzKGdldE1lc3NhZ2UoKSkpCi0JCQkJc2V0TWVzc2FnZSh3YXJuaW5nLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9IGVsc2UgaWYgKCFlcnJvci5lcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCkpKQotCQkJCQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCQkJCQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvclN0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0RXJyb3JTdGF0dXMoa2V5LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdhcm5pbmdTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0V2FybmluZ1N0YXR1cyhrZXksIHdhcm5pbmdNZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGluZm9NZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRJbmZvU3RhdHVzKGtleSwgaW5mb01lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXN0YXR1cy5zZXRPS1N0YXR1cyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5EaWFsb2dQYWdlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklEaWFsb2dQYWdlPC9jb2RlPiBtZXRob2Qgc2V0cwotCSAqIHRoZSBjb250cm9sIHRvIHRoZSBnaXZlbiB2aXNpYmlsaXR5IHN0YXRlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJZW50ZXIoKTsKLQkJfSBlbHNlCi0JCQlleGl0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBXaXphcmQganVzdCBwcmlvciB0byBydW5uaW5nIHRoZSBwZXJmb3JtRmluaXNoIG9wZXJhdGlvbi4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBzdG9yZSB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBwYWdlIGlzIG5vdyBiZWluZyB2YWxpZGF0ZWQuIEF0IHRoaXMgdGltZSwgZWFjaCBjb250cm9sIGlzIHZhbGlkYXRlZCBhbmQgdGhlbiB0aGUKLQkgKiBjb250cm9scyBhcmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cyB3aGljaCB3YXMgdXBkYXRlZCBkdXJpbmcKLQkgKiA8Y29kZT52YWxpZGF0ZUNvbnRyb2xzKCk8L2NvZGU+LiBGaW5hbGx5LCBpdCB3aWxsIGRpc3BsYXkgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhbmQgaXQKLQkgKiB3aWxsIHNldCB0aGUgcGFnZSBjb21wbGV0ZS4gU3ViY2xhc3NlcyB3aWxsIG5vdCB0eXBpY2FsbHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotCQl2YWxpZGF0ZVBhZ2UodHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKGJvb2xlYW4gc2hvd01lc3NhZ2UpIHsKLQkJaWYgKCFpc1ZhbGlkYXRpbmcpIHsKLQkJCWlzVmFsaWRhdGluZyA9IHRydWU7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlQ29udHJvbHNCYXNlKCk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQlpZiAoc2hvd01lc3NhZ2UpCi0JCQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShzdGF0dXMuZ2V0TGFzdEVyck1zZygpID09IG51bGwpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGluZGl2aWR1YWwgY29udHJvbHMuIFVzZSB2YWxpZGF0aW9uIGtleXMgdG8ga2VlcCB0cmFjayBvZiBlcnJvcnMuCi0JICogCi0JICogQHNlZSBzZXRPS1N0YXR1cyhJbnRlZ2VyKSBhbmQgc2V0RXJyb3JNZXNzYWdlKEludGVnZXIsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHZhbGlkYXRlQ29udHJvbHNCYXNlKCkgewotCQlpZiAoIXZhbGlkYXRpb25NYXAuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvcE5hbWUgPSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXTsKLQkJCQlJbnRlZ2VyIHZhbEtleSA9IChJbnRlZ2VyKSB2YWxpZGF0aW9uTWFwLmdldChwcm9wTmFtZSk7Ci0JCQkJaWYgKHZhbEtleSAhPSBudWxsKQotCQkJCQl2YWxpZGF0ZVByb3BlcnR5KHByb3BOYW1lLCB2YWxLZXkpOwotCQkJCWlmICghZ2V0U3RhdHVzKHZhbEtleSkpCi0JCQkJCXJldHVybiBwcm9wTmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHZhbGlkYXRpb25rZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBJbnRlZ2VyIHZhbGlkYXRpb25LZXkpIHsKLQkJc2V0T0tTdGF0dXModmFsaWRhdGlvbktleSk7Ci0JCUlTdGF0dXMgc3RhdHVzMSA9IG1vZGVsLnZhbGlkYXRlUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKCFzdGF0dXMxLmlzT0soKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMxLmlzTXVsdGlTdGF0dXMoKSA/IHN0YXR1czEuZ2V0Q2hpbGRyZW4oKVswXS5nZXRNZXNzYWdlKCkgOiBzdGF0dXMxLmdldE1lc3NhZ2UoKTsKLQkJCXN3aXRjaCAoc3RhdHVzMS5nZXRTZXZlcml0eSgpKSB7Ci0JCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQkJc2V0RXJyb3JTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQkJc2V0V2FybmluZ1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLklORk8gOgotCQkJCQlzZXRJbmZvU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZiBjb250cm9scyBhZnRlciB2YWxpZGF0aW9uLiBTdWJsY2Fzc2VzIHNob3VsZCBjaGVjayB0aGUgc3RhdHVzIG9mCi0JICogdmFsaWRhdGlvbiBrZXlzIHRvIGRldGVybWluZSBlbmFibGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGlzRmlyc3RUaW1lVG9QYWdlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpcnN0VGltZVRvUGFnZSgpIHsKLQkJcmV0dXJuIGlzRmlyc3RUaW1lVG9QYWdlOwotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIHNldEphdmFTdGF0dXNNZXNzYWdlKElTdGF0dXMgamF2YVN0YXR1cywgSW50ZWdlciBzdGF0dXNLZXksIFN0cmluZyBtZXNzYWdlKSB7Ci0JLy8gaWYgKGphdmFTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JLy8gc2V0V2FybmluZ1N0YXR1cyhzdGF0dXNLZXksIG1lc3NhZ2UpOwotCS8vIGVsc2UKLQkvLyBzZXRFcnJvclN0YXR1cyhzdGF0dXNLZXksIG1lc3NhZ2UpOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rmlyc3RUaW1lVG9QYWdlKGJvb2xlYW4gYikgewotCQlpc0ZpcnN0VGltZVRvUGFnZSA9IGI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdvdERhdGFNb2RlbFdpemFyZCA9IGZhbHNlOwotCXByaXZhdGUgRGF0YU1vZGVsV2l6YXJkIGRhdGFNb2RlbFdpemFyZCA9IG51bGw7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFdpemFyZCBnZXREYXRhTW9kZWxXaXphcmQoKXsKLQkJaWYoIWdvdERhdGFNb2RlbFdpemFyZCl7Ci0JCQlnb3REYXRhTW9kZWxXaXphcmQgPSB0cnVlOwotCQkJSVdpemFyZCB3aXphcmQgPSBnZXRXaXphcmQoKTsKLQkJCWlmKHdpemFyZCBpbnN0YW5jZW9mIERhdGFNb2RlbFdpemFyZCl7Ci0JCQkJZGF0YU1vZGVsV2l6YXJkID0gKERhdGFNb2RlbFdpemFyZCl3aXphcmQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGFNb2RlbFdpemFyZDsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBJZiBhIHByb3BlcnR5IGNoYW5nZXMgdGhhdCB3ZSB3YW50IHRvIHZhbGlkYXRlLCBmb3JjZSB2YWxpZGF0aW9uIG9uIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChmaW5hbCBEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlEYXRhTW9kZWxXaXphcmQgdyA9IGdldERhdGFNb2RlbFdpemFyZCgpOwotCQlpZih3ID09IG51bGwgfHwgIXcuaXNFeGVjdXRpbmcoKSkKLQkJewotCQkgICAgZmluYWwgUnVubmFibGUgdWlDaGFuZ2VzID0gbmV3IFJ1bm5hYmxlKCkKLQkJICAgIHsKLQkJICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotCQkgICAgICAgIHsKLSAgICAgICAgCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAJCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAoZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyB8fCAoIWlzUGFnZUNvbXBsZXRlKCkgJiYgZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcpKSkgewotICAgICAgICAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAJCQkJCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAJCQkJCQl2YWxpZGF0ZVBhZ2Uoc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkpOwotICAgICAgICAJCQkJCQlicmVhazsKLSAgICAgICAgCQkJCQl9Ci0gICAgICAgIAkJCQl9Ci0gICAgICAgIAkJCX0KLQkJICAgICAgICB9Ci0JCSAgICB9OwotCQkgICAgaWYoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRUaHJlYWQoKSl7Ci0JCSAgICAJdWlDaGFuZ2VzLnJ1bigpOwotCQkgICAgfSBlbHNlIHsKLQkJICAgIAlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWModWlDaGFuZ2VzKTsKLQkJICAgIH0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJbW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJaWYgKHN5bmNoSGVscGVyICE9IG51bGwpIHsKLQkJCXN5bmNoSGVscGVyLmRpc3Bvc2UoKTsKLQkJCXN5bmNoSGVscGVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5mb3BvcElEKCkgewotCQlyZXR1cm4gaW5mb3BvcElEOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZm9wb3BJRChTdHJpbmcgaW5mb3BvcElEKSB7Ci0JCXRoaXMuaW5mb3BvcElEID0gaW5mb3BvcElEOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTA1YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElETVBhZ2VHcm91cCAKLXsKLSAgcHVibGljIFN0cmluZyBnZXRXaXphcmRJRCgpOwotICAKLSAgcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJRCgpOwotICAKLSAgcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJbnNlcnRpb25JRCgpOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpOwotICAKLSAgcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZERhdGFPcGVyYXRpb25Ub1J1bigpOwotICAKLSAgcHVibGljIExpc3QgZ2V0UGFnZXMoSURhdGFNb2RlbCBkYXRhTW9kZWwpOwotICAKLSAgcHVibGljIElETVBhZ2VIYW5kbGVyIGdldFBhZ2VIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCApOwotICAKLSAgcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgZ2V0UGFnZUdyb3VwSGFuZGxlciggSURhdGFNb2RlbCBkYXRhTW9kZWwgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3MGU1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi0vKioKLSAqIAotICogVGhlIHdpemFyZCBmcmFtZXdvcmsgYWxsb3dzIHBhZ2UgZ3JvdXBzIHRvIGJlIGluc2VydGVkIGFmdGVyIG90aGVyIHBhZ2UgZ3JvdXAuCi0gKiBJZiBtb3JlIHRoYW4gb25lIHBhZ2UgZ3JvdXAgaW5zZXJ0cyBpdHNlbGYgYWZ0ZXIgYSBwYXJ0aWN1bGFyIHBhZ2UgZ3JvdXAgaXQgbWF5Ci0gKiBub3QgYmUgZGV0ZXJtaW5pc3RpYyB3aGljaCBwYWdlIGdyb3VwIHNob3VsZCBmb2xsb3cgZWFjaCBvdGhlci4gIFRoaXMgY2xhc3MKLSAqIGFsbG93cyBhIHBhcnRpY3VsYXIgcGFnZSBncm91cCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIHN1YnNlcXVlbnQgcGFnZQotICogZ3JvdXBzIHNob3VsZCBiZSBvcmRlcmVkLgotICogCi0gKiBGb3IgZXhhbXBsZTogQSBwYWdlIGdyb3VwIFQgaGFzIHRocmVlIHBhZ2UgZ3JvdXBzIFgsIFksIGFuZCBaIHRoYXQgaGF2ZSByZWdpc3RlcmVkCi0gKiAgICAgICAgICAgICAgdmlhIHRoZSB3aXphcmRQYWdlR3JvdXAgZXh0ZW5zaW9uIHBvaW50IHRvIGZvbGxvdyBpdC4KLSAqICAgICAgICAgICAgICBUaGUgd2l6YXJkIGZyYW1ld29yayB3aWxsIGNhbGwgZ2V0TmV4dEdyb3VwIHdpdGg6Ci0gKiAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgVC5nZXROZXh0R3JvdXAoIG51bGwsIHsgIlgiLCAiWSIsICJaIiB9ICkKLSAqICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGVpdGhlciAiWCIsICJZIiwgIloiLCBvciBudWxsIGlmIG5vIHBhZ2UgZ3JvdXAKLSAqICAgICAgICAgICAgICBzaG91bGQgZm9sbG93LiAgSWYgIlkiIHdhcyByZXR1cm5lZCB0aGVuIGEgc3ViZXF1ZW50IGNhbGwKLSAqICAgICAgICAgICAgICB3aWxsIGJlIG1hZGUgYnkgdGhlIGZyYW1ld29yayB3aXRoOgotICogICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIFQuZ2V0TmV4dEdyb3VwKCAiWSIsIHsgIlgiLCAiWSIsICJaIiB9ICkKLSAqICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICBBZ2FpbiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGVpdGhlciAiWCIsICJZIiwgIloiLCBvciBudWxsIGlmIG5vIHBhZ2UKLSAqICAgICAgICAgICAgICBncm91cCBzaG91bGQgZm9sbG93IHRoaXMgcGFnZSBncm91cCAiWSIuCi0gKiAgICAgICAgICAgICAgCi0gKiBOb3RlOiBhbnkgcGFnZSBncm91cCBjYW4gaGF2ZSBhIHBhZ2UgZ3JvdXAgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggaXQgc28gdGhpcyBtZXRob2QKLSAqICAgICAgIGNhbGwgaXMgcmVjdXJzaXZlIGluIG5hdHVyZS4gIEZvciBleGFtcGxlOiB0aGUgcGFnZSBncm91cCBZIG1pZ2h0IGhhdmUgcGFnZQotICogICAgICAgZ3JvdXBzIFkxLCBZMiwgYW5kIFkzIGZvbGxvd2luZyBpdC4gIFRoaXMgd291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY2FsbHM6Ci0gKiAgICAgICAKLSAqICAgICAgICAgICAgICAgICBULmdldE5leHRHcm91cCggbnVsbCwgeyAiWCIsICJZIiwgIloiIH0gKSAgLy8gIlkiIGlzIHNlbGVjdGVkIHVzaW5nIFRzIGhhbmRsZXIuCi0gKiAgICAgICAgICAgICAgICAgWS5nZXROZXh0R3JvdXAoIG51bGwsIHsgIlkxIiwgIlkyIiwgIlkzIiB9ICkgLy8gIlkxIiBpcyBzZWxlY3RlZCB1c2luZyBZcyBoYW5kbGVyLgotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIEZvciB0aGlzIGV4YW1wbGUgWTEgaGFzIG5vIHBhZ2UgZ3JvdXBzIGZvbGxvd2luZyBpdC4KLSAqICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBULmdldE5leHRHcm91cCggIlkiLCB7ICJYIiwgIlkiLCAiWiIgfSApICAvLyBudWxsIGlzIHNlbGVjdGVkIHVzaW5nIFRzIGhhbmRsZXIuCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgRm9yIHRoaXMgZXhhbXBsZSwgdGhlIFQgaGFuZGxlciBkZWNpZGVkIHRoYXQgbm8gcGFnZSBncm91cCBmb2xsb3dlZCBZIG5vdCBldmVuIFggb3IgWi4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURNUGFnZUdyb3VwSGFuZGxlciAKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gY3VycmVudFBhZ2VHcm91cElEIHRoZSBjdXJyZW50IHBhZ2UgZ3JvdXAgSUQuICBUaGlzIHZhbHVlIHdpbGwgYmUgbnVsbCB0aGUgZmlyc3QgdGltZSAKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAqIEBwYXJhbSBwYWdlR3JvdXBJRHMgYSBsaXN0IG9mIHBhZ2UgZ3JvdXAgSURzIHRoYXQgZm9sbG93IHRoZSBwYWdlIGdyb3VwIGZvciB0aGlzIGhhbmRsZXIuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcGFnZSBncm91cCBpZCB0aGF0IHNob3VsZCBmb2xsb3cgY3VycmVudFBhZ2VHcm91cElELCBvciBpdAotICAgKiBzaG91bGQgcmV0dXJuIG51bGwgaWYgbm8gcGFnZSBncm91cCBmb2xsb3dzIGN1cnJlbnRQYWdlR3JvdXBJRC4KLSAgICogCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlR3JvdXAoIFN0cmluZyBjdXJyZW50UGFnZUdyb3VwSUQsIFN0cmluZ1tdIHBhZ2VHcm91cElEcyApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDE5YTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElETVBhZ2VIYW5kbGVyIHsKLQotCS8qKgotCSAqIHJldHVybiB0aGlzIGFzIHRoZSBwYWdlIG5hbWUgaWYgdGhlIGV4cGVjdGVkTmV4dFBhZ2VOYW1lIG9yIGV4cGVjdGVkUHJldmlvdXNQYWdlTmFtZSBzaG91bGQKLQkgKiBiZSBza2lwcGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9QQUdFID0gIklETUV4dGVuZGVkUGFnZUhhbmRsZXIuU0tJUF9QQUdFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogcHJlZml4IHRoaXMgc3RyaW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlIHBhZ2Ugd2hpY2ggb2NjdXJzIGJlZm9yZSB0aGUgcGFnZSB0aGF0IHNob3VsZCBiZQotCSAqIHJldHVybmVkLiBFLkcuIHN1cHBvc2UgeW91ciBwYWdlIGNvbnRyaWJ1dGlvbnMga25vdyBhYm91dCBwYWdlcyBBLCBCIGFuZCBDLCBhbmQgeW91IHdhbnQgdGhlCi0JICogdG8gc2tpcCBwYWdlcyBCIGFuZCBDLCB3aGVuIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UgZnJvbSBBLiBUbyBkbyB0aGlzLCByZXR1cm4gUEFHRV9BRlRFUitDLgotCSAqIFRoZSBmcmFtZXdvcmsgd2lsbCB0aGVuIGFzayB0aGUgd2l6YXJkIGZvciB0aGUgcGFnZSB0aGF0IG5vcm1hbGx5IGNvbWVzIGFmdGVyIHBhZ2UgQy4KLQkgKiBQQUdFX0JFRk9SRSB3b3JrcyBzaW1pbGFybHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9BRlRFUiA9ICJJRE1FeHRlbmRlZFBhZ2VIYW5kbGVyLlBBR0VfQUZURVIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBzYW1lIGFzIFBBR0VfQUZURVIsIGV4Y2VwdCBmb3IgcmV0dXJpbmcgdGhlIHBhZ2UgYmVmb3JlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfQkVGT1JFID0gIklETUV4dGVuZGVkUGFnZUhhbmRsZXIuUEFHRV9CRUZPUkUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBhZ2UgdGhhdCBzaG91bGQgYmUgbmV4dAotCSAqIAotCSAqIEBwYXJhbSBjdXJyZW50UGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRoZSB3aXphcmQgaXMgY3VycmVudGx5IG9uCi0JICogQHBhcmFtIGV4cGVjdGVkTmV4dFBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIG5leHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXh0UGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWROZXh0UGFnZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYWdlIHRoYXQgc2hvdWxkIGJlIHByZXZpb3VzCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnRQYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgdGhlIHdpemFyZCBpcyBjdXJyZW50bHkgb24KLQkgKiBAcGFyYW0gZXhwZWN0ZWROZXh0UGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgcHJldmlvdXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmV2aW91c1BhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkUHJldmlvdXNQYWdlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9QYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvUGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0MjExOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9QYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuQ29tbW9uVUlQbHVnaW5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5ETVdpemFyZFBhZ2VFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgb3JnYW5pemVzIHRoZSB3aXphcmQgcGFnZSBleHRlbnNpb25zIGZvciBhIHBhcnRpY3VsYXIgd2l6YXJkLiAKLSAqIAotICogQGF1dGhvciBrcmFldgotICovCi1wdWJsaWMgY2xhc3MgUGFnZUV4dGVuc2lvbk1hbmFnZXIgewotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgd2hlcmUgdGhlIHdpemFyZCBwYWdlIGV4dGVuc2lvbnMgYXJlCi0JICogY29udHJpYnV0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9JTlRfV0laQVJEX1BBR0VfR1JPVVAgPSAid2l6YXJkUGFnZUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQncyBlbGVtZW50IHdoZXJlIHRoZSB3aXphcmQgcGFnZQotCSAqIGV4dGVuc2lvbnMgYXJlIGNvbnRyaWJ1dGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfV0laQVJEX1BBR0UgPSAid2l6YXJkUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZyB3aXphcmRJRDsKLQlwcml2YXRlIERNV2l6YXJkUGFnZUVsZW1lbnRbXSBlbGVtZW50czsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHBhZ2UgZXh0ZW5zaW9uIG1hbmFnZXIgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmQgLQotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCB0byBjb25zdHJ1Y3QgdGhlIG1hbmFnZXIgZm9yLgotCSAqLwotCXB1YmxpYyBQYWdlRXh0ZW5zaW9uTWFuYWdlcihEYXRhTW9kZWxXaXphcmQgd2l6YXJkKSB7Ci0JCXRoaXMud2l6YXJkSUQgPSB3aXphcmQuZ2V0V2l6YXJkSUQoKTsKLQkJbG9hZEVsZW1lbnRzKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhZGRpdGlvbmFsIGNvbnRyb2xzIGZvciB0aGUgc3BlY2lmaWVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIDxwPgotCSAqIFRoZSBhZGRpdGlvbmFsIGNvbnRyb2xzIGFyZSBjb250cmlidXRlZCBieSB0aGUgd2l6YXJkIHBhZ2UgZXh0ZW5zaW9ucwotCSAqIHRoYXQgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIDxjaXRlPndpemFyZFBhZ2U8L2NpdGU+IGVsZW1lbnQgb2YgdGhlCi0JICogPGNpdGU+d2l6YXJkUGFnZUdyb3VwPC9jaXRlPiBleHRlbnNpb24gcG9pbnQgYW5kIHRoZSA8Y2l0ZT53aXphcmRJRDwvY2l0ZT4KLQkgKiBhdHRyaWJ1dGUgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHdpemFyZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJRE1XaXphcmRQYWdlRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAod2l6YXJkSUQuZXF1YWxzKGVsZW1lbnQuZ2V0V2l6YXJkSUQoKSkpIHsKLQkJCQllbGVtZW50LmNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhwYXJlbnQsIG1vZGVsLCBwYWdlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRFbGVtZW50cygpIHsgCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChDb21tb25VSVBsdWdpbkNvbnN0YW50cy5QTFVHSU5fSUQsIFBPSU5UX1dJWkFSRF9QQUdFX0dST1VQKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYWxsRWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBhbGxFbGVtZW50c1tpXTsKLQkJCWlmIChFTEVNRU5UX1dJWkFSRF9QQUdFLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlyZXN1bHQuYWRkKG5ldyBETVdpemFyZFBhZ2VFbGVtZW50KGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQkKLQkJZWxlbWVudHMgPSAoRE1XaXphcmRQYWdlRWxlbWVudFtdKSByZXN1bHQudG9BcnJheShuZXcgRE1XaXphcmRQYWdlRWxlbWVudFtdIHsgfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9TaW1wbGVQYWdlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1NpbXBsZVBhZ2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTkzNmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL1NpbXBsZVBhZ2VHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVQYWdlR3JvdXAgaW1wbGVtZW50cyBBZGRhYmxlUGFnZUdyb3VwIHsKLQlwcml2YXRlIFN0cmluZyBncm91cElEOwotCXByaXZhdGUgU3RyaW5nIHdpemFyZElEOwotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0V4dGVuZGVkUGFnZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVxdWlyZWREYXRhT3BlcmF0aW9uOwotCXByaXZhdGUgU2V0ICAgIGRhdGFNb2RlbElEczsKLQotCXByaXZhdGUgSURNUGFnZUhhbmRsZXIgcGFnZUhhbmRsZXI7Ci0JcHJpdmF0ZSBJRE1QYWdlR3JvdXBIYW5kbGVyIHBhZ2VHcm91cEhhbmRsZXI7Ci0JcHJpdmF0ZSBWZWN0b3IgcGFnZXM7Ci0KLQlwdWJsaWMgU2ltcGxlUGFnZUdyb3VwKFN0cmluZyBncm91cElELCBTdHJpbmcgd2l6YXJkSUQsIGJvb2xlYW4gYWxsb3dFeHRlbmRlZFBhZ2VzLCBTdHJpbmcgcmVxdWlyZURhdGFPcGVyYXRpb24pIHsKLQkJdGhpcy5ncm91cElEID0gZ3JvdXBJRDsKLQkJdGhpcy53aXphcmRJRCA9IHdpemFyZElEOwotCQl0aGlzLmFsbG93RXh0ZW5kZWRQYWdlcyA9IGFsbG93RXh0ZW5kZWRQYWdlczsKLQkJdGhpcy5yZXF1aXJlZERhdGFPcGVyYXRpb24gPSByZXF1aXJlRGF0YU9wZXJhdGlvbjsKLQkJcGFnZXMgPSBuZXcgVmVjdG9yKCk7Ci0JfQotCi0JcHVibGljIFNpbXBsZVBhZ2VHcm91cChTdHJpbmcgZ3JvdXBJRCwgU3RyaW5nIHdpemFyZElEKSB7Ci0JCXRoaXMoZ3JvdXBJRCwgd2l6YXJkSUQsIHRydWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlwYWdlcy5hZGQocGFnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoSVdpemFyZFBhZ2VbXSBuZXdQYWdlcykgewotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbmV3UGFnZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlwYWdlcy5hZGQobmV3UGFnZXNbaW5kZXhdKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSB7Ci0JCXJldHVybiBhbGxvd0V4dGVuZGVkUGFnZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFnZUdyb3VwSGFuZGxlcihJRE1QYWdlR3JvdXBIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcGFnZUdyb3VwSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgZ2V0UGFnZUdyb3VwSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZUdyb3VwSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYWdlSGFuZGxlcihJRE1QYWdlSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXBhZ2VIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgZ2V0UGFnZUhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBwYWdlczsKLQl9Ci0JCi0JcHVibGljIElXaXphcmRQYWdlW10gZ2V0RXh0ZW5kZWRQYWdlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gKElXaXphcmRQYWdlW10pIHBhZ2VzLnRvQXJyYXkobmV3IElXaXphcmRQYWdlWzBdKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VHcm91cElEKCkgewotCQlyZXR1cm4gZ3JvdXBJRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VHcm91cEluc2VydGlvbklEKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkRGF0YU9wZXJhdGlvblRvUnVuKCkgewotCQlyZXR1cm4gcmVxdWlyZWREYXRhT3BlcmF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiB3aXphcmRJRDsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldERhdGFNb2RlbElEcygpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbElEczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWxJRHMoU2V0IGRhdGFNb2RlbElEcykgewotCQl0aGlzLmRhdGFNb2RlbElEcyA9IGRhdGFNb2RlbElEczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9FcnJvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4NmY5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9FcnJvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIEVycm9yRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBAT3ZlcnJpZGUKLXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpIHx8IHN0YXR1cy5nZXRFeGNlcHRpb24oKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9JbmZvRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9JbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTg5YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSW5mb0RpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIEluZm9EaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIEBPdmVycmlkZQotcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBAT3ZlcnJpZGUKLXByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL01lc3NhZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL01lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ2YWVhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0gIC8qKgotICAgKiBSZXNlcnZlIHJvb20gZm9yIHRoaXMgbWFueSBsaXN0IGl0ZW1zLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9JVEVNX0NPVU5UID0gNzsKLQotICAvKioKLSAgICogVGhlIERldGFpbHMgYnV0dG9uLgotICAgKi8KLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZXRhaWxzQnV0dG9uOwotCi0gIC8qKgotICAgKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBTV1QgbGlzdCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIGVycm9yIGRldGFpbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0OwotICBwcm90ZWN0ZWQgVGV4dCBkZXRhaWxzOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZGV0YWlscyB2aWV3ZXIgaXMgY3VycmVudGx5IGNyZWF0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0Q3JlYXRlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxzQ3JlYXRlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBGaWx0ZXIgbWFzayBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggc3RhdHVzIGl0ZW1zIHRvIGRpc3BsYXkuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGRpc3BsYXlNYXNrID0gMHhGRkZGOwotCi0gIC8qKgotICAgKiBUaGUgbWFpbiBzdGF0dXMgb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIElTdGF0dXMgc3RhdHVzOwotICAKLSAgcHJpdmF0ZSBQb2ludCBzYXZlZFNpemUgPSBudWxsOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHRoZSBtYWluIGVycm9yIG9iamVjdCdzIGRldGFpbGVkIGVycm9ycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5TdGF0dXM8L2NvZGU+KS4KLSAgICovCi0gIHByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBzdGF0dXNMaXN0OwotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgTWVzc2FnZURpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgdGhpcy50aXRsZSA9IGRpYWxvZ1RpdGxlID09IG51bGwgPyBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlByb2JsZW1fT2NjdXJyZWQiKSA6IC8vJE5PTi1OTFMtMSQKLSAgZGlhbG9nVGl0bGU7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IEpGYWNlUmVzb3VyY2VzLmZvcm1hdCgiUmVhc29uIiwgbmV3IE9iamVjdFtdIHsgbWVzc2FnZSwgc3RhdHVzLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgc3RhdHVzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc3RhdHVzLmdldENoaWxkcmVuKCkpOwotICAgIHRoaXMuZGlzcGxheU1hc2sgPSBkaXNwbGF5TWFzazsKLSAgICBzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gSGFuZGxlcyB0aGUgcHJlc3Npbmcgb2YgdGhlIE9rIG9yCi0gICAqIERldGFpbHMgYnV0dG9uIGluIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UKLSAgICogdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIHRvZ2dsZSB0aGUgZGlzcGxheWluZwotICAgKiBvZiB0aGUgZXJyb3IgZGV0YWlscyBhcmVhLiBOb3RlIHRoYXQgdGhlIERldGFpbHMgYnV0dG9uIHdpbGwgb25seSBiZQotICAgKiB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0gICAqLwotICBAT3ZlcnJpZGUKLXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKQotICB7Ci0gICAgaWYgKGlkID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKQotICAgIHsgLy8gd2FzIHRoZSBkZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotICAgICAgdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotICAgIH0KLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0gICAqLwotICBAT3ZlcnJpZGUKLXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQodGl0bGUpOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSk7Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMKLSAgICogb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQotICAgIC8vIGNyZWF0ZSBjb21wb3NpdGUKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIENvbXBvc2l0ZSBpbWFnZUFuZExhYmVsID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBpbWFnZUFuZExhYmVsLnNldExheW91dChnbCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkpOwotICAgIAotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIEltYWdlIGltYWdlID0gZ2V0RGlhbG9nSW1hZ2UoKTsKLSAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChpbWFnZUFuZExhYmVsLCAwKTsKLSAgICAgIGltYWdlLnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgIGxhYmVsLnNldEltYWdlKGltYWdlKTsKLSAgICAgIGxhYmVsLnNldExheW91dERhdGEoCi0gICAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUgotICAgICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgbWVzc2FnZQotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQoaW1hZ2VBbmRMYWJlbCwgU1dULlJFQURfT05MWXxTV1QuV1JBUCk7Ci0gICAgICB0ZXh0LnNldFRleHQobWVzc2FnZSk7Ci0gICAgICBHcmlkRGF0YSBkYXRhID0KLSAgICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICAgIEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMCi0gICAgICAgICAgICB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotICAgICAgZGF0YS53aWR0aEhpbnQgPQotICAgICAgICBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLk1JTklNVU1fTUVTU0FHRV9BUkVBX1dJRFRIKTsKLSAgICAgCi0gICAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICB0ZXh0LnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGNyZWF0ZURyb3BEb3duTGlzdChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIHRoZSBsaXN0Ci0gICAgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLSAgICAvLyBmaWxsIHRoZSBsaXN0Ci0gICAgcG9wdWxhdGVMaXN0KGxpc3QpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBkYXRhLmhlaWdodEhpbnQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKSAqIExJU1RfSVRFTV9DT1VOVDsKLSAgICBsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbGlzdENyZWF0ZWQgPSB0cnVlOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIHByb3RlY3RlZCBUZXh0IGNyZWF0ZURyb3BEb3duRGV0YWlscyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgZGV0YWlscyA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotICAgIC8vZGV0YWlscy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IocGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCAyNTUsIDI1NSwgMjU1KTsKLSAgICBkZXRhaWxzLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgIHBvcHVsYXRlRGV0YWlscyhkZXRhaWxzLCBzdGF0dXMsIDApOwotICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZGV0YWlscy5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGRldGFpbHMuc2V0U2VsZWN0aW9uKDApOwotICAgIGRldGFpbHNDcmVhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gZGV0YWlsczsKLSAgfQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0gICAqLwotICAvKioKLSAgICogRXh0ZW5kcyA8Y29kZT5XaW5kb3cub3BlbigpPC9jb2RlPi4gT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkKLSAgICogdGhlIGVycm9yLiBJZiB5b3Ugc3BlY2lmaWVkIGEgbWFzayB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLSAgICogY2hpbGRyZW4sIHRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLSAgICogY2hpbGQgc3RhdHVzIG1hdGNoaW5nIHRoZSBtYXNrLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wdWJsaWMgaW50IG9wZW4oKQotICB7Ci0gICAgaWYgKHNob3VsZERpc3BsYXkoc3RhdHVzLCBkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLm9wZW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyoqCi0gICAqIFRoaXMgZXNzZW50aWFsbHkgZG9lcyB0aGUgd29yayBvZiBhIGZhY3RvcnkgT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvCi0gICAqIGRpc3BsYXkgdGhlIGdpdmVuIGVycm9yLiBVc2UgdGhpcyBtZXRob2QgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZwotICAgKiBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2ggdG8gZGlzcGxheSBhbGwgc3VjaAotICAgKiBpdGVtcyB3aXRob3V0IGZpbHRlcmluZy4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5NZXNzYWdlKAotICAgIFNoZWxsIHBhcmVudCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMpCi0gIHsKLQotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgY2FzZSBJU3RhdHVzLklORk8gOgotICAgICAgICByZXR1cm4gb3BlbkluZm8oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLSAgICAgIGNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLSAgICAgICAgcmV0dXJuIG9wZW5XYXJuaW5nKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBkaWFsb2dUaXRsZSwKLSAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIG9wZW5FcnJvcigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbk1lc3NhZ2UoCi0gICAgU2hlbGwgcGFyZW50LAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBDaG9pY2VbXSBvcHRpb25zKQotICB7Ci0KLSAgICByZXR1cm4gb3Blbk9wdGlvbnMoCi0gICAgICBwYXJlbnQsCi0gICAgICBkaWFsb2dUaXRsZSwKLSAgICAgIG1lc3NhZ2UsCi0gICAgICBzdGF0dXMsCi0gICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUiwKLSAgICAgIG9wdGlvbnMpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotICAgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3Ugd2lzaAotICAgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAqIGNoaWxkcmVuLiBUaGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5FcnJvcigKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgRXJyb3JEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBFcnJvckRpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3BlbkluZm8oCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIEluZm9EaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBJbmZvRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuV2FybmluZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgV2FybmluZ0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IFdhcm5pbmdEaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5PcHRpb25zKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2ssCi0gICAgQ2hvaWNlW10gb3B0aW9ucykKLSAgewotICAgIE9wdGlvbnNEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBPcHRpb25zRGlhbG9nKAotICAgICAgICBwYXJlbnRTaGVsbCwKLSAgICAgICAgdGl0bGUsCi0gICAgICAgIG1lc3NhZ2UsCi0gICAgICAgIHN0YXR1cywKLSAgICAgICAgZGlzcGxheU1hc2ssCi0gICAgICAgIG9wdGlvbnMpOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgcmV0dXJuIGRpYWxvZy5nZXRSZXR1cm5Db2RlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGVzIHRoZSBsaXN0IHVzaW5nIHRoaXMgZXJyb3IgZGlhbG9nJ3Mgc3RhdHVzIG9iamVjdC4gVGhpcyB3YWxrcyB0aGUKLSAgICogY2hpbGQgc3RhdGkgb2YgdGhlIHN0YXR1cyBvYmplY3QgYW5kIGRpc3BsYXlzIHRoZW0gaW4gYSBsaXN0LiBUaGUgZm9ybWF0Ci0gICAqIGZvciBlYWNoIGVudHJ5IGlzIHN0YXR1c19wYXRoIDogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzIHBhdGggd2FzCi0gICAqIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIEl0ZXJhdG9yIGVudW1lcmF0aW9uID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSVN0YXR1cyBjaGlsZFN0YXR1cyA9IChJU3RhdHVzKSBlbnVtZXJhdGlvbi5uZXh0KCk7Ci0gICAgICBwb3B1bGF0ZUxpc3QobGlzdCwgY2hpbGRTdGF0dXMsIDApOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCwgSVN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKQotICB7Ci0gICAgaWYgKCFzdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspCi0gICAgewotICAgICAgc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHNiLmFwcGVuZChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICBsaXN0LmFkZChzYi50b1N0cmluZygpKTsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBvcHVsYXRlTGlzdChsaXN0LCBjaGlsZHJlbltpXSwgbmVzdGluZyArIDEpOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEZXRhaWxzKFRleHQgdGV4dCwgSVN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKQotICB7Ci0gICAgaWYgKCFzdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gICAgU3RyaW5nICAgIHRhYkNoYXJzICAgID0gcmVwZWF0KCAnICcsIG5lc3RpbmcgKiAyICk7Ci0gICAgU3RyaW5nICAgIG1lc3NhZ2VMaW5lID0gdGFiQ2hhcnMgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0gICAgVGhyb3dhYmxlIGV4Y2VwdCAgICAgID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgIAotICAgIHRleHQuYXBwZW5kKCBtZXNzYWdlTGluZSApOwotICAgIAotICAgIGlmKCBleGNlcHQgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gdHJhY2UgPSBnZXRTdGFja1RyYWNlKCBleGNlcHQgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNlLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIHRleHQuYXBwZW5kKCB0YWJDaGFycyArICIgICAgIiArIHRyYWNlW2luZGV4XSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwb3B1bGF0ZURldGFpbHModGV4dCwgY2hpbGRyZW5baV0sIG5lc3RpbmcgKyAxKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdCBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIGEgc3RhdHVzIG9iamVjdAotICAgKiBAcGFyYW0gbWFzawotICAgKiAgICAgICAgICAgIGEgbWFzayBhcyBwZXIgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHN0YXR1cyBzaG91bGQgYmUgZGlzcGxheWVkLCBhbmQKLSAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU3RhdHVzIHN0YXR1cywgaW50IG1hc2spCi0gIHsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhdHVzLm1hdGNoZXMobWFzayk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNoaWxkcmVuW2ldLm1hdGNoZXMobWFzaykpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlcgotICAgKiBwcmVzc2luZyB0aGUgZGV0YWlscyBidXR0b24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKQotICB7Ci0gICAgUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotICAgIGludCAgIG5ld0hlaWdodCAgPSAtMTsKLSAgICAKLSAgICBpZiAoZGV0YWlsc0NyZWF0ZWQpCi0gICAgewotICAgICAgZGV0YWlscy5kaXNwb3NlKCk7Ci0gICAgICBkZXRhaWxzQ3JlYXRlZCA9IGZhbHNlOwotICAgICAgZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLSAgICAgIAotICAgICAgLy8gV2l0aG91dCB0aGUgZm9sbG93aW5nIGNvbXB1dGVTaXplIGNhbGwgdGhlIHNldFNpemUgY2FsbCBiZWxvdyB0aHJvd3MgYW4gYXJyYXkgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24uCi0gICAgICAvLyBWZXJ5IHdlaXJkLgotICAgICAgZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgICAgCi0gICAgICBuZXdIZWlnaHQgPSBzYXZlZFNpemUueTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmKCBzYXZlZFNpemUgPT0gbnVsbCApIHNhdmVkU2l6ZSA9IHdpbmRvd1NpemU7Ci0gICAgICAgIAotICAgICAgZGV0YWlscyA9IGNyZWF0ZURyb3BEb3duRGV0YWlscygoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLSAgICAgIGRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0gICAgICBuZXdIZWlnaHQgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLSAgICB9Ci0KLQotICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+IDQwMCA/IDQwMCA6IG5ld0hlaWdodDsKLSAgICAKLSAgICBnZXRTaGVsbCgpLnNldFNpemUoIG5ldyBQb2ludCh3aW5kb3dTaXplLngsIG5ld0hlaWdodCkgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRTdGFja1RyYWNlKCBUaHJvd2FibGUgZXhjICkKLSAgewotICAgIFZlY3RvciAgICAgICBsaW5lcyAgICAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciAgcHJpbnRXcml0ZXIgID0gbmV3IFByaW50V3JpdGVyKCBzdHJpbmdXcml0ZXIgKTsKLSAgICAKLSAgICBleGMucHJpbnRTdGFja1RyYWNlKCBwcmludFdyaXRlciApOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHByaW50V3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBuZXN0ZWRFeGMgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlciggc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkgKTsKLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBzdHJpbmdSZWFkZXIgKTsKLSAgICBTdHJpbmcgICAgICAgICBsaW5lICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgCi0gICAgICB3aGlsZSggbGluZSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgbGluZXMuYWRkKCBsaW5lLnRyaW0oKSApOwotICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gbmVzdGVkRXhjICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlsaW5lcy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIHJlcGVhdCggY2hhciB0aGVfY2hhciwgaW50IGNvdW50ICkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCBjb3VudCApOwotCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBidWYuYXBwZW5kKCB0aGVfY2hhciApOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL09wdGlvbnNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL09wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhZjljMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9PcHRpb25zRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25zRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICBwcml2YXRlIENob2ljZVtdIGNob2ljZXM7Ci0gIHByaXZhdGUgaW50IHJldHVybkNvZGVfOwotCi0gIHB1YmxpYyBPcHRpb25zRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2ssCi0gICAgQ2hvaWNlW10gY2hvaWNlcykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgdGhpcy5jaG9pY2VzID0gY2hvaWNlczsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgYSBidXR0b24gZm9yIGVhY2ggb3B0aW9ucwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBjaG9pY2VzW2ldLmdldFNob3J0Y3V0KCksIGNob2ljZXNbaV0uZ2V0TGFiZWwoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpICkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkKLSAgewotICAgIGlmIChpZCA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkKLSAgICAgIC8vIHdhcyB0aGUgRGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRSZXR1cm5Db2RlKGlkKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5Db2RlKGludCBpZCkKLSAgewotICAgIHJldHVybkNvZGVfID0gaWQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLXB1YmxpYyBpbnQgZ2V0UmV0dXJuQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gcmV0dXJuQ29kZV87Ci0gIH0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIElTdGF0dXMuSU5GTyA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORyA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1N0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NhMzZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1N0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLS8qKgotKiBDb25zdGFudHMgZm9yIHN0YXR1cyBkaWFsb2dzCi0qLwotcHVibGljIGludGVyZmFjZSBTdGF0dXNEaWFsb2dDb25zdGFudHMgewotCi0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIlllcyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFU19JRCA9IDI7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIlllcyB0byBhbGwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfVE9fQUxMX0lEID0gNDsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiQ2FuY2VsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMX0lEID0gMTsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiT0siIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19JRCA9IDA7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkRldGFpbHMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBSUxTX0lEID0gMTM7Ci0KLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiWWVzIiBidXR0b24KLSAgKi8KLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX1lFU19MQUJFTCIpOwotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfVE9fQUxMX0xBQkVMID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19ZRVNfVE9fQUxMX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOQ0VMX0xBQkVMID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19DQU5DRUxfTEFCRUwiKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1dhcm5pbmdEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL1dhcm5pbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiZGEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9XYXJuaW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXJuaW5nRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgV2FybmluZ0RpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgVGhpcyBzaG91bGQgYWxzbyBiZSBvdmVyd3JpdHRlbiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0ssIENhbmNlbCBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKLSAgICAgIGZhbHNlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgQE92ZXJyaWRlCi1wcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhOTEyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYW4gSUVudmlyb25tZW50IGNsYXNzIGZvciB0aGUgRWNsaXBzZSBJRW52aXJvbm1lbnQuCi0gKiBUaGlzIElFbnZpcm9ubWVudCBjdXJyZW50bHkgc3VwcG9ydHMgdGhlICJwbGF0Zm9ybSIgcHJvdG9jb2wgYW5kIHRoZSAiZmlsZSIKLSAqIHByb3RvY29sLgotICoKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VFbnZpcm9ubWVudCBpbXBsZW1lbnRzIElFbnZpcm9ubWVudAotewotICBwcml2YXRlIFNpbXBsZVVSSUZhY3RvcnkgdXJpRmFjdG9yeV8gICAgICA9IG51bGw7Ci0gIHByaXZhdGUgSVN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlcl8gICA9IG51bGw7Ci0gIHByaXZhdGUgSUxvZyAgICAgICAgICAgICAgbG9nZ2VyXyAgICAgICAgICA9IG51bGw7Ci0gIAotICBwdWJsaWMgRWNsaXBzZUVudmlyb25tZW50KCkKLSAgewotICAgIHRoaXMoIG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpICk7ICAKLSAgfQotICAKLSAgcHVibGljIEVjbGlwc2VFbnZpcm9ubWVudCggSVN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyICkKLSAgewotICAgIElVUklTY2hlbWUgZWNsaXBzZVNjaGVtZSA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlU2NoZW1lKCk7Ci0gICAgSVVSSVNjaGVtZSBmaWxlU2NoZW1lICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAKLSAgICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLSAgICBzdGF0dXNIYW5kbGVyXyAgID0gc3RhdHVzSGFuZGxlcjsKLSAgICAKLSAgICB1cmlGYWN0b3J5Xy5yZWdpc3RlclNjaGVtZSggInBsYXRmb3JtIiwgZWNsaXBzZVNjaGVtZSApOyAvLyROT04tTkxTLTEkCi0gICAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJmaWxlIiwgZmlsZVNjaGVtZSApOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldExvZygpCi0gICAqLwotICBwdWJsaWMgSUxvZyBnZXRMb2coKQotICB7Ci0JICBpZiggbG9nZ2VyXyA9PSBudWxsICkKLSAgICB7ICAKLSAgICAgIGxvZ2dlcl8gPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUxvZygpOyAKLSAgICB9Ci0JCi0gICAgcmV0dXJuIGxvZ2dlcl87Ci0gIH0KLSAgIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzSGFuZGxlciBnZXRTdGF0dXNIYW5kbGVyKCkKLSAgewotICAgIHJldHVybiBzdGF0dXNIYW5kbGVyXzsKLSAgfQotCi0gIC8qKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0VVJJRmFjdG9yeSgpCi0gICAqLwotICBwdWJsaWMgSVVSSUZhY3RvcnkgZ2V0VVJJRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gdXJpRmFjdG9yeV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL0VjbGlwc2VTdGF0dXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZGM4MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL0VjbGlwc2VTdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWkuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpLlN0YXR1c0RpYWxvZ0NvbnN0YW50czsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIEVjbGlwc2UgVUkgdmVyc2lvbiBvZiB0aGUgSVN0YXR1c0hhbmRsZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VTdGF0dXNIYW5kbGVyIGltcGxlbWVudHMgSVN0YXR1c0hhbmRsZXIKLXsKLSAgcHJpdmF0ZSBTaGVsbCAgICAgICAgc2hlbGxfOwotICAKLSAgcHVibGljIEVjbGlwc2VTdGF0dXNIYW5kbGVyKCkKLSAgewotICAgIHRoaXMoIG5ldyBTaGVsbCgpICk7Ci0gIH0KLQotICBwdWJsaWMgRWNsaXBzZVN0YXR1c0hhbmRsZXIoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzaGVsbF8gPSBzaGVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIHJlcG9ydChJU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcykgCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0KLSAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgICBzaGVsbF8sCi0gICAgICAgIE1lc3NhZ2VzLlRJVExFX1dBUk5JTkcsCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMsCi0JCQkJY2hvaWNlcyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICBpZiAoY2hvaWNlc1tpXS5nZXRTaG9ydGN1dCgpID09IHJlc3VsdCkKLSAgICAgICAgcmV0dXJuIGNob2ljZXNbaV07Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQoSVN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gdXNlck9rID0gZmFsc2U7Ci0gICAgCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICAvLyBhbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCBhbmQgd2UgbmVlZCB0byBzdG9wIGV4ZWN1dGluZyB0aGUgY29tbWluZwotICAgICAgLy8gY29tbWFuZHMKLSAgICAgIGNhc2UgU3RhdHVzLkVSUk9SIDoKLSAgICAgIHsKLSAgICAgICAgdXNlck9rID0gcmVwb3J0RXJyb3JTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFN0YXR1cy5XQVJOSU5HIDoKLSAgICAgIHsKLSAgICAgICAgdXNlck9rID0gcmVwb3J0V2FybmluZyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgIAotICAgICAgY2FzZSBTdGF0dXMuSU5GTyA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHRydWU7Ci0gICAgICAgIHJlcG9ydEluZm8oc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmKCAhdXNlck9rICkgdGhyb3cgbmV3IFN0YXR1c0V4Y2VwdGlvbiggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRXYXJuaW5nKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgaW50IHVzZXJSZXNwb25zZSA9Ci0gICAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgICBzaGVsbF8sCi0gICAgICAgIE1lc3NhZ2VzLlRJVExFX1dBUk5JTkcsCi0gICAgICAgIG51bGwsCi0gICAgICAgIHN0YXR1cyk7Ci0gICAgcmV0dXJuICh1c2VyUmVzcG9uc2UgPT0gU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRFcnJvclN0YXR1cyhJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICBzaGVsbF8sCi0gICAgICBNZXNzYWdlcy5USVRMRV9FUlJPUiwKLSAgICAgIG51bGwsCi0gICAgICBzdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgcmVwb3J0RXJyb3JTdGF0dXMoIHN0YXR1cyApOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRJbmZvKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgICAgc2hlbGxfLAotICAgICAgICBNZXNzYWdlcy5USVRMRV9JTkZPLAotICAgICAgICBudWxsLAotICAgICAgICBzdGF0dXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGMyOWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aS5lbnZpcm9ubWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRJVExFX1dBUk5JTkc7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRJVExFX0VSUk9SOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUSVRMRV9JTkZPOwotICAKLSAgc3RhdGljCi0gIHsKLSAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCBCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL2Vudmlyb25tZW50LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvZW52aXJvbm1lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmZGU5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvZW52aXJvbm1lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVElUTEVfV0FSTklORz1XYXJuaW5nOgotVElUTEVfRVJST1I9RXJyb3I6Ci1USVRMRV9JTkZPPUluZm86Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9Db21tb25VSVBsdWdpbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiNTVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9Db21tb25VSVBsdWdpbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25VSVBsdWdpbkNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmMGNmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBEYXRhTW9kZWxXaXphcmRQYWdlW10gY3JlYXRlUGFnZUdyb3VwKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZUdyb3VwSUQpOwotCi0JLyoKLQkgKiB0aGlzIGlzIG9wdGlvbmFsCi0JICovCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGNyZWF0ZVBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZUdyb3VwSUQpIAotCXsKLQkgIHJldHVybiBudWxsOwotCX0KLQkJCi0JLyoqCi0JICogVGhpcyBwYWdlIGdyb3VwIGhhbmRsZXIgY2FuIGJlIG9wdGlvbmFsbHkgb3ZlcnJpZGVuLgotCSAqLwotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoIElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZUdyb3VwSUQgKQotCXsKLQkgIHJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlYWM2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklkZW50aWZpYWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbnZlbmllbnQgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHRoZSBzZW1hbnRpY3Mgb2YgdGhlCi0gKiBnaXZlbiA8Y29kZT5JQ29uZmlndXJhdGlvbkVsZW1lbnQ8L2NvZGU+IGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aGUKLSAqIDxjaXRlPndpemFyZFBhZ2U8L2NpdGU+IGVsZW1lbnQgb2YgdGhlIDxjaXRlPndpemFyZFBhZ2VHcm91cDwvY2l0ZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBrcmFldgotICovCi1wdWJsaWMgY2xhc3MgRE1XaXphcmRQYWdlRWxlbWVudCBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIHsKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgcG9pbnRzIHRvIHRoZSB3aXphcmQsIHdoaWNoIHBhZ2VzIGFyZQotCSAqIGV4dGVuZGVkIGJ5IHRoZSBjdXJyZW50IGNvbnRyaWJ1dGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0laQVJEX0lEID0gIndpemFyZElEIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGZhY3RvcnkgY2xhc3MgbmFtZSwgd2hlcmUgaXMKLQkgKiB0aGUgSmF2YSBjb2RlIHRoYXQgY29udHJpYnV0ZXMgdGhlIG5ldyBjb250cm9scyB0byB0aGUgd2l6YXJkIHBhZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRkFDVE9SWSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBTdHJpbmcgd2l6YXJkSUQ7Ci0JcHJvdGVjdGVkIERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50IGZhY3RvcnlFbGVtZW50OwotCQotCXByaXZhdGUgaW50IGxvYWRPcmRlcjsKLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlcjsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkRNV2l6YXJkUGFnZUVsZW1lbnQ8L2NvZGU+IGZyb20gdGhlIGdpdmVuCi0JICogPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPiB0byB3cmFwLgotCSAqLwotCXB1YmxpYyBETVdpemFyZFBhZ2VFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCQkKLQkJd2l6YXJkSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfV0laQVJEX0lEKTsKLQkJcmVhZEZhY3RvcnkoZWxlbWVudCk7Ci0JCQotCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJZGVudGlmaWFibGUjZ2V0SUQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCVN0cmluZyBpZCA9IHdpemFyZElEOwotCQlpZiAoZmFjdG9yeUVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWQgPSBpZCArICJAIiArIGZhY3RvcnlFbGVtZW50LmNsYXNzTmFtZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpZDsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBJZGVudGlmaWFibGUjZ2V0TG9hZE9yZGVyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIHdpemFyZCB3aGljaCBwYWdlcyB0aGUgY3VycmVudCBleHRlbnNpb24gd2lsbAotCSAqIGNvbnRyaWJ1dGUgdG8uCi0JICogCi0JICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiB3aXphcmRJRDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogPHA+Ci0JICogVGhlIGN1cnJlbnQgZXh0ZW5zaW9uIGNvbnRyaWJ1dGVzIGFkZGl0aW9uYWwgY29udHJvbHMgdG8gdGhlIHNwZWNpZmllZAotCSAqIHBhcmVudCBjb21wb3NpdGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSB3aXphcmQgcGFnZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJaWYgKGZhY3RvcnlFbGVtZW50ICE9IG51bGwpCi0JCQlmYWN0b3J5RWxlbWVudC5jcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMocGFyZW50LCBtb2RlbCwgcGFnZU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmFjdG9yaWVzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFTEVNRU5UX0ZBQ1RPUlkpOwotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwgJiYgZmFjdG9yaWVzLmxlbmd0aCA+IDApIHsKLQkJCWZhY3RvcnlFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KGZhY3Rvcmllc1swXSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyZDVmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgY2xhc3Mgd2hlcmUgdGhlIGFjdHVhbCBleHRlbmRpbmcgb2YgdGhlIHdpemFyZCBwYWdlcyBoYXBwZW4uCi0gKiAKLSAqIDxwPgotICogSW1wbGVtZW50YXRpb24gb2YgdGhpcyBhYnN0cmFjdCBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpbiB0aGUKLSAqIDxjaXRlPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS53aXphcmRQYWdlR3J1b3A8L2NpdGU+IGV4dGVuc2lvbgotICogcG9pbnQgPiA8Y2l0ZT53aXphcmRQYWdlPC9jaXRlPiA+IDxjaXRlPmZhY3Rvcnk8L2NpdGU+ID4gPGNpdGU+Y2xhc3NOYW1lPC9jaXRlPi4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBrcmFldgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCAtCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZSB3aGVyZSB0aGUgYWRkaXRpb25hbCBjb250cm9scyB3aWxsIGJlCi0JICogICAgICAgICAgICBhZGRlZCB0by4KLQkgKiBAcGFyYW0gbW9kZWwgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEgbW9kZWwgb2YgdGhlIHdpemFyZC4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDdkNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gYnVnIDIxMzkyNwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9VSSA9ICJvcmcuZWNsaXBzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlIYXNoTWFwIHdpemFyZFBsdWdpbklETWFwID0gbnVsbDsKLQotCVRyZWVNYXAgd2l6YXJkUGFnZUVsZW1lbnRzID0gbnVsbDsKLQotCS8vIHByaXZhdGUgVHJlZVNldCB3aXphcmRFeHRQYWdlRWxlbWVudHMgPSBudWxsOwotCUxpc3Qgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlciByZWFkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyKCkgewotCQlzZXR1cFdpemFyZFBsdWdpbklETWFwKCk7Ci0JCXJlYWRGcm9tUmVnaXN0cnkoKTsKLQkJcG9zdFJlYWRGcm9tUmVnaXN0cnkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0dXBXaXphcmRQbHVnaW5JRE1hcCgpIHsKLQkJd2l6YXJkUGx1Z2luSURNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyBnZXQgZWRpdG9yIHBsdWdpbiBhbmQgc2F2ZSBpdCB0byBhIGhhc2ggbWFwCi0JCS8vIE5vdGU6IGVkaXRvcnMgZXh0ZW5zaW9uIGlkIGlzIGRpZmZlcmVudCBmcm9tIGVkaXRvciBpZAotCi0JCUlFeHRlbnNpb25Qb2ludFtdIHBvaW50ID0gbmV3IElFeHRlbnNpb25Qb2ludFtde1BsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoT1JHX0VDTElQU0VfVUksICJleHBvcnRXaXphcmRzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChPUkdfRUNMSVBTRV9VSSwgImltcG9ydFdpemFyZHMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KE9SR19FQ0xJUFNFX1VJLCAibmV3V2l6YXJkcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIsICJleHRlbmRhYmxlV2l6YXJkIil9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBvaW50Lmxlbmd0aDsgeCsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50W3hdLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB3aXphcmRJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwbHVnaW5JRCA9IGVsZW1lbnRzW2ldLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJCXdpemFyZFBsdWdpbklETWFwLnB1dCh3aXphcmRJRCwgcGx1Z2luSUQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRGcm9tUmVnaXN0cnkoKSB7Ci0JCXdpemFyZFBhZ2VFbGVtZW50cyA9IG5ldyBUcmVlTWFwKCk7Ci0JCS8vIHdpemFyZEV4dFBhZ2VFbGVtZW50cyA9IG5ldyBUcmVlU2V0KCk7Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gUmVhZCBhbGwgcGFnZSBleHRlbnNpb25zIGludG8gZWRpdG9yUGFnZUVsZW1lbnRzCi0JCXJlYWRlciA9IG5ldyBXaXphcmRQYWdlRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBXaXphcmRQYWdlRXh0ZW5zaW9uUmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JCXB1YmxpYyBXaXphcmRQYWdlRXh0ZW5zaW9uUmVhZGVyKCkgewotCQkJc3VwZXIoQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuUExVR0lOX0lELCBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuRUxFTUVOVF9QQUdFX0dST1VQKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKCFETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuRUxFTUVOVF9QQUdFX0dST1VQLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KGVsZW1lbnQpOwotCi0JCQkvLyBwdXQgdGhlIGVsZW1lbnQgaW50byBhIGhhc2htYXAsIHdpemFyZElEIGFzIGtleSwKLQkJCS8vIGxpc3Qgb2YgcGFnZSBlbGVtZW50cyBhcyBvYmplY3QKLQkJCVN0cmluZyB3aXphcmRJRCA9IG5ld0VsZW1lbnQuZ2V0V2l6YXJkSUQoKTsKLQkJCWlmICghd2l6YXJkUGFnZUVsZW1lbnRzLmNvbnRhaW5zS2V5KHdpemFyZElEKSkgewotCQkJCXdpemFyZFBhZ2VFbGVtZW50cy5wdXQod2l6YXJkSUQsIGNyZWF0ZVBhZ2VNYXBFbnRyeShuZXdFbGVtZW50KSk7Ci0JCQl9IGVsc2UgewotCQkJCVRyZWVNYXAgcGFnZU1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJCQlpbnNlcnRQYWdlRWxlbWVudChwYWdlTWFwLCBuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnNlcnRQYWdlRWxlbWVudChUcmVlTWFwIHBhZ2VNYXAsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlpZiAobmV3RWxlbWVudC5wYWdlSW5zZXJ0aW9uSUQgPT0gbnVsbCkgewotCQkJCXBhZ2VNYXAucHV0KG5ld0VsZW1lbnQsIG5ldyBUcmVlU2V0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBuZXdFbGVtZW50LnBhZ2VJbnNlcnRpb25JRDsKLQkJCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGdldFBhZ2VFbGVtZW50KGVsZW1lbnROYW1lLCBwYWdlTWFwKTsKLQkJCQlpbnNlcnRFeHRQYWdlRWxlbWVudChwYWdlTWFwLCBwYXJlbnRFbGVtZW50LCBuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJbmV3RWxlbWVudC5nZXRQYWdlSW5zZXJ0aW9uSUQoKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluc2VydEV4dFBhZ2VFbGVtZW50KFRyZWVNYXAgcGFnZU1hcCwgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IHBhcmVudEVsZW1lbnQsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmFkZChuZXdFbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoIXBhcmVudEVsZW1lbnQuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCkpIHsKLQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMCwgbmV3IE9iamVjdFtde3BhcmVudEVsZW1lbnQuZ2V0UGFnZUlEKCl9KSk7Ci0JCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzEsIG5ldyBPYmplY3RbXXtuZXdFbGVtZW50LmdldFBhZ2VJRCgpfSkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVRyZWVTZXQgc2V0ID0gKFRyZWVTZXQpIHBhZ2VNYXAuZ2V0KHBhcmVudEVsZW1lbnQpOwotCQkJc2V0LmFkZChuZXdFbGVtZW50KTsKLQotCQkJaWYgKG5ld0VsZW1lbnQuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKQotCQkJCXBhZ2VNYXAucHV0KG5ld0VsZW1lbnQsIG5ldyBUcmVlU2V0KCkpOwotCi0JCQlpZiAobm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmNvbnRhaW5zKG5ld0VsZW1lbnQpKQotCQkJCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5yZW1vdmUobmV3RWxlbWVudCk7Ci0JCX0KLQotCQlwcml2YXRlIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBnZXRQYWdlRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUsIFRyZWVNYXAgbWFwKSB7Ci0JCQlTZXQga2V5U2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0ga2V5U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBlbGVtZW50ID0gKERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0UGFnZUlEKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQotCQl9Ci0KLQkJcHJpdmF0ZSBUcmVlTWFwIGNyZWF0ZVBhZ2VNYXBFbnRyeShETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgbmV3RWxlbWVudCkgewotCQkJVHJlZU1hcCBwYWdlTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkJCVRyZWVTZXQgcGFnZUV4dGVuc2lvblNldCA9IG5ldyBUcmVlU2V0KCk7Ci0JCQlwYWdlTWFwLnB1dChuZXdFbGVtZW50LCBwYWdlRXh0ZW5zaW9uU2V0KTsKLQkJCXJldHVybiBwYWdlTWFwOwotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0V4dGVuc2lvbkVsZW1lbnRzKFN0cmluZyB3aXphcmRJRCkgewotCQlUcmVlTWFwIHRyZWVNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldCh3aXphcmRJRCk7Ci0JCXJldHVybiB0cmVlTWFwLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50W10gZ2V0UGFnZUVsZW1lbnRzKFN0cmluZyB3aXphcmRJRCkgewotCQlUcmVlTWFwIGVsZW1lbnRNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldCh3aXphcmRJRCk7Ci0JCWlmIChlbGVtZW50TWFwID09IG51bGwgfHwgZWxlbWVudE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBuZXcgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50WzBdOwotCQl9Ci0JCUFycmF5TGlzdCBhbHJlYWR5VmlzdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudE1hcC5zaXplKCkpOwotCQlTZXQgYWxsUGFnZUVsZW1lbnRzTGlzdCA9IGVsZW1lbnRNYXAua2V5U2V0KCk7Ci0JCUFycmF5TGlzdCBvcmRlcmVkUGFnZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRNYXAuc2l6ZSgpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxQYWdlRWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhbHJlYWR5VmlzdGVkTGlzdC5jb250YWlucyhlbGVtZW50KSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGVsZW1lbnQuZ2V0SUQoKSwgbnVsbCkuaXNFbmFibGVkKCkpIHsKLQkJCQlvcmRlcmVkUGFnZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCVRyZWVTZXQgdHJlZVNldCA9IChUcmVlU2V0KSBlbGVtZW50TWFwLmdldChlbGVtZW50KTsKLQkJCQlpZiAodHJlZVNldCAhPSBudWxsICYmICF0cmVlU2V0LmlzRW1wdHkoKSkKLQkJCQkJZmxhdGVuVHJlZVNldCh0cmVlU2V0LCBhbGxQYWdlRWxlbWVudHNMaXN0LCBhbHJlYWR5VmlzdGVkTGlzdCwgb3JkZXJlZFBhZ2VMaXN0LCBlbGVtZW50TWFwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0UGFnZUFycmF5KG9yZGVyZWRQYWdlTGlzdCk7Ci0KLQl9Ci0KLQlwcml2YXRlIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudFtdIGdldFBhZ2VBcnJheShBcnJheUxpc3Qgb3JkZXJlZFBhZ2VMaXN0KSB7Ci0JCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudFtdIHBhZ2VFbGVtZW50cyA9IG5ldyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnRbb3JkZXJlZFBhZ2VMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJlZFBhZ2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwYWdlRWxlbWVudHNbaV0gPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBvcmRlcmVkUGFnZUxpc3QuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBwYWdlRWxlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZsYXRlblRyZWVTZXQoVHJlZVNldCB0cmVlU2V0LCBTZXQgYWxsUGFnZUVsZW1lbnRzTGlzdCwgQXJyYXlMaXN0IGFscmVhZHlWaXN0ZWRMaXN0LCBBcnJheUxpc3Qgb3JkZXJlZFBhZ2VMaXN0LCBUcmVlTWFwIGVsZW1lbnRNYXApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHJlZVNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBlbGVtZW50ID0gKERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWxyZWFkeVZpc3RlZExpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMiwgbmV3IE9iamVjdFtde2VsZW1lbnQuZ2V0UGFnZUlEKCksIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudC5BVFRfUEFHRV9JTlNFUlRJT05fSUR9KSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChhbGxQYWdlRWxlbWVudHNMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJVHJlZVNldCBzZXQgPSAoVHJlZVNldCkgZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJb3JkZXJlZFBhZ2VMaXN0LmFkZChlbGVtZW50KTsKLQkJCQlhbHJlYWR5VmlzdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJZmxhdGVuVHJlZVNldChzZXQsIGFsbFBhZ2VFbGVtZW50c0xpc3QsIGFscmVhZHlWaXN0ZWRMaXN0LCBvcmRlcmVkUGFnZUxpc3QsIGVsZW1lbnRNYXApOwotCQkJfSBlbHNlIHsKLQkJCQlvcmRlcmVkUGFnZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCWFscmVhZHlWaXN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBpZiBjaGlsZCBlbGVtZW50cyBhcmUgcmVhZCBpbiBiZWZvcmUgcGFyZW50IGVsZW1lbnQuIERvIHBvc3QgcmVhZC4KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGxpc3RSZW1vdmVPYmplY3RzOwotCi0JcHJpdmF0ZSB2b2lkIHBvc3RSZWFkRnJvbVJlZ2lzdHJ5KCkgewotCQlsaXN0UmVtb3ZlT2JqZWN0cyA9IG5ldyBBcnJheUxpc3Qobm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5nZXQoaSk7Ci0JCQlUcmVlTWFwIHBhZ2VNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldChlbGVtZW50LndpemFyZElEKTsKLQkJCWlmIChlbGVtZW50LnBhZ2VJbnNlcnRpb25JRCA9PSBudWxsKSB7Ci0JCQkJYWRkVG9GaXJzdEF2aWFsaWFibGUocGFnZU1hcCwgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKHJlYWRlciAhPSBudWxsICYmIHBhZ2VNYXAgIT0gbnVsbCkKLQkJCQlyZWFkZXIuaW5zZXJ0UGFnZUVsZW1lbnQocGFnZU1hcCwgZWxlbWVudCk7Ci0JCX0KLQkJbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnJlbW92ZUFsbChsaXN0UmVtb3ZlT2JqZWN0cyk7Ci0JCWlmICghbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmlzRW1wdHkoKSkKLQkJCWxvZ01pc3NpbmdDbGFzc0Vycm9yKCk7Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jbGVhcigpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhZ2VNYXAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUb0ZpcnN0QXZpYWxpYWJsZShUcmVlTWFwIHBhZ2VNYXAsIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCWJvb2xlYW4gaW5zZXJ0Tm90Rm91bmQgPSB0cnVlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcikgewotCQkJCVRyZWVTZXQgc2V0ID0gKFRyZWVTZXQpIHBhZ2VNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCXNldC5hZGQobmV3RWxlbWVudCk7Ci0JCQkJbGlzdFJlbW92ZU9iamVjdHMuYWRkKG5ld0VsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAoaW5zZXJ0Tm90Rm91bmQpIHsKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzMpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nTWlzc2luZ0NsYXNzRXJyb3IoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQpIG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5nZXQoaSk7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfNCwgbmV3IE9iamVjdFtde2VsZW1lbnQucGFnZUluc2VydGlvbklELCBlbGVtZW50LmdldFBhZ2VJRCgpLCBlbGVtZW50LnBsdWdpbklEfSkpOwotCQl9Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jbGVhcigpOwotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRWpiUGFnZUV4dGVuc2lvblJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwZDQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkNvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBjb252ZW5pZW50IG1ldGhvZHMgZm9yIGFjY2Vzc2luZyB0aGUgc2VtYW50aWNzIG9mIHRoZQotICogZ2l2ZW4gPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPiBpbiB0aGUgY29udGV4dCBvZiB0aGUKLSAqIDxjaXRlPmZhY3Rvcnk8L2NpdGU+IGVsZW1lbnQgYXMgYSBjaGlsZCBlbGVtZW50IG9mIHRoZSA8Y2l0ZT53aXphcmRQYWdlPC9jaXRlPgotICogZWxlbWVudCBvZiB0aGUgPGNpdGU+d2l6YXJkUGFnZUdyb3VwPC9jaXRlPiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3Iga3JhZXYKLSAqLwotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50IGV4dGVuZHMgQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyIHsKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgcG9pbnRzIHRvIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotCSAqIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgPGNvZGU+RE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeTwvY29kZT4KLQkgKiBhYnN0cmFjdCBjbGFzcy4gVGhpcyBjbGFzcyBkb2VzIHRoZSBhY3R1YWwgam9iIG9uIGV4dGVuZGluZyBhIHdpemFyZAotCSAqIHBhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotCXByb3RlY3RlZCBETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5IHdpemFyZFBhZ2VGYWN0b3J5OwotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFnZUZhY3RvcnlJbml0aWFsaXplZDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQ8L2NvZGU+IGZyb20gdGhlIGdpdmVuCi0JICogPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+SUNvbmZpZ3VyYXRpb25FbGVtZW50PC9jb2RlPiB0byB3cmFwLgotCSAqLwotCXB1YmxpYyBETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihlbGVtZW50KTsKLQkJY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTX05BTUUpOwotCQkKLQkJaXNQYWdlRmFjdG9yeUluaXRpYWxpemVkID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhZGRpdGlvbmFsIGNvbnRyb2xzIGZvciB0aGUgc3BlY2lmaWVkIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JICogPGNvZGU+RE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeTwvY29kZT4gYWJzdHJhY3QgY2xhc3MsIHRoYXQgaXMKLQkgKiBkZWZpbmVkIGluIHRoZSA8Y2l0ZT5jbGFzc05hbWU8L2NpdGU+IGF0dHJpYnV0ZSwgaXMgaW5pdGlhbGl6ZWQuIFRoZW4KLQkgKiB0aGUgbWV0aG9kIGZvcndhcmRzIHRoZSBjYWxsIHRvIHRoZSBmYWN0b3J5IGNsYXNzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlIHdoZXJlIHRoZSBhZGRpdGlvbmFsIGNvbnRyb2xzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGFkZGVkIHRvLgotCSAqIEBwYXJhbSBtb2RlbCAtCi0JICogICAgICAgICAgICB0aGUgZGF0YSBtb2RlbCBvZiB0aGUgd2l6YXJkLgotCSAqIEBwYXJhbSBwYWdlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5kZWQgd2l6YXJkIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlpZiAoIWlzUGFnZUZhY3RvcnlJbml0aWFsaXplZCkKLQkJCWluaXRQYWdlRmFjdG9yeSgpOwotCi0JCWlmICh3aXphcmRQYWdlRmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJd2l6YXJkUGFnZUZhY3RvcnkuY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKHBhcmVudCwgbW9kZWwsIHBhZ2VOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRQYWdlRmFjdG9yeSgpIHsKLQkJdHJ5IHsKLQkJCXdpemFyZFBhZ2VGYWN0b3J5ID0gKERNV2l6YXJkUGFnZUV4dGVuc2lvbkZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1NfTkFNRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoIkVycm9yIGdldHRpbmcgcGFnZSBmYWN0b3J5OiAiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJCAKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaXNQYWdlRmFjdG9yeUluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1ZjQzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQUdFX0dST1VQID0gIndpemFyZFBhZ2VHcm91cCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQUdFX0lEID0gInBhZ2VHcm91cElEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1dJWkFSRF9JRCA9ICJ3aXphcmRJRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9SRVFVSVJFU19EQVRBX09QRVJBVElPTl9JRCA9ICJyZXF1aXJlc0RhdGFPcGVyYXRpb25JZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9EQVRBX01PREVMX0lEUyA9ICJkYXRhTW9kZWxJZHMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQUxMT1dTX0VYVEVOREVEX1BBR0VTX0FGVEVSID0gImFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQUdFX0lOU0VSVElPTl9JRCA9ICJwYWdlR3JvdXBJbnNlcnRpb25JRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRkFDVE9SWSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQgd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50OwotCXByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSUQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB3aXphcmRJRDsKLQlwdWJsaWMgU3RyaW5nIHBhZ2VHcm91cElEOwotCXByb3RlY3RlZCBTdHJpbmcgd2l6YXJkRmFjdG9yeUVsZW1lbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCXByb3RlY3RlZCBTdHJpbmcgcmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQ7Ci0JcHJvdGVjdGVkIFNldCBkYXRhTW9kZWxJRHM7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYWdlSW5zZXJ0aW9uSUQ7Ci0JcHJpdmF0ZSBpbnQgbG9hZE9yZGVyOwotCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyOwotCi0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHVibGljIERNV2l6YXJkUGFnZUdyb3VwRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDEpIHsKLQkJc3VwZXIoZWxlbWVudDEpOwotCQlwbHVnaW5JRCA9IGVsZW1lbnQxLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQl3aXphcmRJRCA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfV0laQVJEX0lEKTsKLQkJcGFnZUdyb3VwSUQgPSBlbGVtZW50MS5nZXRBdHRyaWJ1dGUoQVRUX1BBR0VfSUQpOwotCQlyZXF1aXJlc0RhdGFPcGVyYXRpb25JZCA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfUkVRVUlSRVNfREFUQV9PUEVSQVRJT05fSUQpOwotCQlkYXRhTW9kZWxJRHMgPSBnZXREYXRhTW9kZWxJZHMoIGVsZW1lbnQxICk7Ci0JCXJlYWRBbGxvd3NFeHRlbmRlZFBhZ2VBZnRlcihlbGVtZW50MSk7Ci0JCXBhZ2VJbnNlcnRpb25JRCA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfUEFHRV9JTlNFUlRJT05fSUQpOwotCQlyZWFkRmFjdG9yeShlbGVtZW50MSk7Ci0JCXZhbGlkYXRlU2V0dGluZ3MoKTsKLQkJbG9hZE9yZGVyID0gbG9hZE9yZGVyQ291bnRlcisrOwotCX0KLQotICBwcml2YXRlIFNldCBnZXREYXRhTW9kZWxJZHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgSGFzaFNldCBpZHMgICAgPSBuZXcgSGFzaFNldCgpOwotICAgIFN0cmluZyAgaWRMaXN0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RBVEFfTU9ERUxfSURTKTsKLSAgICAKLSAgICBpZiggaWRMaXN0ICE9IG51bGwgKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIGRhdGFNb2RlbElEcyA9IGlkTGlzdC5zcGxpdCggIiAqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhTW9kZWxJRHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgaWRzLmFkZCggZGF0YU1vZGVsSURzW2luZGV4XSApOyAgCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpZHM7Ci0gIH0KLSAgCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2V0dGluZ3MoKSB7Ci0JCWlmICh3aXphcmRJRCA9PSBudWxsIHx8IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCA9PSBudWxsKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcigiSW5jb21wbGV0ZSBwYWdlIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCByZWFkQWxsb3dzRXh0ZW5kZWRQYWdlQWZ0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCVN0cmluZyBhbGxvd3NQYWdlQWZ0ZXJWYWx1ZSA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfQUxMT1dTX0VYVEVOREVEX1BBR0VTX0FGVEVSKTsKLQkJYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyID0gYWxsb3dzUGFnZUFmdGVyVmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKGFsbG93c1BhZ2VBZnRlclZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY3RvcmllcyA9IGVsZW1lbnQxLmdldENoaWxkcmVuKEVMRU1FTlRfRkFDVE9SWSk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCAmJiBmYWN0b3JpZXMubGVuZ3RoID4gMCkgewotCQkJd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQoZmFjdG9yaWVzWzBdLCBwYWdlR3JvdXBJRCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgY3JlYXRlUGFnZUhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkUGFnZVtdIGNyZWF0ZVBhZ2VHcm91cChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAod2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0JCXJldHVybiBJZGVudGlmaWFibGVDb21wYXJhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLCBvKTsKLQkJLyoKLQkJICogaWYgKG8gPT0gbnVsbCkgcmV0dXJuIEdSRUFURVJfVEhBTjsgV2l6YXJkUGFnZUVsZW1lbnQgZWxlbWVudCA9IChXaXphcmRQYWdlRWxlbWVudCkgbzsgaWYKLQkJICogKGdldElEKCkgPT0gbnVsbCAmJiBlbGVtZW50LmdldElEKCkgPT0gbnVsbCkgcmV0dXJuIGNvbXBhcmVMb2FkT3JkZXIoZWxlbWVudCk7IGlmCi0JCSAqIChnZXRJRCgpID09IG51bGwpIHJldHVybiBHUkVBVEVSX1RIQU47IGVsc2UgaWYgKGVsZW1lbnQuZ2V0SUQoKSA9PSBudWxsKSByZXR1cm4KLQkJICogTEVTU19USEFOOwotCQkgKiAKLQkJICogaW50IHByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoKTsgaW50IGVsZW1lbnRQcmlvcml0eSA9ZWxlbWVudC5nZXRQcmlvcml0eSgpOwotCQkgKiAKLQkJICogaWYgKHByaW9yaXR5ID09IGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIGNvbXBhcmVMb2FkT3JkZXIoZWxlbWVudCk7IGlmIChwcmlvcml0eSA8Ci0JCSAqIGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIEdSRUFURVJfVEhBTjsgaWYgKHByaW9yaXR5ID4gZWxlbWVudFByaW9yaXR5KSByZXR1cm4gTEVTU19USEFOOwotCQkgKiByZXR1cm4gRVFVQUw7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKSB7Ci0JCXJldHVybiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBwbHVnaW5JRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlSUQoKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBJRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlSW5zZXJ0aW9uSUQoKSB7Ci0JCXJldHVybiBwYWdlSW5zZXJ0aW9uSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgewotCQlyZXR1cm4gbG9hZE9yZGVyOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKSB7Ci0JCXJldHVybiBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcgotCSAqICAgICAgICAgICAgVGhlIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKGJvb2xlYW4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKSB7Ci0JCXRoaXMuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyID0gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQoKSB7Ci0JCXJldHVybiByZXF1aXJlc0RhdGFPcGVyYXRpb25JZDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKFN0cmluZyBkYXRhT3BlcmF0aW9uSWQpIHsKLQkJcmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQgPSBkYXRhT3BlcmF0aW9uSWQ7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWxJRHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsSUQoU2V0IG5ld0RhdGFNb2RlbElEcykgewotCQlkYXRhTW9kZWxJRHMgPSBuZXdEYXRhTW9kZWxJRHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRGYWN0b3J5RWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEZhY3RvcnlFbGVtZW50KCkgewotCQlyZXR1cm4gd2l6YXJkRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZEZhY3RvcnlFbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgd2l6YXJkRmFjdG9yeUVsZW1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZEZhY3RvcnlFbGVtZW50KFN0cmluZyB3aXphcmRGYWN0b3J5RWxlbWVudCkgewotCQl0aGlzLndpemFyZEZhY3RvcnlFbGVtZW50ID0gd2l6YXJkRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCkgewotCQlyZXR1cm4gd2l6YXJkSUQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZElECi0JICogICAgICAgICAgICBUaGUgd2l6YXJkSUQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZElEKFN0cmluZyB3aXphcmRJRCkgewotCQl0aGlzLndpemFyZElEID0gd2l6YXJkSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuCi0JICovCi0JcHVibGljIERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQgZ2V0V2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KCkgewotCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudChETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCkgewotCQl0aGlzLndpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCA9IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudDsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlSUQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlSUQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VJRChTdHJpbmcgcGFnZUlEKSB7Ci0JCXRoaXMucGFnZUdyb3VwSUQgPSBwYWdlSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBnZXRQYWdlSUQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkYTQ2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VHcm91cEZhY3RvcnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkNvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQgZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5IHdpemFyZFBhZ2VHcm91cEZhY3Rvcnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWdlR3JvdXBGYWN0b3J5SW5pdGlhbGl6ZWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYWdlR3JvdXBJRDsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIERNV2l6YXJkUGFnZUdyb3VwRmFjdG9yeUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwYWdlR3JvdXBJRCkgewotCQlzdXBlcihlbGVtZW50KTsKLQkJY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTX05BTUUpOwotCQl0aGlzLnBhZ2VHcm91cElEID0gcGFnZUdyb3VwSUQ7Ci0JfQotCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGNyZWF0ZVBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmICghaXNQYWdlR3JvdXBGYWN0b3J5SW5pdGlhbGl6ZWQpCi0JCQlpbml0UGFnZUZhY3RvcnkoKTsKLQkJaWYgKHdpemFyZFBhZ2VHcm91cEZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlETVBhZ2VIYW5kbGVyIGhhbmRsZXIgPSB3aXphcmRQYWdlR3JvdXBGYWN0b3J5LmNyZWF0ZVBhZ2VIYW5kbGVyKGRhdGFNb2RlbCwgcGFnZUdyb3VwSUQpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkUGFnZVtdIGNyZWF0ZVBhZ2VHcm91cChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoIWlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkKQotCQkJaW5pdFBhZ2VGYWN0b3J5KCk7Ci0KLQkJaWYgKHdpemFyZFBhZ2VHcm91cEZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCURhdGFNb2RlbFdpemFyZFBhZ2VbXSBwYWdlcyA9IHdpemFyZFBhZ2VHcm91cEZhY3RvcnkuY3JlYXRlUGFnZUdyb3VwKGRhdGFNb2RlbCwgcGFnZUdyb3VwSUQpOwotCQkKLQkJcmV0dXJuIHBhZ2VzOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoIElEYXRhTW9kZWwgZGF0YU1vZGVsICkKLQl7Ci0JICBpZiAoIWlzUGFnZUdyb3VwRmFjdG9yeUluaXRpYWxpemVkKSBpbml0UGFnZUZhY3RvcnkoKTsKLQkJCi0JICBpZiggd2l6YXJkUGFnZUdyb3VwRmFjdG9yeSA9PSBudWxsICkgcmV0dXJuIG51bGw7Ci0JICAKLQkgIHJldHVybiB3aXphcmRQYWdlR3JvdXBGYWN0b3J5LmNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoIGRhdGFNb2RlbCwgcGFnZUdyb3VwSUQgKTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZUZhY3RvcnkoKSB7Ci0JCXRyeSB7Ci0JCQl3aXphcmRQYWdlR3JvdXBGYWN0b3J5ID0gKERNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTU19OQU1FKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcigiRXJyb3IgZ2V0dGluZyBwYWdlIGZhY3Rvcnk6ICIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkIAotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpc1BhZ2VHcm91cEZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1YzA0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9EYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OID0gIkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVCA9ICJEYXRhTW9kZWxXaXphcmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNoTWFwIGV4dGVuc2lvbnM7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlzdXBlcihXVFBVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9JRCk7Ci0JCWlmIChudWxsID09IGlkIHx8IGlkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIEVMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9JRCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfQ0xBU1MpOwotCQlpZiAobnVsbCA9PSBjbGFzc05hbWUgfHwgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIEVMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9DTEFTUykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWFkZEV4dGVuc2lvbihpZCwgZWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlbnNpb24oU3RyaW5nIGlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZXh0ZW5zaW9ucy5jb250YWluc0tleShpZCkpIHsKLQkJCVdUUFVJUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEdXBsaWNhdGUgIiArIEVMRU1FTlQgKyAiICIgKyBBVFRSSUJVVEVfSUQgKyAiICIgKyBpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWV4dGVuc2lvbnMucHV0KGlkLCBlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEV4dGVuc2lvbihTdHJpbmcgaWQpIHsKLQkJaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJZXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGV4dGVuc2lvbnMuZ2V0KGlkKTsKLQkJaWYgKG51bGwgPT0gZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBFTEVNRU5UICsgIiBub3QgZm91bmQgZm9yICIgKyBBVFRSSUJVVEVfSUQgKyAiOiAiICsgaWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZCBnZXRXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJRGF0YU1vZGVsV2l6YXJkIHdpemFyZCA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0RXh0ZW5zaW9uKGRhdGFNb2RlbC5nZXRJRCgpKTsKLQotCQl0cnkgewotCQkJd2l6YXJkID0gKERhdGFNb2RlbFdpemFyZCkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJJQlVURV9DTEFTUyk7Ci0JCQl3aXphcmQuc2V0RGF0YU1vZGVsKGRhdGFNb2RlbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gd2l6YXJkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0V4dGVuc2libGVWaWV3UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0V4dGVuc2libGVWaWV3UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5NzUyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9FeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVWaWV3UmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQlwcml2YXRlIE1hcCBleHRlbmRlZFZpZXdlck1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZGVzY3JpcHRvck1hcCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIEVsZW1lbnRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfVklFV0VSID0gImV4dGVuZGVkVmlld2VyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXRVJfSUQgPSAidmlld2VySUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9WSUVXRVJfSUQgPSAicGFyZW50Vmlld2VySUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1MgPSAiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9HUk9VUF9JRCA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeSgpIHsKLQkJc3VwZXIoV1RQVUlQbHVnaW4uUExVR0lOX0lELCBXVFBVSVBsdWdpbi5FWFRFTkRFRF9WSUVXRVJfUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEV4dGVuc2libGVWaWV3UmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcgdmlld2VySUQpIHsKLQkJcmV0dXJuIChEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yTWFwKCkuZ2V0KHZpZXdlcklEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnJlZ2lzdHJ5LlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFbGVtZW50cy5FWFRFTkRFRF9WSUVXRVIpKSB7Ci0JCQlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWdldERlc2NyaXB0b3JNYXAoKS5wdXQoZGVzY3JpcHRvci5nZXRWaWV3ZXJJRCgpLCBkZXNjcmlwdG9yKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuZGVkVmlld2VyTWFwLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RXh0ZW5kZWRWaWV3ZXJNYXAoKSB7Ci0JCWlmIChleHRlbmRlZFZpZXdlck1hcCA9PSBudWxsKQotCQkJZXh0ZW5kZWRWaWV3ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRWaWV3ZXJNYXA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yTWFwLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0RGVzY3JpcHRvck1hcCgpIHsKLQkJaWYgKGRlc2NyaXB0b3JNYXAgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvck1hcDsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRGVzY3JpcHRvciB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdmlld2VySUQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBwYXJlbnRWaWV3ZXJJRCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZhY3RvcnlDbGFzcyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGljb24gPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZ1bmN0aW9uR3JvdXBJRCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmdDYWNoZSA9IG51bGw7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0JCS8qKgotCQkgKiAgCi0JCSAqLwotCQlwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQotCQkJdGhpcy52aWV3ZXJJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5WSUVXRVJfSUQpOwotCQkJdGhpcy5wYXJlbnRWaWV3ZXJJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5QQVJFTlRfVklFV0VSX0lEKTsKLQkJCXRoaXMuZmFjdG9yeUNsYXNzID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkVsZW1lbnRzLkZBQ1RPUllfQ0xBU1MpOwotCQkJdGhpcy5pY29uID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkVsZW1lbnRzLklDT04pOwotCQkJdGhpcy5sYWJlbCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5MQUJFTCk7Ci0JCQl0aGlzLmZ1bmN0aW9uR3JvdXBJRCA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5GVU5DVElPTl9HUk9VUF9JRCk7Ci0JCX0KLQotCQlwdWJsaWMgSUV4dGVuc2libGVWaWV3RmFjdG9yeSBjcmVhdGVGYWN0b3J5SW5zdGFuY2UoKSB7Ci0JCQlJRXh0ZW5zaWJsZVZpZXdGYWN0b3J5IGZhY3RvcnlJbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZhY3RvcnlJbnN0YW5jZSA9IChJRXh0ZW5zaWJsZVZpZXdGYWN0b3J5KSB0aGlzLmVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihnZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiBmYWN0b3J5SW5zdGFuY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmYWN0b3J5Q2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpIHsKLQkJCXJldHVybiBmYWN0b3J5Q2xhc3M7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmdW5jdGlvbkdyb3VwSUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uR3JvdXBJRCgpIHsKLQkJCXJldHVybiBmdW5jdGlvbkdyb3VwSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBpY29uLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJY29uKCkgewotCQkJcmV0dXJuIGljb247Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBsYWJlbC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJlbnRWaWV3ZXJJRC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50Vmlld2VySUQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50Vmlld2VySUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB2aWV3ZXJJRC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld2VySUQoKSB7Ci0JCQlyZXR1cm4gdmlld2VySUQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmICh0b1N0cmluZ0NhY2hlID09IG51bGwpCi0JCQkJdG9TdHJpbmdDYWNoZSA9ICJFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkluZm8gW3ZpZXdlcklEPVwiIiArIGdldFZpZXdlcklEKCkgKyAiXCIscGFyZW50Vmlld2VySUQ9XCIiICsgZ2V0UGFyZW50Vmlld2VySUQoKSArICJcIixmYWN0b3J5Q2xhc3M9IiArIGdldEZhY3RvcnlDbGFzcygpICsgIlwiLGZ1bmN0aW9uR3JvdXBJRD1cIiIgKyBnZXRGdW5jdGlvbkdyb3VwSUQoKSArICJcIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCXJldHVybiB0b1N0cmluZ0NhY2hlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JRXh0ZW5zaWJsZVZpZXdGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JRXh0ZW5zaWJsZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTkzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSUV4dGVuc2libGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbnNpYmxlVmlld0ZhY3RvcnkgewotCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lPcGVyYXRpb25Ob2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JT3BlcmF0aW9uTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWVlYTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lPcGVyYXRpb25Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA1LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uTm9kZSB7Ci0KLQlwdWJsaWMgSU9wZXJhdGlvbk5vZGVbXSBnZXRDaGlsZHJlbigpOwotCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCk7Ci0KLQkvKioKLQkgKiBTYW1lIGFzIGNhbGxpbmcgc2V0Q2hlY2tlZChjaGVja2VkLCB0cnVlKQotCSAqIAotCSAqIEBwYXJhbSBjaGVja2VkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlwdWJsaWMgSU9wZXJhdGlvbk5vZGUgZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbHdheXNFeGVjdXRlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9BYnN0cmFjdFdUUFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Fic3RyYWN0V1RQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3MDM1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Fic3RyYWN0V1RQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEwLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdUUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXByb3RlY3RlZCBzdGF0aWMgQWJzdHJhY3RXVFBVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7IAotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RXVFBVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGx1Z2luSUQoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydHVwKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9DbG9zYWJsZVdpemFyZERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9DbG9zYWJsZVdpemFyZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE2YzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI0LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2FibGVXaXphcmREaWFsb2cgZXh0ZW5kcyBXaXphcmREaWFsb2cgewotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBuZXdXaXphcmQKLQkgKi8KLQlwdWJsaWMgQ2xvc2FibGVXaXphcmREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElXaXphcmQgbmV3V2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBuZXdXaXphcmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbmlzaEFuZENsb3NlKCkgewotCQlzdXBlci5maW5pc2hQcmVzc2VkKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRE1QYWdlR3JvdXBFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9ETVBhZ2VHcm91cEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWVmM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9ETVBhZ2VHcm91cEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRNV2l6YXJkUGFnZUdyb3VwRWxlbWVudDsKLQotcHVibGljIGNsYXNzIERNUGFnZUdyb3VwRWxlbWVudEltcGwgaW1wbGVtZW50cyBJRE1QYWdlR3JvdXAgewotCXByaXZhdGUgRE1XaXphcmRQYWdlR3JvdXBFbGVtZW50IHBhZ2VHcm91cEVsZW1lbnQ7Ci0KLQlwcml2YXRlIExpc3QgcGFnZXM7Ci0JCi0JcHVibGljIERNUGFnZUdyb3VwRWxlbWVudEltcGwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJcGFnZUdyb3VwRWxlbWVudCA9IG5ldyBETVdpemFyZFBhZ2VHcm91cEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZERhdGFPcGVyYXRpb25Ub1J1bigpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuZ2V0UmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldERhdGFNb2RlbElEcygpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuZ2V0RGF0YU1vZGVsSURzKCk7Ci0JfQotCi0JcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgZ2V0UGFnZUdyb3VwSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZUdyb3VwRWxlbWVudC5jcmVhdGVQYWdlR3JvdXBIYW5kbGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UGFnZXMoSURhdGFNb2RlbCBkYXRhTW9kZWwpewotCQlpZiAocGFnZXMgPT0gbnVsbCkgewotCQkJcGFnZXMgPSBBcnJheXMuYXNMaXN0KHBhZ2VHcm91cEVsZW1lbnQuY3JlYXRlUGFnZUdyb3VwKGRhdGFNb2RlbCkpOwotCQl9Ci0JCXJldHVybiBwYWdlczsKLQl9Ci0JCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGdldFBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBwYWdlR3JvdXBFbGVtZW50LmNyZWF0ZVBhZ2VIYW5kbGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJRCgpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuZ2V0UGFnZUlEKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJbnNlcnRpb25JRCgpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuZ2V0UGFnZUluc2VydGlvbklEKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEVsZW1lbnQuZ2V0V2l6YXJkSUQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRGlzcGxheVV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRGlzcGxheVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjYTQwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxOSwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5VXRpbGl0eSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0KLQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkID09IG51bGwpCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQllbHNlCi0JCQlydW5uYWJsZS5ydW4oKTsKLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXJyb3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYTI0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Vycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQWRkZWQgYSBEZXRhaWxzIGJ1dHRvbiB0byB0aGUgTWVzc2FnZURpYWxvZyB0byBzaG93IHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2UuCi0gKiAKLSAqIEJvcnJvd2VkIGZyb20gYW4gZWNsaXBzZSBJbnRlcm5hbEVycm9yRGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckRpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEFCRUxTX09LX0NBTkNFTCA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfREVUQUlMUyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfQ0FOQ0VMX0RFVEFJTFMgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMfTsKLQlwcml2YXRlIFRocm93YWJsZSBkZXRhaWw7Ci0JcHJpdmF0ZSBpbnQgZGV0YWlsQnV0dG9uSUQgPSAtMTsKLQlwcml2YXRlIFRleHQgdGV4dDsKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCS8vV29ya2Fyb3VuZC4gU1dUIGRvZXMgbm90IHNlZW0gdG8gc2V0IHRoZSBkZWZhdWx0IGJ1dHRvbiBpZgotCS8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotCXByaXZhdGUgaW50IGRlZmF1bHRCdXR0b25JbmRleCA9IDA7Ci0JLyoqCi0JICogU2l6ZSBvZiB0aGUgdGV4dCBpbiBsaW5lcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9MSU5FX0NPVU5UID0gMTU7Ci0KLQlwdWJsaWMgRXJyb3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIFRocm93YWJsZSBkZXRhaWwsIGludCBkaWFsb2dJbWFnZVR5cGUsIFN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ1RpdGxlSW1hZ2UsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCQlkZWZhdWx0QnV0dG9uSW5kZXggPSBkZWZhdWx0SW5kZXg7Ci0JCXRoaXMuZGV0YWlsID0gZGV0YWlsOwotCQltZXNzYWdlID0gZGlhbG9nTWVzc2FnZTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsKLQl9Ci0KLQkvL1dvcmthcm91bmQuIFNXVCBkb2VzIG5vdCBzZWVtIHRvIHNldCByaWd0aCB0aGUgZGVmYXVsdCBidXR0b24gaWYKLQkvL3RoZXJlIGlzIG5vdCBjb250cm9sIHdpdGggZm9jdXMuIEJ1ZzogMTQ2NjgKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWNyZWF0ZSgpOwotCQlCdXR0b24gYiA9IGdldEJ1dHRvbihkZWZhdWx0QnV0dG9uSW5kZXgpOwotCQliLnNldEZvY3VzKCk7Ci0JCWIuZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKGIpOwotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGV0YWlsIGJ1dHRvbjsKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXRhaWxCdXR0b24oaW50IGluZGV4KSB7Ci0JCWRldGFpbEJ1dHRvbklEID0gaW5kZXg7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IGRldGFpbEJ1dHRvbklEKSB7Ci0JCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQl9IGVsc2UgewotCQkJc2V0UmV0dXJuQ29kZShidXR0b25JZCk7Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHByZXNzaW5nIHRoZSBkZXRhaWxzCi0JICogYnV0dG9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpIHsKLQkJUG9pbnQgd2luZG93U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlQb2ludCBvbGRTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCXRleHQgPSBudWxsOwotCQkJZ2V0QnV0dG9uKGRldGFpbEJ1dHRvbklEKS5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZURyb3BEb3duVGV4dCgoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLQkJCWdldEJ1dHRvbihkZXRhaWxCdXR0b25JRCkuc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCX0KLQkJUG9pbnQgbmV3U2l6ZSA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJZ2V0U2hlbGwoKS5zZXRTaXplKG5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueSArIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoaXMgZGlhbG9nJ3MgZHJvcC1kb3duIGxpc3QgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgZHJvcC1kb3duIGxpc3QgY29tcG9uZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHJvcERvd25UZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCXRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQkvLyBwcmludCB0aGUgc3RhY2t0cmFjZSBpbiB0aGUgdGV4dCBmaWVsZAotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShiYW9zKTsKLQkJCWRldGFpbC5wcmludFN0YWNrVHJhY2UocHMpOwotCQkJaWYgKChkZXRhaWwgaW5zdGFuY2VvZiBTV1RFcnJvcikgJiYgKCgoU1dURXJyb3IpIGRldGFpbCkudGhyb3dhYmxlICE9IG51bGwpKSB7Ci0JCQkJcHMucHJpbnRsbigiXG4qKiogU3RhY2sgdHJhY2Ugb2YgY29udGFpbmVkIGV4Y2VwdGlvbiAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCSgoU1dURXJyb3IpIGRldGFpbCkudGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQl9IGVsc2UgaWYgKChkZXRhaWwgaW5zdGFuY2VvZiBTV1RFeGNlcHRpb24pICYmICgoKFNXVEV4Y2VwdGlvbikgZGV0YWlsKS50aHJvd2FibGUgIT0gbnVsbCkpIHsKLQkJCQlwcy5wcmludGxuKCJcbioqKiBTdGFjayB0cmFjZSBvZiBjb250YWluZWQgZXhjZXB0aW9uICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJKChTV1RFeGNlcHRpb24pIGRldGFpbCkudGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQl9Ci0JCQlwcy5mbHVzaCgpOwotCQkJYmFvcy5mbHVzaCgpOwotCQkJdGV4dC5zZXRUZXh0KGJhb3MudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiBURVhUX0xJTkVfQ09VTlQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGRldGFpbCwgaW50IGRlZmF1bHRJbmRleCwgYm9vbGVhbiBzaG93Q2FuY2VsKSB7Ci0JCVN0cmluZ1tdIGxhYmVsczsKLQkJaWYgKGRldGFpbCA9PSBudWxsKQotCQkJbGFiZWxzID0gc2hvd0NhbmNlbCA/IExBQkVMU19PS19DQU5DRUwgOiBMQUJFTFNfT0s7Ci0JCWVsc2UKLQkJCWxhYmVscyA9IHNob3dDYW5jZWwgPyBMQUJFTFNfT0tfQ0FOQ0VMX0RFVEFJTFMgOiBMQUJFTFNfT0tfREVUQUlMUzsKLQkJRXJyb3JEaWFsb2cgZGlhbG9nID0gbmV3IEVycm9yRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdAotCQkJCQkvLyB0aGUKLQkJCQkJLy8gZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cKLQkJCQkJLy8gaWNvbgotCQkJCQltZXNzYWdlLCBkZXRhaWwsIEVSUk9SLCBsYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JCWlmIChkZXRhaWwgIT0gbnVsbCkKLQkJCWRpYWxvZy5zZXREZXRhaWxCdXR0b24obGFiZWxzLmxlbmd0aCAtIDEpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCQkvLyBjcmVhdGUgaW1hZ2UKLQkJSW1hZ2UgaW1hZ2UgPSBjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgMCk7Ci0JCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0JCQlsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUiB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQl9Ci0JCS8vIGNyZWF0ZSBtZXNzYWdlCi0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0V4ZWN1dGlvbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0V4ZWN1dGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzc3OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FeGVjdXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGludGVyZmFjZSBFeGVjdXRpb25MaXN0ZW5lcgotewotICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCk7Ci0gIAotICBwdWJsaWMgdm9pZCB1bmRvRXhlY3V0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9HZW5lcmljV2l6YXJkTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9HZW5lcmljV2l6YXJkTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDc2OWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvR2VuZXJpY1dpemFyZE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNXaXphcmROb2RlIGltcGxlbWVudHMgSVdpemFyZE5vZGUgewotCi0JcHJvdGVjdGVkIElXaXphcmQgd2l6YXJkOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEdlbmVyaWNXaXphcmROb2RlLgotCSAqLwotCXB1YmxpYyBHZW5lcmljV2l6YXJkTm9kZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVdpemFyZE5vZGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHdpemFyZCAhPSBudWxsKQotCQkJd2l6YXJkLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVdpemFyZE5vZGUjZ2V0Q29udGVudHMoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGZpbmFsIElXaXphcmQgZ2V0V2l6YXJkKCkgewotCQlpZiAod2l6YXJkID09IG51bGwpCi0JCQl3aXphcmQgPSBjcmVhdGVXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdG8gY3JlYXRlIHRoZSB3aXphcmQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVdpemFyZCBjcmVhdGVXaXphcmQoKTsKLQotCS8qCi0JICogQHNlZSBJV2l6YXJkTm9kZSNpc0NvbnRlbnRDcmVhdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRDcmVhdGVkKCkgewotCQlyZXR1cm4gd2l6YXJkICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGUjZ2V0RXh0ZW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0RXh0ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0ludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWZiNmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJtZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RDb250ZW50c0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfdXNlRGVmYXVsdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbDsKLQotCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0TWVzc2FnZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzExY2FkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTGlzdE1lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyA1LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBkZmhvbHQKLSAqLwotcHVibGljIGNsYXNzIExpc3RNZXNzYWdlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGxpc3RJdGVtczsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0JLyoqCi0JICogRUpCU2VsZWN0aXZlSW1wb3J0RGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZUltYWdlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLQkgKiBAcGFyYW0gZGlhbG9nTWVzc2FnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkaWFsb2dJbWFnZVR5cGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBkZWZhdWx0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBMaXN0TWVzc2FnZURpYWxvZyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIGludCBkaWFsb2dJbWFnZVR5cGUsIGphdmEubGFuZy5TdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0TWVzc2FnZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTGlzdE1lc3NhZ2VEaWFsb2cob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4LCBTdHJpbmdbXSBuYW1lcykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ1RpdGxlSW1hZ2UsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCQlsaXN0SXRlbXMgPSBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhbiBhcmVhIG9mIHRoZSBkaWFsb2cgd2hpY2ggYXBwZWFycyBiZWxvdyB0aGUgbWVzc2FnZSBhbmQKLQkgKiBhYm92ZSB0aGUgYnV0dG9uIGJhci4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gU3ViY2xhc3NlcwotCSAqIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRoZQotCSAqICAgICAgICAgICAgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBjdXN0b20gYXJlYQotCSAqIEByZXR1cm4gdGhlIGN1c3RvbSBhcmVhIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCAwKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAobGlzdEl0ZW1zICE9IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWxpc3Quc2V0SXRlbXMobGlzdEl0ZW1zKTsKLQkJfQotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHNpbXBsZSBjb25maXJtIChPSy9DYW5jZWwpIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5Db25maXJtKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyBPSwotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgZXJyb3IgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgRVJST1IsIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyBvayBpcyB0aGUKLQkJLy8gZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkluZm9ybWF0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBJTkZPUk1BVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7Ci0JCS8vIG9rIGlzIHRoZSBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHNpbXBsZSBZZXMvTm8gcXVlc3Rpb24gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSBPSyBidXR0b24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfSwgMCwgaXRlbXMpOyAvLyB5ZXMKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIHdhcm5pbmcgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5XYXJuaW5nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gaXRlbXMpIHsKLQkJTGlzdE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IExpc3RNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdCB0aGUgZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cgaWNvbgotCQkJCQltZXNzYWdlLCBXQVJOSU5HLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gb2sgaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RlbmVyTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3MmVhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RlbmVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIExpc3RlbmVyTGlzdCB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQWN0aW9uTGlzdGVuZXJbXSBOVUxMX0FSUkFZID0gbmV3IEFjdGlvbkxpc3RlbmVyWzBdOwotCXByb3RlY3RlZCB0cmFuc2llbnQgQWN0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lckxpc3QgPSBOVUxMX0FSUkFZOwotCi0JLyoqCi0JICogQWRkIHRoZSBsaXN0ZW5lciBhcyBhIGxpc3RlbmVyIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdAotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkCi0JICogQHBhcmFtIGwKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAobCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobGlzdGVuZXJMaXN0ID09IE5VTExfQVJSQVkpIHsKLQkJCS8vIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGxpc3RlbmVyIGFkZGVkLAotCQkJLy8gaW5pdGlhbGl6ZSB0aGUgbGlzdHMKLQkJCWxpc3RlbmVyTGlzdCA9IG5ldyBBY3Rpb25MaXN0ZW5lcltde2x9OwotCQl9IGVsc2UgewotCQkJLy8gT3RoZXJ3aXNlIGNvcHkgdGhlIGFycmF5IGFuZCBhZGQgdGhlIG5ldyBsaXN0ZW5lcgotCQkJaW50IGkgPSBsaXN0ZW5lckxpc3QubGVuZ3RoOwotCQkJQWN0aW9uTGlzdGVuZXJbXSB0bXAgPSBuZXcgQWN0aW9uTGlzdGVuZXJbaSArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lckxpc3QsIDAsIHRtcCwgMCwgaSk7Ci0KLQkJCXRtcFtpICsgMV0gPSBsOwotCi0JCQlsaXN0ZW5lckxpc3QgPSB0bXA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgbGlzdGVuZXJsaXN0Ci0JICovCi0JcHVibGljIGludCBnZXRMaXN0ZW5lckNvdW50KCkgewotCQlyZXR1cm4gbGlzdGVuZXJMaXN0Lmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgQWN0aW9uTGlzdGVuZXJbXSBnZXRMaXN0ZW5lckxpc3QoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckxpc3Q7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShBY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCWlmIChsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9IC0xOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJMaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7Ci0JCQlpZiAobGlzdGVuZXJMaXN0W2ldLmVxdWFscyhsKSkgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCUFjdGlvbkxpc3RlbmVyW10gdG1wID0gbmV3IEFjdGlvbkxpc3RlbmVyW2xpc3RlbmVyTGlzdC5sZW5ndGggLSAxXTsKLQkJCS8vIENvcHkgdGhlIGxpc3QgdXAgdG8gaW5kZXgKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJMaXN0LCAwLCB0bXAsIDAsIGluZGV4KTsKLQkJCS8vIENvcHkgZnJvbSB0d28gcGFzdCB0aGUgaW5kZXgsIHVwIHRvCi0JCQkvLyB0aGUgZW5kIG9mIHRtcCAod2hpY2ggaXMgdHdvIGVsZW1lbnRzCi0JCQkvLyBzaG9ydGVyIHRoYW4gdGhlIG9sZCBsaXN0KQotCQkJaWYgKGluZGV4IDwgdG1wLmxlbmd0aCkKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVyTGlzdCwgaW5kZXggKyAxLCB0bXAsIGluZGV4LCB0bXAubGVuZ3RoIC0gaW5kZXgpOwotCQkJLy8gc2V0IHRoZSBsaXN0ZW5lciBhcnJheSB0byB0aGUgbmV3IGFycmF5IG9yIG51bGwKLQkJCWxpc3RlbmVyTGlzdCA9ICh0bXAubGVuZ3RoID09IDApID8gTlVMTF9BUlJBWSA6IHRtcDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL01lbnVFbmFibGVtZW50UHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTWVudUVuYWJsZW1lbnRQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFhZmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTWVudUVuYWJsZW1lbnRQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLQotcHVibGljIGNsYXNzIE1lbnVFbmFibGVtZW50UHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcnsKLQotCXN0YXRpYyBwcml2YXRlIExpc3Q8TWVudUVuYWJsZXJFeHRlbnNpb24+ICBsaXN0ID0gTWVudUVuYWJsZXJFeHRlbnNpb25SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZW51RW5hYmxlcigpOwkKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLAotCQkJT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQotCQlpZiggbGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCApewotCQkJTWVudUVuYWJsZXJFeHRlbnNpb24gbWVudUVuYWJsZXJFeHRlbnNpb24gPSBsaXN0LmdldCggMCApOwotCQkJSVByb3BlcnR5VGVzdGVyIHRlc3RlciA9ICBtZW51RW5hYmxlckV4dGVuc2lvbi5nZXRJbnN0YW5jZSgpOwotCQkJaWYoIHRlc3RlciAhPSBudWxsICl7Ci0JCQkJcmV0dXJuIHRlc3Rlci50ZXN0KCByZWNlaXZlciwgcHJvcGVydHksIGFyZ3MsIGV4cGVjdGVkVmFsdWUgKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9NZW51RW5hYmxlckV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9NZW51RW5hYmxlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzFkYmJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTWVudUVuYWJsZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE1lbnVFbmFibGVyRXh0ZW5zaW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VX0VOQUJMRVJfRVhURU5TSU9OID0gIm1lbnVlbmFibGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCS8vcHJpdmF0ZSBJTWVudUVuYWJsZXIgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBJUHJvcGVydHlUZXN0ZXIgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBib29sZWFuIGVycm9yQ29uZGl0aW9uID0gZmFsc2U7Ci0JCi0JcHVibGljIE1lbnVFbmFibGVyRXh0ZW5zaW9uKCl7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBNZW51RW5hYmxlckV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQlpbml0KCk7Ci0JfQotCQotCXB1YmxpYyBJUHJvcGVydHlUZXN0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCAmJiAhZXJyb3JDb25kaXRpb24pCi0JCQkJaW5zdGFuY2UgPSAoSVByb3BlcnR5VGVzdGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllcnJvckNvbmRpdGlvbiA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL01lbnVFbmFibGVyRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL01lbnVFbmFibGVyRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NGI5NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9NZW51RW5hYmxlckV4dGVuc2lvblJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTWVudUVuYWJsZXJFeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBNZW51RW5hYmxlckV4dGVuc2lvblJlYWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0PE1lbnVFbmFibGVyRXh0ZW5zaW9uPiBwYWdlRXh0ZW5kZXJzID0gbnVsbDsKLQkKLQlwdWJsaWMgTWVudUVuYWJsZXJFeHRlbnNpb25SZWFkZXIoKXsKLQkJc3VwZXIoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIsICJNZW51RW5hYmxlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JfQotCQotCi0JcHVibGljIHN0YXRpYyBNZW51RW5hYmxlckV4dGVuc2lvblJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IE1lbnVFbmFibGVyRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCQlpbnN0YW5jZS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChNZW51RW5hYmxlckV4dGVuc2lvbi5NRU5VX0VOQUJMRVJfRVhURU5TSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCWFkZEV4dGVuc2lvbihlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBuZXdFeHRlbnNpb24pIHsKLQkJZ2V0TWVudUVuYWJsZXIoKS5hZGQobmV3IE1lbnVFbmFibGVyRXh0ZW5zaW9uKG5ld0V4dGVuc2lvbikpOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxNZW51RW5hYmxlckV4dGVuc2lvbj4gZ2V0TWVudUVuYWJsZXIoKSB7Ci0JCWlmIChwYWdlRXh0ZW5kZXJzID09IG51bGwpCi0JCQlwYWdlRXh0ZW5kZXJzID0gbmV3IEFycmF5TGlzdDxNZW51RW5hYmxlckV4dGVuc2lvbj4oKTsKLQkJcmV0dXJuIHBhZ2VFeHRlbmRlcnM7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTmV3UHJvamVjdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDY3ZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3OwotCi1wdWJsaWMgY2xhc3MgTmV3UHJvamVjdEdyb3VwIGltcGxlbWVudHMgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcgewotCXByaXZhdGUgSURhdGFNb2RlbCBtb2RlbDsKLQlwdWJsaWMgVGV4dCBwcm9qZWN0TmFtZUZpZWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgVGV4dCBsb2NhdGlvblBhdGhGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b24gPSBudWxsOwotCS8vIGNvbnN0YW50cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSCA9IDMwNTsKLQkvLyBkZWZhdWx0IHZhbHVlcwotCXByaXZhdGUgU3RyaW5nIGRlZlByb2plY3ROYW1lTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5OYW1lXzsKLQlwcml2YXRlIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLkJyb3dzZV87Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmRGlyRGlhbG9nTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5EZWZEaXJEaWFsb2dMYWJlbF87Ci0KLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCi0JcHVibGljIE5ld1Byb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJc3luY2hIZWxwZXIgPSBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIobW9kZWwpOwotCQlidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0JCUNvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcHJvamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbGFiZWwKLQkJTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoZGVmUHJvamVjdE5hbWVMYWJlbCk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotCQlwcm9qZWN0TmFtZUZpZWxkID0gbmV3IFRleHQocHJvamVjdEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlwcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0Rm9udChmb250KTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3ROYW1lRmllbGQsIFBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TGFiZWx9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwcm9qZWN0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCS8vIHByb2plY3Qgc3BlY2lmaWNhdGlvbiBncm91cAotCQlHcm91cCBwcm9qZWN0R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvamVjdEdyb3VwLnNldEZvbnQoZm9udCk7Ci0JCXByb2plY3RHcm91cC5zZXRUZXh0KEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCk7Ci0KLQkJZmluYWwgQnV0dG9uIHVzZURlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0Zvcih1c2VEZWZhdWx0c0J1dHRvbikuc3BhbigzLDEpLmFwcGx5VG8odXNlRGVmYXVsdHNCdXR0b24pOwotCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRUZXh0KEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV91c2VEZWZhdWx0TGFiZWwpOwotCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRGb250KGZvbnQpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KHVzZURlZmF1bHRzQnV0dG9uLCBVU0VfREVGQVVMVF9MT0NBVElPTiwgbnVsbCk7Ci0KLQkJY3JlYXRlVXNlclNwZWNpZmllZFByb2plY3RMb2NhdGlvbkdyb3VwKHByb2plY3RHcm91cCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVzZXJTcGVjaWZpZWRQcm9qZWN0TG9jYXRpb25Hcm91cChDb21wb3NpdGUgcHJvamVjdEdyb3VwKSB7Ci0JCUZvbnQgZm9udCA9IHByb2plY3RHcm91cC5nZXRGb250KCk7Ci0JCS8vIGxvY2F0aW9uIGxhYmVsCi0JCWZpbmFsIExhYmVsIGxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwocHJvamVjdEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0Rm9udChmb250KTsKLQkJbG9jYXRpb25MYWJlbC5zZXRUZXh0KEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9sb2NhdGlvbkxhYmVsKTsKLQotCQkvLyBwcm9qZWN0IGxvY2F0aW9uIGVudHJ5IGZpZWxkCi0JCWxvY2F0aW9uUGF0aEZpZWxkID0gbmV3IFRleHQocHJvamVjdEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRGb250KGZvbnQpOwotCi0JCS8vIGJyb3dzZSBidXR0b24KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0R3JvdXAsIFNXVC5QVVNIKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKGJyb3dzZUJ1dHRvbikuYXBwbHlUbyhicm93c2VCdXR0b24pOwotCQlicm93c2VCdXR0b24uc2V0Rm9udChmb250KTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoZGVmQnJvd3NlQnV0dG9uTGFiZWwpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIElEYXRhTW9kZWwgbG9jYWxNb2RlbCA9IG1vZGVsOwotCi0JCWNsYXNzIExvY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyIHsKLQkJCXByaXZhdGUgYm9vbGVhbiB0eXBpbmcgPSBmYWxzZTsKLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXR5cGluZyA9IHRydWU7Ci0JCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KFVTRVJfREVGSU5FRF9MT0NBVElPTiwgbG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXR5cGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIHVzZURlZmF1bHQgPSBsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTik7Ci0JCQkJaWYgKFVTRV9ERUZBVUxUX0xPQ0FUSU9OLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJbG9jYXRpb25MYWJlbC5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdCk7Ci0JCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJaWYgKHVzZURlZmF1bHQpIHsKLQkJCQkJCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQobG9jYWxNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGxvY2FsTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCF0eXBpbmcpIHsKLQkJCQkJaWYgKCh1c2VEZWZhdWx0ICYmIERFRkFVTFRfTE9DQVRJT04uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgfHwgKCF1c2VEZWZhdWx0ICYmIFVTRVJfREVGSU5FRF9MT0NBVElPTi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSkgewotCQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dCgoU3RyaW5nKSBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpOwotCi0JCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChuZXcgRGF0YU1vZGVsRXZlbnQobW9kZWwsIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRykpOwotCi0JCWxvY2F0aW9uUGF0aEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbW9kZWwuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGxvY2F0aW9uUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShkZWZEaXJEaWFsb2dMYWJlbCk7Ci0JCVN0cmluZyBkaXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKTsKLQkJaWYgKGRpck5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWRpck5hbWUgPSBuZXcgUGF0aChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKTsKLQkJfQotCi0JCWlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkgewotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShVU0VSX0RFRklORURfTE9DQVRJT04sIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQltb2RlbCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjIzZWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUljb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZSA9IG51bGw7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2U7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlzW11bXTsKLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cykgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOwotCX0KLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBzaXplOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0JCQkJeCArPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeCAtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZkJhc2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0KLQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDApCi0JCQkJZHJhd1RvcFJpZ2h0KGZPdmVybGF5c1swXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkKLQkJCQlkcmF3Qm90dG9tUmlnaHQoZk92ZXJsYXlzWzFdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAyKQotCQkJCWRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMykKLQkJCQlkcmF3VG9wTGVmdChmT3ZlcmxheXNbM10pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCWZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCXggLT0gaWQud2lkdGg7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9QYWdlR3JvdXBNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmZDkwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGJ1ZyAyMTM5MjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5Db21tb25VSVBsdWdpbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFBhZ2VHcm91cE1hbmFnZXIgewotCXByaXZhdGUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHJvb3RPcGVyYXRpb247Ci0JcHJpdmF0ZSBJRE1QYWdlR3JvdXAgcm9vdFBhZ2VHcm91cDsKLQlwcml2YXRlIEhhc2hNYXAgZ3JvdXBUYWJsZTsKLQlwcml2YXRlIEhhc2hTZXQgb3BlcmF0aW9uc1J1bjsKLQlwcml2YXRlIFN0YWNrIHBhZ2VHcm91cFN0YWNrOwotCXByaXZhdGUgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JcHJpdmF0ZSBTdGFja0VudHJ5IHNhdmVkVG9wRW50cnk7Ci0JcHJpdmF0ZSBpbnQgc2F2ZWRTdGFja1NpemU7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQUdFX0dST1VQID0gIndpemFyZFBhZ2VHcm91cCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIHBhdXNlQWZ0ZXJFeGVjdXRpb24gPSBudWxsOwotCi0JcHVibGljIFBhZ2VHcm91cE1hbmFnZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwsIElETVBhZ2VHcm91cCByb290UGFnZUdyb3VwKSB7Ci0KLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JCXRoaXMuZ3JvdXBUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMucGFnZUdyb3VwU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJdGhpcy5yb290UGFnZUdyb3VwID0gcm9vdFBhZ2VHcm91cDsKLQotCi0JCVBhZ2VHcm91cEVudHJ5IHJvb3RQYWdlR3JvdXBFbnRyeSA9IG5ldyBQYWdlR3JvdXBFbnRyeShyb290UGFnZUdyb3VwKTsKLQkJZWxlbWVudHMgPSBnZXRQYWdlR3JvdXBFeHRlbnNpb25zKCk7Ci0JCWdyb3VwVGFibGUucHV0KHRoaXMucm9vdFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpLCByb290UGFnZUdyb3VwRW50cnkpOwotCi0JCWlmICh0aGlzLnJvb3RQYWdlR3JvdXAuZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpKSB7Ci0JCQkvLyBGaW5kIGFsbCB0aGUgcGFnZSBncm91cHMgdGhhdCBmb2xsb3cgdGhpcyByb290IHBhZ2UgZ3JvdXAuCi0JCQlsb2FkRXh0ZW5kZWRQYWdlcyhyb290UGFnZUdyb3VwKTsKLQkJfQotCX0KLQotCXB1YmxpYyBQYWdlR3JvdXBNYW5hZ2VyKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiByb290T3BlcmF0aW9uLCBJRE1QYWdlR3JvdXAgcm9vdFBhZ2VHcm91cCkgewotCQl0aGlzKHJvb3RPcGVyYXRpb24uZ2V0RGF0YU1vZGVsKCksIHJvb3RQYWdlR3JvdXApOwotCQl0aGlzLm9wZXJhdGlvbnNSdW4gPSBuZXcgSGFzaFNldCgpOwotCi0JCXJvb3RPcGVyYXRpb24uYWRkT3BlcmF0aW9uTGlzdGVuZXIobmV3IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIGludCBub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LmdldEV4ZWN1dGlvblR5cGUoKSkgewotCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJPTExCQUNLIDoKLQkJCQkJCWlmIChldmVudC5nZXRPcGVyYXRpb25UeXBlKCkgPT0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCkgewotCQkJCQkJCW9wZXJhdGlvbnNSdW4ucmVtb3ZlKGV2ZW50LmdldE9wZXJhdGlvbigpLmdldElEKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSA6Ci0JCQkJCQlpZiAoZXZlbnQuZ2V0T3BlcmF0aW9uVHlwZSgpID09IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fRklOSVNIRUQpIHsKLQkJCQkJCQlvcGVyYXRpb25zUnVuLmFkZChldmVudC5nZXRPcGVyYXRpb24oKS5nZXRJRCgpKTsKLQkJCQkJCQlpZiAobnVsbCAhPSBwYXVzZUFmdGVyRXhlY3V0aW9uICYmIGV2ZW50LmdldE9wZXJhdGlvbigpLmdldElEKCkuZXF1YWxzKHBhdXNlQWZ0ZXJFeGVjdXRpb24pKSB7Ci0JCQkJCQkJCXJldHVybiBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0dXJuIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRHcm91cEFmdGVyKFN0cmluZyBwYWdlR3JvdXBJRCwgSURNUGFnZUdyb3VwIHBhZ2VJbnNlcnRHcm91cCkgewotCQlQYWdlR3JvdXBFbnRyeSBwYWdlR3JvdXBFbnRyeSA9IChQYWdlR3JvdXBFbnRyeSkgZ3JvdXBUYWJsZS5nZXQocGFnZUdyb3VwSUQpOwotCi0JCWlmIChwYWdlR3JvdXBFbnRyeS5wYWdlR3JvdXAuZ2V0QWxsb3dzRXh0ZW5kZWRQYWdlcygpKSB7Ci0JCQlhZGRQYWdlR3JvdXAocGFnZUdyb3VwRW50cnkucGFnZUdyb3VwLCBwYWdlSW5zZXJ0R3JvdXApOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUZvcndhcmRPbmVQYWdlKCkgewotCQlib29sZWFuIHBhZ2VGb3VuZCA9IGZhbHNlOwotCi0JCWlmIChwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQlQYWdlR3JvdXBFbnRyeSByb290RW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KHJvb3RQYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSk7Ci0JCQlwYWdlR3JvdXBTdGFjay5wdXNoKG5ldyBTdGFja0VudHJ5KHJvb3RFbnRyeSwgLTEpKTsKLQkJfQotCi0JCXNhdmVTdGFja0luZm8oKTsKLQotCQl0cnkgewotCQkJcGFnZUZvdW5kID0gZmluZE5leHRQYWdlKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihleGMpOwotCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJvb3RPcGVyYXRpb24ucm9sbEJhY2sobnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQkJcGFnZUZvdW5kID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAocGFnZUZvdW5kID09IGZhbHNlKSB7Ci0JCQkvLyBJZiB3ZSBtb3ZlZCBmb3J3YXJkIGFuZCB0aGVyZSB3YXNuJ3QgYSBwYWdlIHRoZW4gd2Ugd2lsbCByZXN0b3JlIHRoZSBzdGFjay4KLQkJCS8vIE5vcm1hbGx5LCB0aGlzIHdvdWxkbid0IGhhcHBlbiBzaW5jZSBhIGNhbGwgdG8gaGFzTmV4dFBhZ2Ugd291bGQgaGF2ZSBpbmRpY2F0ZWQKLQkJCS8vIHRoYXQgdGhlcmUgd2Fzbid0IGEgcGFnZS4KLQkJCXJlc3RvcmVTdGFja0luZm8oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVCYWNrT25lUGFnZSgpIHsKLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0KLQkJLy8gUG9wIHRoZSBsYXN0IHBhZ2UuCi0JCWlmICghdG9wRW50cnkucGFnZXNSZXR1cm5lZC5lbXB0eSgpKQotCQkJdG9wRW50cnkucGFnZXNSZXR1cm5lZC5wb3AoKTsKLQotCQkvLyBOb3cgZmluZCB0aGUgcHJldmlvdXMgcGFnZS4KLQkJYm9vbGVhbiBmb3VuZFByZXZpb3VzUGFnZSA9IGZpbmRQcmV2aW91c1BhZ2VJbkdyb3VwKCk7Ci0KLQkJd2hpbGUgKCFmb3VuZFByZXZpb3VzUGFnZSAmJiAhcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCWlmICh0b3BFbnRyeS5yYW5PcGVyYXRpb25zKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyb290T3BlcmF0aW9uLnJvbGxCYWNrKG51bGwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXBhZ2VHcm91cFN0YWNrLnBvcCgpOwotCi0JCQlpZiAoIXBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCQlmb3VuZFByZXZpb3VzUGFnZSA9IGZpbmRQcmV2aW91c1BhZ2VJbkdyb3VwKCk7Ci0JCQkJdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXBhZ2VHcm91cFN0YWNrLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIElXaXphcmRQYWdlIGdldEN1cnJlbnRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBwYWdlID0gbnVsbDsKLQotCQlpZiAoIXBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpIHsKLQkJCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCQkJaW50IHBhZ2VJbmRleCA9IHRvcEVudHJ5LmdldFRvcFBhZ2VJbmRleCgpOwotCi0JCQlwYWdlID0gcGFnZUluZGV4ID09IC0xID8gbnVsbCA6IChJV2l6YXJkUGFnZSkgdG9wRW50cnkucGFnZUdyb3VwRW50cnkuZ2V0UGFnZXMoKS5nZXQocGFnZUluZGV4KTsKLQkJfQotCi0JCXJldHVybiBwYWdlOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBoYXNNdWxpdHBsZVBhZ2VzOwotCi0JcHVibGljIGJvb2xlYW4gaGFzTXVsdGlwbGVQYWdlcygpIHsKLQkJaWYgKG51bGwgPT0gaGFzTXVsaXRwbGVQYWdlcykgewotCQkJaW50IHBhZ2VDb3VudCA9IDA7Ci0JCQlQYWdlR3JvdXBFbnRyeSByb290RW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KHJvb3RQYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSk7Ci0JCQlwYWdlQ291bnQgKz0gcm9vdEVudHJ5LmdldFBhZ2VzKCkuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IHBhZ2VDb3VudCA8IDIgJiYgaSA8IHJvb3RFbnRyeS5ncm91cHNUaGF0Rm9sbG93LnNpemUoKTsgaSsrKSB7Ci0JCQkJcGFnZUNvdW50ICs9ICgoUGFnZUdyb3VwRW50cnkpIHJvb3RFbnRyeS5ncm91cHNUaGF0Rm9sbG93LmdldChpKSkuZ2V0UGFnZXMoKS5zaXplKCk7Ci0JCQl9Ci0JCQloYXNNdWxpdHBsZVBhZ2VzID0gcGFnZUNvdW50ID4gMSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIGhhc011bGl0cGxlUGFnZXMuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dFBhZ2UoKSB7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJc2F2ZVN0YWNrSW5mbygpOwotCi0JCWlmIChwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQlQYWdlR3JvdXBFbnRyeSByb290RW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KHJvb3RQYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSk7Ci0JCQlwYWdlR3JvdXBTdGFjay5wdXNoKG5ldyBTdGFja0VudHJ5KHJvb3RFbnRyeSwgLTEpKTsKLQkJfQotCi0JCXBhZ2VGb3VuZCA9IGZpbmROZXh0UGFnZShmYWxzZSk7Ci0JCXJlc3RvcmVTdGFja0luZm8oKTsKLQotCQlyZXR1cm4gcGFnZUZvdW5kOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG9BbGxDdXJyZW50T3BlcmF0aW9ucygpIHsKLQkJd2hpbGUgKCFwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQltb3ZlQmFja09uZVBhZ2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldFBhZ2VHcm91cEV4dGVuc2lvbnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChDb21tb25VSVBsdWdpbkNvbnN0YW50cy5QTFVHSU5fSUQsIEVMRU1FTlRfUEFHRV9HUk9VUCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGFsbEVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gYWxsRWxlbWVudHNbaV07Ci0JCQlpZiAoRUxFTUVOVF9QQUdFX0dST1VQLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKSByZXN1bHQudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10geyB9KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluZFByZXZpb3VzUGFnZUluR3JvdXAoKSB7Ci0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCQlib29sZWFuIHBhZ2VGb3VuZCA9IGZhbHNlOwotCi0JCWlmICghdG9wRW50cnkucGFnZXNSZXR1cm5lZC5lbXB0eSgpKSB7Ci0JCQl0b3BFbnRyeS5wYWdlc0NvbXBsZXRlID0gZmFsc2U7Ci0JCQlwYWdlRm91bmQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2VGb3VuZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluZE5leHRQYWdlKGJvb2xlYW4gcnVuT3BlcmF0aW9ucykgewotCQlTdGFja0VudHJ5IHRvcEVudHJ5ID0gKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKTsKLQkJaW50IG5ld1BhZ2VJbmRleCA9IHRvcEVudHJ5LmZpbmROZXh0UGFnZUluZGV4KCk7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKG5ld1BhZ2VJbmRleCA9PSAtMSkgewotCQkJLy8gT3VyIHBhZ2UgaGFuZGxlciBkaWRuJ3QgZmluZCBhIHBhZ2Ugc28gd2Ugd2lsbCBzZWUgaWYgdGhlcmUgaXMgYSBwYWdlIGdyb3VwIHRoYXQKLQkJCS8vIGZvbGxvd3MgdGhpcyBwYWdlIGdyb3VwIHRoYXQgY2FuIGZpbmQgYSBwYWdlLgotCQkJdG9wRW50cnkucGFnZXNDb21wbGV0ZSA9IHRydWU7Ci0KLQkJCVN0YWNrRW50cnkgbmV4dFN0YWNrRW50cnkgPSBmaW5kTmV4dFBhZ2VHcm91cChwYWdlR3JvdXBTdGFjayk7Ci0KLQkJCWlmIChuZXh0U3RhY2tFbnRyeSAhPSBudWxsKSB7Ci0JCQkJSURNUGFnZUdyb3VwIHBhZ2VHcm91cCA9IG5leHRTdGFja0VudHJ5LnBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cDsKLQkJCQlTdHJpbmcgcmVxdWlyZXNPcGVyYXRpb25zSWQgPSBwYWdlR3JvdXAuZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKTsKLQotCQkJCS8vIElmIHRoaXMgZ3JvdXAgcmVxdWlyZXMgYW4gb3BlcmF0aW9uIGFuZCBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBydW4KLQkJCQkvLyB0aGVuIHdlIG5lZWQgdG8gcnVuIGl0LgotCQkJCWlmIChyb290T3BlcmF0aW9uICE9IG51bGwgJiYgcnVuT3BlcmF0aW9ucyAmJiByZXF1aXJlc09wZXJhdGlvbnNJZCAhPSBudWxsICYmICFvcGVyYXRpb25zUnVuLmNvbnRhaW5zKHJlcXVpcmVzT3BlcmF0aW9uc0lkKSkgewotCQkJCQlwYXVzZUFmdGVyRXhlY3V0aW9uID0gcmVxdWlyZXNPcGVyYXRpb25zSWQ7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0YXR1cyA9IHJvb3RPcGVyYXRpb24ucmVzdW1lKG51bGwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJV1RQVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQkJbmV4dFN0YWNrRW50cnkucmFuT3BlcmF0aW9ucyA9IHRydWU7Ci0JCQkJCQotCQkJCQkvLyBUT0RPIG5lZWQgYSBiZXR0ZXIgZXJyb3IgZmVlZGJhY2sgbWVjaGFuaXNtIGhlcmUuCi0JCQkJCWlmKHN0YXR1cyA9PSBudWxsKXsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJfSBlbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcGFnZUdyb3VwU3RhY2sucHVzaChuZXh0U3RhY2tFbnRyeSk7Ci0JCQkJcGFnZUZvdW5kID0gZmluZE5leHRQYWdlKHJ1bk9wZXJhdGlvbnMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gV2UgZm91bmQgYSBuZXcgcGFnZSBpbiB0aGUgcGFnZSBoYW5kbGVyLgotCQkJcGFnZUZvdW5kID0gdHJ1ZTsKLQkJCXRvcEVudHJ5LnBhZ2VzUmV0dXJuZWQucHVzaChuZXcgSW50ZWdlcihuZXdQYWdlSW5kZXgpKTsKLQkJfQotCi0JCXJldHVybiBwYWdlRm91bmQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVTdGFja0luZm8oKSB7Ci0JCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJc2F2ZWRUb3BFbnRyeSA9IG5ldyBTdGFja0VudHJ5KChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCkpOwotCQl9Ci0JCXNhdmVkU3RhY2tTaXplID0gcGFnZUdyb3VwU3RhY2suc2l6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlU3RhY2tJbmZvKCkgewotCQlpZiAoc2F2ZWRTdGFja1NpemUgPT0gMCkgewotCQkJcGFnZUdyb3VwU3RhY2sucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCXBhZ2VHcm91cFN0YWNrLnNldFNpemUoc2F2ZWRTdGFja1NpemUgLSAxKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2goc2F2ZWRUb3BFbnRyeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4dGVuZGVkUGFnZXMoSURNUGFnZUdyb3VwIHBhZ2VHcm91cCkgewotCQlTdHJpbmcgd2l6YXJkSWQgPSByb290UGFnZUdyb3VwLmdldFdpemFyZElEKCk7Ci0JCVN0cmluZyBwYWdlR3JvdXBJZCA9IHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpOwotCQlpbnQgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKLQkJCURNUGFnZUdyb3VwRWxlbWVudEltcGwgcGFnZUluc2VydEdyb3VwID0gbmV3IERNUGFnZUdyb3VwRWxlbWVudEltcGwoZWxlbWVudHNbaW5kZXhdKTsKLQkJCVN0cmluZyBwYWdlSW5zZXJ0R3JvdXBJZCA9IHBhZ2VJbnNlcnRHcm91cC5nZXRQYWdlR3JvdXBJbnNlcnRpb25JRCgpOwotCQkJaWYgKHBhZ2VJbnNlcnRHcm91cC5nZXRXaXphcmRJRCgpLmVxdWFscyh3aXphcmRJZCkgJiYgKG51bGwgPT0gcGFnZUluc2VydEdyb3VwSWQgfHwgcGFnZUluc2VydEdyb3VwSWQuZXF1YWxzKHBhZ2VHcm91cElkKSkpIHsKLQkJCQlhZGRQYWdlR3JvdXAocGFnZUdyb3VwLCBwYWdlSW5zZXJ0R3JvdXApOwotCi0JCQkJLy8gSWYgdGhpcyBwYWdlIGdyb3VwIGhhcyBwYWdlIHRoZW4gYWRkIHRoZW0KLQkJCQlpZiAocGFnZUluc2VydEdyb3VwLmdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSkgewotCQkJCQlsb2FkRXh0ZW5kZWRQYWdlcyhwYWdlSW5zZXJ0R3JvdXApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQYWdlR3JvdXAoSURNUGFnZUdyb3VwIHBhZ2VHcm91cCwgSURNUGFnZUdyb3VwIGluc2VydGVkUGFnZUdyb3VwKSB7Ci0JCVBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChwYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSk7Ci0JCVBhZ2VHcm91cEVudHJ5IG5leHRHcm91cEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChpbnNlcnRlZFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQotCQlpZiAocGFnZUdyb3VwRW50cnkgPT0gbnVsbCkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBuZXcgUGFnZUdyb3VwRW50cnkocGFnZUdyb3VwKTsKLQkJCWdyb3VwVGFibGUucHV0KHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpLCBwYWdlR3JvdXBFbnRyeSk7Ci0JCX0KLQotCQlpZiAobmV4dEdyb3VwRW50cnkgPT0gbnVsbCkgewotCQkJbmV4dEdyb3VwRW50cnkgPSBuZXcgUGFnZUdyb3VwRW50cnkoaW5zZXJ0ZWRQYWdlR3JvdXApOwotCQkJZ3JvdXBUYWJsZS5wdXQoaW5zZXJ0ZWRQYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSwgbmV4dEdyb3VwRW50cnkpOwotCQl9Ci0KLQkJcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5hZGQobmV4dEdyb3VwRW50cnkpOwotCX0KLQotCXB1YmxpYyBTdGFja0VudHJ5IGZpbmROZXh0UGFnZUdyb3VwKFN0YWNrIHN0YWNrKSB7Ci0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgc3RhY2sucGVlaygpOwotCQlQYWdlR3JvdXBFbnRyeSBuZXh0UGFnZUdyb3VwID0gdG9wRW50cnkuZ2V0TmV4dFBhZ2VHcm91cChudWxsKTsKLQkJaW50IHBhcmVudEluZGV4ID0gdG9wRW50cnkucGFyZW50R3JvdXBJbmRleDsKLQkJaW50IHByZXZQYXJlbnRJbmRleCA9IHN0YWNrLnNpemUoKSAtIDE7Ci0KLQkJLy8gUmVjdXJzZSB1cCB0aHJvdWdoIHRoZSBwYXJlbnRzIHRvIGZpbmQgdGhlIG5leHQgZ3JvdXAgaWYgbmVlZGVkLgotCQl3aGlsZSAocGFyZW50SW5kZXggIT0gLTEgJiYgbmV4dFBhZ2VHcm91cCA9PSBudWxsKSB7Ci0JCQlTdGFja0VudHJ5IHBhcmVudFN0YWNrRW50cnkgPSAoU3RhY2tFbnRyeSkgc3RhY2suZWxlbWVudEF0KHBhcmVudEluZGV4KTsKLQotCQkJbmV4dFBhZ2VHcm91cCA9IHBhcmVudFN0YWNrRW50cnkuZ2V0TmV4dFBhZ2VHcm91cCh0b3BFbnRyeS5nZXRJZCgpKTsKLQkJCXByZXZQYXJlbnRJbmRleCA9IHBhcmVudEluZGV4OwotCQkJcGFyZW50SW5kZXggPSBwYXJlbnRTdGFja0VudHJ5LnBhcmVudEdyb3VwSW5kZXg7Ci0JCQl0b3BFbnRyeSA9IHBhcmVudFN0YWNrRW50cnk7Ci0JCX0KLQotCQlyZXR1cm4gbmV4dFBhZ2VHcm91cCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdGFja0VudHJ5KG5leHRQYWdlR3JvdXAsIHByZXZQYXJlbnRJbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTdGFja0VudHJ5IHsKLQkJcHVibGljIFBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cEVudHJ5OwotCQlwdWJsaWMgU3RhY2sgcGFnZXNSZXR1cm5lZDsgLy8gRWxlbWVudCA9IEludGVyZ2VyIG9mIHBhZ2UgaW5kZXhlcy4KLQkJcHVibGljIGJvb2xlYW4gcGFnZXNDb21wbGV0ZTsKLQkJcHVibGljIGludCBwYXJlbnRHcm91cEluZGV4OwotCQlwdWJsaWMgYm9vbGVhbiByYW5PcGVyYXRpb25zOwotCi0JCXB1YmxpYyBTdGFja0VudHJ5KFBhZ2VHcm91cEVudHJ5IG5ld1BhZ2VHcm91cEVudHJ5LCBpbnQgcGFyZW50SW5kZXgpIHsKLQkJCXBhZ2VHcm91cEVudHJ5ID0gbmV3UGFnZUdyb3VwRW50cnk7Ci0JCQlwYWdlc1JldHVybmVkID0gbmV3IFN0YWNrKCk7Ci0JCQlwYWdlc0NvbXBsZXRlID0gZmFsc2U7Ci0JCQlwYXJlbnRHcm91cEluZGV4ID0gcGFyZW50SW5kZXg7Ci0JCQlyYW5PcGVyYXRpb25zID0gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RhY2tFbnRyeShTdGFja0VudHJ5IHN0YWNrRW50cnkpIHsKLQkJCXBhZ2VHcm91cEVudHJ5ID0gc3RhY2tFbnRyeS5wYWdlR3JvdXBFbnRyeTsKLQkJCXBhZ2VzUmV0dXJuZWQgPSBuZXcgU3RhY2soKTsKLQkJCXBhZ2VzQ29tcGxldGUgPSBzdGFja0VudHJ5LnBhZ2VzQ29tcGxldGU7Ci0JCQlwYXJlbnRHcm91cEluZGV4ID0gc3RhY2tFbnRyeS5wYXJlbnRHcm91cEluZGV4OwotCQkJcmFuT3BlcmF0aW9ucyA9IHN0YWNrRW50cnkucmFuT3BlcmF0aW9uczsKLQkJCXBhZ2VzUmV0dXJuZWQuYWRkQWxsKHN0YWNrRW50cnkucGFnZXNSZXR1cm5lZCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJcmV0dXJuIHBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpOwotCQl9Ci0KLQkJcHVibGljIGludCBmaW5kTmV4dFBhZ2VJbmRleCgpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQotCQkJaWYgKCFwYWdlc0NvbXBsZXRlKSB7Ci0JCQkJTGlzdCBwYWdlcyA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VzKCk7Ci0KLQkJCQlpbnQgcGFnZUluZGV4ID0gZ2V0VG9wUGFnZUluZGV4KCk7Ci0JCQkJU3RyaW5nIHBhZ2VJZCA9IHBhZ2VJbmRleCA9PSAtMSA/IG51bGwgOiAoKElXaXphcmRQYWdlKSBwYWdlcy5nZXQocGFnZUluZGV4KSkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBleHBlY3RlZElkID0gcGFnZUluZGV4ICsgMSA+PSBwYWdlcy5zaXplKCkgPyBudWxsIDogKChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KHBhZ2VJbmRleCArIDEpKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG5ld1BhZ2VJZCA9IG51bGw7Ci0KLQkJCQl0cnkgewotCQkJCQluZXdQYWdlSWQgPSBwYWdlR3JvdXBFbnRyeS5nZXRQYWdlSGFuZGxlcigpLmdldE5leHRQYWdlKHBhZ2VJZCwgZXhwZWN0ZWRJZCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihleGMpOwotCQkJCX0KLQotCQkJCWlmIChuZXdQYWdlSWQgIT0gbnVsbCAmJiBuZXdQYWdlSWQuZXF1YWxzKElETVBhZ2VIYW5kbGVyLlNLSVBfUEFHRSkgJiYgcGFnZUluZGV4ID49IDAgJiYgcGFnZUluZGV4IDwgcGFnZXMuc2l6ZSgpIC0gMikgewotCQkJCQlyZXN1bHQgPSBwYWdlSW5kZXggKyAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IHBhZ2VHcm91cEVudHJ5LmNoZWNrRm9yU3BlY2lhbElkcyhuZXdQYWdlSWQpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBQYWdlR3JvdXBFbnRyeSBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBhZnRlcklkKSB7Ci0JCQlQYWdlR3JvdXBFbnRyeSByZXN1bHQgPSBudWxsOwotCQkJU3RyaW5nIG5leHRHcm91cElEID0gbnVsbDsKLQkJCVN0cmluZ1tdIGdyb3VwSURMaXN0ID0gZ2V0R3JvdXBJRExpc3QoKTsKLQotCQkJdHJ5IHsKLQkJCQluZXh0R3JvdXBJRCA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VHcm91cEhhbmRsZXIoKS5nZXROZXh0UGFnZUdyb3VwKGFmdGVySWQsIGdyb3VwSURMaXN0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihleGMpOwotCQkJfQotCi0JCQlpZiAobmV4dEdyb3VwSUQgIT0gbnVsbCkgewotCQkJCS8vIEZpbmQgdGhpcyBzdHJpbmcgaW4gdGhlIGxpc3QuCi0JCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGdyb3VwSURMaXN0Lmxlbmd0aDsgaW5kZXgrKykgewotCQkJCQlpZiAoZ3JvdXBJRExpc3RbaW5kZXhdLmVxdWFscyhuZXh0R3JvdXBJRCkpIHsKLQkJCQkJCXJlc3VsdCA9IChQYWdlR3JvdXBFbnRyeSkgcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5lbGVtZW50QXQoaW5kZXgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZ1tdIGdldEdyb3VwSURMaXN0KCkgewotCQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1twYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LnNpemUoKV07Ci0KLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LnNpemUoKTsgaW5kZXgrKykgewotCQkJCVBhZ2VHcm91cEVudHJ5IGVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBwYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LmVsZW1lbnRBdChpbmRleCk7Ci0KLQkJCQlyZXN1bHRbaW5kZXhdID0gZW50cnkucGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcml2YXRlIGludCBnZXRUb3BQYWdlSW5kZXgoKSB7Ci0JCQlyZXR1cm4gcGFnZXNSZXR1cm5lZC5lbXB0eSgpID8gLTEgOiAoKEludGVnZXIpIHBhZ2VzUmV0dXJuZWQucGVlaygpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQYWdlR3JvdXBFbnRyeSB7Ci0JCXB1YmxpYyBJRE1QYWdlR3JvdXAgcGFnZUdyb3VwOwotCQlwdWJsaWMgVmVjdG9yIGdyb3Vwc1RoYXRGb2xsb3c7Ci0JCXByaXZhdGUgSURNUGFnZUhhbmRsZXIgcGFnZUhhbmRsZXI7Ci0JCXByaXZhdGUgSURNUGFnZUdyb3VwSGFuZGxlciBwYWdlR3JvdXBIYW5kbGVyOwotCQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0KLQkJcHVibGljIFBhZ2VHcm91cEVudHJ5KElETVBhZ2VHcm91cCBuZXdQYWdlR3JvdXApIHsKLQkJCXBhZ2VHcm91cCA9IG5ld1BhZ2VHcm91cDsKLQkJCWdyb3Vwc1RoYXRGb2xsb3cgPSBuZXcgVmVjdG9yKCk7Ci0JCQlpbml0aWFsaXplZCA9IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIElETVBhZ2VIYW5kbGVyIGdldFBhZ2VIYW5kbGVyKCkgewotCQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCQlpbml0KCk7Ci0KLQkJCXJldHVybiBwYWdlSGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoKSB7Ci0JCQlpZiAoIWluaXRpYWxpemVkKQotCQkJCWluaXQoKTsKLQotCQkJcmV0dXJuIHBhZ2VHcm91cEhhbmRsZXI7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRQYWdlcygpIHsKLQkJCWlmICghaW5pdGlhbGl6ZWQpCi0JCQkJaW5pdCgpOwotCi0JCQlyZXR1cm4gcGFnZUdyb3VwLmdldFBhZ2VzKGRhdGFNb2RlbCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJCXRyeSB7Ci0JCQkJcGFnZUhhbmRsZXIgPSBwYWdlR3JvdXAuZ2V0UGFnZUhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJCQlwYWdlR3JvdXBIYW5kbGVyID0gcGFnZUdyb3VwLmdldFBhZ2VHcm91cEhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlXVFBVSVBsdWdpbi5sb2dFcnJvcihleGMpOwotCQkJfQotCi0JCQlpZiAocGFnZUhhbmRsZXIgPT0gbnVsbCkKLQkJCQlwYWdlSGFuZGxlciA9IG5ldyBTaW1wbGVQYWdlSGFuZGxlcigpOwotCi0JCQlpZiAocGFnZUdyb3VwSGFuZGxlciA9PSBudWxsKQotCQkJCXBhZ2VHcm91cEhhbmRsZXIgPSBuZXcgU2ltcGxlUGFnZUdyb3VwSGFuZGxlcigpOwotCi0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQotCQlwcml2YXRlIGludCBjaGVja0ZvclNwZWNpYWxJZHMoU3RyaW5nIHBhZ2VJZCkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCi0JCQlMaXN0IHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQotCQkJaWYgKHBhZ2VzLmlzRW1wdHkoKSB8fCBwYWdlSWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCWlmIChwYWdlSWQuc3RhcnRzV2l0aChJRE1QYWdlSGFuZGxlci5QQUdFX0FGVEVSKSkgewotCQkJCVN0cmluZyBhZnRlcklEID0gcGFnZUlkLnN1YnN0cmluZyhJRE1QYWdlSGFuZGxlci5QQUdFX0FGVEVSLmxlbmd0aCgpLCBwYWdlSWQubGVuZ3RoKCkpOwotCQkJCXJlc3VsdCA9IGdldEluZGV4T2YoYWZ0ZXJJRCk7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0ID49IDAgJiYgcmVzdWx0IDwgcGFnZXMuc2l6ZSgpIC0gMSA/IHJlc3VsdCArIDEgOiAtMTsKLQkJCX0gZWxzZSBpZiAocGFnZUlkLnN0YXJ0c1dpdGgoSURNUGFnZUhhbmRsZXIuUEFHRV9CRUZPUkUpKSB7Ci0JCQkJU3RyaW5nIGJlZm9yZUlEID0gcGFnZUlkLnN1YnN0cmluZyhJRE1QYWdlSGFuZGxlci5QQUdFX0JFRk9SRS5sZW5ndGgoKSwgcGFnZUlkLmxlbmd0aCgpKTsKLQkJCQlyZXN1bHQgPSBnZXRJbmRleE9mKGJlZm9yZUlEKTsKLQkJCQlyZXN1bHQgPSByZXN1bHQgPj0gMSAmJiByZXN1bHQgPCBwYWdlcy5zaXplKCkgPyByZXN1bHQgLSAxIDogLTE7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGdldEluZGV4T2YocGFnZUlkKTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByaXZhdGUgaW50IGdldEluZGV4T2YoU3RyaW5nIHBhZ2VJZCkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCi0JCQlMaXN0IHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYWdlcy5zaXplKCk7IGluZGV4KyspIHsKLQkJCQlpZiAoKChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KGluZGV4KSkuZ2V0TmFtZSgpLmVxdWFscyhwYWdlSWQpKSB7Ci0JCQkJCXJlc3VsdCA9IGluZGV4OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotCQkJcmV0dXJuIGluaXRpYWxpemVkOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoRGF0YU1vZGVsV2l6YXJkIHdpemFyZCkgewotCQlJdGVyYXRvciBwYWdlR3JvdXBzID0gZ3JvdXBUYWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocGFnZUdyb3Vwcy5oYXNOZXh0KCkpIHsKLQkJCVBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cCA9IChQYWdlR3JvdXBFbnRyeSkgcGFnZUdyb3Vwcy5uZXh0KCk7Ci0JCQlpZiAocGFnZUdyb3VwLmlzSW5pdGlhbGl6ZWQoKSkgewotCQkJCUl0ZXJhdG9yIHBhZ2VzID0gcGFnZUdyb3VwLmdldFBhZ2VzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAocGFnZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCUlXaXphcmRQYWdlIHBhZ2UgPSAoSVdpemFyZFBhZ2UpIHBhZ2VzLm5leHQoKTsKLQkJCQkJd2l6YXJkLnN0b3JlRGVmYXVsdFNldHRpbmdzKHBhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVPcGVyYXRpb25XcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlT3BlcmF0aW9uV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI2MDAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVPcGVyYXRpb25XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotcHVibGljIGNsYXNzIFJ1bm5hYmxlT3BlcmF0aW9uV3JhcHBlciBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIElVbmRvYWJsZU9wZXJhdGlvbiB1bmRvYWJsZU9wZXJhdGlvbjsKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0JcHVibGljIFJ1bm5hYmxlT3BlcmF0aW9uV3JhcHBlcihJVW5kb2FibGVPcGVyYXRpb24gdW5kb2FibGVPcGVyYXRpb24pIHsKLQkJdGhpcy51bmRvYWJsZU9wZXJhdGlvbiA9IHVuZG9hYmxlT3BlcmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzdGF0dXMgPSB1bmRvYWJsZU9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUil7Ci0JCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjM5MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIG91ciBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyB0byB0aGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLiBUaGlzIGNsYXNzCi0gKiBuZWVkcyB0byBiZSB1c2VkIHdoZW4gcnVubmluZyB0aGUgb3BlcmF0aW9uIGZyb20gYSBJUnVubmFibGVDb250ZXh0LgotICogCi0gKiBAc2VlIElSdW5uYWJsZUNvbnRleHQKLSAqIEBzZWUgSmF2YVVJUGx1Z2luI2dldFJ1bm5hYmxlV2l0aFByb2dyZXNzIENyZWF0aW9uIGRhdGU6ICg1LzgvMjAwMSAxOjI4OjQ1IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgaGVhZGxlc3NSdW5uYWJsZTsKLQotCS8qKgotCSAqIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHsKLQkJc2V0SGVhZGxlc3NSdW5uYWJsZShhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS84LzIwMDEgMToyOTo1MiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRIZWFkbGVzc1J1bm5hYmxlKCkgewotCQlyZXR1cm4gaGVhZGxlc3NSdW5uYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoaXMgb3BlcmF0aW9uLiBQcm9ncmVzcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IuIFRoaXMgbWV0aG9kCi0JICogaXMgdXN1YWxseSBpbnZva2VkIGJ5IGFuIDxjb2RlPklSdW5uYWJsZUNvbnRleHQ8L2NvZGU+J3M8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCwgd2hpY2gKLQkgKiBzdXBwbGllcyB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4gQSByZXF1ZXN0IHRvIGNhbmNlbCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBob25vcmVkIGFuZAotCSAqIGFja25vd2xlZGdlZCBieSB0aHJvd2luZyA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlIHJlcXVlc3RzIGZvcgotCSAqICAgICAgICAgICAgY2FuY2VsYXRpb24KLQkgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgcnVuIG1ldGhvZCBtdXN0IHByb3BhZ2F0ZSBhIGNoZWNrZWQgZXhjZXB0aW9uLCBpdCBzaG91bGQgd3JhcCBpdCBpbnNpZGUKLQkgKiAgICAgICAgICAgICAgICBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFyZQotCSAqICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUKLQkgKiAgICAgICAgICAgICAgICBjYWxsaW5nIGNvbnRleHQKLQkgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIHVzaW5nCi0JICogICAgICAgICAgICAgICAgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk8L2NvZGU+LCBpdCBzaG91bGQgZXhpdCBieSB0aHJvd2luZwotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgSVJ1bm5hYmxlQ29udGV4dCNydW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWdldEhlYWRsZXNzUnVubmFibGUoKS5ydW4obW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS84LzIwMDEgMToyOTo1MiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SGVhZGxlc3NSdW5uYWJsZQotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMuajJlZS5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SGVhZGxlc3NSdW5uYWJsZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBuZXdIZWFkbGVzc1J1bm5hYmxlKSB7Ci0JCWhlYWRsZXNzUnVubmFibGUgPSBuZXdIZWFkbGVzc1J1bm5hYmxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2F2ZUhhbmRsZXJVSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TYXZlSGFuZGxlclVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTYyMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TYXZlSGFuZGxlclVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVNhdmVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBTYXZlSGFuZGxlclVJIGltcGxlbWVudHMgSVNhdmVIYW5kbGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0ZBSUxFRCA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiMTYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFR0lOTklOR19NRVNTQUdFID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIxNyIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNZZXNUb0FsbCA9IGZhbHNlOwotCXByb3RlY3RlZCBpbnQgcmVmZXJlbmNlQ291bnQgPSAwOwotCi0JLyoqCi0JICogU2F2ZUhhbmRsZXJVSSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlSGFuZGxlclVJKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGFjY2VzcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3MoKSB7Ci0JCXJlZmVyZW5jZUNvdW50Kys7Ci0JfQotCi0JcHJvdGVjdGVkIFNoZWxsIGdldFBhcmVudFNoZWxsRm9yRGlhbG9nKCkgewotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgcmVzdWx0ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IERpc3BsYXkuZ2V0RGVmYXVsdCgpIDogcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVGYWlsZWQoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZWZlcmVuY2VDb3VudCA+IDEpCi0JCQkvL0xldCB0aGUgb3V0ZXJtb3N0IHJlZmVyZW5jZSBoYW5kbGUgaXQKLQkJCXRocm93IGV4OwotCQlTdHJpbmcgZXhNc2cgPSBleC5nZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKSA9PSBudWxsID8gZXguZ2V0TWVzc2FnZSgpIDogZXguZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IEJFR0lOTklOR19NRVNTQUdFICsgIjpcbiIgKyBleE1zZzsvLyROT04tTkxTLTEkCi0JCWdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0UGFyZW50U2hlbGxGb3JEaWFsb2coKSwgU0FWRV9GQUlMRUQsIG1lc3NhZ2UpOwotCQkJfQotCQl9KTsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCWVsc2UKLQkJCXRocm93IGV4OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByb21wdFVzZXJUb1NhdmVSZWFkT25seShJRmlsZSBhRmlsZSkgewotCi0JCVN0cmluZ1tdIGJ1dHRvblN0cmluZ3MgPSB7V1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJZZXNfVUlfIiksIFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiWWVzX1RvX0FsbF9VSV8iKSwgV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJOb19VSV8iKX07IC8vJE5PTi1OTFMtMyQgPSAiTm8iIC8vJE5PTi1OTFMtMiQgPSAiWWVzIFRvIEFsbCIgLy8kTk9OLU5MUy0xJCA9ICJZZXMiCi0JCVN0cmluZyB0aXRsZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiU2F2aW5nX1JlYWQtT25seV9GaWxlX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIlNhdmluZyBSZWFkLU9ubHkgRmlsZSIKLQkJU3RyaW5nIG1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjJjb25jYXRfSU5GT18iLCAobmV3IE9iamVjdFtde2FGaWxlLmdldEZ1bGxQYXRoKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZpbGUgezB9IGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNhdmVkLiAgV291bGQgeW91IGxpa2UgdG8gbWFrZSBpdCBlZGl0YWJsZSBhbmQgc2F2ZSBhbnl3YXk/IgotCi0JCWZpbmFsIE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0UGFyZW50U2hlbGxGb3JEaWFsb2coKSwgdGl0bGUsIG51bGwsIC8vIGFjY2VwdAotCQkJCQkvLyB0aGUKLQkJCQkJLy8gZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cKLQkJCQkJLy8gaWNvbgotCQkJCQltZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBidXR0b25TdHJpbmdzLCAwKTsgLy8gWWVzIGlzIHRoZSBkZWZhdWx0Ci0KLQkJZmluYWwgaW50W10gcmV0ID0gbmV3IGludFsxXTsKLQkJZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJcmV0WzBdID0gZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc3dpdGNoIChyZXRbMF0pIHsKLQkJCWNhc2UgMCA6IHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWNhc2UgMSA6IHsKLQkJCQlpc1llc1RvQWxsID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWNhc2UgMiA6IHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHJlbGVhc2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJcmVmZXJlbmNlQ291bnQtLTsKLQkJaWYgKHJlZmVyZW5jZUNvdW50ID09IDApCi0JCQlpc1llc1RvQWxsID0gZmFsc2U7Ci0KLQl9Ci0KLQkvKioKLQkgKiBzaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKElGaWxlIGFGaWxlKSB7Ci0JCWJvb2xlYW4geWVzID0gaXNZZXNUb0FsbCB8fCBwcm9tcHRVc2VyVG9TYXZlUmVhZE9ubHkoYUZpbGUpOwotCQlpZiAoeWVzKQotCQkJYUZpbGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlyZXR1cm4geWVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVBhZ2VHcm91cEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlUGFnZUdyb3VwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmFkMDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlUGFnZUdyb3VwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVQYWdlR3JvdXBIYW5kbGVyIGltcGxlbWVudHMgSURNUGFnZUdyb3VwSGFuZGxlciB7Ci0JcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBjdXJyZW50UGFnZUdyb3VwSUQsIFN0cmluZ1tdIHBhZ2VHcm91cElEcykgewotCQlpZiAocGFnZUdyb3VwSURzID09IG51bGwgfHwgcGFnZUdyb3VwSURzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGN1cnJlbnRQYWdlR3JvdXBJRCA9PSBudWxsKQotCQkJcmV0dXJuIHBhZ2VHcm91cElEc1swXTsKLQotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFnZUdyb3VwSURzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJaWYgKHBhZ2VHcm91cElEc1tpbmRleF0uZXF1YWxzKGN1cnJlbnRQYWdlR3JvdXBJRCkpIHsKLQkJCQkvLyBXZSBmb3VuZCB0aGUgY3VycmVudFBhZ2VHcm91cElELCBzbyB3ZSB3YW50IHRvIHJldHVybiB0aGUgbmV4dCBvbmUgaW4gdGhlCi0JCQkJLy8gYXJyYXkgaWYgdGhlcmUgaXMgb25lLgotCQkJCWlmIChpbmRleCArIDEgPCBwYWdlR3JvdXBJRHMubGVuZ3RoKSB7Ci0JCQkJCXJlc3VsdCA9IHBhZ2VHcm91cElEc1tpbmRleCArIDFdOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGRiMzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlUGFnZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VIYW5kbGVyIGltcGxlbWVudHMgSURNUGFnZUhhbmRsZXIKLXsKLSAgcHVibGljIFN0cmluZyBnZXROZXh0UGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWROZXh0UGFnZU5hbWUpIAotICB7Ci0gICAgcmV0dXJuIGV4cGVjdGVkTmV4dFBhZ2VOYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmV2aW91c1BhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkUHJldmlvdXNQYWdlTmFtZSkgCi0gIHsKLQlyZXR1cm4gZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0VUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5OWFmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3M7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0VUkgZXh0ZW5kcyBTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MgewotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFZGl0SW1wbChmaW5hbCBJRmlsZVtdIGZpbGVzVG9WYWxpZGF0ZSkgewotCQlmaW5hbCBJU3RhdHVzIFtdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3RhdHVzWzBdID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlc1RvVmFsaWRhdGUsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0YXR1c1swXTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZWRLZXlMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZEtleUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZWUxODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZEtleUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzMwLzIwMDEgNDowMDoyOCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGltZWRLZXlMaXN0ZW5lciBleHRlbmRzIFRpbWVyIGltcGxlbWVudHMgS2V5TGlzdGVuZXIsIE1vdXNlTGlzdGVuZXIsIE1vdXNlVHJhY2tMaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIFdpZGdldCBtb25pdG9yaW5nVGFyZ2V0OwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVfTElNSVQgPSAyMDA7Ci0KLQkvKioKLQkgKiBKMkVFVGltZWRLZXlMaXN0ZW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZWxheQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBUaW1lZEtleUxpc3RlbmVyKGludCBkZWxheSwgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoZGVsYXksIGxpc3RlbmVyKTsKLQkJc2V0UmVwZWF0cyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8zMC8yMDAxIDQ6NDM6MzMgUE0pCi0JICogCi0JICogQHBhcmFtIGEKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkS2V5TGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcyhUSU1FX0xJTUlULCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU2VudCB3aGVuIGEga2V5IGlzIHByZXNzZWQgb24gdGhlIHN5c3RlbSBrZXlib2FyZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUga2V5IHByZXNzCi0JICovCi0JcHVibGljIHZvaWQga2V5UHJlc3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYSBrZXkgaXMgcmVsZWFzZWQgb24gdGhlIHN5c3RlbSBrZXlib2FyZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUga2V5IHJlbGVhc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50IGUpIHsKLQkJLy8gUmVwbGFjZWQgd2l0aCBTV1QuTW9kaWZ5IC0tIHNlZSBtb2RpZnlUZXh0KCkgaW4gdGhpcyBjbGFzcwotCQkvLyAgICAgICAgbW9uaXRvcmluZ1RhcmdldCA9IChXaWRnZXQpIGUuZ2V0U291cmNlKCk7Ci0JCS8vICAgICAgICByZXN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3duKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyI21vdXNlVXAoTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQltb25pdG9yaW5nVGFyZ2V0ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJcmVzdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXIjbW91c2VFbnRlcihNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lciNtb3VzZUV4aXQoTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lciNtb3VzZUhvdmVyKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS51dGlsLlRpbWVyI2dldFNvdXJjZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBtb25pdG9yaW5nVGFyZ2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZWRNb2RpZnlMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZE1vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDBjNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZE1vZGlmeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIEoyRUVUaW1lZEtleUxpc3RlbmVyIGJ1dCB1c2luZyB0aGUgTW9kaWZ5IFNXVCBldmVudAotICogaW5zdGVhZCBvZiB0aGUgS2V5VXAuIENyZWF0aW9uIGRhdGU6ICg5LzEwLzIwMDEgMTE6NDY6NTEgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgVGltZWRNb2RpZnlMaXN0ZW5lciBleHRlbmRzIFRpbWVkS2V5TGlzdGVuZXIgewotCS8qKgotCSAqIEoyRUVUaW1lZE1vZGVmeUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRlbGF5Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkTW9kaWZ5TGlzdGVuZXIoaW50IGRlbGF5LCBBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihkZWxheSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEoyRUVUaW1lZE1vZGVmeUxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBUaW1lZE1vZGlmeUxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIFJlL1N0YXJ0IHRoZSB0aW1lcgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiMTFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLQotcHVibGljIGNsYXNzIFRpbWVyIHsKLQkvKioKLQkgKiBEb1Bvc3RFdmVudCBpcyBhIHJ1bm5hYmxlIGNsYXNzIHRoYXQgZmlyZXMgYWN0aW9uRXZlbnRzIHRvIHRoZSBsaXN0ZW5lcnMgb24gdGhlCi0JICogRXZlbnREaXNwYXRjaFRocmVhZCwgdmlhIGludm9rZUxhdGVyLgotCSAqIAotCSAqIEBzZWUgI3Bvc3QKLQkgKi8KLQljbGFzcyBEb1Bvc3RFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGV2ZW50UXVldWVkKSB7Ci0JCQkJZmlyZUFjdGlvblBlcmZvcm1lZChuZXcgQWN0aW9uRXZlbnQoZ2V0U291cmNlKCksIDAsIG51bGwpKTsKLQkJCQljYW5jZWxFdmVudCgpOwotCQkJfQotCQl9Ci0KLQkJVGltZXIgZ2V0VGltZXIoKSB7Ci0JCQlyZXR1cm4gVGltZXIudGhpczsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCWJvb2xlYW4gZXZlbnRRdWV1ZWQgPSBmYWxzZTsKLQlpbnQgaW5pdGlhbERlbGF5LCBkZWxheTsKLQlib29sZWFuIHJlcGVhdHMgPSB0cnVlLCBjb2FsZXNjZSA9IHRydWU7Ci0JcHJpdmF0ZSBSdW5uYWJsZSBkb1Bvc3RFdmVudDsKLQkvLyBUaGVzZSBmaWVsZHMgYXJlIG1haW50YWluZWQgYnkgVGltZXJRdWV1ZS4KLQkvLyBldmVudFF1ZXVlZCBjYW4gYWxzbyBiZSByZXNldCBieSB0aGUgVGltZXJRdWV1ZSwgYnV0IHdpbGwgb25seSBldmVyCi0JLy8gaGFwcGVuIGluIGFwcGxldCBjYXNlIHdoZW4gVGltZXJRdWV1ZXMgdGhyZWFkIGlzIGRlc3Ryb3llZC4KLQlsb25nIGV4cGlyYXRpb25UaW1lOwotCVRpbWVyIG5leHRUaW1lcjsKLQlib29sZWFuIHJ1bm5pbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgVGltZXIgdGhhdCB3aWxsIG5vdGlmeSBpdHMgbGlzdGVuZXJzIGV2ZXJ5IDxpPmRlbGF5IDwvaT4gbWlsbGlzZWNvbmRzLgotCSAqIAotCSAqIEBwYXJhbSBkZWxheQotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBsaXN0ZW5lciBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIEFuIGluaXRpYWwgbGlzdGVuZXIKLQkgKiBAc2VlICNzZXRJbml0aWFsRGVsYXkKLQkgKiBAc2VlICNzZXRSZXBlYXRzCi0JICovCi0JcHVibGljIFRpbWVyKGludCBkZWxheSwgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxheSA9IGRlbGF5OwotCQl0aGlzLmluaXRpYWxEZWxheSA9IGRlbGF5OwotCi0JCWRvUG9zdEV2ZW50ID0gbmV3IERvUG9zdEV2ZW50KCk7Ci0KLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gYWN0aW9uTGlzdGVuZXIgdG8gdGhlIFRpbWVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgY2FuY2VsRXZlbnQoKSB7Ci0JCWV2ZW50UXVldWVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgdGhhdCBoYXZlIHJlZ2lzdGVyZWQgaW50ZXJlc3QgZm9yIG5vdGlmaWNhdGlvbiBvbiB0aGlzIGV2ZW50IHR5cGUuIFRoZQotCSAqIGV2ZW50IGluc3RhbmNlIGlzIGxhemlseSBjcmVhdGVkIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbnRvIHRoZSBmaXJlIG1ldGhvZC4KLQkgKiAKLQkgKiBAc2VlIEV2ZW50TGlzdGVuZXJMaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCS8vIEd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgbm9uLW51bGwgYXJyYXkKLQkJQWN0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0KLQkJLy8gUHJvY2VzcyB0aGUgbGlzdGVuZXJzIGxhc3QgdG8gZmlyc3QsIG5vdGlmeWluZwotCQkvLyB0aG9zZSB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewotCQkJbGlzdGVuZXJzW2ldLmFjdGlvblBlcmZvcm1lZChlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRpbWVyJ3MgZGVsYXkuCi0JICogCi0JICogQHNlZSAjc2V0RGVsYXkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlbGF5KCkgewotCQlyZXR1cm4gZGVsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVGltZXIncyBpbml0aWFsIGRlbGF5LgotCSAqIAotCSAqIEBzZWUgI3NldERlbGF5Ci0JICovCi0JcHVibGljIGludCBnZXRJbml0aWFsRGVsYXkoKSB7Ci0JCXJldHVybiBpbml0aWFsRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Yj50cnVlIDwvYj4gaWYgdGhlIFRpbWVyIGNvYWxlc2NlcyBtdWx0aXBsZSBwZW5kaW5nIDxiPnBlcmZvcm1Db21tYW5kKCkgPC9iPgotCSAqIG1lc3NhZ2VzLgotCSAqIAotCSAqIEBzZWUgI3NldENvYWxlc2NlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb2FsZXNjZSgpIHsKLQkJcmV0dXJuIGNvYWxlc2NlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGI+dHJ1ZSA8L2I+IGlmIHRoZSBUaW1lciB3aWxsIHNlbmQgYSA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2UgdG8gaXRzCi0JICogbGlzdGVuZXJzIG11bHRpcGxlIHRpbWVzLgotCSAqIAotCSAqIEBzZWUgI3NldFJlcGVhdHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdHMoKSB7Ci0JCXJldHVybiByZXBlYXRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGI+dHJ1ZSA8L2I+IGlmIHRoZSBUaW1lciBpcyBydW5uaW5nLgotCSAqIAotCSAqIEBzZWUgI3N0YXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCQlyZXR1cm4gdGltZXJRdWV1ZSgpLmNvbnRhaW5zVGltZXIodGhpcyk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgcG9zdCgpIHsKLQkJaWYgKCFldmVudFF1ZXVlZCkgewotCQkJZXZlbnRRdWV1ZWQgPSB0cnVlOwotCQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKGRvUG9zdEV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gQWN0aW9uTGlzdGVuZXIgZnJvbSB0aGUgVGltZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVzdGFydHMgYSBUaW1lciwgY2FuY2VsaW5nIGFueSBwZW5kaW5nIGZpcmluZ3MsIGFuZCBjYXVzaW5nIGl0IHRvIGZpcmUgd2l0aCBpdHMgaW5pdGlhbAotCSAqIGRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydCgpIHsKLQkJc3RvcCgpOwotCQlzdGFydCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgVGltZXIgY29hbGVzY2VzIG11bHRpcGxlIHBlbmRpbmcgQWN0aW9uRXZlbnQgZmlyaW5ncy4gQSBidXN5IGFwcGxpY2F0aW9uIG1heQotCSAqIG5vdCBiZSBhYmxlIHRvIGtlZXAgdXAgd2l0aCBhIFRpbWVyJ3MgbWVzc2FnZSBnZW5lcmF0aW9uLCBjYXVzaW5nIG11bHRpcGxlCi0JICogPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiBtZXNzYWdlIHNlbmRzIHRvIGJlIHF1ZXVlZC4gV2hlbiBwcm9jZXNzZWQsIHRoZSBhcHBsaWNhdGlvbiBzZW5kcwotCSAqIHRoZXNlIG1lc3NhZ2VzIG9uZSBhZnRlciB0aGUgb3RoZXIsIGNhdXNpbmcgdGhlIFRpbWVyJ3MgbGlzdGVuZXJzIHRvIHJlY2VpdmUgYSBzZXF1ZW5jZSBvZgotCSAqIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZXMgd2l0aCBubyBkZWxheSBiZXR3ZWVuIHRoZW0uIENvYWxlc2NpbmcgYXZvaWRzIHRoaXMKLQkgKiBzaXR1YXRpb24gYnkgcmVkdWNpbmcgbXVsdGlwbGUgcGVuZGluZyBtZXNzYWdlcyB0byBhIHNpbmdsZSBtZXNzYWdlIHNlbmQuIFRpbWVycyBjb2FsZXNjZQotCSAqIHRoZWlyIG1lc3NhZ2Ugc2VuZHMgYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2FsZXNjZShib29sZWFuIGZsYWcpIHsKLQkJY29hbGVzY2UgPSBmbGFnOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFRpbWVyJ3MgZGVsYXksIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gc3VjY2Vzc2l2ZSA8Yj5hY3Rpb25QZXJmb21lZCgpCi0JICogPC9iPiBtZXNzYWdlcyB0byBpdHMgbGlzdGVuZXJzCi0JICogCi0JICogQHNlZSAjc2V0SW5pdGlhbERlbGF5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsYXkoaW50IGRlbGF5KSB7Ci0JCWlmIChkZWxheSA8IDApIHsKLQkJCVN0cmluZyBtc2cgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuVGltZXJfVUlfMCwgbmV3IE9iamVjdFtde0ludGVnZXIudG9TdHJpbmcoZGVsYXkpfSk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJdGhpcy5kZWxheSA9IGRlbGF5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIFRpbWVyJ3MgaW5pdGlhbCBkZWxheS4gVGhpcyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBmaXJzdCAicmluZ2luZyIgb2YgdGhlIFRpbWVyIG9ubHkuCi0JICogU3Vic2VxdWVudCByaW5naW5ncyB3aWxsIGJlIHNwYWNlZCB1c2luZyB0aGUgZGVsYXkgcHJvcGVydHkuCi0JICogCi0JICogQHNlZSAjc2V0RGVsYXkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsRGVsYXkoaW50IGluaXRpYWxEZWxheSkgewotCQlpZiAoaW5pdGlhbERlbGF5IDwgMCkgewotCQkJU3RyaW5nIG1zZyA9IFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5UaW1lcl9VSV8xLCBuZXcgT2JqZWN0W117SW50ZWdlci50b1N0cmluZyhpbml0aWFsRGVsYXkpfSk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQkJdGhpcy5pbml0aWFsRGVsYXkgPSBpbml0aWFsRGVsYXk7Ci0JfQotCi0JLyoqCi0JICogSWYgPGI+ZmxhZyA8L2I+IGlzIDxiPmZhbHNlIDwvYj4sIGluc3RydWN0cyB0aGUgVGltZXIgdG8gc2VuZCA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IHRvCi0JICogaXRzIGxpc3RlbmVycyBvbmx5IG9uY2UsIGFuZCB0aGVuIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwZWF0cyhib29sZWFuIGZsYWcpIHsKLQkJcmVwZWF0cyA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIHRoZSBUaW1lciwgY2F1c2luZyBpdCB0byBzZW5kIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZXMgdG8gaXRzIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAc2VlICNzdG9wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRpbWVyUXVldWUoKS5hZGRUaW1lcih0aGlzLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIGdldEluaXRpYWxEZWxheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyBhIFRpbWVyLCBjYXVzaW5nIGl0IHRvIHN0b3Agc2VuZGluZyA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2VzIHRvIGl0cyBUYXJnZXQuCi0JICogCi0JICogQHNlZSAjc3RhcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aW1lclF1ZXVlKCkucmVtb3ZlVGltZXIodGhpcyk7Ci0JCWNhbmNlbEV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGltZXIgcXVldWUuCi0JICovCi0JVGltZXJRdWV1ZSB0aW1lclF1ZXVlKCkgewotCQlyZXR1cm4gVGltZXJRdWV1ZS5zaW5nbGV0b24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmb3IgdGhlIEFjdGlvbkV2ZW50IHRoYXQgaXMgZmlyZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyUXVldWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXJRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODZhMGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZXJRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotCi0KLWNsYXNzIFRpbWVyUXVldWUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgVGltZXJRdWV1ZSBzaW5nbGV0b247Ci0JVGltZXIgZmlyc3RUaW1lcjsKLQlib29sZWFuIHJ1bm5pbmc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IGNsYXNzTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUaW1lclF1ZXVlLgotCSAqLwotCXB1YmxpYyBUaW1lclF1ZXVlKCkgewotCQlzdXBlcigpOwotCi0JCS8vIE5vdyBzdGFydCB0aGUgVGltZXJRdWV1ZSB0aHJlYWQuCi0JCXN0YXJ0KCk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgYWRkVGltZXIoVGltZXIgdGltZXIsIGxvbmcgZXhwaXJhdGlvblRpbWUpIHsKLQkJVGltZXIgcHJldmlvdXNUaW1lcjsKLQkJVGltZXIgbmV4dFRpbWVyOwotCi0JCS8vIElmIHRoZSBUaW1lciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgdGhlbiBpZ25vcmUgdGhlIGFkZC4KLQkJaWYgKHRpbWVyLnJ1bm5pbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByZXZpb3VzVGltZXIgPSBudWxsOwotCQluZXh0VGltZXIgPSBmaXJzdFRpbWVyOwotCi0JCS8vIEluc2VydCB0aGUgVGltZXIgaW50byB0aGUgbGlua2VkIGxpc3QgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbAotCQkvLyBleHBpcmUuIElmIHR3byB0aW1lcnMgZXhwaXJlIGF0IHRoZSBzYW1lIHRpbWUsIHB1dCB0aGUgbmV3ZXIgZW50cnkKLQkJLy8gbGF0ZXIgc28gdGhleSBleHBpcmUgaW4gdGhlIG9yZGVyIHRoZXkgY2FtZSBpbi4KLQotCQl3aGlsZSAobmV4dFRpbWVyICE9IG51bGwpIHsKLQkJCWlmIChuZXh0VGltZXIuZXhwaXJhdGlvblRpbWUgPiBleHBpcmF0aW9uVGltZSkKLQkJCQlicmVhazsKLQotCQkJcHJldmlvdXNUaW1lciA9IG5leHRUaW1lcjsKLQkJCW5leHRUaW1lciA9IG5leHRUaW1lci5uZXh0VGltZXI7Ci0JCX0KLQotCQlpZiAocHJldmlvdXNUaW1lciA9PSBudWxsKSB7Ci0JCQlmaXJzdFRpbWVyID0gdGltZXI7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2aW91c1RpbWVyLm5leHRUaW1lciA9IHRpbWVyOwotCQl9Ci0KLQkJdGltZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTsKLQkJdGltZXIubmV4dFRpbWVyID0gbmV4dFRpbWVyOwotCQl0aW1lci5ydW5uaW5nID0gdHJ1ZTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNUaW1lcihUaW1lciB0aW1lcikgewotCQlyZXR1cm4gdGltZXIucnVubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgYSB0b24gb2YgdGltZXJzLCB0aGlzIG1ldGhvZCBtYXkgbmV2ZXIgcmV0dXJuLiBJdCBsb29wcyBjaGVja2luZyB0byBzZWUgaWYgdGhlCi0JICogaGVhZCBvZiB0aGUgVGltZXIgbGlzdCBoYXMgZXhwaXJlZC4gSWYgaXQgaGFzLCBpdCBwb3N0cyB0aGUgVGltZXIgYW5kIHJlc2NoZWR1bGVzIGl0IGlmCi0JICogbmVjZXNzYXJ5LgotCSAqLwotCXN5bmNocm9uaXplZCBsb25nIHBvc3RFeHBpcmVkVGltZXJzKCkgewotCQlUaW1lciB0aW1lcjsKLQkJbG9uZyBjdXJyZW50VGltZTsKLQkJbG9uZyB0aW1lVG9XYWl0OwotCi0JCS8vIFRoZSB0aW1lVG9XYWl0IHdlIHJldHVybiBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUgYW5kIG9ubHkgYmUgemVybwotCQkvLyB3aGVuIHdlIGhhdmUgbm8gVGltZXJzIHRvIHdhaXQgZm9yLgotCi0JCWRvIHsKLQkJCXRpbWVyID0gZmlyc3RUaW1lcjsKLQkJCWlmICh0aW1lciA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCi0JCQljdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJdGltZVRvV2FpdCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lIC0gY3VycmVudFRpbWU7Ci0KLQkJCWlmICh0aW1lVG9XYWl0IDw9IDApIHsKLQkJCQl0cnkgewotCQkJCQl0aW1lci5wb3N0KCk7IC8vIGhhdmUgdGltZXIgcG9zdCBhbiBldmVudAotCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHF1ZXVlCi0JCQkJcmVtb3ZlVGltZXIodGltZXIpOwotCi0JCQkJLy8gVGhpcyB0cmllcyB0byBrZWVwIHRoZSBpbnRlcnZhbCB1bmlmb3JtIGF0Ci0JCQkJLy8gdGhlIGNvc3Qgb2YgZHJpZnQuCi0JCQkJaWYgKHRpbWVyLmlzUmVwZWF0cygpKSB7Ci0JCQkJCWFkZFRpbWVyKHRpbWVyLCBjdXJyZW50VGltZSArIHRpbWVyLmdldERlbGF5KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQWxsb3cgb3RoZXIgdGhyZWFkcyB0byBjYWxsIGFkZFRpbWVyKCkgYW5kIHJlbW92ZVRpbWVyKCkKLQkJCS8vIGV2ZW4gd2hlbiB3ZSBhcmUgcG9zdGluZyBUaW1lcnMgbGlrZSBtYWQuIFNpbmNlIHRoZSB3YWl0KCkKLQkJCS8vIHJlbGVhc2VzIHRoZSBsb2NrLCBiZSBzdXJlIG5vdCB0byBtYWludGFpbiBhbnkgc3RhdGUKLQkJCS8vIGJldHdlZW4gaXRlcmF0aW9ucyBvZiB0aGUgbG9vcC4KLQotCQkJdHJ5IHsKLQkJCQl3YWl0KDEpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9IHdoaWxlICh0aW1lVG9XYWl0IDw9IDApOwotCi0JCXJldHVybiB0aW1lVG9XYWl0OwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVRpbWVyKFRpbWVyIHRpbWVyKSB7Ci0JCVRpbWVyIHByZXZpb3VzVGltZXI7Ci0JCVRpbWVyIG5leHRUaW1lcjsKLQkJYm9vbGVhbiBmb3VuZDsKLQotCQlpZiAoIXRpbWVyLnJ1bm5pbmcpCi0JCQlyZXR1cm47Ci0KLQkJcHJldmlvdXNUaW1lciA9IG51bGw7Ci0JCW5leHRUaW1lciA9IGZpcnN0VGltZXI7Ci0JCWZvdW5kID0gZmFsc2U7Ci0KLQkJd2hpbGUgKG5leHRUaW1lciAhPSBudWxsKSB7Ci0JCQlpZiAobmV4dFRpbWVyID09IHRpbWVyKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlwcmV2aW91c1RpbWVyID0gbmV4dFRpbWVyOwotCQkJbmV4dFRpbWVyID0gbmV4dFRpbWVyLm5leHRUaW1lcjsKLQkJfQotCi0JCWlmICghZm91bmQpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHByZXZpb3VzVGltZXIgPT0gbnVsbCkgewotCQkJZmlyc3RUaW1lciA9IHRpbWVyLm5leHRUaW1lcjsKLQkJfSBlbHNlIHsKLQkJCXByZXZpb3VzVGltZXIubmV4dFRpbWVyID0gdGltZXIubmV4dFRpbWVyOwotCQl9Ci0KLQkJdGltZXIuZXhwaXJhdGlvblRpbWUgPSAwOwotCQl0aW1lci5uZXh0VGltZXIgPSBudWxsOwotCQl0aW1lci5ydW5uaW5nID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKLQkJbG9uZyB0aW1lVG9XYWl0OwotCi0JCXRyeSB7Ci0JCQl3aGlsZSAocnVubmluZykgewotCQkJCXRpbWVUb1dhaXQgPSBwb3N0RXhwaXJlZFRpbWVycygpOwotCQkJCXRyeSB7Ci0JCQkJCXdhaXQodGltZVRvV2FpdCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyZWFkRGVhdGggdGQpIHsKLQkJCXJ1bm5pbmcgPSBmYWxzZTsKLQkJCS8vIE1hcmsgYWxsIHRoZSB0aW1lcnMgd2UgY29udGFpbiBhcyBub3QgYmVpbmcgcXVldWVkLgotCQkJVGltZXIgdGltZXIgPSBmaXJzdFRpbWVyOwotCQkJd2hpbGUgKHRpbWVyICE9IG51bGwpIHsKLQkJCQl0aW1lci5ldmVudFF1ZXVlZCA9IGZhbHNlOwotCQkJCXRpbWVyID0gdGltZXIubmV4dFRpbWVyOwotCQkJfQotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKCF0aGlzLnJ1bm5pbmcpCi0JCQkJCXN0YXJ0KCk7Ci0JCQl9Ci0JCQl0aHJvdyB0ZDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGltZXJRdWV1ZSBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXN5bmNocm9uaXplZCAoY2xhc3NMb2NrKSB7Ci0JCQkJc2luZ2xldG9uID0gbmV3IFRpbWVyUXVldWUoKTsKLQkJCX0KLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHJ1bm5pbmcpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLlRpbWVyUXVldWVfRVJST1JfMCk7Ci0JCX0KLQkJVGhyZWFkIHRpbWVyVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiVGltZXJRdWV1ZSIpOy8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXRpbWVyVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRpbWVyVGhyZWFkLnN0YXJ0KCk7Ci0JCXJ1bm5pbmcgPSB0cnVlOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0JCXJ1bm5pbmcgPSBmYWxzZTsKLQkJbm90aWZ5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWY7Ci0JCVRpbWVyIG5leHRUaW1lcjsKLQotCQlidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlRpbWVyUXVldWUgKCIpOy8vJE5PTi1OTFMtMSQKLQotCQluZXh0VGltZXIgPSBmaXJzdFRpbWVyOwotCQl3aGlsZSAobmV4dFRpbWVyICE9IG51bGwpIHsKLQkJCWJ1Zi5hcHBlbmQobmV4dFRpbWVyLnRvU3RyaW5nKCkpOwotCi0JCQluZXh0VGltZXIgPSBuZXh0VGltZXIubmV4dFRpbWVyOwotCQkJaWYgKG5leHRUaW1lciAhPSBudWxsKQotCQkJCWJ1Zi5hcHBlbmQoIiwgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJYnVmLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50SWRlbnRpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOTk5ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSWRlbnRpZmllckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRNYW5hZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1jbGFzcyBVSUVuYWJsZW1lbnRJZGVudGlmaWVyIGV4dGVuZHMgRW5hYmxlbWVudElkZW50aWZpZXIgaW1wbGVtZW50cyBJSWRlbnRpZmllckxpc3RlbmVyIHsKLQotCXByaXZhdGUgSUlkZW50aWZpZXIgYWN0aXZpdHlJZGVudGlmaWVyOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgVUlFbmFibGVtZW50SWRlbnRpZmllcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIoaWQsIHByb2plY3QpOwotCQlJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJYWN0aXZpdHlJZGVudGlmaWVyID0gZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0SWRlbnRpZmllcihpZCk7Ci0JCQlhY3Rpdml0eUlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyTGlzdGVuZXIjaWRlbnRpZmllckNoYW5nZWQob3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JZGVudGlmaWVyRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaWRlbnRpZmllckNoYW5nZWQoSWRlbnRpZmllckV2ZW50IGlkZW50aWZpZXJFdmVudCkgewotCQlib29sZWFuIGVuYWJsZWRDaGFuZ2VkID0gcmVzZXRFbmFibGVkKCk7Ci0JCUVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZXZ0ID0gbmV3IEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQodGhpcywgZmFsc2UsIGVuYWJsZWRDaGFuZ2VkKTsKLQkJZmlyZUlkZW50aWZpZXJDaGFuZ2VkKGV2dCk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpdml0eU1hbmFnZXIgZ2V0QWN0aXZpdHlNYW5hZ2VyKCkgewotCQlyZXR1cm4gKChVSUVuYWJsZW1lbnRNYW5hZ2VyKSBJRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UpLmdldEFjdGl2aXR5TWFuYWdlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlzcGUud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXIjZ2V0TmV3RW5hYmxlZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0TmV3RW5hYmxlZCgpIHsKLQkJSUlkZW50aWZpZXIgaWRlbnRpZmllciA9IGdldEFjdGl2aXR5SWRlbnRpZmllcigpOwotCQlpZiAoaWRlbnRpZmllciAhPSBudWxsKQotCQkJcmV0dXJuIGlkZW50aWZpZXIuaXNFbmFibGVkKCkgJiYgc3VwZXIuZ2V0TmV3RW5hYmxlZCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIElJZGVudGlmaWVyIGdldEFjdGl2aXR5SWRlbnRpZmllcigpIHsKLQkJaWYgKGFjdGl2aXR5SWRlbnRpZmllciA9PSBudWxsKXsKLQkJCUlBY3Rpdml0eU1hbmFnZXIgbWFuYWdlciA9IGdldEFjdGl2aXR5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWFjdGl2aXR5SWRlbnRpZmllciA9IGdldEFjdGl2aXR5TWFuYWdlcigpLmdldElkZW50aWZpZXIoZ2V0SWQoKSk7Ci0JCQkJYWN0aXZpdHlJZGVudGlmaWVyLmFkZElkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlJZGVudGlmaWVyOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2Y5M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgVUlFbmFibGVtZW50TWFuYWdlciBleHRlbmRzIEVuYWJsZW1lbnRNYW5hZ2VyIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCBhY3Rpdml0eVN1cHBvcnQgPSBudWxsOwotCi0JcHVibGljIFVJRW5hYmxlbWVudE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpdml0eU1hbmFnZXIgZ2V0QWN0aXZpdHlNYW5hZ2VyKCkgewotCQlpZiAoZ2V0QWN0aXZpdHlTdXBwb3J0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBhY3Rpdml0eVN1cHBvcnQuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgZ2V0QWN0aXZpdHlTdXBwb3J0KCkgewotCQlpZiAoYWN0aXZpdHlTdXBwb3J0ID09IG51bGwpCi0JCQlhY3Rpdml0eVN1cHBvcnQgPSBpbml0QWN0aXZpdHlTdXBwb3J0KCk7Ci0JCXJldHVybiBhY3Rpdml0eVN1cHBvcnQ7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IGluaXRBY3Rpdml0eVN1cHBvcnQoKSB7Ci0JCUlXb3JrYmVuY2ggd29yayA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3b3JrID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL05vdCBpbml0aWFsaXplZCB5ZXQKLQkJfQotCQlyZXR1cm4gKHdvcmsgIT0gbnVsbCkgPyB3b3JrLmdldEFjdGl2aXR5U3VwcG9ydCgpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyI2NyZWF0ZUlkZW50aWZpZXIoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbmFibGVtZW50SWRlbnRpZmllciBjcmVhdGVJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVySWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBVSUVuYWJsZW1lbnRJZGVudGlmaWVyKGlkZW50aWZpZXJJZCwgcHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSU9wZXJhdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlPcGVyYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjA2YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSU9wZXJhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklPcGVyYXRpb25IYW5kbGVyOwotCi0KLS8qKgotICogQGF1dGhvciBkZmhvbHQKLSAqLwotcHVibGljIGNsYXNzIFVJT3BlcmF0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElPcGVyYXRpb25IYW5kbGVyIHsKLQlwcm90ZWN0ZWQgU2hlbGwgcGFyZW50U2hlbGw7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JTkZPUk1BVElPTiA9ICJJbmZvcm1hdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0VSUk9SID0gIkVycm9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09ORklSTSA9ICJDb25maXJtIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgaW5mb3JtYXRpb25UaXRsZSA9IERFRkFVTFRfSU5GT1JNQVRJT047Ci0JcHJvdGVjdGVkIFN0cmluZyBjb25maXJtVGl0bGUgPSBERUZBVUxUX0NPTkZJUk07Ci0JcHJvdGVjdGVkIFN0cmluZyBlcnJvclRpdGxlID0gREVGQVVMVF9FUlJPUjsKLQotCS8qKgotCSAqIFVJT3BlcmF0aW9uSGFuZGxlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBVSU9wZXJhdGlvbkhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVUlPcGVyYXRpb25IYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJT3BlcmF0aW9uSGFuZGxlcihTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJcGFyZW50U2hlbGwgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0UGFyZW50U2hlbGwoKSwgZ2V0Q29uZmlybVRpdGxlKCksIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCXJldHVybiBMaXN0TWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0UGFyZW50U2hlbGwoKSwgZ2V0Q29uZmlybVRpdGxlKCksIG1lc3NhZ2UsIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZS4gVGhlIGJvb2xlYW4gYXJyYXkKLQkgKiB3aWxsIHJldHVybiB0d28gYm9vbGVhbnMuIFRoZSBmaXJzdCBpbmRpY2F0ZXMgdGhlaXIgcmVzcG9uc2UgdG8gdGhlIG9yaWdpbmFsIHF1ZXN0aW9uIGFuZCB0aGUKLQkgKiBzZWNvbmQgaW5kaWNhdGVzIGlmIHRoZXkgc2VsZWN0ZWQgdGhlIGFwcGx5IHRvIGFsbCBjaGVjayBib3guCi0JICogCi0JICogUmV0dXJuIHRoZSByZXR1cm4gY29kZSBmb3IgdGhlIGRpYWxvZy4gMCA9IFllcywgMSA9IFllcyB0byBhbGwsIDIgPSBObwotCSAqLwotCXB1YmxpYyBpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2soU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfSwgMSk7IC8vIHllcwotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlciNjYW5Db250aW51ZVdpdGhBbGxDaGVja0FsbG93Q2FuY2VsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBjYW5Db250aW51ZVdpdGhBbGxDaGVja0FsbG93Q2FuY2VsKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0UGFyZW50U2hlbGwoKSwgZ2V0Q29uZmlybVRpdGxlKCksIG51bGwsIC8vIGFjY2VwdAotCQkJCQkvLyB0aGUKLQkJCQkJLy8gZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cKLQkJCQkJLy8gaWNvbgotCQkJCQltZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9LCAxKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIGhhcyBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFBhcmVudFNoZWxsKCksIGdldEVycm9yVGl0bGUoKSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRpYWxvZyB0aXRsZSB0byBiZSB1c2VkIGZvciBjb25maXJtYXRpb25zCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29uZmlybVRpdGxlKCkgewotCQlyZXR1cm4gY29uZmlybVRpdGxlOwotCX0KLQotCS8qKgotCSAqIFRoZSBkaWFsb2cgdGl0bGUgdG8gYmUgdXNlZCBmb3IgZXJyb3JzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXJyb3JUaXRsZSgpIHsKLQkJcmV0dXJuIGVycm9yVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRpYWxvZyB0aXRsZSB0byBiZSB1c2VkIGZvciBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEluZm9ybWF0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBpbmZvcm1hdGlvblRpdGxlOwotCX0KLQotCXB1YmxpYyBTaGVsbCBnZXRQYXJlbnRTaGVsbCgpIHsKLQkJaWYgKHBhcmVudFNoZWxsID09IG51bGwpCi0JCQlwYXJlbnRTaGVsbCA9IFdUUFVJUGx1Z2luLmdldFBsdWdpbldvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0KLQkJcmV0dXJuIHBhcmVudFNoZWxsOwotCX0KLQotCS8qKgotCSAqIEFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZSBuZWVkcyB0byBiZSBwcmVzZW50ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmZvcm0oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0UGFyZW50U2hlbGwoKSwgZ2V0SW5mb3JtYXRpb25UaXRsZSgpLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzkvMjAwMSAxMTo1MTozNiBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q29uZmlybVRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlybVRpdGxlKGphdmEubGFuZy5TdHJpbmcgbmV3Q29uZmlybVRpdGxlKSB7Ci0JCWNvbmZpcm1UaXRsZSA9IG5ld0NvbmZpcm1UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzkvMjAwMSAxMTo1MTozNiBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXJyb3JUaXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yVGl0bGUoamF2YS5sYW5nLlN0cmluZyBuZXdFcnJvclRpdGxlKSB7Ci0JCWVycm9yVGl0bGUgPSBuZXdFcnJvclRpdGxlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdJbmZvcm1hdGlvblRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb25UaXRsZShqYXZhLmxhbmcuU3RyaW5nIG5ld0luZm9ybWF0aW9uVGl0bGUpIHsKLQkJaW5mb3JtYXRpb25UaXRsZSA9IG5ld0luZm9ybWF0aW9uVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXIjZ2V0Q29udGV4dCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50U2hlbGwoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSVRlc3RlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlUZXN0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MmE2Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSVRlc3RlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlUZXN0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBVSVRlc3RlckltcGwgaW1wbGVtZW50cyBVSVRlc3RlciB7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFVJVGVzdGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5VSVRlc3RlciNpc0N1cnJlbnRDb250ZXh0VUkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudENvbnRleHRVSSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpIHx8IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZSwgd29ya2JlbmNoIG11c3Qgbm90IGJlIHJ1bm5pbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9WYWxpZGF0aW9uU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1ZhbGlkYXRpb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4ZjZiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1ZhbGlkYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCBlbmNvbXBhcyBhIHNldCBvZiBWYWxpZGF0aW9uIHN0YXR1cyBDcmVhdGlvbiBkYXRlOiAoOS8xMC8yMDAxIDU6MzU6MTIgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdGF0dXMgewotCi0JLy8gVE9ETyBtYWtlIGFsbCB0aGVzZSB2YXJzIHByaXZhdGUgYW5kIGNoYW5nZSBlcnJNc2dzICYgZXJyU3RhdHVzIHRvIG1hcHMgc28gdGhlIHNhbWUgbWV0aG9kcwotCS8vIGNhbiBiZSB1c2VkIGFzIHdpdGggd2FybmluZ3MgJiBpbmZvCi0JSGFzaHRhYmxlIGVyck1zZ3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JSGFzaHRhYmxlIGVyclN0YXR1cyA9IG5ldyBIYXNodGFibGUoKTsKLQlIYXNodGFibGUgdENvbnRyb2xzID0gbmV3IEhhc2h0YWJsZSgpOwotCU1hcCB3YXJuTXNnczsKLQlNYXAgd2FyblN0YXR1czsKLQlNYXAgaW5mb01zZ3M7Ci0JTWFwIGluZm9TdGF0dXM7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uU3RhdHVzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25TdGF0dXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGZvciBhbnkgZXJyb3IuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIHJldHVybiBlcnJvcnMgYWNjb3JkaW5nIHRvIHRoZWlyIGtleS4gaS5lLiwKLQkgKiBsb3dlciBrZXkgZXJyb3JzIHdpbGwgYmUgcmV0dXJuZWQgZmlyc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXN0RXJyTXNnKCkgewotCQkvL1RPRE8gb25jZSBpdmFycyBhcmUgY2hhbmdlZCB0byBtYXBzLCBwYXNzIHRoaXMgdG8gZ2V0TGFzdE1zZygpCi0JCUVudW1lcmF0aW9uIGUgPSBlcnJTdGF0dXMua2V5cygpOwotCQlTdHJpbmdbXSBlcnJzID0gbmV3IFN0cmluZ1tlcnJTdGF0dXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJzLmxlbmd0aDsgaSsrKQotCQkJZXJyc1tpXSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmRPbmUgPSBmYWxzZTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUludGVnZXIga2V5ID0gKEludGVnZXIpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghKChCb29sZWFuKSBlcnJTdGF0dXMuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJZXJyc1trZXkuaW50VmFsdWUoKSAlIGVycnMubGVuZ3RoXSA9IChTdHJpbmcpIGVyck1zZ3MuZ2V0KGtleSk7Ci0JCQkJZm91bmRPbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZE9uZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXJycy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoZXJyc1tpXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZXJyc1tpXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0V2FybmluZ01zZ3MoKSB7Ci0JCWlmICh3YXJuTXNncyA9PSBudWxsKQotCQkJd2Fybk1zZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd2Fybk1zZ3M7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0V2FybmluZ1N0YXR1c01hcCgpIHsKLQkJaWYgKHdhcm5TdGF0dXMgPT0gbnVsbCkKLQkJCXdhcm5TdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd2FyblN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRJbmZvTXNncygpIHsKLQkJaWYgKGluZm9Nc2dzID09IG51bGwpCi0JCQlpbmZvTXNncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpbmZvTXNnczsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRJbmZvU3RhdHVzTWFwKCkgewotCQlpZiAoaW5mb1N0YXR1cyA9PSBudWxsKQotCQkJaW5mb1N0YXR1cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpbmZvU3RhdHVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdFdhcm5pbmdNc2coKSB7Ci0JCXJldHVybiBnZXRMYXN0TXNnKHdhcm5TdGF0dXMsIHdhcm5Nc2dzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RJbmZvTXNnKCkgewotCQlyZXR1cm4gZ2V0TGFzdE1zZyhpbmZvU3RhdHVzLCBpbmZvTXNncyk7Ci0JfQotCi0JLyoKLQkgKiBMb29rIGZvciBhbnkgc3RhdHVzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gc3RhdHVzIGFjY29yZGluZyB0byB0aGVpciBrZXkuIGkuZS4sCi0JICogbG93ZXIga2V5IHN0YXR1cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhc3RNc2coTWFwIHN0YXR1c01hcCwgTWFwIG1zZ01hcCkgewotCQlpZiAoc3RhdHVzTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHN0YXR1c01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBpbmZvcyA9IG5ldyBTdHJpbmdbc3RhdHVzTWFwLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspCi0JCQlpbmZvc1tpXSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmRPbmUgPSBmYWxzZTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJbnRlZ2VyIGtleSA9IChJbnRlZ2VyKSBlLm5leHQoKTsKLQkJCWlmICghKChCb29sZWFuKSBzdGF0dXNNYXAuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaW5mb3Nba2V5LmludFZhbHVlKCkgJSBpbmZvcy5sZW5ndGhdID0gKFN0cmluZykgbXNnTWFwLmdldChrZXkpOwotCQkJCWZvdW5kT25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmRPbmUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKQotCQkJCWlmIChpbmZvc1tpXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW5mb3NbaV07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEVyck1zZ0FuZEZvY3VzKCkgewotCi0JCUVudW1lcmF0aW9uIGUgPSBlcnJTdGF0dXMua2V5cygpOwotCi0JCUludGVnZXIgdGhlT25lID0gbnVsbDsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUludGVnZXIga2V5ID0gKEludGVnZXIpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghKChCb29sZWFuKSBlcnJTdGF0dXMuZ2V0KGtleSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKHRoZU9uZSA9PSBudWxsIHx8IGtleS5pbnRWYWx1ZSgpIDwgdGhlT25lLmludFZhbHVlKCkpIHsKLQkJCQkJdGhlT25lID0ga2V5OwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodGhlT25lICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSB0Q29udHJvbHMuZ2V0KHRoZU9uZSk7Ci0JCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJY29udHJvbC5zZXRGb2N1cygpOwotCQkJfQotCQkJcmV0dXJuICgoU3RyaW5nKSBlcnJNc2dzLmdldCh0aGVPbmUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcihJbnRlZ2VyIGtleSkgewotCQlCb29sZWFuIHN0YXQgPSAoQm9vbGVhbikgZXJyU3RhdHVzLmdldChrZXkpOwotCQlpZiAoc3RhdCAhPSBudWxsKQotCQkJcmV0dXJuIHN0YXQuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyb2woSW50ZWdlciBrZXksIENvbnRyb2wgY29udHJvbCkgewotCQl0Q29udHJvbHMucHV0KGtleSwgY29udHJvbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIEJvb2xlYW4gc3RhdHVzLCBTdHJpbmcgbXNnKSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgbXNnKTsKLQkJZXJyU3RhdHVzLnB1dChrZXksIHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBtc2cpIHsKLQkJZXJyTXNncy5wdXQoa2V5LCBtc2cpOwotCQllcnJTdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXYXJuaW5nU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgbXNnKSB7Ci0JCWdldFdhcm5pbmdNc2dzKCkucHV0KGtleSwgbXNnKTsKLQkJZ2V0V2FybmluZ1N0YXR1c01hcCgpLnB1dChrZXksIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIG1zZykgewotCQlnZXRJbmZvTXNncygpLnB1dChrZXksIG1zZyk7Ci0JCWdldEluZm9TdGF0dXNNYXAoKS5wdXQoa2V5LCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVyclN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCWlmICh3YXJuTXNncyAhPSBudWxsKQotCQkJd2Fybk1zZ3MucHV0KGtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh3YXJuU3RhdHVzICE9IG51bGwpCi0JCQl3YXJuU3RhdHVzLnB1dChrZXksIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJaWYgKGluZm9Nc2dzICE9IG51bGwpCi0JCQlpbmZvTXNncy5wdXQoa2V5LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZm9TdGF0dXMgIT0gbnVsbCkKLQkJCWluZm9TdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJbnRlZ2VyIGtleSwgYm9vbGVhbiBvaywgU3RyaW5nIG1zZykgewotCQllcnJNc2dzLnB1dChrZXksIG1zZyk7Ci0JCWVyclN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbihvaykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTRjOTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGx1Z2luQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuV29ya2JlbmNoQWN0aXZpdHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmFjdGl2aXRpZXMuV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogIAotICovCi1wdWJsaWMgY2xhc3MgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsIGltcGxlbWVudHMgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIgewotCi0JcHJpdmF0ZSBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCA9IG51bGw7Ci0JcHJpdmF0ZSBJQWN0aXZpdHlNYW5hZ2VyIGFjdGl2aXR5TWFuYWdlciA9IG51bGw7Ci0KLQlwdWJsaWMgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJJbXBsKCkgewotCQl3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpOwotCQlhY3Rpdml0eU1hbmFnZXIgPSB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQuZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5SUQsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlTZXQgZW5hYmxlZEFjdGl2aXRpZXMgPSBhY3Rpdml0eU1hbmFnZXIuZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCk7Ci0JCVNldCBuZXdFbmFibGVkQWN0aXZpdGllcyA9IG51bGw7Ci0JCWlmIChlbmFibGVkICYmICFlbmFibGVkQWN0aXZpdGllcy5jb250YWlucyhhY3Rpdml0eUlEKSkgewotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMuYWRkQWxsKGVuYWJsZWRBY3Rpdml0aWVzKTsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzLmFkZChhY3Rpdml0eUlEKTsKLQkJfQotCQlpZiAoIWVuYWJsZWQgJiYgZW5hYmxlZEFjdGl2aXRpZXMuY29udGFpbnMoYWN0aXZpdHlJRCkpIHsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzLmFkZEFsbChlbmFibGVkQWN0aXZpdGllcyk7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcy5yZW1vdmUoYWN0aXZpdHlJRCk7Ci0JCX0KLQkJaWYgKG51bGwgIT0gbmV3RW5hYmxlZEFjdGl2aXRpZXMpIHsKLQkJCXNldEVuYWJsZWRBY3Rpdml0eUlkcyhuZXdFbmFibGVkQWN0aXZpdGllcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEVuYWJsZWRBY3Rpdml0eUlkcygpIHsKLQkJcmV0dXJuIGFjdGl2aXR5TWFuYWdlci5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQWN0aXZpdHlJZHMoU2V0IGFjdGl2aXR5SURzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQl3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGFjdGl2aXR5SURzKTsKLQkJfSBlbHNlIHsKLQkJCWZpbmFsIFNldCBuZXdBY3Rpdml0eUlEcyA9IGFjdGl2aXR5SURzOyAKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydC5zZXRFbmFibGVkQWN0aXZpdHlJZHMobmV3QWN0aXZpdHlJRHMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRBY3Rpdml0eUlEc0Zyb21Db250cmlidXRpb24oZmluYWwgU3RyaW5nIGxvY2FsSUQsIGZpbmFsIFN0cmluZyBwbHVnaW5JRCkgewotCQlJSWRlbnRpZmllciBpZGVudGlmaWVyID0gYWN0aXZpdHlNYW5hZ2VyLmdldElkZW50aWZpZXIoV29ya2JlbmNoQWN0aXZpdHlIZWxwZXIuY3JlYXRlVW5pZmllZElkKG5ldyBJUGx1Z2luQ29udHJpYnV0aW9uKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRMb2NhbElkKCkgewotCQkJCXJldHVybiBsb2NhbElEOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQkJCXJldHVybiBwbHVnaW5JRDsKLQkJCX0KLQkJfSkpOwotCQlyZXR1cm4gaWRlbnRpZmllci5nZXRBY3Rpdml0eUlkcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTAyMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBsdWdpbkNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUEFjdGl2aXR5SGVscGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgVUkgaXMgc2V0IHVwIHRvIGZpbHRlciBjb250cmlidXRpb25zIChoYXMgZGVmaW5lZCBhY3Rpdml0eSBjYXRlZ29yaWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNGaWx0ZXJpbmcoKSB7Ci0JCXJldHVybiAhUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKS5nZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXREZWZpbmVkQWN0aXZpdHlJZHMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbG93VXNlT2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIWlzRmlsdGVyaW5nKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQbHVnaW5Db250cmlidXRpb24pIHsKLQkJCUlQbHVnaW5Db250cmlidXRpb24gY29udHJpYnV0aW9uID0gKElQbHVnaW5Db250cmlidXRpb24pIG9iamVjdDsKLQkJCWlmIChjb250cmlidXRpb24uZ2V0UGx1Z2luSWQoKSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2aXR5U3VwcG9ydCgpOwotCQkJCUlJZGVudGlmaWVyIGlkZW50aWZpZXIgPSB3b3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0SWRlbnRpZmllcihjcmVhdGVVbmlmaWVkSWQoY29udHJpYnV0aW9uKSk7Ci0JCQkJcmV0dXJuIGlkZW50aWZpZXIuaXNFbmFibGVkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjcmVhdGVVbmlmaWVkSWQoSVBsdWdpbkNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24pIHsKLQkJaWYgKGNvbnRyaWJ1dGlvbi5nZXRQbHVnaW5JZCgpICE9IG51bGwpCi0JCQlyZXR1cm4gY29udHJpYnV0aW9uLmdldFBsdWdpbklkKCkgKyAnLycgKyBjb250cmlidXRpb24uZ2V0TG9jYWxJZCgpOwotCQlyZXR1cm4gY29udHJpYnV0aW9uLmdldExvY2FsSWQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTUxM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMywgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGNsYXNzIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAid3RwY29tbW9udWkiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RfbG9jYXRpb25fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUE9wZXJhdGlvbkFjdGlvbl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hc3RlckRlc2NyaXB0b3JfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXVFBPcHRpb25hbE9wZXJhdGlvbkRhdGFNb2RlbF9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUE9wZXJhdGlvbkFjdGlvbl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUE9wdGlvbmFsT3BlcmF0aW9uRGF0YU1vZGVsX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVVMVElQTEVfTU9EVUxFX1BSRUZfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJQWN0aW9uV1RQT3BlcmF0aW9uX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFzdGVyRGVzY3JpcHRvcl9FUlJPUl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUFdpemFyZF9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUFdpemFyZF9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUFdpemFyZF9VSV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyb3dzZV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZW5kYWJsZVdpemFyZF9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVuZGVkV2l6YXJkUGFnZV9FUlJPUl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVuZGVkV2l6YXJkUGFnZV9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUEFjdGlvbkRpYWxvZ19VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVyUXVldWVfRVJST1JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaW1lcl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVyX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZV9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZkRpckRpYWxvZ0xhYmVsXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTkxTLmJpbmQoa2V5LCBhcmdzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEdlbmVyaWNBY3Rpb25JZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQR2VuZXJpY0FjdGlvbklkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFiOGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQR2VuZXJpY0FjdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTYsIDIwMDQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1RQR2VuZXJpY0FjdGlvbklkcyB7Ci0KLQlTdHJpbmcgQ1VUID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5DdXQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPUFkgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLkNvcHkiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBBU1RFID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5QYXN0ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5SZW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuRGVsZXRlIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxNjlhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBqYXZhLmxhbmcuVGhyb3dhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV1RQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfVklFV0VSX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCA9ICJleHRlbmRlZFZpZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdUUFVJUGx1Z2luIHBsdWdpbjsKLQkvLyBSZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1RQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIC0xLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdUUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3b3JrYmVuY2gKLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlcm5hbCB0byB0aGUgajJlZSBwbHVnaW4gYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaCBnZXRQbHVnaW5Xb3JrYmVuY2goKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJ1bm5hYmxlT3BlcmF0aW9uV3JhcHBlciBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhmaW5hbCBJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVPcGVyYXRpb25XcmFwcGVyKG9wZXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFdUUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBUaHJvd2FibGUgZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgKyAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBJU3RhdHVzIHN0YXR1cyApCi0gICAgewotICAgICAgICBnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCBzdGF0dXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgU3RyaW5nIG1zZyApCi0gICAgewotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsICkgKTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpKTsKLQl9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0N2I2YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9Xb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiB3aGljaCBkZWxlZ2F0ZXMgaXRzIHdvcmsgdG8gYSBydW5uYWJsZSB0aGF0IG1vZGlmaWVzIHRoZSB3b3Jrc3BhY2UuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQlwcml2YXRlIExpc3QgZlJ1bm5hYmxlczsKLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlzdXBlcihydWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiB3aGljaCB3aWxsIGRlbGVnYXRlIGl0cyB3b3JrIHRvIHRoZSBnaXZlbiBydW5uYWJsZS4KLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKElTY2hlZHVsaW5nUnVsZSBydWxlLCBMaXN0IG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcykgewotCQlzdXBlcihydWxlKTsKLQkJZ2V0UnVubmFibGVzKCkuYWRkQWxsKG5lc3RlZFJ1bm5hYmxlc1dpdGhQcm9ncmVzcyk7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKExpc3QgbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKCk7Ci0JCWdldFJ1bm5hYmxlcygpLmFkZEFsbChuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmF0aW9uIHdoaWNoIHdpbGwgZGVsZWdhdGUgaXRzIHdvcmsgdG8gdGhlIGdpdmVuIHJ1bm5hYmxlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICB0aGUgcnVubmFibGUgdG8gZGVsZWdhdGUgdG8gd2hlbiB0aGlzIG9wZXJhdGlvbiBpcyBleGVjdXRlZAotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmVzdGVkT3ApIHsKLQkJc3VwZXIoKTsKLQkJZ2V0UnVubmFibGVzKCkuYWRkKG5lc3RlZE9wKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRSdW5uYWJsZShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmVzdGVkT3ApIHsKLQkJcmV0dXJuIGdldFJ1bm5hYmxlcygpLmFkZChuZXN0ZWRPcCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeXsKLQkJCUxpc3QgcnVubmFibGVzID0gZ2V0UnVubmFibGVzKCk7Ci0JCQlpZihydW5uYWJsZXMuc2l6ZSgpID09IDApewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBydW5uYWJsZXMuc2l6ZSgpKTsvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bm5hYmxlcy5zaXplKCk7IGkrKykgewotCQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IChJUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHJ1bm5hYmxlcy5nZXQoaSk7Ci0JCQkJb3AucnVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFJ1bm5hYmxlcygpIHsKLQkJaWYgKGZSdW5uYWJsZXMgPT0gbnVsbCkKLQkJCWZSdW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlyZXR1cm4gZlJ1bm5hYmxlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4ZmUxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT53dHAgb3BlcmF0aW9uIGFwaSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPgotCQkJVGhlIFdUUCBXaXphcmQgQVBJIGFsbG93cyBjbGllbnRzIHRvIGJ1aWxkIHdpemFyZHMgaW4gY29uanVuY3Rpb24gd2l0aAotCQkJdGhlIFdUUCBPcGVyYXRpb24gRnJhbWV3b3JrIHF1aWNrbHkgYW5kIHdpdGggbWluaW1hbCBlZmZvcnQuCi0JCTwvcD4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlVuZGVyIENvbnN0cnVjdGlvbi48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMTAiPgotPHRyPgotPHRkPgotPHA+Ci08aW1nIHNyYz0iZXNjYXBlX291dF90b19zb3VyY2VfZm9sZGVyIGxldmVsL292ZXJ2aWV3L3lvdXJfaW1hZ2UuanBnIj48L3A+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4KLTxwPgotPGk+RmlndXJlIDE6IEltYWdlIGRlc2NyaXB0aW9uPC9pPgotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTdhNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLQk8aGVhZD4KLQkJPG1ldGEKLQkJCW5hbWU9InJvb3QiCi0JCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JCTx0aXRsZT53dHAgb3BlcmF0aW9uIGFwaSBvdmVydmlldzwvdGl0bGU+Ci0JPC9oZWFkPgotCi0JPGJvZHk+Ci0JCTxhYnN0cmFjdD4KLQkJCVRoZSBXVFAgV2l6YXJkIEFQSSBhbGxvd3MgY2xpZW50cyB0byBidWlsZCB3aXphcmRzIGluIGNvbmp1bmN0aW9uIHdpdGgKLQkJCXRoZSBXVFAgT3BlcmF0aW9uIEZyYW1ld29yayBxdWlja2x5IGFuZCB3aXRoIG1pbmltYWwgZWZmb3J0LgotCQk8L2Fic3RyYWN0PgotCQk8cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotCQk8aW1nIHNyYz0iZXNjYXBlX291dF90b19zb3VyY2VfZm9sZGVyIGxldmVsL292ZXJ2aWV3L3lvdXJfaW1hZ2UuanBnIiBjYXB0aW9uPSJJbWFnZSBkZXNjcmlwdGlvbiIgLz4KLQk8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ZDkxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLW5vbl93b3JrYmVuY2gvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyODVmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1jb21tb25fY29yZS5qYXIKLWNvbW1vbi5qYXIKLWNvbW1vbl9jb3Jlc3JjLnppcAotY29tbW9uc3JjLnppcAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhYWI4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3RwLmNvbW1vbi9kZWJ1Zy9sb2d0cmFjZT1mYWxzZQotb3JnLmVjbGlwc2Uud3RwLmNvbW1vbi9kZWJ1Zy9sb2d0cmFjZWZpbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLnd0cC5jb21tb24vZGVidWcvbG9nbGV2ZWw9V0FSTklORwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjQ1OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdhNGU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSNNb24gSnVuIDA4IDE1OjM1OjQ1IEVEVCAyMDA5Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlVW5jaGVja2VkRXhjZXB0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTQ3OWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5hY3Rpdml0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7YnVuZGxlLXZlcnNpb249IlsxLjAuMjAwLDIuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwMTExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbAotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHNyYy1ub25fd29ya2JlbmNoLyxcCi0gICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE1MjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4KLSAgPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiBmcmFnbWVudD0iZmFsc2UiLz4KLQotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij4KLSAgICA8dHlwZSBuYW1lPSJDaG9pY2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IkVudmlyb25tZW50RXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJFbnZpcm9ubWVudFNlcnZpY2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklFbnZpcm9ubWVudCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJTG9nIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklTdGF0dXNIYW5kbGVyIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9Ik51bGxTdGF0dXNIYW5kbGVyIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJTdGF0dXNFeGNlcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICA8L3BhY2thZ2U+Ci0gCi0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj4KLSAgICA8dHlwZSBuYW1lPSJJVVJJIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklGYWN0b3J5IiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklGaWx0ZXIiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iSVVSSVNjaGVtZSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJVVJJVmlzaXRvciIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJTaW1wbGVVUklGYWN0b3J5IiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJVUklFeGNlcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICA8L3BhY2thZ2U+Ci0KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbCI+PC9wYWNrYWdlPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZkMjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlcj1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1Db21tb24gRnJhbWV3b3JrcwotT3BlcmF0aW9uRXh0ZW5zaW9uPU9wZXJhdGlvbkV4dGVuc2lvbgotRnVuY3Rpb25fRXh0ZW5zaW9uX0dyb3VwPUZ1bmN0aW9uIEV4dGVuc2lvbiBHcm91cAotV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXI9V1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIKLURhdGFNb2RlbFByb3ZpZGVyPURhdGFNb2RlbFByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxN2U3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Ik9wZXJhdGlvbkV4dGVuc2lvbiIgbmFtZT0iJU9wZXJhdGlvbkV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvT3BlcmF0aW9uRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZ1bmN0aW9uR3JvdXAiIG5hbWU9IiVGdW5jdGlvbl9FeHRlbnNpb25fR3JvdXAiIHNjaGVtYT0ic2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiIG5hbWU9IiVXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIgc2NoZW1hPSJzY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iIG5hbWU9IiVEYXRhTW9kZWxQcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZCIvPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29udGV4dC5TZW5zaXRpdmUuQ2xhc3Muc2F2ZUhhbmRsZXIiCi0gICAgICAgICBuYW1lPSJTYXZlIEhhbmRsZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ic2F2ZUhhbmRsZXIiCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3MiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50IgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICAgICAgIGtleT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkVuYWJsZW1lbnREZXRlcm1pbmF0aW9uIgotICAgICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAga2V5PSJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCIKLSAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MiCi0gICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YzdkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmNvbW1vbiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3NyYyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3NyYyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLQotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxOTg0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgaWQ9IkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIiBuYW1lPSJEYXRhIE1vZGVsIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIGFuIGV4aXN0aW5nIGRhdGEgbW9kZWwgcHJvdmlkZXIgd2l0aCBhIGN1c3RvbSBkYXRhIG1vZGVsIHByb3ZpZGVyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJEYXRhTW9kZWxQcm92aWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iUHJvdmlkZXJEZWZpbmVzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iUHJvdmlkZXJJbXBsZW1lbnRzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkRhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCBwcm92aWRlciB0byBleHRlbmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iUHJvdmlkZXJEZWZpbmVzVHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVyVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdHlwZSB0aGUgZGF0YSBtb2RlbCBwcm92aWRlciBkZWZpbmVzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXJJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICByZXF1aXJlZCBpZGVudGlmaWVyIGZvciB0aGUgZGVmaW5lZCB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IlByb3ZpZGVySW1wbGVtZW50c1R5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlclR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIHR5cGUgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgaW1wbGVtZW50cwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVySUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWRlbnRpZmllciBmb3IgdGhlIGltcGxlbWVudGVkIHR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmYxZWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9PcGVyYXRpb25FeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iT3BlcmF0aW9uRXh0ZW5zaW9uIiBuYW1lPSJPcGVyYXRpb24gRXh0ZW5zaW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgaXMgdGhlIG1ldGhvZG9sb2d5IGZvciBleHRlbmRpbmcgYW4gZXhpc3Rpbmcgb3BlcmF0aW9uIGJ5IGFkZGluZyBlaXRoZXIgYSBwcmUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIHByaW9yLCBvciBhIHBvc3Qgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBvcmlnaW5hbCBvcGVyYXRpb24uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVyYXRpb25FeHRlbnNpb24iLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im9wZXJhdGlvbkV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlT3BlcmF0aW9uQ2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByZS1vcGVyYXRpb24gY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9zdE9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3N0LW9wZXJhdGlvbiBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICByZXF1aXJlZCBpZCBvZiB0aGUgb3BlcmF0aW9uIHRvIGV4dGVuZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q1MGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGlkPSJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIgbmFtZT0iV1RQIEFjdGl2aXR5IEJyaWRnZSBIZWxwZXIiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYWN0aXZpdHkgYnJpZGdlIGhlbHBlciB3aGljaCBpcyB1c2VmdWwgd2hlbiBlbmFibGluZyBjYXBhYmlsaXRpZXMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIgY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDk1OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iZnVuY3Rpb25Hcm91cCIgbmFtZT0iRnVuY3Rpb24gRXh0ZW5zaW9uIEdyb3VwIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEEgZnVuY3Rpb25Hcm91cCBwcm92aWRlcyBhIGdyb3VwaW5nIG9mIHJlbGF0ZWQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY29udHJpYnV0ZWQgdG8gdGhlIHRvb2xzLiAgRm9yIGV4YW1wbGUsIGEgdGhpcmQgcGFydHkgY29tcG9uZW50IG1heSB3YW50IHRvIGNvbnRyaWJ1dGUgYWN0aW9ucywgZWRpdG9yIHBhZ2VzLCBlZGl0IG1vZGVsIHJlc291cmNlcywgYW5kIG1hbnkgb3RoZXIgZnVuY3Rpb25zIHNwZWNpZmljIHRvIGEgZ2l2ZW4gcHJvZHVjdC4gIEJ5IGFzc29jaWF0aW5nIGFsbCB0aGVzZSBmdW5jdGlvbnMgd2l0aCBhIGdyb3VwIGlkLCBhIG1lY2hhbmlzbSBpcyBleHBvc2VkIGZvciB1c2VycyB0byBzZWxlY3RpdmVseSBlbmFibGUgYW5kIGRpc2FibGUgYmFza2V0cyBvZiBmdW5jdGlvbi4gIEV4dGVuc2lvbiBwb2ludHMgdGhhdCBhbGxvdyBmb3IgYSAmcXVvdDtncm91cElEJnF1b3Q7IGF0dHJpYnV0ZSBnZW5lcmFsbHkgd2lsbCBoaWRlIHRob3NlIGZ1bmN0aW9ucyB3aGVuIHRoZSBncm91cCBpZCBpcyBkaXNhYmxlZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmdW5jdGlvbkdyb3VwIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmdW5jdGlvbkdyb3VwIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFeHRlbnNpb24gcG9pbnQgZGVmaW5pdGlvbiBmb3IgYSBncm91cC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhlIGdyb3VwLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgaHVtYW4gcmVhZGFibGUgbmFtZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgZ3JvdXAuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgcGF0aCB0byBhbiBpY29uIGltYWdlLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgdXJsIGZvciB0aGUgZnVuY3Rpb24gZ3JvdXAuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9yZGVyaW5nIG1hZ25pdHVkZSBvZiBwbHVnaW5zDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluaXRpYWxpemVyQ2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIENsYXNzIHVzZWQgdG8gZGV0ZXJtaW5lIHBsdWdpbiBlbmFibGVtZW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3Mgb25lIHRvIGJpbmQgZnVuY3Rpb24gZ3JvdXBzIHRvIHBhdHRlcm5zLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb25Hcm91cElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZnVuY3Rpb24gZ3JvdXAgdG8gYmluZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0dGVybiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgcGF0dGVybiB0byBiZSBib3VuZC4gUGF0dGVybnMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hpY2ggbWF0Y2ggdW5pcXVlIGlkZW50aWZpZXJzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmZ1bmN0aW9uR3JvdXAmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2Z1bmN0aW9uR3JvdXANCi0gICAgICAgICAgICBuYW1lPSZxdW90O0FjbWUgQ28uIEZ1bmN0aW9uIEV4dGVuc2lvbiZxdW90Ow0KLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7VGhlIEFjbWVQcm8gRXh0ZW5zaW9ucyBhZGQgaW50ZWdyYXRpb24gdG8gdGhlIEFjbWUgV2ViIFNlcnZlci4mcXVvdDsNCi0gICAgICAgICAgICBlbmFibGVkQnlEZWZhdWx0PSZxdW90O3RydWUmcXVvdDsNCi0gICAgICAgICAgICBpY29uPSZxdW90Oy4uLiZxdW90Ow0KLSAgICAgICAgICAgIHVybD0mcXVvdDtodHRwOi8vd3d3LmFjbWUuY29tLyZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9JV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvSVdGVFdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyYmFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9JV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIEFyY2hpdmVSdW50aW1lIGFuZCBBcmNoaXZlV3JhcHBlZCBleGNlcHRpb25zLCB3aGljaCBjYW4gY29udGFpbiBuZXN0ZWQKLSAqIGV4Y2VwdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV0ZUV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0bwotCSAqIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzIG9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKTsKLQotCXB1YmxpYyBFeGNlcHRpb24gZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dGVFdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dGVFdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5OTBmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9XRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWk7Ci0KLS8vaW1wb3J0IGNvbS5pYm0uZXRvb2xzLndmdC5ubHMuV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXI7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNC8wMy8wMSAxMToxMjo1MSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY4ODUwNDQyNzczNzc3ODQ0MjlMOwotCi0JLyoqCi0JICogV0ZUV3JhcHBlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBXRlRXcmFwcGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICovCi0JcHVibGljIFdGVFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgV0ZUV3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0LCBTdHJpbmcgcykgewotCQlzdXBlcih0YXJnZXQsIHMpOwotCX0KLQotCS8qKgotCSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCQlpZiAoZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJLy9UT0RPIGFkZCB0aGlzIGJhY2sgaW4KLQkJCS8vIHMucHJpbnRsbihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCQlnZXRUYXJnZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCS8vVE9ETyBhZGQgdGhpcyBiYWNrIGluCi0JCQkvLyBzLnByaW50bG4oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl8iKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dvcmtiZW5jaFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dvcmtiZW5jaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjYWM3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9Xb3JrYmVuY2hVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoVXRpbCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gV29ya2JlbmNoUnVubmluZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBXb3JrYmVuY2hVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHdvcmtiZW5jaElzUnVubmluZygpIC0gdGVzdCB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgcnVubmluZyBpbiB0aGUgd29ya2JlbmNoIGVudmlyb25tZW50LgotCSAqIAotCSAqIEBzZWUgSmF2YVBsdWdpbi5zdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd29ya2JlbmNoSXNSdW5uaW5nKCkgewotCQlyZXR1cm4gV29ya2JlbmNoUnVubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBpZiB5b3UgYXJlIHJ1bm5pbmcgaW4gYSBXb3JrYmVuY2ggZW52aXJvbm1lbnQuCi0JICogCi0JICogQHNlZSBKYXZhUGx1Z2luLnN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrYmVuY2hJc1J1bm5pbmcoYm9vbGVhbiBhQm9vbGVhbikgewotCQlXb3JrYmVuY2hSdW5uaW5nID0gYUJvb2xlYW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZjg3N2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi0vKioKLSAqIDxwPgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gZm9yIGFuIElEYXRhTW9kZWxPcGVyYXRpb24uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJRGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIElTdGF0dXMuT0suCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgSURhdGFNb2RlbCB1c2VkIGJ5IHRoaXMgSURhdGFNb2RlbE9wZXJhdGlvbgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuaWQgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RvciB0YWtpbmcgYW4gSURhdGFNb2RlbAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHVzZWQgdG8gZHJpdmUgdGhpcyBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcigiIik7IC8vJE5PTi1OTFMtMSQgLy8gVE9ETyBhZGQgYSBsYWJlbCBwcm9wZXJ0eSB0byBJRGF0YU1vZGVsPz8/Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5pZCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc2V0SUQoKS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jc2V0SUQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRJRCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHNldERhdGFNb2RlbCgpCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbE9wZXJhdGlvbiNzZXREYXRhTW9kZWwoSURhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXREYXRhTW9kZWwoKQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0RGF0YU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGdldFNjaGVkdWxpbmdSdWxlKCkgcmV0dXJucwotCSAqIDxjb2RlPlJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0U2NoZWR1bGluZ1J1bGUoKQotCSAqLwotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSByZXR1cm5zCi0JICogPGNvZGU+SVdvcmtzcGFjZS5BVk9JRF9VUERBVEU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSB7Ci0JCXJldHVybiBJV29ya3NwYWNlLkFWT0lEX1VQREFURTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgc2V0IHRoZSBlbnZpcm9ubWVudCBvbiB0aGlzIG9wZXJhdGlvbiBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuIFRoZSBvcGVyYXRpb24KLQkgKiBjYW4gdGhlbiB1c2UgdGhlIGVudmlyb25tZW50IHRvIHJlcG9ydCBzdGF0dXMsIGxvZyBpbmZvcm1hdGlvbiwgYW5kIGFjY2VzcyByZXNvdXJjZXMgaW4gYW4KLQkgKiBlbnZpcm9ubWVudCBuZXV0cmFsIHdheS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVudgotCSAqICAgICAgICAgICAgdGhlIGVudmlyb25tZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEVudmlyb25tZW50KElFbnZpcm9ubWVudCBlbnYpIHsKLQkJZW52aXJvbm1lbnQgPSBlbnY7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW4gb3BlcmF0aW9uIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgZW52aXJvbm1lbnQgdGhhdCBoYXMgYmVlbiBzZXQgYnkgdGhlIG9wZXJhdGlvbnMKLQkgKiBmcmFtZXdvcmsuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyBhbiBlbnZpcm9ubWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSUVudmlyb25tZW50IGdldEVudmlyb25tZW50KCkgewotCQlyZXR1cm4gZW52aXJvbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiByZWRvLgotCSAqIDwvcD4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB1bmRvLgotCSAqIDwvcD4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2YzMzAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SURhdGFNb2RlbFByb3ZpZGVyPC9jb2RlPi4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElEYXRhTW9kZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgSURhdGFNb2RlbCBmb3IgdGhpcyBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGluaXQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNpbml0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCX0KLQotCS8qKgotCSAqIDwvcD4KLQkgKiBBbiBpbXBsZW1lbmF0aW9uIG9mIHNldERhdGFNb2RlbCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNzZXREYXRhTW9kZWwoSURhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbiBpbXBsZW1lbmF0aW9uIG9mIGdldERhdGFNb2RlbCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCi0JLyoqCi0JICogPC9wPgotCSAqIEEgZGVmYXVsdCBpbXBsZW5lYXRpb24gb2YgcHJvcGVydHlTZXQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBoYXMgYmVlbiBzZXQKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXREZWZhdWx0UHJvcGVydHkoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmKEFMTE9XX0VYVEVOU0lPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmKFJFU1RSSUNUX0VYVEVOU0lPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgaXNQcm9wZXJ0eUVuYWJsZWQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgdmFsaWRhdGUoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIG5lc3RlZCBJRGF0YU1vZGVsIGJlaW5nIHZhbGlkYXRlZC4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMKLQkgKiBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXRFeHRlbmRlZENvbnRleHQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRFeHRlbmRlZENvbnRleHQoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0RGVmYXVsdE9wZXJhdGlvbigpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRPcGVyYXRpb24oKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGdldE5hbWUoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZGlzcG9zZSgpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGEgcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGEgYm9vbGVhbiBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgYm9vbGVhbiBwcm9wZXJ0eSBvbiB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHByb3BlcnR5VmFsdWUpIHsKLQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGFuIGludCBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgaW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRJbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhbiBpbnQgcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGludCBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgcHJvcGVydHlWYWx1ZSkgewotCQltb2RlbC5zZXRJbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIFN0cmluZyBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgaWYgYSBwcm9wZXJ0eSBpcyBzZXQgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIHNldCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmlzUHJvcGVydHlTZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDJiMGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20gSURhdGFNb2RlbHMgdG8gdGhlaXIgSURhdGFNb2RlbExpc3RlbmVycy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwjYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhTW9kZWxFdmVudCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGZsYWcgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2dldEZsYWcoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NIRyA9IDE7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbC4gQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hHID0gMjsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZmxhZyB1c2VkIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5J3MgZW5hYmxtZW50IGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqIEBzZWUgI2dldEZsYWcoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9DSEcgPSAzOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBmbGFnIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkncyB2YWxpZCB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKiBAc2VlICNnZXRGbGFnKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRF9WQUxVRVNfQ0hHID0gNDsKLQotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0JcHJpdmF0ZSBpbnQgZmxhZzsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0cnVjdG9yIGZvciBEYXRhTW9kZWxFdmVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqICAgICAgICAgICAgdGhlIElEYXRhTW9kZWwgd2hvc2UgcHJvcGVydHkgaGFzIGNoYW5nZWQKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eQotCSAqIEBwYXJhbSBmbGFnCi0JICogICAgICAgICAgICBjb250YWlucyBhIGZsYWcgc3BlY2lmaXlpbmcgdGhlIGV2ZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsRXZlbnQoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5mbGFnID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgZXZlbnQgdHlwZS4gVmFsaWQgdHlwZXMgYXJlOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+UFJPUEVSVFlfQ0hHPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPlZBTElEX1ZBTFVFU19DSEc8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+RU5BQkxFX0NIRzwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgZXZlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEZsYWcoKSB7Ci0JCXJldHVybiBmbGFnOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwncyBwcm9wZXJ0eS4gVGhpcyBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxjb2RlPmdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCdzIHByb3BlcnR5LgotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwgcHJvcGVydHkncyBlbmFibGVtZW50IHN0YXRlLiBUaGlzIGlzIGVxdWF2YWxlbnQKLQkgKiB0bzogPGNvZGU+Z2V0RGF0YU1vZGVsKCkuaXNQcm9wZXJ0eUVuYWJsZWQoZ2V0UHJvcGVydHlOYW1lKCkpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgZGF0YU1vZGVsIHByb3BlcnR5J3MgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKiBAc2VlIElEYXRhTW9kZWwjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJldHVybiB0aGUgSURhdGFNb2RlbCBwcm9wZXJ0eSdzIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3JzLiBUaGlzIGlzCi0JICogZXF1YXZhbGVudCB0bzogPGNvZGU+Z2V0RGF0YU1vZGVsKCkuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCBwcm9wZXJ0eSdzIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjgyYTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5EYXRhTW9kZWxFeHRlbnNpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5EYXRhTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIDxwPgotICogRGF0YU1vZGVsRmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBJRGF0YU1vZGVsIGluc3RhbmNlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIgcmVhZGVyOwotCi0JcHJpdmF0ZSBEYXRhTW9kZWxGYWN0b3J5KCkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBJRGF0YU1vZGVsUHJvdmlkZXIgYnkgdGhlIHNwZWNpZmllZCBpZCBhbmQgY29uc3RydWN0cyBhIG5ldwotCSAqIElEYXRhTW9kZWwuIElmIHRoZSBJRGF0YU1vZGVsUHJvdmlkZXIgaXMgbm90IGZvdW5kIHRoZW4gYSBSdW50aW1lRXhjZXB0aW9uIGlzIGxvZ2dlZCBhbmQgbnVsbAotCSAqIGlzIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsUHJvdmlkZXJJRAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBJRGF0YU1vZGVsUHJvdmlkZXIKLQkgKiBAcmV0dXJuIGEgbmV3IElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKFN0cmluZyBkYXRhTW9kZWxQcm92aWRlcklEKSB7Ci0JCUlEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IGxvYWRQcm92aWRlcihkYXRhTW9kZWxQcm92aWRlcklEKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNyZWF0ZURhdGFNb2RlbChwcm92aWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSURhdGFNb2RlbFByb3ZpZGVyIGxvYWRQcm92aWRlcihTdHJpbmcgaWQpIHsKLQkJaWYgKG51bGwgPT0gcmVhZGVyKSB7Ci0JCQlyZWFkZXIgPSBuZXcgRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlci5nZXRQcm92aWRlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIGRhdGFNb2RlbFByb3ZpZGVySURzIGJ5IHRoZSBzcGVjaWZpZWQgZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWxQcm92aWRlcktpbmRJRAotCSAqICAgICAgICAgICAgdGhlIFN0cmluZyBpZCBvZiB0aGUgZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB2YWxpZCBkYXRhTW9kZWxQcm92aWRlcklEcyBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm9uZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldERhdGFNb2RlbFByb3ZpZGVySURzRm9yS2luZChTdHJpbmcgZGF0YU1vZGVsUHJvdmlkZXJLaW5kSUQpIHsKLQkJU3RyaW5nW10gdmFsaWRQcm92aWRlcklEcyA9IGxvYWRQcm92aWRlckZvclByb3ZpZGVyS2luZChkYXRhTW9kZWxQcm92aWRlcktpbmRJRCk7Ci0JCXJldHVybiBudWxsICE9IHZhbGlkUHJvdmlkZXJJRHMgPyB2YWxpZFByb3ZpZGVySURzIDogbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGxvYWRQcm92aWRlckZvclByb3ZpZGVyS2luZChTdHJpbmcgcHJvdmlkZXJLaW5kKSB7Ci0JCWlmIChudWxsID09IHJlYWRlcikgewotCQkJcmVhZGVyID0gbmV3IERhdGFNb2RlbEV4dGVuc2lvblJlYWRlcigpOwotCQl9Ci0JCXJldHVybiByZWFkZXIuZ2V0UHJvdmlkZXJEZXNjcmlwdG9yc0ZvclByb3ZpZGVyS2luZChwcm92aWRlcktpbmQpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEJ1aWxkcyBhbiB7QGxpbmsgSURhdGFNb2RlbH0gdXNpbmcgdGhlIHNwZWNpZmllZCBDbGFzcy4gVGhpcyBDbGFzcyB3aWxsCi0JICogbm9ybWFsbHkgYmUgYSBzdWIgaW50ZXJmYWNlIG9mIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllc30uIElmIHRoZQotCSAqIENsYXNzIGl0IGlzIGFuIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllc30uY2xhc3MgdGhlbiB0aGlzIG1ldGhvZCB3aWxsCi0JICogYXR0ZW1wdCB0byB1c2UgdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvcGVydGllcyNfcHJvdmlkZXJfY2xhc3N9IGZpZWxkIHRvCi0JICogbG9hZCB0aGUge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlcn0gd2l0aCB3aGljaCB0byBiYWNrIHRoZQotCSAqIHtAbGluayBJRGF0YU1vZGVsfS4gSWYgdGhpcyBmYWlscywgb3IgaWYgdGhlIENsYXNzIGlzIG5vdCBhbiBpbnRlcmZhY2UsCi0JICogdGhlbiB0aGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50IHRvCi0JICogPGNvZGU+Y3JlYXRlRGF0YU1vZGVsKGFDbGFzcy5nZXROYW1lKCkpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFDbGFzcwotCSAqICAgICAgICAgICAgYW4ge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfS5jbGFzcyBvciB0aGUgY2xhc3Mgd2hvc2UgbmFtZQotCSAqICAgICAgICAgICAgaXMgdGhlIGlkIG9mIHRoZSBJRGF0YU1vZGVsUHJvdmlkZXIKLQkgKiBAcmV0dXJuIGEgbmV3IElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKENsYXNzIGFDbGFzcykgewotCQlpZihhQ2xhc3MuaXNJbnRlcmZhY2UoKSl7Ci0JCQkJdHJ5ewotCQkJCQlDbGFzcyBjbGF6eiA9IChDbGFzcylhQ2xhc3MuZ2V0RmllbGQoIl9wcm92aWRlcl9jbGFzcyIpLmdldChudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZihjbGF6eiAhPSBudWxsKXsKLQkJCQkJCUlEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IChJRGF0YU1vZGVsUHJvdmlkZXIpY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCQkJCXJldHVybiBjcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZTsgdGhlIGludGVyZmFjZSBtYXkgbm90IGhhdmUgZGVmaW5lZCB0aGUgZmllbGQgYW5kIGlzIHJlbHlpbmcgb24gZXh0ZW5zaW9ucy4KLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0gIAotCQl9Ci0JCXJldHVybiBjcmVhdGVEYXRhTW9kZWwoYUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIG5ldyBJRGF0YU1vZGVsIHVzaW5nIHRoZSB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIG9mIGFuIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyCi0JICogQHJldHVybiBhIG5ldyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKG51bGwgPT0gcHJvdmlkZXIpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gbmV3IERhdGFNb2RlbEltcGwocHJvdmlkZXIpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3NTdkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHByb3ZpZGVzIGEgaHVtYW4gcmVhZGlibGUgZGVzY3JpcHRpb24gZm9yIGFuIElEYXRhTW9kZWwKLSAqIHByb3BlcnR5VmFsdWUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgewotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzLiBJZgotCSAqIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhIDAgbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgZm9yCi0JICogZWFjaCA8Y29kZT52YWx1ZXNbaV08L2NvZGU+IGluIHRoZSBhcnJheSwgYSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBpcyBjcmVhdGVkCi0JICogdXNpbmcgPGNvZGU+bmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnModmFsdWVzW2ldKTs8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzCi0JICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gY3JlYXRlRGVzY3JpcHRvcnMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmIChudWxsID09IHZhbHVlcykgewotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCX0KLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW3ZhbHVlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IodmFsdWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzLiBJZgotCSAqIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhIDAgbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgZm9yCi0JICogZWFjaCA8Y29kZT52YWx1ZXNbaV08L2NvZGU+IGFuZCA8Y29kZT5kZXNjcmlwdGlvbnNbaV08L2NvZGU+IGluIHRoZSBhcnJheXMsIGEgbmV3Ci0JICogRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgdXNpbmcKLQkgKiA8Y29kZT5uZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSwgZGVzY3JpcHRpb25zW2ldKTs8L2NvZGU+LiBCb3RoIGFycmF5cwotCSAqIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9ucwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHByb3BlcnR5IGRlc2NyaXB0aW9ucyBjb29yZXNwb25kaW5nIHRoZSB2YWx1ZXMgYXJyYXkKLQkgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBjcmVhdGVEZXNjcmlwdG9ycyhPYmplY3RbXSB2YWx1ZXMsIFN0cmluZ1tdIGRlc2NyaXB0aW9ucykgewotCQlpZiAobnVsbCA9PSB2YWx1ZXMpIHsKLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQl9Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSwgZGVzY3JpcHRpb25zW2ldKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBwcm9wZXJ0eVZhbHVlOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5RGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGVxdWF2YWxlbnQgdG8gY2FsbGluZyA8Y29kZT5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlWYWx1ZSwgbnVsbCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5VmFsdWUgYW5kCi0JICogcHJvcGVydHlEZXNjcmlwdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIEBwYXJhbSBwcm9wZXJ0eURlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgaHVtYW4gcmVhZGlibGUgcHJvZXBydHkgZGVzY3JpcHRpb25GCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgcHJvcGVydHlWYWx1ZSwgU3RyaW5nIHByb3BlcnR5RGVzY3JpcHRpb24pIHsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQkJdGhpcy5wcm9wZXJ0eURlc2NyaXB0aW9uID0gcHJvcGVydHlEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBodW1hbiByZWFkaWJsZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbi4gSWYgYSBub24gbnVsbCBkZXNjcmlwdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQsCi0JICogdGhlbiBpdCB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSB2YWx1ZSdzIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IHdpbGwgYmUKLQkgKiByZXR1cm5lZCBpZiBpdCBpcyBub3QgbnVsbC4gT3RoZXJ3aXNlIHRoZSBlbXB0eSBTdHJpbmcgKDxjb2RlPiIiPC9jb2RlPikgd2lsbCBiZQotCSAqIHJldHVybmVkLiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIG5ldmVyIGJlIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBodW1hbiByZWFkaWJsZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbiwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0aW9uOwotCQl9Ci0JCVN0cmluZyBzdHIgPSAobnVsbCAhPSBwcm9wZXJ0eVZhbHVlKSA/IHByb3BlcnR5VmFsdWUudG9TdHJpbmcoKSA6IG51bGw7Ci0JCXJldHVybiAobnVsbCAhPSBzdHIpID8gc3RyIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlyZXR1cm4gZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzFjNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIHRoZSBjb3JlIHBpZWNlIG9mIGEgZnJhbWV3b3JrIHVzZWQgdG8gc2ltcGxpZnkgZGF0YSBjb2xsZWN0aW9uLCBvcGVyYXRpb24KLSAqIGV4ZWN1dGlvbiwgYW5kIFdpemFyZCBnZW5lcmF0aW9uLgotICogPC9wPgotICogPHA+Ci0gKiBJRGF0YU1vZGVscyBhcmUgcHJpbWFyaWx5IGFuIGludGVsbGlnZW50IG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgZGF0YS4gRWFjaCBJRGF0YU1vZGVsIHRyYWNrcwotICogc3BlY2lmaWMgT2JqZWN0cyBrbm93biBhcyAicHJvcGVydGllcyIuIEVhY2ggcHJvcGVydHkgbWF5IGJlIHNldCBvciBnZXQgdXNpbmcgaXRzIHByb3BlcnR5IG5hbWUuCi0gKiBBIENvbGxlY3Rpb24gb2YgcHJvcGVydHkgbmFtZXMgZm9yIGFuIElEYXRhTW9kZWwgaW5zdGFuY2UgbWF5IGJlIHJldHJlaXZlZCB1c2luZwotICogPGNvZGU+Z2V0QWxsUHJvcGVydGllcygpPC9jb2RlPi4gSW4gYWRkaXRpb24gdG8gZ2V0dGluZy9zZXR0aW5nIHByb3BlcnRpZXMsIElEYXRhTW9kZWxzIG1heQotICogYWxzbyBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGZvciB1bnNldCBwcm9wZXJ0aWVzLCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdG9ycyBmb3IgcHJvcGVydGllcywKLSAqIGVudW1lcmF0aW9ucyBvZiB2YWxpZCBwcm9wZXJ0eSB2YWx1ZXMsIHZhbGlkYXRpb24gZm9yIHByb3BlcnRpZXMsIGFuZCBlbmFibGVtZW50IGZvciBwcm9wZXJ0aWVzLgotICogPC9wPgotICogPHA+Ci0gKiBJRGF0YU1vZGVscyBtYXkgYWxzbyBiZSBuZXN0ZWQgKGFuZCB1bm5lc3RlZCkgcmVjdXJzaXZlbHkgd2l0aGluIGFub3RoZXIuIFdoZW4gb25lIElEYXRhTW9kZWwgaXMKLSAqIG5lc3RlZCB3aXRoaW4gYW5vdGhlciwgdGhlbiBjbGllbnQgY29kZSBtYXkgYWNjZXNzIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBmb3JtZXIgdGhyb3VnaCB0aGUKLSAqIGxhdHRlci4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHRoZSBzYW1lIElEYXRhTW9kZWwgKHRyYWNraW5nIHRoZSBzYW1lIHByb3BlcnRpZXMpIG1heSBiZQotICogdXNlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgYnJvYWRlciBzY2VuYXJpb3MuIE5lc3RpbmcgbWF5IGFwcGx5IHRvIGFueQotICogSURhdGFNb2RlbCwgYW5kIG1heSBiZSBhYml0cmFyeWx5IGRlZXAgKGV2ZW4gY3lsaWNhbCBpZiB5b3UgZGFyZSkuIE5lc3Rpbmcgb2ZmZXJzIGZsZXhpYmlsaXR5LAotICogZXNwZWNpYWxseSBmb3IgZXh0ZW5zaW9uIGJ5IDNyZCBwYXJ0eSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBFYWNoIElEYXRhTW9kZWwgbWF5IGFsc28gc3VwcGx5IGFuIElEYXRhTW9kZWxPcGVyYXRpb24gKGEgc3ViY2xhc3Mgb2YKLSAqIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24pIGZvciBleGVjdXRpb24uIFdoZW4gZXhlY3V0ZWQgd2l0aGluIHRoZQotICogSURhdGFNb2RlbCBmcmFtZXdvcmsgYWxsIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGluaGVyZW50bHkgYW5kIGFiaXRyYXJpbHkgZXh0ZW5kYWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogRWFjaCBJRGF0YU1vZGVsIG1heSBhbHNvIGluZGlyZWN0bHkgc3VwcGx5IGEgRGF0YU1vZGVsV2l6YXJkLiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lY2Vzc2FyeSB0bwotICogc3BpbHQgVUkgZGVwZW5kZW5jaWVzIGZyb20gdGhlIGNvcmUgSURhdGFNb2RlbCBmcmFtZXdvcmsuIERhdGFNb2RlbFdpemFyZHMgYXJlIGFsc28gaW5oZXJlbnRseQotICogZXh0ZW5kYWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHksIHJhdGhlciB0aGV5IGFyZSBidWlsdCBmcm9tIGFuCi0gKiBJRGF0YU1vZGVsUHJvdmlkZXIuIENsaWVudHMgd2lzaGluZyB0byBkZWZpbmUgdGhlaXIgb3duIElEYXRhTW9kZWwgbXVzdCBkbyBzbyBieSBpbXBsZW1lbnRpbmcgYW4KLSAqIElEYXRhTW9kZWxQcm92aWRlci4gQ2xpZW50cyB3aXNoaW5nIHRvIHV0aWxpemUgYW4gSURhdGFNb2RlbCBtdXN0IGNyZWF0ZSBpdCB1c2luZyB0aGUKLSAqIERhdGFNb2RlbEZhY3Rvcnkgd2l0aCB0aGUgYXNzb2NpYXRlZCBJRGF0YU1vZGVsUHJvdmlkZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBJRCB3aGljaCBpZGVudGlmaWVzIHRoaXMgSURhdGFNb2RlbCBpbnN0YW5jZS4gVGhlIHNhbWUgSUQgc2hvdWxkIGJlIHVzZWQKLQkgKiBieSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gKGlmIGFueSkgZm9yIGNsaWVudHMgdG8gZXh0ZW5kIG9yIGluc3RhbnRpYXRlIGRpcmVjdGx5LCB0aGUKLQkgKiBEYXRhTW9kZWxXaXphcmQgKGlmIGFueSkgZm9yIGNsaWVudHMgdG8gZXh0ZW5kIG9yIGluc3RhbnRpYXRlIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlLCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBhIGhhc2hjb2RlLiBNdWx0aXBsZSBJRGF0YU1vZGVsIGluc3RhbmNlcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUKLQkgKiBJRGF0YU1vZGVsUHJvdmlkZXIgdHlwZSB3aWxsIGFsbCBoYXZlIHRoZSBzYW1lIElELgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldElEKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmlxdWUgSUQgZm9yIHRoaXMgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHRvIGV4ZWN1dGUgYWdhaW5zdCB0aGlzIElEYXRhTW9kZWwuIFRoZSByZXR1cm5lZCBvcGVyYXRpb24gaXMKLQkgKiBkZXJpdmVkIGZyb20gdGhlIG9wZXJhdGlvbiBzdXBwbGllZCBieSB0aGUgYmFja2luZyBJRGF0YU1vZGVsUHJvdmlkZXIuIFRoZSByZXR1cm5lZCB0eXBlIGlzCi0JICogSURhdGFNb2RlbE1hbmFnZXJPcGVyYXRpb24gd2hpY2ggYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHJldHVybmVkCi0JICogSURhdGFNb2RlbE9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0T3BlcmF0aW9uKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgcGVydGFpbnMgdG8gSURhdGFNb2RlbHMgZm9yIGV4dGVkZW5kZWQgb3BlcmF0aW9ucy4gVGhlIHJldHVybmVkIGV4dGVuZGVkCi0JICogY29udGV4dCBpcyB1c2VkIGJ5IHRoZSBJRGF0YU1vZGVsT3BlcmF0aW9uIGZyYW1ld29yayB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIKLQkgKiBleHRlbmRlZCBvcGVyYXRpb24gc2hvdWxkIGV4ZWN1dGUuIFRoZSByZXR1cm5lZCBsaXN0IGlzIHNob3VsZCBjb250YWluIE9iamVjdHMgYWRhcHRhYmxlIHRvCi0JICogSVByb2plY3QuIFRoaXMgSURhdGFNb2RlbCdzIGZ1bmN0aW9uIGdyb3VwcyBhcmUgbG9va2VkIHVwIHRocm91Z2ggdGhlIGV4dGVuc2lvbiBtZWNoYW5pc20uIElmCi0JICogYSBmdW5jdGlvbiBncm91cCBpcyBkZWZpbmVkLCBpdCBpcyBmaXJzdCBjaGVja2VkIGZvciBlbmFibGVtZW50LiBUaGVuIGVhY2ggYWRhcHRlZCBJUHJvamVjdAotCSAqIGlzIGluc3BlY3RlZCB0byB2ZXJpZnkgaXQgaGFuZGxlcyB0aGUgZnVuY3Rpb24gZ3JvdXAuIElmIGFsbCB0aGVzZSBjb25kaXRpb25zIGFyZSBtZXQsIHRoZW4KLQkgKiB0aGUgZXh0ZW5kZWQgb3BlcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElEYXRhTW9kZWwgaXMgZXhlY3V0ZWQ7IG90aGVyd2lzZSBpdCBpcyBza2lwcGVkLgotCSAqIElmIG5vIGZ1bmN0aW9uIGdyb3VwIGlzIGRlZmluZWQsIG9yIG5vIGV4dGVuZGVkIGNvbnRleHQgaXMgZGVmaW5lZCAoaS5lLiB0aGlzIG1ldGhvZCByZXR1cm5zCi0JICogYW4gZW1wdHkgbGlzdCwgb3IgdGhlIG9iamVjdHMgaW4gdGhlIHJldHVybmVkIGxpc3QgYXJlIG5vdCBhZGFwdGFibGUgdG8gSVByb2plY3QpIHRoZW4gdGhlCi0JICogZXh0ZW5kZWQgb3BlcmF0aW9uIHdpbGwgZXhlY3V0ZSAoaXQgd2lsbCBuZXZlciBiZSBza2lwcGVkKS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiBPYmplY3RzIGFkYXB0YWJsZSB0byBJUHJvamVjdAotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldEV4dGVuZGVkQ29udGV4dCgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIG5vdCBhIHByb3BlcnR5IHRoZW4gYSBSdW50aW1lRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBCZWZvcmUgdGhlIHByb3BlcnR5IGlzIHJldHVybmVkLCBmaXJzdCB0aGUgb3duaW5nIElEYXRhTW9kZWwgbXVzdCBiZSBsb2NhdGVkLiBJZiB0aGUKLQkgKiBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgYmFzZSBwcm9wZXJ0eSB7QGxpbmsgI2lzQmFzZVByb3BlcnR5KFN0cmluZyl9LCB0aGVuIHRoaXMKLQkgKiBJRGF0YU1vZGVsIGlzIHRoZSBvd25lci4gT3RoZXJ3aXNlLCBhIHJlY3Vyc2l2ZSBzZWFyY2ggdGhyb3VnaCB0aGUgbmVzdGVkIElEYXRhTW9kZWxzIGlzCi0JICogY29uZHVjdGVkIHRvIGxvY2F0ZSB0aGUgb3duaW5nIElEYXRhTW9kZWwuIElmIG1vcmUgdGhhbiBvbmUgbmVzdGVkIElEYXRhTW9kZWwgZGVmaW5lcyB0aGUKLQkgKiBwcm9wZXJ0eSwgdGhlbiB0aGUgZmlyc3Qgb25lIGxvY2F0ZWQgaXMgY29uc2lkZXJlZCB0aGUgb3duaW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE9uY2UgdGhlIG93bmluZyBJRGF0YU1vZGVsIGlzIGZvdW5kIHRoZSBwcm9wZXJ0eSBpcyBjaGVja2VkIHRvIHNlZSBpZiBpdCBpcyBzZXQKLQkgKiB7QGxpbmsgI2lzUHJvcGVydHlTZXQoU3RyaW5nKX0uIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBzZXQgdmFsdWUgaXMgcmV0dXJuZWQuIElmIHRoZQotCSAqIHByb3BlcnR5IGlzIG5vdCBzZXQsIGl0cyBkZWZhdWx0IGlzIHJldHVybmVkIHtAbGluayAjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGVyZSBhcmUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZ2V0dGluZyBwcmltaXRpdmUgPGNvZGU+aW50PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiB0eXBlcyBhcyB3ZWxsIGFzIFN0cmluZ3MuCi0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgI2dldEludFByb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nKX08L2xpPgotCSAqIDxsaT57QGxpbmsgI2dldFN0cmluZ1Byb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSAjZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgaW50cy4gSWYgdGhlIHByb3BlcnR5IGlzIHNldCB0aGVuIHRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQKLQkgKiB0bzoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+KChJbnRlZ2VyKWdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpLmludFZhbHVlKCk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQgaWYgYSBjYWxsIHRvIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYm9vbGVhbnMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGVxdWF2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPigoQm9vbGVhbilnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKS5ib29sZWFuVmFsdWUoKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCBpZiBhIGNhbGwgdG8gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIFN0cmluZ3MuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGVxdWF2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPihTdHJpbmcpZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+IiI8L2NvZGU+IGlzIHJldHVybmVkIGlmIGEgY2FsbCB0byBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIHRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlWYWx1ZS4gU3Vic2VxdWVudCBjYWxscyB0bwotCSAqIHtAbGluayAjZ2V0UHJvcGVydHkoU3RyaW5nKX0gd2lsbCByZXR1cm4gdGhlIHNhbWUgcHJvcGVydHlWYWx1ZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBhIHByb3BlcnR5VmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzZXQsIHRoZW4gdGhlIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQKLQkgKiAic2V0IiAoc2VlIHtAbGluayAjaXNQcm9wZXJ0eVNldChTdHJpbmcpfSksIGNvbnZlcnNseSwgYSBwcm9wZXJ0eVZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaXMgY29uc2lkZXJlZCAidW5zZXQiLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBpcyBub3QgYSBwcm9wZXJ0eSAoc2VlIHtAbGluayAjaXNQcm9wZXJ0eShTdHJpbmcpfSkgdGhlbiBhCi0JICogUnVudGltZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlcmUgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHNldHRpbmcgcHJpbWl0aXZlIDxjb2RlPmludDwvY29kZT4gYW5kCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHlwZXMgYXMgd2VsbCBhcyBTdHJpbmdzLgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKX08L2xpPgotCSAqIDxsaT57QGxpbmsgI3NldFN0cmluZ1Byb3BlcnR5KFN0cmluZywgU3RyaW5nKX08L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgbWF5IGRlZmluZSBhZGRpdGlvbmFsIHBvc3Qgc2V0IGxvZ2ljIGluCi0JICoge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCl9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5Ci0JICogCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2lzUHJvcGVydHlTZXQoU3RyaW5nKQotCSAqIEBzZWUgI2lzUHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI3Byb3BlcnR5U2V0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGludHMuIFRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG86Ci0JICogPHA+Ci0JICogPGNvZGU+c2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcihwcm9wZXJ0eVZhbHVlKSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0SW50UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGJvb2xlYW5zLiBUaGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxwPgotCSAqIDxjb2RlPnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgKHZhbHVlKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHByb3BlcnR5VmFsdWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHNldHRpbmcgU3RyaW5ncy4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bzoKLQkgKiA8cD4KLQkgKiA8Y29kZT5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBuZXN0IHRoZSBzcGVjaWZpZWQgSURhdGFNb2RlbCB3aXRoaW4gdGhpcyBJRGF0YU1vZGVsLiBUaGUKLQkgKiA8Y29kZT5uZXN0ZWRNb2RlbE5hbWU8L2NvZGU+IGFyZ3VtZW50IHNob3VsZCBiZSBhIHVuaXF1ZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyCi0JICogbmVzdGVkIElEYXRhTW9kZWwuIFRoZSBzYW1lIFN0cmluZyBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdXNpbmcKLQkgKiBlaXRoZXIge0BsaW5rICNnZXROZXN0ZWRNb2RlbChTdHJpbmcpfSBvciB7QGxpbmsgI3JlbW92ZU5lc3RlZE1vZGVsKFN0cmluZyl9LiBJZiB0aGUKLQkgKiBzcGVjaWZpZWQgbmVzdGVkIElEYXRhTW9kZWwgaGFzIGFscmVhZHkgYmVlbiBuZXN0ZWQgdW5kZXIgdGhpcyBJRGF0YU1vZGVsIG9yIGl0IGlzIHRoZSBzYW1lCi0JICogaW5zdGFuY2UgYXMgdGhpcyBJRGF0YU1vZGVsLCB0aGVuIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5lc3RlZE1vZGVsTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIElEYXRhTW9kZWwgdG8gYmUgbmVzdGVkCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqICAgICAgICAgICAgdGhlIElEYXRhTW9kZWwgdG8gYmUgbmVzdGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmVzdGluZyB3YXMgc3VjY2Vzc2Z1bCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNnZXROZXN0ZWRNb2RlbChTdHJpbmcpCi0JICogQHNlZSAjcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZE5lc3RlZE1vZGVsKFN0cmluZyBuZXN0ZWRNb2RlbE5hbWUsIElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5lc3RlZE1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gcmVtb3ZlLgotCSAqIEByZXR1cm4gdGhlIElEYXRhTW9kZWwgcmVtb3ZlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG5lc3RlZCBtb2RlbCBkb2VzIG5vdCBleGlzdCBvcgotCSAqICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBuYW1lIGlzIG51bGwuCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nIG5lc3RlZE1vZGVsTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmVzdGVkIG1vZGVsIGV4aXN0cyAoYXQgdGhlIHRvcCBsZXZlbCBvbmx5KSB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gY2hlY2suCi0JICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmVzdGVkIG1vZGVsIGV4aXN0cyAoYXQgdGhlIHRvcCBsZXZlbCBvbmx5KSB3aXRoIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIG5hbWUgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIGlkZW50aWZpZWQgdGhlIGJ5IHRoZSBzcGVjaWZpZWQgbmFtZS4gQSBSdW50aW1lRXhjZXB0aW9uIGlzCi0JICogdGhyb3duIGlmIHRoZXJlIGlzIG5vIHN1Y2ggbmVzdGVkIElEYXRhTW9kZWwgKGkuZS4gaXNOZXN0ZWRNb2RlbCgpIHdvdWxkIHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPikuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXN0ZWRNb2RlbE5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCB0byBnZXQuCi0JICogQHJldHVybiB0aGUgbmVzdGVkIElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXROZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZE1vZGVscygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscyBuYW1lcywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGVkIElEYXRhTW9kZWxzIG5hbWVzLCBvciBhbiBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RpbmcgKHRoZSBpbnZlcnNlIG9mIG5lc3RlZCkgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGluZyAodGhlIGludmVyc2Ugb2YgbmVzdGVkKSBJRGF0YU1vZGVscywgb3IgYW4gZW1wdHkKLQkgKiAgICAgICAgIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0aW5nTW9kZWxzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgYmFzZSBwcm9wZXJ0aWVzIChub3QgaW5jbHVkaW5nIG5lc3RlZCBwcm9wZXJ0aWVzKSwgb3IgYW4gZW1wdHkKLQkgKiBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIGFsbCBiYXNlIHByb3BlcnRpZXMgKG5vdCBpbmNsdWRpbmcgbmVzdGVkIHByb3BlcnRpZXMpLCBvciBhbiBlbXB0eQotCSAqICAgICAgICAgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEJhc2VQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiByZWN1cnNpdmVseSBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiByZWN1cnNpdmVseSBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogICAgICAgICBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgKHRoZSB1bmlvbiBvZiBnZXRCYXNlUHJvcGVydGllcygpIGFuZAotCSAqIGdldE5lc3RlZFByb3BlcnRpZXMoKSksIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgKHRoZSB1bmlvbiBvZiBnZXRCYXNlUHJvcGVydGllcygpIGFuZAotCSAqICAgICAgICAgZ2V0TmVzdGVkUHJvcGVydGllcygpKSwgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIHRoaXMKLQkgKiByb290IElEYXRhTW9kZWwgb25seS4gTmVzdGVkIElEYXRhTW9kZWxzIGFyZSBub3QgY2hlY2tlZCwgdGhvdWdoIGl0IGlzIHBvc3NpYmxlIGZvciBhIG5lc3RlZAotCSAqIElEYXRhTW9kZWwgdG8gY29udGFpbiB0aGUgc2FtZSBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcHJvcGVydHkgaXMgYSBiYXNlIHByb3BlcnR5LCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNpc1Byb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNpc05lc3RlZFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Jhc2VQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIHRoaXMKLQkgKiBEYXRhTW9kZWwgb3IgYW55IG9mIGl0cyAocmVjdXJzaXZlbHkpIG5lc3RlZCBJRGF0YU1vZGVscy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBwcm9wZXJ0eSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNpc0Jhc2VQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIGFueSBvZgotCSAqIGl0cyAocmVjdXJzaXZlbHkpIG5lc3RlZCBJRGF0YU1vZGVscy4gVGhlIHJvb3QgSURhdGFNb2RlbCBpcyBub3QgY2hlY2tlZCwgdGhvdWdoIGl0IGlzCi0JICogcG9zc2libGUgZm9yIHRoZSByb290IElEYXRhTW9kZWwgdG8gY29udGFpbiB0aGUgc2FtZSBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBuZXN0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHNlZSAjaXNCYXNlUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGJlZW4gc2V0IG9uIHRoZSBJRGF0YU1vZGVsLiBJZiBpdAotCSAqIGhhcyBub3QgYmVlbiBzZXQsIHRoZW4gYSBjYWxsIHRvIGdldCB0aGUgc2FtZSBwcm9wZXJ0eSB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBlbmFibGVkIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIGVuYWJsZWQgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBpcyBFUlJPUgotCSAqIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBpcyBFUlJPUgotCSAqICAgICAgICAgYW5kIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5VmFsaWQoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIElTdGF0dXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFJldHVucyBhbiBJU3RhdHVzLk9LIGlmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcwotCSAqIHZhbGlkIHdpdGggcmVzcGVjdCBpdHNlbGYsIG90aGVyIHByb3Blcml0ZXMsIGFuZCBicm9hZGVyIGNvbnRleHQgb2YgdGhlIElEYXRhTW9kZWwuCi0JICogSVN0YXR1cy5FUlJPUiBpcyByZXR1cm5lZCBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgaW52YWxpZC4gSVN0YXR1cy5XQVJOSU5HIG1heSBhbHNvIGJlCi0JICogcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIG5vdCBvcHRpbWFsLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIElTdGF0dXMgcmV0dXJuZWQgYnkgdmFsaWRhdGUodHJ1ZSkgaXMgRVJST1IgYW5kCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgSVN0YXR1cyByZXR1cm5lZCBieSB2YWxpZGF0ZSh0cnVlKSBpcyBFUlJPUiBhbmQKLQkgKiAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFcXVhdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+dmFsaWRhdGUodHJ1ZSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogSXRlcmF0ZXMgb3ZlciBhbGwgYmFzZSBwcm9wZXJ0aWVzIGFuZCBuZXN0ZWQgbW9kZWxzIElEcyBhbmQgY2FsbHMgdmFsaWRhdGUoU3RyaW5nKS4gVGhpcwotCSAqIG1ldGhvZCByZXR1cm5zIHdoZW4gYW55IGNhbGwgdG8gdmFsaWRhdGUoU3RyaW5nKSByZXR1cm5zIGFuIElTdGF0dXMgZXJyb3IgYW5kCi0JICogc3RvcEF0Rmlyc3RGYWlsdXJlIGlzIHNldCB0byB0cnVlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdG9wQXRGaXJzdEZhaWx1cmUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgc3RvcCBhdCB0aGUgZmlyc3QgZmFpbHVyZQotCSAqIEByZXR1cm4gYW4gSVN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGJvb2xlYW4gc3RvcEF0Rmlyc3RGYWlsdXJlKTsKLQotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBUaGUKLQkgKiA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKCk8L2NvZGU+IG1ldGhvZCBvbiB0aGUgcmV0dXJuZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHdpbGwgYmUKLQkgKiB0aGUgc2FtZSB2YWx1ZSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBGb2xsb3dpbmcgdGhlIGV4YW1wbGUgaW50cm9kdWNlZCBpbiB7QGxpbmsgI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpfSwgc3VwcG9zZQotCSAqIHRoZSA8Y29kZT5TSElSVF9TSVpFPC9jb2RlPiBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgc2V0IHRvIDEuIEEgY2FsbCB0byB0aGlzIG1ldGhvZCB3b3VsZAotCSAqIHJldHVybiBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB3aG9zZSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKCk8L2NvZGU+IHJldHVybnMKLQkgKiA8Y29kZT4xPC9jb2RlPiBhbmQgd2hvc2UgPGNvZGU+Z2V0UHJvcGVydHlEZXNjcmlwdGlvbigpPC9jb2RlPiByZXR1cm5zIDxjb2RlPnNtYWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQWxzbywgbm90ZSB0aGF0IGV2ZW4gaWYgYSBwYXJ0aWN1bGFyIHByb3BlcnR5IGlzIG5vdCBjb25maW5lZCB0byBhIGZpbml0ZSBzZXQgb2YgdmFsdWVzIGFzCi0JICogZGVmaW5lZCBieSB7QGxpbmsgI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpfXRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBhCi0JICogdmFsaWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlICNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBhcnJheSBjb25zaXN0aW5nIG9mIGFsbCB2YWxpZAotCSAqIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIEVhY2gKLQkgKiB7QGxpbmsgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yfSBjb250YWlucyBhIHZhbHVlIGFuZCBhIGh1bWFuIHJlYWRpYmxlIGRlc2NyaXB0aW9uIGZvciB0aGUKLQkgKiB2YWx1ZS4gVGhlIHNldCBvZiBhbGwgdmFsdWVzIGluIHRoZSByZXR1cm5lZCBhcnJheSBhcmUgdGhvc2UgdmFsdWVzIHdoaWNoIGFyZSB2YWxpZCBmb3IgdGhlCi0JICogSURhdGFNb2RlbC4gVGhpcyB2YWx1ZSBzZXQgb25seSBtYWtlcyBzZW5zZSB3aGVuIHZhbGlkIHByb3BlcnR5IHZhbHVlcyBjb25mb3JtIHRvIGEgd2VsbAotCSAqIGRlZmluZWQgZmluaXRlIHNldC4gSWYgbm8gc3VjaCB2YWx1ZSBzZXQgZXhpc3RzIGZvciB0aGUgcHJvcGVydHksIHRoZW4gYSAwIGxlbmd0aCBhcnJheSBpcwotCSAqIHJldHVybmVkLiA8Y29kZT5udWxsPC9jb2RlPiBpcyBuZXZlciByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSB0aGVyZSBpcyBhIHByb3BlcnR5IGNhbGxlZCA8Y29kZT5TSElSVF9TSVpFPC9jb2RlPiB3aGljaCBpcyBhbgotCSAqIDxjb2RlPkludGVnZXI8L2NvZGU+IHR5cGUuIEFsc28gc3VwcHNlIHRoYXQgdmFsaWQgc2hpcnQgc2l6ZXMgYXJlIG9ubHkgc21hbGwsIG1lZGl1bSwgb3IKLQkgKiBsYXJnZS4gSG93ZXZlciwgdGhlIGFjdHVhbCB2YWx1ZXMgcmVwcmVzZW50aW5nIHNtYWxsLCBtZWRpdW0sIGFuZCBsYXJnZSBhcmUgMSwgMiwgYW5kIDMKLQkgKiByZXNwZWN0aXZlbHkuIEEgY2FsbCB0byA8Y29kZT5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU0hJUlRfU0laRSk8L2NvZGU+IHdvdWxkIHJldHVybiBhCi0JICogRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGFycmF5IHdoZXJlIHRoZSB2YWx1ZSwgZGVzY3JpcHRpb24gcGFpcnMgd291bGQgYmUgeygxLCBzbWFsbCksCi0JICogKDIsIG1lZGl1bSksICgzLCBsYXJnZSl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZW4gbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB2YWxpZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWxMaXN0ZW5lciB0byBsaXN0ZW4gZm9yIERhdGFNb2RlbEV2ZW50cy4gSWYgdGhlIHNwZWNpZmllZAotCSAqIGxpc3RlbmVyIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbmV3IGxpc3RlbmVyIHRvIGFkZC4KLQkgKiAKLQkgKiBAc2VlICNyZW1vdmVMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyIGRhdGFNb2RlbExpc3RlbmVyKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWxMaXN0ZW5lci4gSWYgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBpcyBub3QgYSByZWdpc3RlcmVkCi0JICogbGlzdGVuciBvbiB0aGlzIElEYXRhTW9kZWwsIHRoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gZWZmZWN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byByZW1vdmUuCi0JICogQHNlZSAjYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBkYXRhTW9kZWxMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnN0YW50IHVzZWQgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudCNWQUxVRV9DSEcKLQkgKiBAc2VlICNub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DSEcgPSBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uIFRoaXMgY29udGFudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXJzIGJlY2F1c2UgaXQgZG9lcwotCSAqIG5vdCBtYXAgdG8gYW4gZXZlbnQgdHlwZSBvbiBEYXRhTW9kZWxFdmVudC4gV2hlbiBub3RpZnlpbmcgd2l0aCB0aGlzIHR5cGUsIGEgY2hlY2sgaXMgZmlyc3QKLQkgKiBkb25lIHRvIHNlZSB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzZXQuIElmIHRoZSBwcm9wZXJ0eSBpcyA8ZW1wZj5OT1Q8L2VtcGg+IHNldCwgdGhlbiBhCi0JICogPGNvZGU+VkFMVUVfQ0hHPC9jb2RlPiBpcyBmaXJlZCwgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSEcgPSBEYXRhTW9kZWxFdmVudC5ERUZBVUxUX0NIRzsKLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnN0YW50IHVzZWQgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudCNFTkFCTEVfQ0hHCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0NIRyA9IERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQjVkFMSURfVkFMVUVTX0NIRwotCSAqIEBzZWUgI25vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEX1ZBTFVFU19DSEcgPSBEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHOwotCi0JLyoqCi0JICogPHA+Ci0JICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgb2YgYSBwcm9wZXJ0eSBjaGFuZ2UuIDxjb2RlPmV2ZW50VHlwZTwvY29kZT4gc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi0JICogY2hhbmdlLiBBY2NlcHRpYmxlIHZhbHVlcyBmb3IgZXZlbnRUeXBlIGFyZSA8Y29kZT5WQUxVRV9DSEc8L2NvZGU+LAotCSAqIDxjb2RlPkRFRkFVTFRfQ0hHPC9jb2RlPiwgPGNvZGU+RU5BQkxFX0NIRzwvY29kZT4sIDxjb2RlPlZBTElEX1ZBTFVFU19DSEc8L2NvZGU+LiBJZgotCSAqIHRoZSBldmVudFR5cGUgaXMgPGNvZGU+REVGQVVMVF9DSEc8L2NvZGU+IGFuZCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIHNldCwgdGhlbiB0aGlzCi0JICogbWV0aG9kIHdpbGwgZG8gbm90aGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVHlwaWNhbGx5IHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGludm9rZWQgYnkgYW4gSURhdGFNb2RlbFByb3ZpZGVyIGZyb20gaXRzIHByb3BlcnR5U2V0Ci0JICogaW1wbGVtZW50YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2luZwotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGZpcmUKLQkgKiAKLQkgKiBAc2VlICNWQUxVRV9DSEcKLQkgKiBAc2VlICNERUZBVUxUX0NIRwotCSAqIEBzZWUgI0VOQUJMRV9DSEcKLQkgKiBAc2VlICNWQUxJRF9WQUxVRVNfQ0hHCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBldmVudFR5cGUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIGRpc3Bvc2UgbWV0aG9kIHVzZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBub3QgaGFuZGxlZCBieSBnZW5lcmFsIGdhcmJhZ2UKLQkgKiBjb2xsZWN0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGFhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBpbnRlcmZhY2UgcmVxdWlyZWQgd2hlbiBsaXN0ZW5pbmcgZm9yIERhdGFNb2RlbEV2ZW50cyBmcm9tIGFuIElEYXRhTW9kZWwuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2FkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lcikKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudAotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbExpc3RlbmVyIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNlbnQgd2hlbiBEYXRhTW9kZWxFdmVudHMgb2NjdXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIERhdGFNb2RlbEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1MzJhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi0vKioKLSAqIDxwPgotICogSURhdGFNb2RlbE9wZXJhdGlvbiBkZWZpbmVzIGFuIElEYXRhTW9kZWwgZHJpdmVuIHVuZG9hYmxlIG9wZXJhdGlvbi4gRXZlcnkgSURhdGFNb2RlbE9wZXJhdGlvbgotICogbWF5IGJlIGV4dGVuZGVkIGJ5IHRoaXJkIHBhcnR5IGNsaWVudHMgdXNpbmcgdGhlIGV4dGVuZGVkIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzCi0gKiB7QGxpbmsgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb259LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbAotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzIElVbmRvYWJsZU9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSB1bmlxdWUgb3BlcmF0aW9uIGlkLiBUeXBpY2FsbHksIGNsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBvcGVyYXRpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNldHMgdGhlIElEYXRhTW9kZWwgZm9yIHRoaXMgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHVzZWQgdG8gcnVuIHRoaXMgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGlzIG9wZXJhdGlvbidzIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBvcGVyYXRpb24ncyBJRGF0YU1vZGVsLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgSVNjaGVkdWxpbmdSdWxlIHVzZWQgZm9yIGV4ZWN1dGluZyB0aGlzIGpvYiB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcil9LgotCSAqIElmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLCB0aGVuIElXb3Jrc3BhY2UuZ2V0Um9vdCgpIGlzIHVzZWQgYXMgdGhlIElTY2hlZHVsaW5nUnVsZQotCSAqIGR1cmluZyBleGVjdXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTY2hlZHVsaW5nUnVsZQotCSAqIAotCSAqIEBzZWUgI2dldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSwgSVNjaGVkdWxpbmdSdWxlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBPcGVyYXRpb25FeGVjdXRpb25GbGFncyB1c2VkIGZvciBleGVjdXRpbmcgdGhpcyBPcGVyYXRpb24gYXMgYSB3b3Jrc3BhY2Ugam9iLgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcil9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBPcGVyYXRpb25FeGVjdXRpb25GbGFncwotCSAqIAotCSAqIEBzZWUgI2dldFNjaGVkdWxpbmdSdWxlKCkKLQkgKiBAc2Vlb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlLCBJU2NoZWR1bGluZ1J1bGUsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBmcmFtZXdvcmsgd2lsbCBzZXQgdGhlIGVudmlyb25tZW50IG9uIHRoaXMgb3BlcmF0aW9uIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4gVGhlIG9wZXJhdGlvbgotCSAqIGNhbiB0aGVuIHVzZSB0aGUgZW52aXJvbm1lbnQgdG8gcmVwb3J0IHN0YXR1cywgbG9nIGluZm9ybWF0aW9uLCBhbmQgYWNjZXNzIHJlc291cmNlcyBpbiBhbgotCSAqIGVudmlyb25tZW50IG5ldXRyYWwgd2F5LgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBlbnZpcm9ubWVudAotCSAqICAgICAgICAgICAgdGhlIElFbnZpcm9ubWVudCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoSUVudmlyb25tZW50IGVudmlyb25tZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElFdmlyb25tZW50IHNldCBpbiB7QGxpbmsgI3NldEVudmlyb25tZW50KElFbnZpcm9ubWVudCl9fQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBJRW52aXJvbm1lbnQKLQkgKiAKLQkgKiBAc2VlICNzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQpCi0JICovCi0JcHVibGljIElFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZTA4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIERhdGEgTW9kZWwKLSAqIFByb3BlcnRpZXMgaW50ZXJmYWNlcy4gU3ViIGludGVyZmFjZSBjbGFzc2VzIChlLmcuCi0gKiA8Y29kZT5zb21lLmNvbXBhbnkuSUZvb0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3M8L2NvZGU+KSBzaG91bGQgYmUgdXNlZCB0bwotICogY3JlYXRlIGluc3RhbmNlcyBvZiBJRGF0YU1vZGVscyB1c2luZyB0aGUKLSAqIHtAbGluayBEYXRhTW9kZWxGYWN0b3J5I2NyZWF0ZURhdGFNb2RlbChDbGFzcyl9IG1ldGhvZC4gSW4gb3JkZXIgZm9yIHRoaXMKLSAqIG1lY2hhbmlzbSB0byB3b3JrLCB0aGUgYmFja2luZyB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzcyBtdXN0IGJlCi0gKiByZWdpc3RlcmQgdG8gc3VwcG9ydCB0aGUgc3ViIElEYXRhTW9kZWxQcm9wZXJ0aWVzIGludGVyZmFjZSBpbiBvbmUgb2YgdHdvCi0gKiB3YXlzLiBUaGlzIHJlZ2lzdHJhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHRoZSBtb2RlbCBkZXZlbG9wZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBmaXJzdCB3YXkgdG8gcmVnaXN0ZXIgdGhlIGNvcnJlY3Qge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlcn0gY2xhc3MgaXMgZm9yCi0gKiB0aGUgaW50ZXJmYWNlIHRvIGRlZmluZSBhIHB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzIGZpZWxkCi0gKiB3aGljaCBpcyBzZXQgdG8gdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzLCBlLmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxjb2RlPnB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gc29tZS5jb21wYW55LkZvb0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzPC9jb2RlPgotICogPC9wPgotICogVGhlIGFib3ZlIG1lY2hhbmlzbSBpcyByZWNvbW1lbmRlZCB3aGVuZXZlciB0aGUge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfSBhbmQKLSAqIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzZXMgYXJlIGJvdGggZGVmaW5lZCBpbiB0aGUgc2FtZSBwbHVnaW4gc2NvcGUuCi0gKiBBIHNlY29uZCBtZWNoYW5pc20gdXNpbmcgdGhlIERhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludCBpcwotICogYXZhaWxhYmxlIHdoZW4gdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzIGlzIGRlZmluZW5kIG91dHNpZGUgdGhlCi0gKiB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXN9IHBsdWdpbiBzY29wZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIEEgYm9vbGVhbiBwcm9wZXJ0eSBkZWZhdWx0cyB0byBCb29sZWFuLlRSVUUuIElmIHRoaXMgaXMgc2V0IHRvIEJvb2xlYW4uRkFMU0Ugbm8gZXh0ZW5kZWQKLQkgKiBvcGVyYXRpb25zIHdpbGwgYmUgZXhlY3V0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfRVhURU5TSU9OUyA9ICJJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEEgTGlzdCBjb250YWluaW5nIFN0cmluZyBvYmplY3RzLCBkZWZhdXRscyB0byBhbiBlbXB0eSBMaXN0LiBJZiB0aGlzIGxpc3QgY29udGFpbnMgZWxlbWVudHMKLQkgKiBhbmQgQUxMT1dfRVhURU5TSU9OUyBpcyBzZXQgdG8gQm9vbGVhbi5UUlVFLCB0aGVuIG9ubHkgZXh0ZW5kZWQgb3BlcmF0aW9ucyBub3QgaWRlbnRpZmllZCBpbgotCSAqIHRoaXMgbGlzdCB3aWxsIGJlIGV4ZWN1dGVkLiBUaGVzZSBzdHJpbmdzIHNob3VsZCBlaXRoZXIgYmUgdGhlIG9wZXJhdGlvbiBpZCBvciB0aGUgZnVsbHkKLQkgKiBxdWFsaWZpZWQgb3BlcmF0aW9uIGNsYXNzIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RfRVhURU5TSU9OUyA9ICJJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYmZkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogSURhdGFNb2RlbFByb3ZpZGVycyBhcmUgdXNlZCBieSB0aGUgRGF0YU1kb2VsRmFjdG9yeSB0byBjb25zdHJ1Y3QgSURhdGFNb2RlbHMuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzCi0gKiB7QGxpbmsgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcn0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsIiwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGJhY2tpbmcgSURhdGFNb2RlbCBmb3IgdGhpcyBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYmFja2luZyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyBmb3Igd2hpY2ggdGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZS4gVGhpcyBtZXRob2QgaXMKLQkgKiBjYWxsZWQgb25seSBvbmNlIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdmFsaWQgcHJvcGVydHkgbmFtZXMuCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQcm92aWRlcnMgc2hvdWxkIHBlcmZvcm0gYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBoZXJlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBwcm92aWRlciBzaG91bGQgZGVmaW5lIGhvdyBkZWZhdWx0IHByb3BlcnRpZXMgc2hvdWxkIGJlIGNvbXB1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBwcm92aWRlciBzaG91bGQgZGVmaW5lIGhvdyBwcm9wZXJ0eSBlbmFibGVtZW50cyBhcmUgY29tcHV0ZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogSURhdGFNb2RlbFByb3ZpZGVycyBzaG91bGQgcGVyZm9ybSBwcm9wZXJ0eSB2YWxpZGF0aW9uIGhlcmUuIEFsbCBjYWxscyB0bwotCSAqIElEYXRhTW9kZWwudmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcpIGFyZSByb3V0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIElEYXRNb2RlbFByb3ZpZGVyLiBXaGVuCi0JICogSURhdGFNb2RlbC52YWxpZGF0ZSgpIG9yIElEYXRhTW9kZWwudmFsaWRhdGUoYm9vbGVhbikgYXJlIGNhbGxlZCB0byB2YWxpZGF0ZSB0aGUgZW50aXJlCi0JICogSURhdGFNb2RlbCwgYW55IG5lc3RlZCBtb2RlbCBuYW1lcyBhcmUgYWxzbyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgSURhdGFNb2RlbFByb3ZpZGVyIGZvciBhCi0JICogY2hhbmNlIHRvIHZhbGlkYXRlIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCBpbiBhbiBhcHByb3ByaWF0ZSBtYW5uZXIuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYWxsYmFjayBob29rIGZvciB0aGUgSURhdGFNb2RlbCBwcm92aWRlciB0byBiZSBub3RpZmllZCBvZiBhIHNldFByb3BlcnR5KCkKLQkgKiBjYWxsIGludm9rZWQgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBhY3R1YWwgdmFsdWUgaGFzIGJlZW4KLQkgKiBzdG9yZWQgYnkgdGhlIElEYXRhTW9kZWwgYnV0IGJlZm9yZSBhbnkgZ2VuZXJhbCBub3RpZmljYXRpb25zIGFyZSBmaXJlZCB0byBpdHMgbGlzdGVuZXJzLgotCSAqIFRodXMgdGhpcyBJRGF0YU1vZGVsUHJvdmlkZXIgbWF5IHJlYWN0IHRvIHVwZGF0ZXMgYXByb3ByaWF0ZWx5IGJ5IHNldHRpbmcgb3RoZXIgcHJvcGVydGllcywKLQkgKiBub3RpZnlpbmcgZGVmYXVsdCBjaGFuZ2VzLCBub3RpZnlpbmcgdmFsaWQgdmFsdWUgY2hhbmdlcywgZXRjLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZpcmUgYSBWQUxVRV9DSEcgRGF0YU1vZGVsRXZlbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpOwotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWU3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Q29tcG9uZW50IGNyZWF0aW9uIGFuZCBSZWZlcmVuY2VkIENvbXBvbmVudCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIEFQSSAgZm9yIERhdGEgTW9kZWwgUHJvdmlkZXIgZnJhbWV3b3JrIGZvciBidWlsaW5nIGV4ZWN1dGFibGUKLSAgICAgICAgYW5kIHVuZG9hYmxlIG9wZXJhdGlvbnMgdXNpbmcgZGF0YSBtb2RlbHMsIHRoZWlyIHByb3ZpZGVycyBhbmQgcHJvdmlkZXIgaW50ZXJmYWNlcyB0aGF0Ci0gICAgICAgIGNvbnRhaW4gdGhlIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgcHJvdmlkZXJzIHRvIHNldCBhbmQgcmV0cmlldmUgdGhlc2UgcHJvcGVydGllc2UuIAotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWY3NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5Db21wb25lbnQgY3JlYXRpb24gYW5kIFJlZmVyZW5jZWQgQ29tcG9uZW50IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgQVBJIHRoYXQgZGVmaW5lcyB0aGUgcHJvcGV0aWVzIHRoYXQgY2FuIGJlIHNldCBvbiBhIGZsZXhpYmxlCi0gICAgICAgIHByb2plY3QgZGF0YW1vZGVsIHRvIGRyaXZlIHRoZSB0aGUgd2l6YXJkIGFuZCBvcGVyYXRpb25zLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDA2OWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTIsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5GdW5jdGlvbkdyb3VwUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIENvbW1vbiBzdXBlcmNsYXNzIGZvciBlbmFibGVtZW50LWF3YXJlIChlLmcuLCB1c2luZyBmdW5jdGlvbiBncm91cHMgb3IgYWN0aXZpaXRpZXMpIGV4dGVuc2lvbgotICogcG9pbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgaW1wbGVtZW50cyBJZGVudGlmaWFibGUgewotCi0JcHJvdGVjdGVkIEludGVnZXIgcHJpb3JpdHk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFuRWxlbWVudCkgewotCQlzdXBlcihhbkVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0RW5hYmxlbWVudElkZW50aWZpZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZ2V0SUQoKSwgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJRCgpOwotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJaWYgKHByaW9yaXR5ID09IG51bGwpCi0JCQlwcmlvcml0eSA9IG5ldyBJbnRlZ2VyKEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEZ1bmN0aW9uUHJpb3JpdHkoZ2V0SUQoKSkpOwotCQlyZXR1cm4gcHJpb3JpdHkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSVByb2plY3QgcCkgewotCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWQgPSBnZXRFbmFibGVtZW50SWRlbnRpZmllcihwKTsKLQkJcmV0dXJuIGlkLmlzRW5hYmxlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BZGFwdGFiaWxpdHlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOGExOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BZGFwdGFiaWxpdHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRhYmlsaXR5VXRpbGl0eSB7Ci0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGVsZW1lbnQsIENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXJldHVybiAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCWVsc2UKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoZWxlbWVudCwgYWRhcHRlcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzU3MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gaWQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotCi0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJLy8gVE9ETyBqc2hvbGwgaXMgdGhpcyBjb3JyZWN0Pz8/Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzMzMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotLyoqCi0gKiBPdGhlciB0aGluZ3MgdG8gZGVsZXRlOgotICogCi0gKiBUaGUgd3RwdWlBY3Rpb24gZXh0ZW5zaW9uIHBvaW50IGFuZCBzY2hlbWEgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZS9tZXRob2QvZmllbGQKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIAotICovCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgYmVpbmcgdXNlZCB0byB0cmFjayBjb2RlIHNsYXRlZCBmb3IgcmVtb3ZhbC4gQW55IGNsYXNzIG9yIGludGVyZmFjZQotICogaW1wbGVtZW50aW5nIG9yIGV4dGVuZGluZyB0aGlzIGludGVyZmFjZSByZXNwZWN0aXZlbHkgc2hvdWxkIG5vdCBiZSB1c2VkLiBBbGwgc3VjaCBjbGFzc2VzIGFuZAotICogaW50ZXJmYWNlcyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhbmQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAxLjUuCi0gKiAKLSAqIEFueSBtZXRob2Qgb3IgZmllbGQgd2l0aCBqYXZhZG9jIHJlZmVyZW5jaW5nIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBub3QgYmUgdXNlZCBhbmQgd2lsbCBiZQotICogZGVsZXRlZCBwb3N0IFdUUCAxLjUKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxN2Q2NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLQkvKioKLQkgKiBVdGlsaXR5IGNsYXNzOyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0JICovCi0JcHJpdmF0ZSBFeGNlcHRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tCi0JICogCi0JICogQGV4Y2VwdGlvbiBhbmQKLQkgKiAgICAgICAgICAgICAgICBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKElXcmFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJbWVzc2FnZXMuYWRkKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQlFeGNlcHRpb24gbmVzdGVkID0gZXhjZXB0aW9uLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQl3aGlsZSAobmVzdGVkICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZChuZXN0ZWQuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmIChuZXN0ZWQgaW5zdGFuY2VvZiBJV3JhcHBlZEV4Y2VwdGlvbikKLQkJCQluZXN0ZWQgPSAoKElXcmFwcGVkRXhjZXB0aW9uKSBuZXN0ZWQpLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJZWxzZQotCQkJCW5lc3RlZCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgbWVzc2FnZXMudG9BcnJheShuZXcgU3RyaW5nW21lc3NhZ2VzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbQotCSAqIAotCSAqIEBleGNlcHRpb24gYW5kCi0JICogICAgICAgICAgICAgICAgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsIGNvbmNhdGVuYXRlZCBhcwotCSAqICAgICAgICAgICAgICAgIG9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKElXcmFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlTdHJpbmdbXSBtZXNzYWdlcyA9IGdldEFsbE1lc3NhZ2VzKGV4Y2VwdGlvbik7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJc2IuYXBwZW5kKG1lc3NhZ2VzW2ldKTsKLQkJCWlmIChpIDwgbWVzc2FnZXMubGVuZ3RoIC0gMSkKLQkJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSGFzaFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSGFzaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkYTI3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0hhc2hVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgSGFzaFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBpbnQgU0VFRCA9IDExOwotCXByaXZhdGUgc3RhdGljIGludCBNVUxUSSA9IDMxOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIGludCBpKXsKLQkJcmV0dXJuIHNlZWQgKiBNVUxUSSArIGk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIE9iamVjdCBvYmopewotCQlyZXR1cm4gaGFzaChzZWVkLCBudWxsICE9IG9iaiA/IG9iai5oYXNoQ29kZSgpIDogU0VFRCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIGJvb2xlYW4gYil7Ci0JCXJldHVybiBoYXNoKHNlZWQsIGIgPyAxIDogU0VFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2F2ZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNhdmVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2N2NlMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2F2ZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgQVBJIGZvciBjb3Bpbmcgd2l0aCBhdHRlbXB0cyB0byBvdmVyd3JpdGUgcmVhZC1vbmx5IGZpbGVzIG9yIHNhdmUgZmFpbHVyZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2F2ZUhhbmRsZXIgewotCXB1YmxpYyB2b2lkIGFjY2VzcygpOwotCi0JcHVibGljIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKElGaWxlIGFGaWxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjFkOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0tFWSA9ICJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGUgW10gZmlsZXMpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2YzYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgQXJjaGl2ZVJ1bnRpbWUgYW5kIEFyY2hpdmVXcmFwcGVkIGV4Y2VwdGlvbnMsIHdoaWNoIGNhbiBjb250YWluIG5lc3RlZAotICogZXhjZXB0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvCi0JICogaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMgb25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpOwotCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpOwotCi0JcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc1NmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDIxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2VzIHsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1lc3NhZ2VzKCkgewotCQlpbml0aWFsaXplQnVuZGxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUJ1bmRsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHJlc291cmNlQnVuZGxlICE9IG51bGwgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZG9HZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQlpZiAocGF0dGVybiAhPSBudWxsKQotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIGFyZ3MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVGYWlsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MzUwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVGYWlsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi0vKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIHRoYXQgY291bGQgZ2V0IHRocm93biBkdXJpbmcgc2F2ZSBvZiBhbiBlZGl0IG1vZGVsOyBjbGllbnRzIHNob3VsZCB1c2UKLSAqIHtAbGluayAjZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXN9dG8gZ2V0IGFsbCB0aGUgbWVzc2FnZXMgb2YgdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zIHRvCi0gKiByZXBvcnQgdGhlIGZhaWx1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2NDAwMTg5MDE5MTA3MzEyNDBMOwotCi0JLyoqCi0JICogU2F2ZUZhaWxlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhdmVGYWlsZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVySGVhZGxlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJIZWFkbGVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWUxNTBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJIZWFkbGVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8xOS8yMDAxIDExOjQwOjU5IEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlSGFuZGxlckhlYWRsZXNzIGltcGxlbWVudHMgSVNhdmVIYW5kbGVyIHsKLQkvKioKLQkgKiBIZWFkbGVzc1NhdmVIYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVIYW5kbGVySGVhZGxlc3MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYWNjZXNzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VzcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBoYW5kbGVTYXZlRmFpbGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVGYWlsZWQoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aHJvdyBleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKElXRlRXcmFwcGVkRXhjZXB0aW9uIGV4KSB7Ci0JCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleC5nZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKTsKLQkJaWYgKG5lc3RlZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUobmVzdGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKEV4Y2VwdGlvbiBleCkgewotCQlpZiAoZXggaW5zdGFuY2VvZiBJV0ZUV3JhcHBlZEV4Y2VwdGlvbikKLQkJCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoKElXRlRXcmFwcGVkRXhjZXB0aW9uKSBleCk7Ci0JCWVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoKENvcmVFeGNlcHRpb24pIGV4KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoQ29yZUV4Y2VwdGlvbiBleCkgewotCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBzdGF0dXMgPSBleC5nZXRTdGF0dXMoKTsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlUaHJvd2FibGUgbmVzdGVkID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQlpZiAobmVzdGVkIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXJldHVybiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoKENvcmVFeGNlcHRpb24pIG5lc3RlZCk7Ci0JCXJldHVybiBzdGF0dXMuZ2V0Q29kZSgpID09IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1cy5GQUlMRURfV1JJVEVfTE9DQUw7Ci0JfQotCi0JLyoqCi0JICogcmVsZWFzZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotCS8qKgotCSAqIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgYUZpbGUpIHsKLQkJaWYgKGFGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBlcnJvciA9IFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVuYWJsZV90b19zYXZlX3JlYWQtb25seV9mX0VSUk9SXyIsIG5ldyBPYmplY3RbXXthRmlsZS5nZXRGdWxsUGF0aCgpfSk7IC8vJE5PTi1OTFMtMSQgPSAiVW5hYmxlIHRvIHNhdmUgcmVhZC1vbmx5IGZpbGU6ICIKLQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGVycm9yKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVyUmVnaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWFlZjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJSZWdpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotLyoqCi0gKiBBIHJlZ2lzdHJ5IGZvciB0aGUgZGVmYXVsdCBJU2F2ZUhhbmRsZXIgdG8gdXNlIHdoZW4gc2F2aW5nIGVkaXQgbW9kZWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlSGFuZGxlclJlZ2lzdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBJU2F2ZUhhbmRsZXIgc2F2ZUhhbmRsZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyBhbmQgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2F2ZUhhbmRsZXJSZWdpc3RlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTYXZlSGFuZGxlciBnZXRTYXZlSGFuZGxlcigpIHsKLQkJaWYgKHNhdmVIYW5kbGVyID09IG51bGwpCi0JCQlzYXZlSGFuZGxlciA9IChJU2F2ZUhhbmRsZXIpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoInNhdmVIYW5kbGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNhdmVIYW5kbGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQ2YWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGVFZGl0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlcyBtdXN0IGNvbnRhaW4gb25seSB7QGxpbmsgSUZpbGV9cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KExpc3QgZmlsZXMpewotCQlpZihmaWxlcyA9PSBudWxsIHx8IGZpbGVzLnNpemUoKSA9PSAwKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0ZUVkaXQoIChJRmlsZSBbXSlmaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmaWxlcy5zaXplKCldKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoSUZpbGVbXSBmaWxlcykgewotCQlpZihmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUlTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0IHZhbGlkYXRvciA9IChJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5DTEFTU19LRVkpOwotCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlRWRpdChmaWxlcyk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJcmV0dXJuIHN0YXR1cy5pc09LKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4ZmU2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MgaW1wbGVtZW50cyBJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB7Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGVbXSBmaWxlcykgewotCQlmaW5hbCBMaXN0IGZpbGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7aTxmaWxlcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZihmaWxlc1tpXS5leGlzdHMoKSAmJiBmaWxlc1tpXS5pc1JlYWRPbmx5KCkpewotCQkJCWZpbGVzTGlzdC5hZGQoZmlsZXNbaV0pOwotCQkJfQotCQl9Ci0JCWlmKGZpbGVzTGlzdC5zaXplKCkgPiAwKXsKLQkJCUlGaWxlIFtdIGZpbGVzVG9WYWxpZGF0ZSA9IChJRmlsZSBbXSlmaWxlc0xpc3QudG9BcnJheShuZXcgSUZpbGVbZmlsZXNMaXN0LnNpemUoKV0pOwotCQkJcmV0dXJuIHZhbGlkYXRlRWRpdEltcGwoZmlsZXNUb1ZhbGlkYXRlKTsKLQkJfQotCQlyZXR1cm4gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXRJbXBsKElGaWxlW10gZmlsZXNUb1ZhbGlkYXRlKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzVG9WYWxpZGF0ZSwgbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3OThiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLldvcmtiZW5jaFV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXVFBQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByb3RlY3RlZCBzdGF0aWMgV1RQUGx1Z2luIGluc3RhbmNlID0gbnVsbDsgCi0JcHVibGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgV1RQUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1DYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uT1NfTUFDT1NYLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKSA/IGZhbHNlIDogbmV3Ci0JCQkJamF2YS5pby5GaWxlKCJhIikuY29tcGFyZVRvKG5ldyBqYXZhLmlvLkZpbGUoIkEiKSkgIT0gMDsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQbHVnaW5JRCgpOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydHVwKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCVdvcmtiZW5jaFV0aWwuc2V0V29ya2JlbmNoSXNSdW5uaW5nKHRydWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUHJvamVjdFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzRlZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQcm9qZWN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiA0LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV1RQUHJvamVjdFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBBZGRzIGEgb2xkIG5hdXR1cmUgdG8gYSBwcm9qZWN0LCBGSVJTVCwgdGhpcyBpcyB1c2VkIHRvIG1ha2UgcHJvamVjdCBiYWNrd2FyZCBjb21wYXRpYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE9sZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQotCQkvL2NoZWNrIGlmIHRoZSBvbGQgbmF0dXJlIGRvZXMgbm90IGV4aXN0Ci0JCWJvb2xlYW4gYWRkTmF0dXJlID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hdHVyZSA9IHByZXZOYXR1cmVzW2ldOwotCQkJaWYgKG5hdHVyZS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJYWRkTmF0dXJlID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZE5hdHVyZSkgewotCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAxLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQkJbmV3TmF0dXJlc1swXSA9IG5hdHVyZUlkOwotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgSVJlc291cmNlLkFWT0lEX05BVFVSRV9DT05GSUcsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5hdHVyZSBpbiB0aGUgcHJvamVjdCBpbiB0aGUgaW5kZXggc3BlY2lmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE9sZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQsIGludCBpbmRleCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCi0JCS8vY2hlY2sgaWYgdGhlIG9sZCBuYXR1cmUgZG9lcyBub3QgZXhpc3QKLQkJYm9vbGVhbiBhZGROYXR1cmUgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZXZOYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmF0dXJlID0gcHJldk5hdHVyZXNbaV07Ci0JCQlpZiAobmF0dXJlLmVxdWFscyhuYXR1cmVJZCkpIHsKLQkJCQlhZGROYXR1cmUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoYWRkTmF0dXJlKSB7Ci0JCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIGluZGV4KTsKLQotCQkJbmV3TmF0dXJlc1tpbmRleF0gPSBuYXR1cmVJZDsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIGluZGV4LCBuZXdOYXR1cmVzLCBpbmRleCArIDEsIHByZXZOYXR1cmVzLmxlbmd0aCAtIGluZGV4KTsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElSZXNvdXJjZS5BVk9JRF9OQVRVUkVfQ09ORklHLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuYXV0dXJlIHRvIGEgcHJvamVjdCwgRklSU1QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1swXSA9IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuYXR1cmUgdG8gYSBwcm9qZWN0LCBMQVNUCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdExhc3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgYSBuYXR1cmUgZnJvbSB0aGUgcHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVOYXR1cmVGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJaW50IHNpemUgPSBwcmV2TmF0dXJlcy5sZW5ndGg7Ci0JCWludCBuZXdzaXplID0gMDsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWJvb2xlYW4gbWF0Y2hmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHByZXZOYXR1cmVzW2ldLmVxdWFscyhuYXR1cmVJZCkpIHsKLQkJCQltYXRjaGZvdW5kID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW5ld05hdHVyZXNbbmV3c2l6ZSsrXSA9IHByZXZOYXR1cmVzW2ldOwotCQl9Ci0JCWlmICghbWF0Y2hmb3VuZCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgIlRoZSBuYXR1cmUgaWQgIiArIG5hdHVyZUlkICsgIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCksIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ1tdIHRlbXAgPSBuZXdOYXR1cmVzOwotCQluZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tuZXdzaXplXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBuZXdOYXR1cmVzLCAwLCBuZXdzaXplKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldE5hdHVyZURlc2NyaXB0b3IobmF0dXJlSWQpID09IG51bGwpIHsKLQkJCS8vIFRoZSBuYXR1cmUgZG9lcyBub3QgZXhpc3QsIHNvIGRvIG5vdCBhdHRlbXB0IHRvIGRlLWNvbmZpZ3VyZSBpdCB3aGlsZSByZW1vdmluZyBpdC4KLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElSZXNvdXJjZS5BVk9JRF9OQVRVUkVfQ09ORklHIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSwgbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQcm9qZWN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcmVzdWx0ID0gKElQcm9qZWN0KSBvYmplY3Q7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCXJlc3VsdCA9ICgoSVJlc291cmNlKSBvYmplY3QpLmdldFByb2plY3QoKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXJlc3VsdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBvYmplY3QpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDgyZDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFdUUFJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInd0cF9jb21tb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0KLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzE4MmQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTIyMTkyNTU4MTYwMzY0ODUzOEw7Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFdyYXBwZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogV0ZUV3JhcHBlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5UaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgV3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogV0ZUV3JhcHBlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5UaHJvd2FibGUKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBXcmFwcGVkRXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQsIFN0cmluZyBzKSB7Ci0JCXN1cGVyKHRhcmdldCwgcyk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgb3V0IGEgc3RhY2sgdHJhY2UgdG8gdGhlIHN5c3RlbSBlcnIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgewotCQlwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7Ci0JCWlmIChnZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQlzLnByaW50bG4oIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWdldFRhcmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcykgewotCQlpZiAoZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJcy5wcmludGxuKCJTdGFjayB0cmFjZSBvZiBuZXN0ZWQgZXhjZXB0aW9uOiIpOyAvLyROT04tTkxTLTEkCi0JCQlnZXRUYXJnZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk4OTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI2ODQ2Mzc3NDYyNzU2MjAxMDFMOwotCS8qKiBUaGUgZXhjZXB0aW9uIHdoaWNoIG5lY2Vzc2l0YXRlZCB0aGlzIHJ1bnRpbWUgZXhjZXB0aW9uLCBpZiBvbmUgZXhpc3RzICovCi0JcHJvdGVjdGVkIEV4Y2VwdGlvbiBuZXN0ZWRFeGNlcHRpb247Ci0KLQlwdWJsaWMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5lc3RlZEV4Y2VwdGlvbihlKTsKLQl9Ci0KLQlwdWJsaWMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JcHVibGljIFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBzLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcihzKTsKLQkJc2V0TmVzdGVkRXhjZXB0aW9uKGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoKSB7Ci0JCXJldHVybiBFeGNlcHRpb25IZWxwZXIuZ2V0QWxsTWVzc2FnZXModGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8KLQkgKiBpbm5lcm1vc3QsIGNvbmNhdGVuYXRlZCBhcyBvbmUKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpIHsKLQkJcmV0dXJuIEV4Y2VwdGlvbkhlbHBlci5nZXRDb25jYXRlbmF0ZWRNZXNzYWdlcyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCkgewotCQlFeGNlcHRpb24gbiA9IGdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQlpZiAobiA9PSBudWxsKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWVsc2UgaWYgKG4gaW5zdGFuY2VvZiBJV3JhcHBlZEV4Y2VwdGlvbikKLQkJCXJldHVybiAoKElXcmFwcGVkRXhjZXB0aW9uKSBuKS5nZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKTsKLQkJZWxzZQotCQkJcmV0dXJuIG47Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0TmVzdGVkRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmVzdGVkRXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZGVkIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSBmb3IgdGhlIEphdmEgMS40LjIgYWRkaXRpb24gb2YKLQkgKiA8Y29kZT5UaHJvd2FibGUuZ2V0Q2F1c2UoKTwvY29kZT4uCi0JICogQHJldHVybiBUaGUgbmVzdGVkIGV4Y2VwdGlvbiBoZWxkIGJ5IHRoZSByZWNlaXZlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpIHsKLQkJcmV0dXJuIGdldE5lc3RlZEV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCBvdXQgYSBzdGFjayB0cmFjZSB0byB0aGUgc3lzdGVtIGVyci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCXByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsKLQkJaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQlzLnByaW50bG4oIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW5lc3RlZEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQkJaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQlzLnByaW50bG4oIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW5lc3RlZEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TmVzdGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmVzdGVkRXhjZXB0aW9uKGphdmEubGFuZy5FeGNlcHRpb24gbmV3TmVzdGVkRXhjZXB0aW9uKSB7Ci0JCW5lc3RlZEV4Y2VwdGlvbiA9IG5ld05lc3RlZEV4Y2VwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdmYTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuYWN0aXZpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUEFjdGl2aXR5QnJpZGdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UID0gIldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU5FUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFdUUEFjdGl2aXR5QnJpZGdlIElOU1RBTkNFID0gbnVsbDsKLQlwcml2YXRlIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyW10gbGlzdGVuZXJzOwotCi0JcHVibGljIHN0YXRpYyBXVFBBY3Rpdml0eUJyaWRnZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKG51bGwgPT0gSU5TVEFOQ0UpIHsKLQkJCUlOU1RBTkNFID0gbmV3IFdUUEFjdGl2aXR5QnJpZGdlKCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgV1RQQWN0aXZpdHlCcmlkZ2UoKSB7Ci0JCWxvYWRFeHRlbnNpb25Qb2ludHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlJRCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uZW5hYmxlQWN0aXZpdHkoYWN0aXZpdHlJRCwgZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEVuYWJsZWRBY3Rpdml0eUlkcygpIHsKLQkJaWYobGlzdGVuZXJzLmxlbmd0aCA+IDApewotCQkJcmV0dXJuIGxpc3RlbmVyc1swXS5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRBY3Rpdml0eUlkcyhTZXQgYWN0aXZpdHlJRHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3RlbmVyc1tpXS5zZXRFbmFibGVkQWN0aXZpdHlJZHMoYWN0aXZpdHlJRHMpOwotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRBY3Rpdml0eUlEc0Zyb21Db250cmlidXRpb24oU3RyaW5nIGxvY2FsSUQsIFN0cmluZyBwbHVnaW5JRCkgewotCQlpZihsaXN0ZW5lcnMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIGxpc3RlbmVyc1swXS5nZXRBY3Rpdml0eUlEc0Zyb21Db250cmlidXRpb24obG9jYWxJRCwgcGx1Z2luSUQpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeHRlbnNpb25Qb2ludHMoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlQpOwotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJbGlzdGVuZXJzID0gbmV3IFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyW2VsZW1lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChudWxsID09IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShMSVNURU5FUl9DTEFTUykpIHsKLQkJCQlsb2dFcnJvcihlbGVtZW50c1tpXSwgIk5vICIgKyBMSVNURU5FUl9DTEFTUyArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQl0cnkgewotCQkJCWxpc3RlbmVyc1tpXSA9IChXVFBBY3Rpdml0eUJyaWRnZUhlbHBlcikgZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihMSVNURU5FUl9DTEFTUyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2dFcnJvcihlbGVtZW50c1tpXSwgIkVycm9yIGxvYWRpbmcgIiArIExJU1RFTkVSX0NMQVNTICsgIjoiICsgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKExJU1RFTkVSX0NMQVNTKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiUGx1Z2luICIgKyBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCkgKyAiLCBleHRlbnNpb24gIiArIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoYnVmLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9hY3Rpdml0aWVzL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzhkZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9hY3Rpdml0aWVzL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5hY3Rpdml0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciB7Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlJRCwgYm9vbGVhbiBlbmFibGVkKTsKLQotCXB1YmxpYyBTZXQgZ2V0RW5hYmxlZEFjdGl2aXR5SWRzKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQWN0aXZpdHlJZHMoU2V0IGFjdGl2aXR5SURzKTsKLQotCXB1YmxpYyBTZXQgZ2V0QWN0aXZpdHlJRHNGcm9tQ29udHJpYnV0aW9uKFN0cmluZyBsb2NhbElELCBTdHJpbmcgcGx1Z2luSUQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbEV4dGVuc2lvblJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMWZlMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbEV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT04gPSAiRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfRUxFTUVOVCA9ICJEYXRhTW9kZWxQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5FU19UWVBFX0VMRU1FTlQgPSAiUHJvdmlkZXJEZWZpbmVzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UU19UWVBFX0VMRU1FTlQgPSAiUHJvdmlkZXJJbXBsZW1lbnRzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BST1ZJREVSX1RZUEUgPSAicHJvdmlkZXJUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUFJPVklERVJfSUQgPSAicHJvdmlkZXJJRCI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRkcgPSAiZnVuY3Rpb25Hcm91cElEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNoTWFwIHByb3ZpZGVyRXh0ZW5zaW9uczsKLQlwcml2YXRlIEhhc2hNYXAgZGVmaW5lc0V4dGVuc2lvbnM7Ci0JcHJpdmF0ZSBIYXNoTWFwIGltcGxlbWVudHNFeHRlbnNpb25zOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlzdXBlcihXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT04pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUFJPVklERVJfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9JRCk7Ci0JCQlpZiAobnVsbCA9PSBpZCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIFBST1ZJREVSX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9JRCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9DTEFTUyk7Ci0JCQlpZiAobnVsbCA9PSBjbGFzc05hbWUgfHwgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgUFJPVklERVJfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX0NMQVNTKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlhZGRQcm92aWRlckV4dGVuc2lvbihpZCwgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERFRklORVNfVFlQRV9FTEVNRU5UKSkgewotCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJPVklERVJfVFlQRSk7Ci0JCQlpZiAobnVsbCA9PSB0eXBlIHx8IHR5cGUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBERUZJTkVTX1RZUEVfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX1BST1ZJREVSX1RZUEUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9QUk9WSURFUl9JRCk7Ci0JCQlpZiAobnVsbCA9PSBpZCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIERFRklORVNfVFlQRV9FTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfUFJPVklERVJfSUQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWFkZERlZmluZXNFeHRlbnNpb24odHlwZSwgaWQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhJTVBMRU1FTlRTX1RZUEVfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1BST1ZJREVSX1RZUEUpOwotCQkJaWYgKG51bGwgPT0gdHlwZSB8fCB0eXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJPVklERVJfSUQpOwotCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBERUZJTkVTX1RZUEVfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX1BST1ZJREVSX0lEKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlhZGRJbXBsZW1lbnRzRXh0ZW5zaW9uKHR5cGUsIGlkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJvdmlkZXJFeHRlbnNpb24oU3RyaW5nIGlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAocHJvdmlkZXJFeHRlbnNpb25zLmNvbnRhaW5zS2V5KGlkKSkgewotCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEdXBsaWNhdGUgIiArIFBST1ZJREVSX0VMRU1FTlQgKyAiICIgKyBBVFRSSUJVVEVfSUQgKyAiICIgKyBpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXByb3ZpZGVyRXh0ZW5zaW9ucy5wdXQoaWQsIGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZWZpbmVzRXh0ZW5zaW9uKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJaWYgKGRlZmluZXNFeHRlbnNpb25zLmNvbnRhaW5zS2V5KHR5cGUpKSB7Ci0JCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkR1cGxpY2F0ZSAiICsgUFJPVklERVJfRUxFTUVOVCArICIgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFICsgIiAiICsgdHlwZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWRlZmluZXNFeHRlbnNpb25zLnB1dCh0eXBlLCBpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEltcGxlbWVudHNFeHRlbnNpb24oU3RyaW5nIHR5cGUsIFN0cmluZyBpZCkgewotCQlMaXN0IGNhY2hlOwotCQlpZiAoaW1wbGVtZW50c0V4dGVuc2lvbnMuY29udGFpbnNLZXkodHlwZSkpCi0JCQljYWNoZSA9IChMaXN0KSBpbXBsZW1lbnRzRXh0ZW5zaW9ucy5nZXQodHlwZSk7Ci0JCWVsc2UKLQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQljYWNoZS5hZGQoaWQpOwotCQlpbXBsZW1lbnRzRXh0ZW5zaW9ucy5wdXQodHlwZSwgY2FjaGUpOwotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0UHJvdmlkZXJFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCXJlYWRSZWdpc3RyeUlmTmVjZXNzYXJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgcHJvdmlkZXJFeHRlbnNpb25zLmdldChpZCk7Ci0JCWlmIChudWxsID09IGVsZW1lbnQpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIFBST1ZJREVSX0VMRU1FTlQgKyAiIG5vdCBmb3VuZCBmb3IgIiArIEFUVFJJQlVURV9JRCArICI6ICIgKyBpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZpbmVzRXh0ZW5zaW9uKFN0cmluZyBwcm92aWRlclR5cGUpIHsKLQkJcmVhZFJlZ2lzdHJ5SWZOZWNlc3NhcnkoKTsKLQkJU3RyaW5nIGVsZW1lbnQgPSAoU3RyaW5nKSBkZWZpbmVzRXh0ZW5zaW9ucy5nZXQocHJvdmlkZXJUeXBlKTsKLQkJaWYgKG51bGwgPT0gZWxlbWVudCkgewotCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIG5vdCBmb3VuZCBmb3IgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFICsgIjogIiArIHByb3ZpZGVyVHlwZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFByb3ZpZGVyRGVzY3JpcHRvcnNGb3JQcm92aWRlcktpbmQoU3RyaW5nIHByb3ZpZGVyVHlwZSkgewotCQlyZWFkUmVnaXN0cnlJZk5lY2Vzc2FyeSgpOwotCQlMaXN0IHByb3ZpZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJvdmlkZXJMaXN0LmFkZChnZXREZWZpbmVzRXh0ZW5zaW9uKHByb3ZpZGVyVHlwZSkpOwotCQlpZiAoaW1wbGVtZW50c0V4dGVuc2lvbnMuY29udGFpbnNLZXkocHJvdmlkZXJUeXBlKSkgewotCQkJTGlzdCBpbXBsZW1lbnRzSWRzID0gKExpc3QpIGltcGxlbWVudHNFeHRlbnNpb25zLmdldChwcm92aWRlclR5cGUpOwotCQkJaWYgKGltcGxlbWVudHNJZHMgIT0gbnVsbCAmJiAhaW1wbGVtZW50c0lkcy5pc0VtcHR5KCkpIHsKLQkJCQlwcm92aWRlckxpc3QuYWRkQWxsKGltcGxlbWVudHNJZHMpOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIHByb3ZpZGVyQXJyYXkgPSBuZXcgU3RyaW5nW3Byb3ZpZGVyTGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVyQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXByb3ZpZGVyQXJyYXlbaV0gPSAoU3RyaW5nKSBwcm92aWRlckxpc3QuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlckFycmF5OwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkUmVnaXN0cnlJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKCFoYXNJbml0aWFsaXplZCkgewotCQkJcHJvdmlkZXJFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRlZmluZXNFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCWltcGxlbWVudHNFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQkJaGFzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgaWQpIHsKLQkJSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRQcm92aWRlckV4dGVuc2lvbihpZCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb3ZpZGVyID0gKElEYXRhTW9kZWxQcm92aWRlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJJQlVURV9DTEFTUyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGUzMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIERhdGFNb2RlbEltcGwgaW1wbGVtZW50cyBJRGF0YU1vZGVsLCBJRGF0YU1vZGVsTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05PVF9MT0NBVEVEXyA9IFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIwIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX01PREVMX05PVF9MT0NBVEVEID0gV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjEiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gTk9fREVTQ1JJUFRPUlMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGJhc2VQcm9wZXJ0eU5hbWVzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBhbGxQcm9wZXJ0eU5hbWVzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBuZXN0ZWRQcm9wZXJ0eU5hbWVzOyAvLyBsYXppbHkgaW5pdGlhbHplZCB3aGVuIG5lc3RlZCBtb2RlbHMgYWRkZWQKLQlwcml2YXRlIE1hcCBwcm9wZXJ0eVZhbHVlcyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIE1hcCBuZXN0ZWRNb2RlbHM7Ci0JcHJpdmF0ZSBTZXQgbmVzdGluZ01vZGVsczsKLQlwcml2YXRlIExpc3QgbGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXI7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsSW1wbChJRGF0YU1vZGVsUHJvdmlkZXIgZGF0YU1vZGVsUHJvdmlkZXIpIHsKLQkJaW5pdChkYXRhTW9kZWxQcm92aWRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoSURhdGFNb2RlbFByb3ZpZGVyIGRhdGFNb2RlbFByb3ZpZGVyKSB7Ci0JCXRoaXMucHJvdmlkZXIgPSBkYXRhTW9kZWxQcm92aWRlcjsKLQkJZGF0YU1vZGVsUHJvdmlkZXIuc2V0RGF0YU1vZGVsKHRoaXMpOwotCQlDb2xsZWN0aW9uIHByb3BlcnR5TmFtZXMgPSBkYXRhTW9kZWxQcm92aWRlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCUhhc2hTZXQgcHJvcGVydGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXByb3BlcnRpZXMuYWRkQWxsKHByb3BlcnR5TmFtZXMpOwotCi0JCXByb3BlcnRpZXMuYWRkKElEYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTE9XX0VYVEVOU0lPTlMpOwotCQlwcm9wZXJ0aWVzLmFkZChJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TKTsKLQkJYmFzZVByb3BlcnR5TmFtZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHByb3BlcnRpZXMpOwotCQlhbGxQcm9wZXJ0eU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWxsUHJvcGVydHlOYW1lcy5hZGRBbGwoYmFzZVByb3BlcnR5TmFtZXMpOwotCQlkYXRhTW9kZWxQcm92aWRlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCYXNlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gYmFzZVByb3BlcnR5TmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRCYXNlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oYmFzZVByb3BlcnR5TmFtZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gYWxsUHJvcGVydHlOYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGFsbFByb3BlcnR5TmFtZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbCAhPSBuZXN0ZWRQcm9wZXJ0eU5hbWVzICYmIG5lc3RlZFByb3BlcnR5TmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihuZXN0ZWRQcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tWYWxpZFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmICghaXNQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQUk9QRVJUWV9OT1RfTE9DQVRFRF8gKyBwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBEYXRhTW9kZWxJbXBsIGdldE93bmluZ0RhdGFNb2RlbChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWNoZWNrVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHNlYXJjaE5lc3RlZE1vZGVscyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgRGF0YU1vZGVsSW1wbCBzZWFyY2hOZXN0ZWRNb2RlbHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoaXNCYXNlUHJvcGVydHkocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSBpZiAobmVzdGVkTW9kZWxzICE9IG51bGwpIHsKLQkJCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gbnVsbDsKLQkJCU9iamVjdFtdIGtleXMgPSBuZXN0ZWRNb2RlbHMua2V5U2V0KCkudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGF0YU1vZGVsID0gKERhdGFNb2RlbEltcGwpIG5lc3RlZE1vZGVscy5nZXQoa2V5c1tpXSk7Ci0JCQkJaWYgKGRhdGFNb2RlbC5pc1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGRhdGFNb2RlbC5zZWFyY2hOZXN0ZWRNb2RlbHMocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oUFJPUEVSVFlfTk9UX0xPQ0FURURfICsgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJaWYgKGRhdGFNb2RlbC5wcm9wZXJ0eVZhbHVlcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZGF0YU1vZGVsLnByb3BlcnR5VmFsdWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBkYXRhTW9kZWwucHJvdmlkZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGF0YU1vZGVsLnByb3ZpZGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlPYmplY3QgcHJvcCA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChwcm9wID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiAoKEludGVnZXIpIHByb3ApLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJT2JqZWN0IHByb3AgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBwcm9wKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJT2JqZWN0IHByb3AgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcCA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAoU3RyaW5nKSBwcm9wOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGF0YU1vZGVsLnByb3BlcnR5VmFsdWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGF0YU1vZGVsLnByb3ZpZGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlkYXRhTW9kZWwuaW50ZXJuYWxTZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IHByb3BlcnR5VmFsdWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCQlpZiAodmFsdWVDaGFuZ2VkKHByb3BlcnR5VmFsdWUsIG9sZFZhbHVlKSkgewotCQkJaWYgKG51bGwgIT0gcHJvcGVydHlWYWx1ZSkKLQkJCQlwcm9wZXJ0eVZhbHVlcy5wdXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCWVsc2UgaWYgKHByb3BlcnR5VmFsdWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpCi0JCQkJcHJvcGVydHlWYWx1ZXMucmVtb3ZlKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKSkgewotCQkJCW5vdGlmeVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB2YWx1ZUNoYW5nZWQoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuIG8xICE9IG8yICYmICgobzEgIT0gbnVsbCAmJiAhbzEuZXF1YWxzKG8yKSkgfHwgIW8yLmVxdWFscyhvMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCB2YWx1ZSkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ldyBJbnRlZ2VyKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCAodmFsdWUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZE5lc3RlZE1vZGVsKFN0cmluZyBtb2RlbE5hbWUsIElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmICh0aGlzID09IGRhdGFNb2RlbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChudWxsID09IG5lc3RlZE1vZGVscykgewotCQkJbmVzdGVkTW9kZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJbmVzdGVkUHJvcGVydHlOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJRGF0YU1vZGVsSW1wbCBuZXN0ZWREYXRhTW9kZWwgPSAoRGF0YU1vZGVsSW1wbCkgZGF0YU1vZGVsOwotCQlpZiAobnVsbCA9PSBuZXN0ZWREYXRhTW9kZWwubmVzdGluZ01vZGVscykgewotCQkJbmVzdGVkRGF0YU1vZGVsLm5lc3RpbmdNb2RlbHMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCWlmIChuZXN0ZWREYXRhTW9kZWwubmVzdGluZ01vZGVscy5jb250YWlucyh0aGlzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCW5lc3RlZERhdGFNb2RlbC5uZXN0aW5nTW9kZWxzLmFkZCh0aGlzKTsKLQotCQluZXN0ZWRNb2RlbHMucHV0KG1vZGVsTmFtZSwgbmVzdGVkRGF0YU1vZGVsKTsKLQotCQlhZGROZXN0ZWRQcm9wZXJ0aWVzKG5lc3RlZERhdGFNb2RlbC5hbGxQcm9wZXJ0eU5hbWVzKTsKLQkJbmVzdGVkRGF0YU1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmVzdGVkUHJvcGVydGllcyhDb2xsZWN0aW9uIG5lc3RlZFByb3BlcnRpZXMpIHsKLQkJYm9vbGVhbiBwcm9wZXJ0aWVzQWRkZWQgPSBhbGxQcm9wZXJ0eU5hbWVzLmFkZEFsbChuZXN0ZWRQcm9wZXJ0aWVzKTsKLQkJcHJvcGVydGllc0FkZGVkID0gbmVzdGVkUHJvcGVydHlOYW1lcy5hZGRBbGwobmVzdGVkUHJvcGVydGllcykgfHwgcHJvcGVydGllc0FkZGVkOwotCQkvLyBQYXNzIHRoZSBuZXcgcHJvcGVydGllcyB1cCB0aGUgbmVzdGluZyBjaGFpbgotCQlpZiAocHJvcGVydGllc0FkZGVkICYmIG5lc3RpbmdNb2RlbHMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXN0aW5nTW9kZWxzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJKChEYXRhTW9kZWxJbXBsKSBpdGVyYXRvci5uZXh0KCkpLmFkZE5lc3RlZFByb3BlcnRpZXMobmVzdGVkUHJvcGVydGllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRNb2RlbHMoKSB7Ci0JCXJldHVybiBuZXN0ZWRNb2RlbHMgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmVzdGVkTW9kZWxzLnZhbHVlcygpKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRNb2RlbE5hbWVzKCkgewotCQlyZXR1cm4gbmVzdGVkTW9kZWxzICE9IG51bGwgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG5lc3RlZE1vZGVscy5rZXlTZXQoKSkgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGluZ01vZGVscygpIHsKLQkJcmV0dXJuIG5lc3RpbmdNb2RlbHMgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmVzdGluZ01vZGVscykgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nIG1vZGVsTmFtZSkgewotCQlpZiAoIWlzTmVzdGVkTW9kZWwobW9kZWxOYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRGF0YU1vZGVsSW1wbCBtb2RlbCA9IChEYXRhTW9kZWxJbXBsKSBuZXN0ZWRNb2RlbHMucmVtb3ZlKG1vZGVsTmFtZSk7Ci0JCW1vZGVsLm5lc3RpbmdNb2RlbHMucmVtb3ZlKHRoaXMpOwotCQlyZW1vdmVOZXN0ZWRQcm9wZXJ0aWVzKG1vZGVsLmFsbFByb3BlcnR5TmFtZXMpOwotCQltb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG5lc3RlZE1vZGVscy5pc0VtcHR5KCkpIHsKLQkJCW5lc3RlZE1vZGVscyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVOZXN0ZWRQcm9wZXJ0aWVzKENvbGxlY3Rpb24gbmVzdGVkUHJvcGVydGllcykgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5lc3RlZFByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKLQkJYm9vbGVhbiBrZWVwUHJvcGVydHkgPSBmYWxzZTsKLQkJU2V0IG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWtlZXBQcm9wZXJ0eSA9IGZhbHNlOwotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYmFzZVByb3BlcnR5TmFtZXMuY29udGFpbnMocHJvcGVydHkpKSB7Ci0JCQkJa2VlcFByb3BlcnR5ID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgha2VlcFByb3BlcnR5ICYmIG5lc3RlZE1vZGVscyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgbmVzdGVkTW9kZWxzSXRlcmF0b3IgPSBuZXN0ZWRNb2RlbHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoIWtlZXBQcm9wZXJ0eSAmJiBuZXN0ZWRNb2RlbHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJRGF0YU1vZGVsSW1wbCBuZXN0ZWRNb2RlbCA9IChEYXRhTW9kZWxJbXBsKSBuZXN0ZWRNb2RlbHNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChuZXN0ZWRNb2RlbC5pc1Byb3BlcnR5KHByb3BlcnR5KSkgewotCQkJCQkJa2VlcFByb3BlcnR5ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgha2VlcFByb3BlcnR5KSB7Ci0JCQkJaWYgKG51bGwgPT0gbmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKSB7Ci0JCQkJCW5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCW5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZS5hZGQocHJvcGVydHkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG51bGwgIT0gbmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKSB7Ci0JCQlhbGxQcm9wZXJ0eU5hbWVzLnJlbW92ZUFsbChuZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUpOwotCQkJbmVzdGVkUHJvcGVydHlOYW1lcy5yZW1vdmVBbGwobmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKTsKLQkJCWlmIChuZXN0aW5nTW9kZWxzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBuZXN0aW5nTW9kZWxzSXRlcmF0b3IgPSBuZXN0aW5nTW9kZWxzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKG5lc3RpbmdNb2RlbHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJKChEYXRhTW9kZWxJbXBsKSBuZXN0aW5nTW9kZWxzSXRlcmF0b3IubmV4dCgpKS5yZW1vdmVOZXN0ZWRQcm9wZXJ0aWVzKG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRNb2RlbChTdHJpbmcgbW9kZWxOYW1lKSB7Ci0JCXJldHVybiBtb2RlbE5hbWUgIT0gbnVsbCAmJiBudWxsICE9IG5lc3RlZE1vZGVscyAmJiBuZXN0ZWRNb2RlbHMuY29udGFpbnNLZXkobW9kZWxOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXROZXN0ZWRNb2RlbChTdHJpbmcgbW9kZWxOYW1lKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKG51bGwgIT0gbmVzdGVkTW9kZWxzICYmIG51bGwgIT0gbW9kZWxOYW1lKSA/IChJRGF0YU1vZGVsKSBuZXN0ZWRNb2RlbHMuZ2V0KG1vZGVsTmFtZSkgOiBudWxsOwotCQlpZiAobnVsbCA9PSBkYXRhTW9kZWwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE5FU1RFRF9NT0RFTF9OT1RfTE9DQVRFRCArIG1vZGVsTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBkYXRhTW9kZWwucHJvdmlkZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9ycyA9PSBudWxsID8gTk9fREVTQ1JJUFRPUlMgOiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGF0YU1vZGVsLnByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGVzY3JpcHRvciA9PSBudWxsID8gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSA6IGRlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5UHJvcGVydHlDaGFuZ2UoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgaW50IGZsYWcpIHsKLQkJaW50IGlubmVyRmxhZyA9IGZsYWc7Ci0JCWlmIChpbm5lckZsYWcgPT0gREVGQVVMVF9DSEcpIHsKLQkJCWlmIChpc1Byb3BlcnR5U2V0KHByb3BlcnR5TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbm5lckZsYWcgPSBWQUxVRV9DSEc7Ci0JCX0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBEYXRhTW9kZWxFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIGlubmVyRmxhZykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsICYmICFsaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlJRGF0YU1vZGVsTGlzdGVuZXIgbGlzdGVuZXI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotCQkJCWxpc3RlbmVyID0gKElEYXRhTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKTsKLQkJCQlpZiAobGlzdGVuZXIgIT0gZXZlbnQuZ2V0RGF0YU1vZGVsKCkpIHsKLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlKHRydWUpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGJvb2xlYW4gc3RvcE9uRmlyc3RGYWlsdXJlKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJSVN0YXR1cyBwcm9wU3RhdHVzOwotCQlTdHJpbmcgcHJvcE5hbWU7Ci0JCUl0ZXJhdG9yIGl0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJaXQgPSBiYXNlUHJvcGVydHlOYW1lcy5pdGVyYXRvcigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCWRlZmF1bHQgOgotCQkJCQlpdCA9IGdldE5lc3RlZE1vZGVsTmFtZXMoKS5pdGVyYXRvcigpOwotCQkJfQotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXByb3BOYW1lID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXByb3BTdGF0dXMgPSBwcm92aWRlci52YWxpZGF0ZShwcm9wTmFtZSk7Ci0JCQkJaWYgKHByb3BTdGF0dXMgIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSkgewotCQkJCQkJc3RhdHVzID0gcHJvcFN0YXR1czsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJCQkJKChNdWx0aVN0YXR1cykgc3RhdHVzKS5tZXJnZShwcm9wU3RhdHVzKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbCIsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbXVsdGkubWVyZ2Uoc3RhdHVzKTsKLQkJCQkJCQltdWx0aS5tZXJnZShwcm9wU3RhdHVzKTsKLQkJCQkJCQlzdGF0dXMgPSBtdWx0aTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoc3RvcE9uRmlyc3RGYWlsdXJlICYmICFzdGF0dXMuaXNPSygpICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJfSBlbHNlIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbCkKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBkb2Vzbid0IGhhdmUgYW55IGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWRhdGUodHJ1ZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlWYWxpZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB2YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGRhdGFNb2RlbC5wcm92aWRlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gc3RhdHVzID09IG51bGwgPyBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTIDogc3RhdHVzOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpIHsKLQkJTGlzdCBleHRlbmRlZENvbnRleHQgPSBwcm92aWRlci5nZXRFeHRlbmRlZENvbnRleHQoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQ29udGV4dCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGV4dGVuZGVkQ29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlwcm92aWRlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0UmF3T3BlcmF0aW9uKCkgewotCQlJRGF0YU1vZGVsT3BlcmF0aW9uIHByb3ZpZGVyT3AgPSBwcm92aWRlci5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCWlmIChudWxsID09IHByb3ZpZGVyT3ApIHsKLQkJCXByb3ZpZGVyT3AgPSBuZXcgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24odGhpcykgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyT3A7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwoZ2V0UmF3T3BlcmF0aW9uKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSURhdGFNb2RlbCwgcHJvdmlkZXI9IiArIHByb3ZpZGVyLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlTdHJpbmcgaWQgPSBwcm92aWRlci5nZXRJRCgpOwotCQlyZXR1cm4gbnVsbCAhPSBpZCA/IGlkIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjOGFkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGltcGxlbWVudHMgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgewotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbjsKLQlwcml2YXRlIGludCBvcGVyYXRpb25UeXBlOwotCXByaXZhdGUgaW50IGV4ZWN1dGlvblR5cGU7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwoSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24sIGludCBvcGVyYXRpb25UeXBlLCBpbnQgZXhlY3V0aW9uVHlwZSkgewotCQl0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLQkJdGhpcy5vcGVyYXRpb25UeXBlID0gb3BlcmF0aW9uVHlwZTsKLQkJdGhpcy5leGVjdXRpb25UeXBlID0gZXhlY3V0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBvcGVyYXRpb247Ci0JfQotCi0JcHVibGljIGludCBnZXRPcGVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gb3BlcmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV4ZWN1dGlvblR5cGUoKSB7Ci0JCXJldHVybiBleGVjdXRpb25UeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDA3OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFkYXB0YWJpbGl0eVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5PcGVyYXRpb25TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwgZXh0ZW5kcyBXcmFwcGVkT3BlcmF0aW9uIGltcGxlbWVudHMgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHsKLQotCS8vIFN0YWNrIG9mIFN0YWNrRW50cmllcyB0byBiZSBleGVjdXRlZAotCXByb3RlY3RlZCBTdGFjayBvcGVyYXRpb25TdGFja1RvRXhlY3V0ZSA9IG51bGw7Ci0KLQkvLyBTdGFjayBvZiBTdGFja0VudHJpZXMgYWxyZWFkeSBleGVjdXRlZAotCXByb3RlY3RlZCBTdGFjayB1bmRvU3RhY2sgPSBudWxsOwotCXByb3RlY3RlZCBTdGFjayByZWRvU3RhY2sgPSBudWxsOwotCi0JcHJvdGVjdGVkIE9wZXJhdGlvblN0YWNrRW50cnkgcm9vdFN0YWNrRW50cnkgPSBudWxsOwotCi0JcHJvdGVjdGVkIExpc3Qgb3BlcmF0aW9uTGlzdGVuZXJzOwotCi0JcHJvdGVjdGVkIGludCBleGVjdXRpb25TdGF0ZSA9IE5PVF9TVEFSVEVEOwotCi0JcHVibGljIERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbChJRGF0YU1vZGVsT3BlcmF0aW9uIHJvb3RPcGVyYXRpb24pIHsKLQkJc3VwZXIocm9vdE9wZXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgb3BlcmF0aW9uTGlzdGVuZXIpIHsKLQkJaWYgKG51bGwgPT0gb3BlcmF0aW9uTGlzdGVuZXJzKSB7Ci0JCQlvcGVyYXRpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJb3BlcmF0aW9uTGlzdGVuZXJzLmFkZChvcGVyYXRpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgb3BlcmF0aW9uTGlzdGVuZXIpIHsKLQkJaWYgKG51bGwgIT0gb3BlcmF0aW9uTGlzdGVuZXJzKSB7Ci0JCQlvcGVyYXRpb25MaXN0ZW5lcnMucmVtb3ZlKG9wZXJhdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uU3RhdGUoKSB7Ci0JCXJldHVybiBleGVjdXRpb25TdGF0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFWEVDVVRFX0lNUEwgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVORE9fSU1QTCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkVET19JTVBMID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBST0xMQkFDS19JTVBMID0gMzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSRVNVTUVfSU1QTCA9IDQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByb3RlY3RlZCBJU3RhdHVzIGNhY2hlVGhyZWFkQW5kQ29udGludWUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8sIGludCBydW5UeXBlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQlmaW5hbCBib29sZWFuIGlzVG9wTGV2ZWxPcGVyYXRpb24gPSAhdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbC5jb250YWluc0tleShjdXJyZW50VGhyZWFkKTsKLQkJdHJ5IHsKLQkJCWlmIChpc1RvcExldmVsT3BlcmF0aW9uKSB7Ci0JCQkJdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbC5wdXQoY3VycmVudFRocmVhZCwgdGhpcyk7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHJ1blR5cGUpIHsKLQkJCQljYXNlIEVYRUNVVEVfSU1QTCA6Ci0JCQkJCXJldHVybiBleGVjdXRlSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCQljYXNlIFVORE9fSU1QTCA6Ci0JCQkJCXJldHVybiB1bmRvSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCQljYXNlIFJFRE9fSU1QTCA6Ci0JCQkJCXJldHVybiByZWRvSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCQljYXNlIFJPTExCQUNLX0lNUEwgOgotCQkJCQlyZXR1cm4gcm9sbEJhY2tJbXBsKG1vbml0b3IsIGluZm8pOwotCQkJCWNhc2UgUkVTVU1FX0lNUEwgOgotCQkJCQlyZXR1cm4gcmVzdW1lSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpc1RvcExldmVsT3BlcmF0aW9uKSB7Ci0JCQkJdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbC5yZW1vdmUoY3VycmVudFRocmVhZCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZXN1bWUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBSRVNVTUVfSU1QTCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVzdW1lSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoZXhlY3V0aW9uU3RhdGUpIHsKLQkJCWNhc2UgTk9UX1NUQVJURUQgOgotCQkJCXJldHVybiBleGVjdXRlSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCWNhc2UgUEFVU0VEX0VYRUNVVEUgOgotCQkJY2FzZSBDT01QTEVURV9ST0xMQkFDSyA6Ci0JCQkJcmV0dXJuIGRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJCWNhc2UgUEFVU0VEX1VORE8gOgotCQkJCXJldHVybiBkb1VuZG8obW9uaXRvciwgaW5mbyk7Ci0JCQljYXNlIFBBVVNFRF9SRURPIDoKLQkJCQlyZXR1cm4gcmVkb0ltcGwobW9uaXRvciwgaW5mbyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gKENPTVBMRVRFX1VORE8gPT0gZXhlY3V0aW9uU3RhdGUpICYmIHN1cGVyLmNhblJlZG8oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNhY2hlVGhyZWFkQW5kQ29udGludWUobW9uaXRvciwgaW5mbywgUkVET19JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyByZWRvSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQlyZXR1cm4gZG9SZWRvKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGRvUmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQl0cnkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSBSVU5OSU5HX1JFRE87Ci0JCQlPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzID0gbnVsbDsKLQkJCWludCBzaG91bGRDb250aW51ZSA9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCQkJd2hpbGUgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFID09IHNob3VsZENvbnRpbnVlICYmICFyZWRvU3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBzdGFja0VudHJ5ID0gKE9wZXJhdGlvblN0YWNrRW50cnkpIHJlZG9TdGFjay5wZWVrKCk7Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBzdGFja0VudHJ5LmdldE9wZXJhdGlvbigpOwotCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUkVETyk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBzaG91bGRDb250aW51ZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdW5kb1N0YWNrLnB1c2gocmVkb1N0YWNrLnBvcCgpKTsKLQkJCQlyZXR1cm5TdGF0dXMgPSBydW5PcGVyYXRpb24ob3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5SRURPLCByZXR1cm5TdGF0dXMpOwotCQkJCWV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUkVETyk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCi0JCQl9Ci0JCQlyZXR1cm4gcmV0dXJuU3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogcmV0dXJuU3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSByZWRvU3RhY2suaXNFbXB0eSgpID8gQ09NUExFVEVfUkVETyA6IFBBVVNFRF9SRURPOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIChleGVjdXRpb25TdGF0ZSA9PSBDT01QTEVURV9FWEVDVVRFIHx8IGV4ZWN1dGlvblN0YXRlID09IENPTVBMRVRFX1JFRE8pICYmIHN1cGVyLmNhblVuZG8oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNhY2hlVGhyZWFkQW5kQ29udGludWUobW9uaXRvciwgaW5mbywgVU5ET19JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB1bmRvSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQlyZWRvU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJcmV0dXJuIGRvVW5kbyhtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1VuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gUlVOTklOR19VTkRPOwotCQkJT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cyA9IG51bGw7Ci0JCQlpbnQgc2hvdWxkQ29udGludWUgPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQkJCXdoaWxlIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRSA9PSBzaG91bGRDb250aW51ZSAmJiAhdW5kb1N0YWNrLmlzRW1wdHkoKSkgewotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgc3RhY2tFbnRyeSA9IChPcGVyYXRpb25TdGFja0VudHJ5KSB1bmRvU3RhY2sucGVlaygpOwotCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gc3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKTsKLQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8pOwotCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gc2hvdWxkQ29udGludWUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlZG9TdGFjay5wdXNoKHVuZG9TdGFjay5wb3AoKSk7Ci0JCQkJcmV0dXJuU3RhdHVzID0gcnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuVU5ETywgcmV0dXJuU3RhdHVzKTsKLQkJCQlldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fRklOSVNIRUQsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8pOwotCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQotCQkJfQotCQkJcmV0dXJuIHJldHVyblN0YXR1cyA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IHJldHVyblN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gdW5kb1N0YWNrLmlzRW1wdHkoKSA/IENPTVBMRVRFX1VORE8gOiBQQVVTRURfVU5ETzsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBFWEVDVVRFX0lNUEwpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGV4ZWN1dGVJbXBsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gUlVOTklOR19FWEVDVVRFOwotCQkJdW5kb1N0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZSA9IG5ldyBTdGFjaygpOwotCQkJcm9vdFN0YWNrRW50cnkgPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeShudWxsLCByb290T3BlcmF0aW9uKTsKLQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnB1c2gocm9vdFN0YWNrRW50cnkpOwotCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwocm9vdE9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTk9ERV9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KSkgewotCQkJCXJldHVybiBkb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUuaXNFbXB0eSgpID8gQ09NUExFVEVfRVhFQ1VURSA6IFBBVVNFRF9FWEVDVVRFOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMgPSBudWxsOwotCQkJaW50IHNob3VsZENvbnRpbnVlID0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQl3aGlsZSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gc2hvdWxkQ29udGludWUgJiYgIW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLmlzRW1wdHkoKSkgewotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgc3RhY2tFbnRyeSA9IChPcGVyYXRpb25TdGFja0VudHJ5KSBvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wZWVrKCk7Ci0JCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBwcmVTdGFja0VudHJ5ID0gc3RhY2tFbnRyeS5nZXROZXh0UHJlT3BlcmF0aW9uKCk7Ci0JCQkJaWYgKG51bGwgIT0gcHJlU3RhY2tFbnRyeSkgewotCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wdXNoKHByZVN0YWNrRW50cnkpOwotCQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChwcmVTdGFja0VudHJ5LmdldE9wZXJhdGlvbigpLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5OT0RFX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBzdGFja0VudHJ5T3BlcmF0aW9uID0gc3RhY2tFbnRyeS5nZXRPcGVyYXRpb25Gb3JFeGVjdXRpb24oKTsKLQkJCQlpZiAobnVsbCAhPSBzdGFja0VudHJ5T3BlcmF0aW9uKSB7Ci0JCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHN0YWNrRW50cnlPcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBzaG91bGRDb250aW51ZSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuU3RhdHVzID0gcnVuT3BlcmF0aW9uKHN0YWNrRW50cnlPcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUsIHJldHVyblN0YXR1cyk7Ci0JCQkJCXVuZG9TdGFjay5wdXNoKHN0YWNrRW50cnkpOwotCQkJCQlldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChzdGFja0VudHJ5T3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVELCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gc2hvdWxkQ29udGludWUpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgcG9zdFN0YWNrRW50cnkgPSBzdGFja0VudHJ5LmdldE5leHRQb3N0T3BlcmF0aW9uKCk7Ci0JCQkJaWYgKG51bGwgIT0gcG9zdFN0YWNrRW50cnkpIHsKLQkJCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucHVzaChwb3N0U3RhY2tFbnRyeSk7Ci0JCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHBvc3RTdGFja0VudHJ5LmdldE9wZXJhdGlvbigpLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5OT0RFX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucG9wKCk7Ci0JCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwoc3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKSwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTk9ERV9GSU5JU0hFRCwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJfQotCQkJcmV0dXJuIHJldHVyblN0YXR1cyA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IHJldHVyblN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUuaXNFbXB0eSgpID8gQ09NUExFVEVfRVhFQ1VURSA6IFBBVVNFRF9FWEVDVVRFOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcm9sbEJhY2soSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBST0xMQkFDS19JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyByb2xsQmFja0ltcGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoUEFVU0VEX0VYRUNVVEUgPT0gZXhlY3V0aW9uU3RhdGUgfHwgUEFVU0VEX1JPTExCQUNLID09IGV4ZWN1dGlvblN0YXRlKSB7Ci0JCQl0cnkgewotCQkJCWV4ZWN1dGlvblN0YXRlID0gUlVOTklOR19ST0xMQkFDSzsKLQkJCQlPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzID0gbnVsbDsKLQkJCQlpbnQgc2hvdWxkQ29udGludWUgPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQkJCQl3aGlsZSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gc2hvdWxkQ29udGludWUgJiYgIXVuZG9TdGFjay5pc0VtcHR5KCkpIHsKLQkJCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBzdGFja0VudHJ5ID0gKE9wZXJhdGlvblN0YWNrRW50cnkpIHVuZG9TdGFjay5wZWVrKCk7Ci0JCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gc3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKTsKLQkJCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5ST0xMQkFDSyk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFID09IHNob3VsZENvbnRpbnVlKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQl1bmRvU3RhY2sucG9wKCk7Ci0JCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgZXhlY3V0aW9uVG9wU3RhY2tFbnRyeSA9IHN0YWNrRW50cnkucm9sbEJhY2tPbmVPcGVyYXRpb24oKTsKLQkJCQkJaWYgKG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLmNvbnRhaW5zKGV4ZWN1dGlvblRvcFN0YWNrRW50cnkpKSB7Ci0JCQkJCQl3aGlsZSAob3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucGVlaygpICE9IGV4ZWN1dGlvblRvcFN0YWNrRW50cnkpIHsKLQkJCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wb3AoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0YWNrIHBhcmVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCQkJCQlwYXJlbnRTdGFjay5wdXNoKGV4ZWN1dGlvblRvcFN0YWNrRW50cnkpOwotCQkJCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBlbnRyeSA9IGV4ZWN1dGlvblRvcFN0YWNrRW50cnkucGFyZW50OwotCQkJCQkJd2hpbGUgKCFvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5jb250YWlucyhlbnRyeSkpIHsKLQkJCQkJCQlwYXJlbnRTdGFjay5wdXNoKGVudHJ5KTsKLQkJCQkJCQllbnRyeSA9IGVudHJ5LnBhcmVudDsKLQkJCQkJCX0KLQkJCQkJCXdoaWxlIChvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wZWVrKCkgIT0gZW50cnkpIHsKLQkJCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wb3AoKTsKLQkJCQkJCX0KLQkJCQkJCXdoaWxlICghcGFyZW50U3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucHVzaChwYXJlbnRTdGFjay5wb3AoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuU3RhdHVzID0gcnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuVU5ETywgcmV0dXJuU3RhdHVzKTsKLQkJCQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVELCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5ST0xMQkFDSyk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldHVyblN0YXR1cyA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IHJldHVyblN0YXR1czsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZXhlY3V0aW9uU3RhdGUgPSB1bmRvU3RhY2suaXNFbXB0eSgpID8gQ09NUExFVEVfUk9MTEJBQ0sgOiBQQVVTRURfUk9MTEJBQ0s7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIGludCBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQpIHsKLQkJaWYgKG51bGwgIT0gb3BlcmF0aW9uTGlzdGVuZXJzKSB7Ci0JCQlJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbkxpc3RlbmVycy5zaXplKCk7IGkrKykgewotCQkJCWxpc3RlbmVyID0gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyKSBvcGVyYXRpb25MaXN0ZW5lcnMuZ2V0KGkpOwotCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBsaXN0ZW5lci5ub3RpZnkoZXZlbnQpKSB7Ci0JCQkJCXJldHVybiBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCX0KLQotCXByb3RlY3RlZCBPcGVyYXRpb25TdGF0dXMgYWRkU3RhdHVzKE9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCU9wZXJhdGlvblN0YXR1cyBpbm5lclJldHVyblN0YXR1cyA9IHJldHVyblN0YXR1czsKLQkJaWYgKGlubmVyUmV0dXJuU3RhdHVzID09IG51bGwpIHsKLQkJCWlubmVyUmV0dXJuU3RhdHVzID0gbmV3IE9wZXJhdGlvblN0YXR1cyhzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQkJaW5uZXJSZXR1cm5TdGF0dXMuc2V0U2V2ZXJpdHkoc3RhdHVzLmdldFNldmVyaXR5KCkpOwotCQkJaW5uZXJSZXR1cm5TdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlpbm5lclJldHVyblN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gaW5uZXJSZXR1cm5TdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBPcGVyYXRpb25TdGF0dXMgYWRkRXh0ZW5kZWRTdGF0dXMoT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cywgSVN0YXR1cyBhU3RhdHVzKSB7Ci0JCU9wZXJhdGlvblN0YXR1cyBpbm5lclJldHVyblN0YXR1cyA9IHJldHVyblN0YXR1czsKLQkJaWYgKGlubmVyUmV0dXJuU3RhdHVzID09IG51bGwpIHsKLQkJCWlubmVyUmV0dXJuU3RhdHVzID0gbmV3IE9wZXJhdGlvblN0YXR1cyhuZXcgSVN0YXR1c1tde1dUUENvbW1vblBsdWdpbi5PS19TVEFUVVN9KTsKLQkJfQotCQlpbm5lclJldHVyblN0YXR1cy5hZGRFeHRlbmRlZFN0YXR1cyhhU3RhdHVzKTsKLQkJcmV0dXJuIGlubmVyUmV0dXJuU3RhdHVzOwotCX0KLQotCXByaXZhdGUgT3BlcmF0aW9uU3RhdHVzIHJ1bk9wZXJhdGlvbihmaW5hbCBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJQWRhcHRhYmxlIGluZm8sIGZpbmFsIGludCBleGVjdXRpb25UeXBlLCBPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzKSB7Ci0JCU9wZXJhdGlvblN0YXR1cyBpbm5lclJldHVyblN0YXR1cyA9IHJldHVyblN0YXR1czsKLQkJaWYgKHJvb3RPcGVyYXRpb24gPT0gb3BlcmF0aW9uKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bk9wZXJhdGlvbihvcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaW5uZXJSZXR1cm5TdGF0dXMgPSBhZGRTdGF0dXMoaW5uZXJSZXR1cm5TdGF0dXMsIHN0YXR1cyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gcnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCWlubmVyUmV0dXJuU3RhdHVzID0gYWRkRXh0ZW5kZWRTdGF0dXMoaW5uZXJSZXR1cm5TdGF0dXMsIHN0YXR1cyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjUiLCBuZXcgT2JqZWN0W117b3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpfSksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5uZXJSZXR1cm5TdGF0dXMgPSBhZGRFeHRlbmRlZFN0YXR1cyhpbm5lclJldHVyblN0YXR1cywgc3RhdHVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5uZXJSZXR1cm5TdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIHJ1bk9wZXJhdGlvbihmaW5hbCBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJQWRhcHRhYmxlIGluZm8sIGZpbmFsIGludCBleGVjdXRpb25UeXBlKSB7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMgd29ya3NwYWNlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyhpbmZvKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3dpdGNoIChleGVjdXRpb25UeXBlKSB7Ci0JCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUgOgotCQkJCQkJCXRoaXMuc2V0U3RhdHVzKG9wZXJhdGlvbi5leGVjdXRlKHBtLCBpbmZvKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8gOgotCQkJCQkJCXRoaXMuc2V0U3RhdHVzKG9wZXJhdGlvbi51bmRvKHBtLCBpbmZvKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJFRE8gOgotCQkJCQkJCXRoaXMuc2V0U3RhdHVzKG9wZXJhdGlvbi5yZWRvKHBtLCBpbmZvKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKG51bGwgPT0gdGhpcy5nZXRTdGF0dXMoKSkgewotCQkJCQkJdGhpcy5zZXRTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aGlzLnNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI1IiwgbmV3IE9iamVjdFtde29wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKX0pLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG9wZXJhdGlvbi5nZXRTY2hlZHVsaW5nUnVsZSgpOwotCQlpZiAobnVsbCA9PSBydWxlKSB7Ci0JCQlydWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHdvcmtzcGFjZVJ1bm5hYmxlLCBydWxlLCBvcGVyYXRpb24uZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJd29ya3NwYWNlUnVubmFibGUuc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjUiLCBuZXcgT2JqZWN0W117b3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpfSksIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB3b3Jrc3BhY2VSdW5uYWJsZS5nZXRTdGF0dXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgT3BlcmF0aW9uU3RhY2tFbnRyeSB7Ci0KLQkJcHJpdmF0ZSBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbjsKLQkJcHJpdmF0ZSBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbkZvckV4ZWN1dGlvbjsKLQotCQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRPcHNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JCXByaXZhdGUgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlciBleHRPcEhvbGRlciA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBpbnQgcHJlT3BJbmRleCA9IDA7Ci0JCXByaXZhdGUgaW50IHBvc3RPcEluZGV4ID0gMDsKLQotCQlwcml2YXRlIE9wZXJhdGlvblN0YWNrRW50cnlbXSBwcmVPcFN0YWNrRW50cmllcyA9IG51bGw7Ci0JCXByaXZhdGUgT3BlcmF0aW9uU3RhY2tFbnRyeVtdIHBvc3RPcFN0YWNrRW50cmllcyA9IG51bGw7Ci0KLQkJcHVibGljIE9wZXJhdGlvblN0YWNrRW50cnkgcGFyZW50ID0gbnVsbDsKLQotCQlwdWJsaWMgT3BlcmF0aW9uU3RhY2tFbnRyeShPcGVyYXRpb25TdGFja0VudHJ5IHBhcmVudCwgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0JCQl0aGlzLm9wZXJhdGlvbkZvckV4ZWN1dGlvbiA9IG9wZXJhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IHJvbGxCYWNrT25lT3BlcmF0aW9uKCkgewotCQkJcG9zdE9wSW5kZXggPSAwOwotCQkJb3BlcmF0aW9uRm9yRXhlY3V0aW9uID0gb3BlcmF0aW9uOwotCQkJaWYgKHByZU9wSW5kZXggPT0gMCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJlbnQucm9sbEJhY2tFeHRlbmRlZCh0aGlzKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzOwotCQl9Ci0KLQkJcHJpdmF0ZSBPcGVyYXRpb25TdGFja0VudHJ5IHJvbGxCYWNrRXh0ZW5kZWQoT3BlcmF0aW9uU3RhY2tFbnRyeSBleHRlbmRlZEVudHJ5KSB7Ci0JCQl3aGlsZSAocG9zdE9wSW5kZXggPiAwKSB7Ci0JCQkJaW50IGluZGV4ID0gLS1wb3N0T3BJbmRleDsKLQkJCQlpZiAocG9zdE9wU3RhY2tFbnRyaWVzW2luZGV4XSA9PSBleHRlbmRlZEVudHJ5KSB7Ci0JCQkJCXBvc3RPcFN0YWNrRW50cmllc1tpbmRleF0gPSBudWxsOwotCQkJCQlyZXR1cm4gdGhpczsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAocHJlT3BJbmRleCA+IDApIHsKLQkJCQlpbnQgaW5kZXggPSAtLXByZU9wSW5kZXg7Ci0JCQkJaWYgKHByZU9wU3RhY2tFbnRyaWVzW2luZGV4XSA9PSBleHRlbmRlZEVudHJ5KSB7Ci0JCQkJCXByZU9wU3RhY2tFbnRyaWVzW2luZGV4XSA9IG51bGw7Ci0JCQkJCWlmIChpbmRleCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gdGhpczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChudWxsICE9IHBhcmVudCkgewotCQkJCXJldHVybiBwYXJlbnQucm9sbEJhY2tFeHRlbmRlZCh0aGlzKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzOwotCQl9Ci0KLQkJcHVibGljIE9wZXJhdGlvblN0YWNrRW50cnkgZ2V0TmV4dFByZU9wZXJhdGlvbigpIHsKLQkJCWlmICghZXh0ZW5kZWRPcHNJbml0aWFsaXplZCkgewotCQkJCWluaXRFeHRlbmRlZE9wcygpOwotCQkJfQotCQkJaWYgKGV4dE9wSG9sZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUxpc3Qgb3BzID0gZXh0T3BIb2xkZXIuZ2V0UHJlT3BzKCk7Ci0JCQlpZiAob3BzID09IG51bGwgfHwgb3BzLnNpemUoKSA8PSBwcmVPcEluZGV4KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXdoaWxlIChwcmVPcEluZGV4IDwgb3BzLnNpemUoKSkgewotCQkJCWludCBpbmRleCA9IHByZU9wSW5kZXgrKzsKLQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wID0gKElEYXRhTW9kZWxPcGVyYXRpb24pIG9wcy5nZXQoaW5kZXgpOwotCQkJCWlmIChzaG91bGRFeGVjdXRlRXh0ZW5kZWQob3AuZ2V0SUQoKSkpIHsKLQkJCQkJb3Auc2V0RGF0YU1vZGVsKGdldERhdGFNb2RlbCgpKTsKLQkJCQkJb3Auc2V0RW52aXJvbm1lbnQoZ2V0RW52aXJvbm1lbnQoKSk7Ci0JCQkJCXByZU9wU3RhY2tFbnRyaWVzW2luZGV4XSA9IG5ldyBPcGVyYXRpb25TdGFja0VudHJ5KHRoaXMsIG9wKTsKLQkJCQkJcmV0dXJuIHByZU9wU3RhY2tFbnRyaWVzW2luZGV4XTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGdldE9wZXJhdGlvbklEKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvbklEKCkgewotCQkJcmV0dXJuIG9wZXJhdGlvbi5nZXRJRCgpOwotCQl9Ci0KLQkJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkgewotCQkJcmV0dXJuIG9wZXJhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV4ZWN1dGVkKCkgewotCQkJcmV0dXJuIG51bGwgIT0gb3BlcmF0aW9uRm9yRXhlY3V0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSByb290IG9wZXJhdGlvbiBpcyBvbmx5IHJldHVybmVkIG9uY2U7IHRoaXMgd2F5IGl0IGlzIGtub3duIHdoZXRoZXIgaXQgaGFzIGJlZW4KLQkJICogZXhlY3V0ZWQgeWV0IG9yIG5vdC4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldE9wZXJhdGlvbkZvckV4ZWN1dGlvbigpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG9wZXJhdGlvbkZvckV4ZWN1dGlvbjsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3BlcmF0aW9uRm9yRXhlY3V0aW9uID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IGdldE5leHRQb3N0T3BlcmF0aW9uKCkgewotCQkJaWYgKCFleHRlbmRlZE9wc0luaXRpYWxpemVkKSB7Ci0JCQkJaW5pdEV4dGVuZGVkT3BzKCk7Ci0JCQl9Ci0JCQlpZiAoZXh0T3BIb2xkZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJTGlzdCBvcHMgPSBleHRPcEhvbGRlci5nZXRQb3N0T3BzKCk7Ci0JCQlpZiAob3BzID09IG51bGwgfHwgb3BzLnNpemUoKSA8PSBwb3N0T3BJbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQl3aGlsZSAocG9zdE9wSW5kZXggPCBvcHMuc2l6ZSgpKSB7Ci0JCQkJaW50IGluZGV4ID0gcG9zdE9wSW5kZXgrKzsKLQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wID0gKElEYXRhTW9kZWxPcGVyYXRpb24pIG9wcy5nZXQoaW5kZXgpOwotCQkJCWlmIChzaG91bGRFeGVjdXRlRXh0ZW5kZWQob3AuZ2V0SUQoKSkpIHsKLQkJCQkJb3Auc2V0RGF0YU1vZGVsKGdldERhdGFNb2RlbCgpKTsKLQkJCQkJb3Auc2V0RW52aXJvbm1lbnQoZ2V0RW52aXJvbm1lbnQoKSk7Ci0JCQkJCXBvc3RPcFN0YWNrRW50cmllc1tpbmRleF0gPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeSh0aGlzLCBvcCk7Ci0JCQkJCXJldHVybiBwb3N0T3BTdGFja0VudHJpZXNbaW5kZXhdOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdEV4dGVuZGVkT3BzKCkgewotCQkJaWYgKHNob3VsZEV4ZWN1dGVFeHRlbmRlZChvcGVyYXRpb24uZ2V0SUQoKSkpIHsKLQkJCQlleHRPcEhvbGRlciA9IENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIuY3JlYXRlRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIob3BlcmF0aW9uLmdldElEKCkpOwotCQkJCWlmIChudWxsICE9IGV4dE9wSG9sZGVyKSB7Ci0JCQkJCWlmIChleHRPcEhvbGRlci5oYXNQcmVPcHMoKSkgewotCQkJCQkJcHJlT3BTdGFja0VudHJpZXMgPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeVtleHRPcEhvbGRlci5nZXRQcmVPcHMoKS5zaXplKCldOwotCQkJCQl9Ci0JCQkJCWlmIChleHRPcEhvbGRlci5oYXNQb3N0T3BzKCkpIHsKLQkJCQkJCXBvc3RPcFN0YWNrRW50cmllcyA9IG5ldyBPcGVyYXRpb25TdGFja0VudHJ5W2V4dE9wSG9sZGVyLmdldFBvc3RPcHMoKS5zaXplKCldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZXh0ZW5kZWRPcHNJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRFeGVjdXRlRXh0ZW5kZWQoU3RyaW5nIG9wZXJhdGlvbklEKSB7Ci0JCS8vIENoZWNrIHRoZSB0b3AgbW9zdCBsZXZlbCBvcGVyYXRpb24gZmlyc3QKLQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsIHRocmVhZFJvb3RPcGVyYXRpb24gPSAoRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsKSB0aHJlYWRUb0V4dGVuZGVkT3BDb250cm9sLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLQkJaWYgKHRocmVhZFJvb3RPcGVyYXRpb24gIT0gdGhpcyAmJiB0aHJlYWRSb290T3BlcmF0aW9uLmdldERhdGFNb2RlbCgpICE9IGdldERhdGFNb2RlbCgpICYmICF0aHJlYWRSb290T3BlcmF0aW9uLnNob3VsZEV4ZWN1dGVFeHRlbmRlZChvcGVyYXRpb25JRCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBObyBleHRlbmRlZCBvcGVyYXRpb25zIGFyZSBiZWluZyBleGVjdXRlZAotCQlib29sZWFuIGFsbG93RXh0ZW5zaW9ucyA9IGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TKTsKLQkJaWYgKCFhbGxvd0V4dGVuc2lvbnMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBUaGlzIHNwZWNpZmljIG9wZXJhdGlvbiBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCi0JCUxpc3QgcmVzdHJpY3RlZEV4dGVuc2lvbnMgPSAoTGlzdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUyk7Ci0JCWlmIChyZXN0cmljdGVkRXh0ZW5zaW9ucy5jb250YWlucyhvcGVyYXRpb25JRCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBUaGlzIHNwZWNpZmljIGZ1bmN0aW9uIGdyb3VwIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQKLQkJTGlzdCBleHRlbmRlZENvbnRleHQgPSBnZXREYXRhTW9kZWwoKS5nZXRFeHRlbmRlZENvbnRleHQoKTsKLQkJZm9yIChpbnQgY29udGV4dENvdW50ID0gMDsgY29udGV4dENvdW50IDwgZXh0ZW5kZWRDb250ZXh0LnNpemUoKTsgY29udGV4dENvdW50KyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihleHRlbmRlZENvbnRleHQuZ2V0KGNvbnRleHRDb3VudCksIElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChudWxsICE9IHByb2plY3QgJiYgIUlFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKG9wZXJhdGlvbklELCBwcm9qZWN0KS5pc0VuYWJsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDk0YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxNYW5hZ2VyT3BlcmF0aW9uIGlzIGFuIElEYXRhTW9kZWxPcGVyYXRpb24gcmV0dXJuZWQgZnJvbQotICoge0BsaW5rb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2dldERlZmF1bHRPcGVyYXRpb24oKX0uIFRoaXMgT3BlcmF0aW9uIHdyYXBzIHRoZSBJRGF0YU1vZGVsT3BlcmF0aW9uIHJldHVybmVkCi0gKiBmcm9tIHRoZSBJRGF0TW9kZWxQcm92aWRlciBiYWNraW5nIHRoZSBJRGF0YU1vZGVsIHRoYXQgY3JlYXRlZCBpdC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBvcGVyYXRpb24gc3VwcG9ydHMgcHJlIGFuZCBwb3N0IG9wZXJhdGlvbiBleGVjdXRpb24uIFByZSBhbmQgcG9zdCBvcGVyYXRpb25zIGFyZQotICogSURhdGFNb2RlbE9wZXJhdGlvbnMgcmVnaXN0ZXJlZCB0aHJvdWdoIHRoZSBPcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGFyZSBleGVjdXRlZAotICogYmVmb3JlIGFuZCBhZnRlciB0aGUgcHJpbWFyeSBvcGVyYXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMTwvYj4gPGJyPgotICogU3VwcG9zZSBhbiBJRGF0YU1vZGVsUHJvdmlkZXIgcmV0dXJucyBJRGF0YU1vZGVsT3BlcmF0aW9uIFggYXMgaXRzIGRlZmF1bHQgb3BlcmF0aW9uLCBhbmQgdGhpcwotICogSURhdGFNb2RlbE1hbmFnZXJPcGVyYXRpb24gaXMgd3JhcHBpbmcgWC4gQWxzbyBzdXBwb3NlIG9wZXJhdGlvbiBBIGlzIHJlZ2lzdGVyZWQgYXMgYSBwcmUKLSAqIG9wZXJhdGlvbiB0byBYIGFuZCBvcGVyYXRpb24gQiBpcyByZWdpc3RlcmVkIGFzIGEgcG9zdCBvcGVyYXRpb24gdG8gWC4gV2hlbiB0aGlzCi0gKiBJRGF0YU1vZGVsTWFuYWdlck9wZXJhdGlvbiBpcyBleGVjdXRlZCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGlzIG9yZGVyOgotICogQSwgWCwgQiB3aGljaCBtYXkgYmUgdGhvdWdodCBhcyBhIHByZW9yZGVyIGV4ZWN1dGlvbiBvZiB0aGUgZm9sbG93aW5nIHRyZWU6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICAgICAgICAgWAotICogICAgICAgICAgLyBcCi0gKiAgICAgICAgIEEgICBCCi0gKiAgICAgICAgIAotICogICBleGVjdXRpb24gPSBBLmV4ZWN1dGUoKSwgIFguZXhlY3V0ZSgpLCBCLmV4ZWN1dGUoKQotICogICB1bmRvID0gQi51bmRvKCksIFgudW5kbygpLCBBLnVuZG8oKQotICogICByZWRvID0gQS5yZWRvKCksIFgucmVkbygpLCBCLnJlZG8oKQotICogPC9wcmU+Ci0gKiAKLSAqIDxwPgotICogPGI+RXhhbXBsZSAyPC9iPiA8YnI+Ci0gKiBJZiBBIGhhZCBhIHByZSBvcGVyYXRpb24gQyBhbmQgcG9zdCBvcGVyYXRpb24gRCwgYW5kIEIgaGFkIGEgcHJlIG9wZXJhdGlvbiBFIGFuZCBwb3N0IG9wZXJhdGlvbiBGCi0gKiB0aGVuIHRoZSB0cmVlIHdvdWxkIGxvb2sgbGlrZToKLSAqIDwvcD4KLSAqIAotICogPHByZT4KLSAqICAgICAgICAgICAgWAotICogICAgICAgICAgIC8gXAotICogICAgICAgICAgLyAgIFwKLSAqICAgICAgICAgQSAgICAgQgotICogICAgICAgIC8gXCAgIC8gXAotICogICAgICAgQyAgIEQgRSAgIEYKLSAqICAgCi0gKiAgIGV4ZWN1dGlvbiA9IEMuZXhlY3V0ZSgpLCBBLmV4ZWN1dGUoKSwgIEQuZXhlY3V0ZSgpLCBYLmV4ZWN1dGUoKSwgRS5leGVjdXRlKCksIEIuZXhlY3V0ZSgpLCBGLmV4ZWN1dGUoKQotICogICB1bmRvID0gRi51bmRvKCksIEIudW5kbygpLCBFLnVuZG8oKSwgWC51bmRvKCksIEQudW5kbygpLCBBLnVuZG8oKSwgQy51bmRvKCkKLSAqICAgcmVkbyA9IEMucmVkbygpLCBBLnJlZG8oKSwgIEQucmVkbygpLCBYLnJlZG8oKSwgRS5yZWRvKCksIEIucmVkbygpLCBGLnJlZG8oKQotICogPC9wcmU+Ci0gKiAKLSAqIDwvcD4KLSAqIDxiPkV4YW1wbGUgMzwvYj4gPGJyPgotICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwcmUgb3BlcmF0aW9uIG9yIHBvc3Qgb3BlcmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uLCB0aGVuIHRoZXJlCi0gKiBpcyBubyBkZWZpbmVkIG9yZGVyaW5nIG9mIHRob3NlIHByZSBhbmQgcG9zdCBvcGVyYXRpb24gd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsIG90aGVyIHRoYW4KLSAqIHRoYXQgaXQgd2lsbCBiZSBjb25zaXN0ZW50LiBGb3IgZXhhbXBsZSBzdXBwb3NlIG9wZXJhdGlvbiBYIGhhZCBvbmx5IHR3byBwcmUgb3BlcmF0aW9ucywgQSBhbmQgQiwKLSAqIGFuZCB0d28gcG9zdCBvcGVyYXRpb25zLCBDIGFuZCBELiBUaGUgZXhlY3V0aW9uIHRyZWUgd291bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICAgICAgIFggICAgICAgICAgICAgIFggICAgICAgICAgICAgIFggICAgICAgICAgICAgIFgKLSAqICAgICAgICAvIFwgICAgICAgICAgICAvIFwgICAgICAgICAgICAvIFwgICAgICAgICAgICAvIFwKLSAqICAgICAgQUIgICBDRCAgICAgICAgQkEgICBDRCAgICAgICAgQUIgICBEQyAgICAgICAgQkEgICBEQwotICogICAKLSAqICAgIGV4ZWMgPSBBQlhDRCAgIGV4ZWMgPSBCQVhDRCAgIGV4ZWMgPSBBQlhEQyAgIGV4ZWMgPSBCQVhEQwotICogICAgdW5kbyA9IERDWEJBICAgdW5kbyA9IERDWEFCICAgdW5kbyA9IENEWEJBICAgdW5kbyA9IENEWEFCIAotICogICAgcmVkbyA9IEFCWENEICAgcmVkbyA9IEJBWENEICAgcmVkbyA9IEFCWERDICAgcmVkbyA9IEJBWERDCi0gKiA8L3ByZT4KLSAqIAotICogPHA+Ci0gKiBEdXJpbmcgZXhlY3V0aW9uLCByb2xsYmFjaywgdW5kbywgYW5kIHJlZG8sIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudH1zIGFyZSBmaXJlZCB0byBhbGwKLSAqIHJlZ2lzdGVyZWQge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyfXMgZ2l2aW5nIGVhY2ggb2YgdGhlbSBhbiBvcHBvcnR1bml0eSB0byBwYXVzZSB0aGUKLSAqIG9wZXJhdGlvbiBieSByZXR1cm5pbmcge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyI1BBVVNFfS4KLSAqIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudH0gaGFzIG1vcmUgZGV0YWlscyBvbiB3aGVuIHRoZXNlIGV2ZW50cyBhcmUgZmlyZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2Vlb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2dldERlZmF1bHRPcGVyYXRpb24oKQotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIGV4dGVuZHMgSURhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBuZXZlciBiZWVuIGV4ZWN1dGVkLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcwotCSAqIHN0YXRlIGl0IG1heSBvbmx5IGJlIGV4ZWN1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9TVEFSVEVEID0gMDsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoaWxlIHRoZSBvcGVyYXRpb24gaXMgZXhlY3V0aW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdAotCSAqIG1heSBvbmx5IGJlIHBhdXNlZCBieSBhbiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HX0VYRUNVVEUgPSAxOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hpbGUgdGhlIG9wZXJhdGlvbiBpcyByb2xsaW5nIGJhY2suIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlCi0JICogaXQgbWF5IG9ubHkgYmUgcGF1c2VkIGJ5IGFuIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn0uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI3JvbGxCYWNrKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkdfUk9MTEJBQ0sgPSAyOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hpbGUgdGhlIG9wZXJhdGlvbiBpcyByZWRvaW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdAotCSAqIG1heSBvbmx5IGJlIHBhdXNlZCBieSBhbiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HX1VORE8gPSAzOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hpbGUgdGhlIG9wZXJhaXRvbiBpcyByZWRvaW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdAotCSAqIG1heSBvbmx5IGJlIHBhdXNlZCBieSBhbiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jcmVkbyhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HX1JFRE8gPSA0OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHBhdXNlZCB3aGlsZSBpdCB3YXMgZXhlY3V0aW5nLiBXaGVuIHRoZQotCSAqIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0IG1heSBlaXRoZXIgYmUgcmVzdW1lZCB0byBjb250aW51ZSBleGVjdXRpb24gb3Igcm9sbGVkIGJhY2sgdG8KLQkgKiB1bmRvIHRoZSBwYXJ0aWFsIGV4ZWN1dGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjcmVzdW1lKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSAjcm9sbEJhY2soSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRURfRVhFQ1VURSA9IDU7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcGF1c2VkIHdoaWxlIGl0IHdhcyByb2xsaW5nIGJhY2suIFdoZW4gdGhlCi0JICogb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQgbWF5IGVpdGhlciBiZSByZXN1bWVkIHRvIGNvbnRpbnVlIHJvbGxpbmcgYmFjayBvciBleGVjdXRlZAotCSAqIHdoaWNoIGNvbnRpbnVlIHRoZSBmb3dhcmQgZXhlY3V0aW9uIGZyb20gdGhlIHBvaW50IHdoZXJlIHRoZSByb2xsYmFjayB3YXMgcGF1c2VkCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI3Jlc3VtZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0VEX1JPTExCQUNLID0gNjsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBwYXVzZWQgd2hpbGUgaXQgd2FzIHVuZG9pbmcuIFdoZW4gdGhlCi0JICogb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQgbWF5IGJlIG9ubHkgYmUgcmVzdW1lZCB0byBjb250aW51ZSB1bmRvaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNyZXN1bWUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRURfVU5ETyA9IDc7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcGF1c2VkIHdoaWxlIGl0IHdhcyByZWRvaW5nLiBXaGVuIHRoZQotCSAqIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0IG1heSBvbmx5IGJlIHJlc3VtZWQgdG8gY29udGludWUgcmVkb2luZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjcmVzdW1lKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0VEX1JFRE8gPSA4OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVkIGV4ZWN1dGlvbi4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMKLQkgKiBzdGF0ZSBpdCBtYXkgb25seSBiZSB1bmRvbmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVfRVhFQ1VURSA9IDk7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZWQgcm9sbGluZyBiYWNrLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcwotCSAqIHN0YXRlIGl0IG1heSBvbmx5IGJlIGV4ZWN1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFX1JPTExCQUNLID0gMTA7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZWQgdW5kb2luZy4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUKLQkgKiBpdCBtYXkgb25seSBiZSByZWRvbmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVfVU5ETyA9IDExOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVkIHJlZG9pbmcuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlCi0JICogaXQgbWF5IG9ubHkgYmUgdWRvbmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVfUkVETyA9IDEyOwotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZSBvZiB0aGUgb3BlcmF0aW9uLiBSZXR1cm5zIG9uZSBvZjoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayAjTk9UX1NUQVJURUR9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNSVU5OSU5HX0VYRUNVVEV9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNSVU5OSU5HX1JPTExCQUNLfTwvbGk+Ci0JICogPGxpPntAbGluayAjUlVOTklOR19VTkRPfTwvbGk+Ci0JICogPGxpPntAbGluayAjUlVOTklOR19SRURPfTwvbGk+Ci0JICogPGxpPntAbGluayAjUEFVU0VEX0VYRUNVVEV9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNQQVVTRURfUk9MTEJBQ0t9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNQQVVTRURfVU5ET308L2xpPgotCSAqIDxsaT57QGxpbmsgI1BBVVNFRF9SRURPfTwvbGk+Ci0JICogPGxpPntAbGluayAjQ09NUExFVEVfRVhFQ1VURX08L2xpPgotCSAqIDxsaT57QGxpbmsgI0NPTVBMRVRFX1JPTExCQUNLfTwvbGk+Ci0JICogPGxpPntAbGluayAjQ09NUExFVEVfVU5ET308L2xpPgotCSAqIDxsaT57QGxpbmsgI0NPTVBMRVRFX1JFRE99PC9saT4KLQkgKiA8L3VsPgotCSAqIDxwPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uU3RhdGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlc3VtZXMgZXhlY3V0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgY3VyZW50bHkgcGF1c2VkLiBBbiBvcGVyYXRpb24gaXMgcGF1c2VkIGlmCi0JICoge0BsaW5rICNnZXRFeGVjdXRpb25TdGF0ZSgpfSByZXR1cm5zIGFueSBvZiB7QGxpbmsgI1BBVVNFRF9FWEVDVVRFfSwKLQkgKiB7QGxpbmsgI1BBVVNFRF9ST0xMQkFDS30sIHtAbGluayAjUEFVU0VEX1VORE99LCBvciB7QGxpbmsgI1BBVVNFRF9SRURPfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIChvciA8Y29kZT5udWxsPC9jb2RlPikgdG8gdXNlIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgdG8KLQkgKiAgICAgICAgICAgIHRoZSB1c2VyLgotCSAqIEBwYXJhbSBpbmZvCi0JICogICAgICAgICAgICB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5Ci0JICogICAgICAgICAgICBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZSB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlciBmb3IgdGhlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJU3RhdHVzIG9mIHRoZSByZXN1bWUuIFRoZSBzdGF0dXMgc2V2ZXJpdHkgc2hvdWxkIGJlIHNldCB0byA8Y29kZT5PSzwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGFuZCA8Y29kZT5FUlJPUjwvY29kZT4gaWYgaXQgd2FzIG5vdC4gQW55IG90aGVyCi0JICogICAgICAgICBzdGF0dXMgaXMgYXNzdW1lZCB0byByZXByZXNlbnQgYW4gaW5jb21wbGV0aW9uIG9mIHRoZSByZXN1bWUuCi0JICovCi0JcHVibGljIElTdGF0dXMgcmVzdW1lKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogUm9sbHMgYmFjayB0aGUgcGFydGlhbCBleGVjdXRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgaW4KLQkgKiB7QGxpbmsgI2dldEV4ZWN1dGlvblN0YXRlKCl9IHJldHVybnMgZWl0ZXIge0BsaW5rICNQQVVTRURfRVhFQ1VURX0gb3IKLQkgKiB7QGxpbmsgI1BBVVNFRF9ST0xMQkFDS30uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHRvIHVzZSBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIHRvCi0JICogICAgICAgICAgICB0aGUgdXNlci4KLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseQotCSAqICAgICAgICAgICAgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIgZm9yIHRoZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBvZiB0aGUgcmVzdW1lLiBUaGUgc3RhdHVzIHNldmVyaXR5IHNob3VsZCBiZSBzZXQgdG8gPGNvZGU+T0s8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhbmQgPGNvZGU+RVJST1I8L2NvZGU+IGlmIGl0IHdhcyBub3QuIEFueSBvdGhlcgotCSAqICAgICAgICAgc3RhdHVzIGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGFuIGluY29tcGxldGlvbiBvZiB0aGUgcmVzdW1lLgotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJvbGxCYWNrKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBvcGVyYXRpb24gZXZlbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBJT3BlcmF0aW9uTGlzdGVuZXIgdG8gYWRkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbkxpc3RlbmVyKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyIG9wZXJhdGlvbkxpc3RlbmVyKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBJT3BlcmF0aW9uTGluc3RlbmVyLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb25MaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIElPcGVyYXRvaW5MaXN0ZW5lciB0byByZW1vdmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgb3BlcmF0aW9uTGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2NzgwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogPHA+Ci0gKiBUaGVzZSBldmVudHMgYXJlIGZpcmVkIHRvIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn1zIGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn1zIGR1cmluZyBleGVjdXRpb24sIHJvbGxiYWNrLCB1bmRvLAotICogYW5kIHJlZG8uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogPGI+RXhhbXBsZSAyPC9iPiBmcm9tIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259PGJyPgotICogPHByZT4KLSAqICAgICAgICAgIFgKLSAqICAgICAgICAgLyBcCi0gKiAgICAgICAgLyAgIFwKLSAqICAgICAgIEEgICAgIEIKLSAqICAgICAgLyBcICAgLyBcCi0gKiAgICAgQyAgIEQgRSAgIEYKLSAqIDwvcHJlPgotICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBldmVudHMgd2lsbCBiZSBmaXJlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGR1cmluZyBhbiBleGVjdXRpb246Ci0gKiA8dGFibGUgYm9yZGVyPTE+Ci0gKiA8dHI+PHRoPm9wZXJhdGlvbjwvdGg+PHRoPm9wZXJhdGlvbiB0eXBlPC90aD48dGg+ZXhlY3V0aW9uIHR5cGU8L3RoPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDwvdGFibGU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMjwvYj4gZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufTxicj4KLSAqIDxwcmU+Ci0gKiAgICAgICAgICBYCi0gKiAgICAgICAgIC8gXAotICogICAgICAgIC8gICBcCi0gKiAgICAgICBBICAgICBCCi0gKiAgICAgIC8gXCAgIC8gXAotICogICAgIEMgICBEIEUgICBGCi0gKiA8L3ByZT4KLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXZlbnRzIHdpbGwgYmUgZmlyZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBkdXJpbmcgYSByb2xsYmFjazoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIDx0cj48dGg+b3BlcmF0aW9uPC90aD48dGg+b3BlcmF0aW9uIHR5cGU8L3RoPjx0aD5leGVjdXRpb24gdHlwZTwvdGg+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDwvdGFibGU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMjwvYj4gZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufTxicj4KLSAqIDxwcmU+Ci0gKiAgICAgICAgICBYCi0gKiAgICAgICAgIC8gXAotICogICAgICAgIC8gICBcCi0gKiAgICAgICBBICAgICBCCi0gKiAgICAgIC8gXCAgIC8gXAotICogICAgIEMgICBEIEUgICBGCi0gKiA8L3ByZT4KLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXZlbnRzIHdpbGwgYmUgZmlyZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBkdXJpbmcgYW4gdW5kbzoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIDx0cj48dGg+b3BlcmF0aW9uPC90aD48dGg+b3BlcmF0aW9uIHR5cGU8L3RoPjx0aD5leGVjdXRpb24gdHlwZTwvdGg+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8L3RhYmxlPgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5FeGFtcGxlIDI8L2I+IGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn08YnI+Ci0gKiA8cHJlPgotICogICAgICAgICAgWAotICogICAgICAgICAvIFwKLSAqICAgICAgICAvICAgXAotICogICAgICAgQSAgICAgQgotICogICAgICAvIFwgICAvIFwKLSAqICAgICBDICAgRCBFICAgRgotICogPC9wcmU+Ci0gKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgZHVyaW5nIGEgcmVkbzoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIDx0cj48dGg+b3BlcmF0aW9uPC90aD48dGg+b3BlcmF0aW9uIHR5cGU8L3RoPjx0aD5leGVjdXRpb24gdHlwZTwvdGg+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8L3RhYmxlPgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50IHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gdHlwZSBzZXQgd2hlbiBhbiBvcGVyYXRpb24gZXhlY3V0aW9uIHRyYXZlcnNhbCBpcyBhYm91dCB0byBzdGFydCB3aXRoaW4gdGhlCi0JICogdHJlZSBvZiBvcGVyYXRpb25zIGhhbmRsZWQgYnkgdGhlIG93bmluZyB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufS4gVGhpcyBvcGVyYXRpb24KLQkgKiB0eXBlIGlzIG9ubHkgc2V0IHdoZW4gdGhlIGV4ZWN1dGlvbiB0eXBlIGlzIHNldCB0byB7QGxpbmsgI0VYRUNVVEV9LiBVc2luZyB0aGUgZXhhbXBsZQotCSAqIGFib3ZlLCBldmVudHMgd2l0aCB0aGlzIG9wZXJhdGlvbiB0eXBlIHdpbGwgYmUgZmlyZWQgYWNjb3JkaW5nIHRvIGFuIGluIG9yZGVyIHRyYXZlcnNhbCBvZgotCSAqIHRoZSB0cmVlOyBpLmUuIFhBQ0RCRUYKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9TVEFSVElORyA9IDE7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiB0eXBlIHNldCB3aGVuIGFuIG9wZXJhdGlvbiBleGVjdXRpb24gdHJhdmVyc2FsIGZpbmlzaGVzIHdpdGhpbiB0aGUgdHJlZSBvZgotCSAqIG9wZXJhdGlvbnMgaGFuZGxlZCBieSB0aGUgb3duaW5nIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259LiBUaGlzIG9wZXJhdGlvbiB0eXBlIGlzCi0JICogb25seSBzZXQgd2hlbiB0aGUgZXhlY3V0aW9uIHR5cGUgaXMgc2V0IHRvIHtAbGluayAjRVhFQ1VURX0uIFVzaW5nIHRoZSBleGFtcGxlIGFib3ZlLCBldmVudHMKLQkgKiB3aXRoIHRoaXMgb3BlcmF0aW9uIHR5cGUgd2lsbCBiZSBmaXJlZCBhY2NvcmRpbmcgdG8gYSBwb3N0IG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZTsgaS5lLgotCSAqIENEQUVGQlgKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9GSU5JU0hFRCA9IDI7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiB0eXBlIHNldCByaWdodCBiZWZvcmUgYW4gb3BlcmF0aW9uIGlzIGdvaW5nIHRvIGRvIGl0cyB3b3JrLiBUaGlzIG9wZXJhdGlvbiB0eXBlCi0JICogbWF5IGJlIHVzZWQgd2l0aCBhbGwgZXhlY3Rpb24gdHlwZXMuIFVzaW5nIHRoZSBleGFtcGxlIGFib3ZlLCBldmVudHMgd2l0aCB0aGlzIG9wZXJpdG9uIHR5cGUKLQkgKiB3aWxsIGJlIGZpcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRyZWUgdHJhdmVyc2FsOiBDQURYQkVGCi0JICogPHA+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9TVEFSVElORyA9IDM7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiB0eXBlIHNldCBpbW1lZGlhdGx5IGFmdGVyIGFuIG9wZXJhdGlvbiBmaW5zaGVkIGRvaW5nIGl0cyB3b3JrLiBUaGlzIG9wZXJhdGlvbgotCSAqIHR5cGUgbWF5IGJlIHVzZWQgd2l0aCBhbGwgZXhlY3Rpb24gdHlwZXMuIFVzaW5nIHRoZSBleGFtcGxlIGFib3ZlLCBldmVudHMgd2l0aCB0aGlzIG9wZXJpdG9uCi0JICogdHlwZSB3aWxsIGJlIGZpcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRyZWUgdHJhdmVyc2FsOiBDQURYQkVGCi0JICogPHA+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9GSU5JU0hFRCA9IDQ7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhlY3V0aW9uIHR5cGUgc2V0IHdoZW4gZHVyaW5nIGV4ZWN1dGlvbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURSA9IDA7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZWN1dGlvbiB0eXBlIHNldCB3aGVuIGR1cmluZyByb2xsYmFjay4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9MTEJBQ0sgPSAxOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGVjdXRpb24gdHlwZSBzZXQgd2hlbiBkdXJpbmcgdW5kby4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ETyA9IDI7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZWN1dGlvbiB0eXBlIHNldCB3aGVuIGR1cmluZyByZWRvLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURPID0gMzsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIG9wZXJhdGlvbiBpbiBxdWVzdGlvbi4gVGhpcyBvcGVyYXRpb24gd2lsbCBiZSBvbmUgb2YgdGhlIG9wZXJhdGlvbnMgd2l0aGluIHRoZQotCSAqIHRyZWUgb2Ygb3BlcmF0aW9ucyBoYW5kbGVkIGJ5IHRoZSBvd25pbmcge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn0KLQkgKiBleGVjdXRpbmcgaXQuIFRoaXMgd2lsbCBiZSBvbmUgb2Yge0BsaW5rICNOT0RFX1NUQVJUSU5HfSwge0BsaW5rICNOT0RFX0ZJTklTSEVEfSwKLQkgKiB7QGxpbmsgI01BSU5fU1RBUlRJTkd9LCBvciB7QGxpbmsgI01BSU5fRklOSVNIRUR9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIG9uZSBvZiB7QGxpbmsgI05PREVfU1RBUlRJTkd9LCB7QGxpbmsgI05PREVfRklOSVNIRUR9LCB7QGxpbmsgI01BSU5fU1RBUlRJTkd9LCBvcgotCSAqICAgICAgICAge0BsaW5rICNNQUlOX0ZJTklTSEVEfS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgZXhlY3V0aW9uIHRoZSBvcGVyYXRpb24gaXMgYWJvdXQgdG8gYmVnaW4uIFRoaXMgd2lsbCBiZSBvbmUgb2YKLQkgKiB7QGxpbmsgI0VYRUNVVEV9LCB7QGxpbmsgI1JPTExCQUNLfSwge0BsaW5rICNVTkRPfSwgb3Ige0BsaW5rICNSRURPfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBvbmUgb2Yge0BsaW5rICNFWEVDVVRFfSwge0BsaW5rICNST0xMQkFDS30sIHtAbGluayAjVU5ET30sIG9yIHtAbGluayAjUkVET30uCi0JICovCi0JcHVibGljIGludCBnZXRFeGVjdXRpb25UeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVmNDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSAqIDxwPgotICogVXNlZCB0byBsaXN0ZW4gZm9yIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudH1zIGZpcmVkIGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn1zLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgewotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyBzaG91bGQgcmV0dXJuIHRoaXMgY29uc3RhbnQgZnJvbSB7QGxpbmsgI25vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCl9IHRvIHNwZWNpZnkgdGhhdAotCSAqIGV4ZWN1dGlvbiBzaG91bGQgY29udGludWUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRJTlVFID0gMDsKLQotCS8qKgotCSAqIDxwPgotCSAqIENsaWVudHMgc2hvdWxkIHJldHVybiB0aGlzIGNvbnN0YW50IGZyb20ge0BsaW5rICNub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQpfSB0byBzcGVjaWZ5IHRoYXQKLQkgKiBleGVjdXRpb24gc2hvdWxkIHBhdXNlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRSA9IDE7Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIExpc3RlbmVyIGludGVyZmFjZSBieSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufSBmb3Igb3BlcmF0aW9uIGV4ZWN1dGlvbgotCSAqIG5vdGlmaWNhdGlvbi4gUHJpb3IgdG8gc3RhcnRpbmcgYW55IG9wZXJhdGlvbidzIGV4ZWN1dGlvbiwgbm90aWZpY2F0aW9ucyB3aWxsIGJlIHNlbnQgd2hpY2gKLQkgKiBhbGxvdyBjbGllbnRzIHRvIHBhdXNlIGFuIG9wZXJhdGlvbidzIGV4ZWN1dGlvbi4gSW1wbGVtZW50ZXJzIHNob3VsZCByZXR1cm4ge0BsaW5rICNDT05USU5VRX0KLQkgKiB0byBhbGxvdyB0aGUgb3BlcmF0aW9uJ3MgZXhlY3V0aW9uIHRvIGNvbnRpbnVlIG9yIHtAbGluayAjUEFVU0V9IHRvIHBhdXNlIGV4ZWN1dGlvbi4gSWYKLQkgKiB7QGxpbmsgI1BBVVNFfSBpcyByZXR1cm5lZCwgdGhlbiB0aGUgZW50aXJlIG9wZXJhdGlvbiBzdGFjayB3aWxsIGJlIHBhdXNlZCB1bnRpbCBpdCBpcwotCSAqIHJlc3VtZWQuIFRoZSByZXNwb25zaWJsaXR5IGZvciByZXN1bWluZyBhIHBhdXNlZCBvcGVyYXRpb24gbGllcyBvbiB0aGUgY2xpZW50IHRoYXQgcGF1c2VkIGl0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBvcGVyYXRpb24gZXZlbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybiBDT05USU5VRSB0byBjb250aW51ZSwgb3IgUEFVU0UgdG8gcGF1c2UuCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24jYWRkT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIpCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24jcmVzdW1lKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIGludCBub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTRiZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwcml2YXRlIElBZGFwdGFibGUgaW5mbzsKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi1wdWJsaWMgSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyhJQWRhcHRhYmxlIGluZm8pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQl9Ci1wdWJsaWMgSUFkYXB0YWJsZSBnZXRJbmZvKCkgewotCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQlyZXR1cm4gaW5mbzsKLX0KLXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJU3RhdHVzIGFTdGF0dXMpIHsKLQlzdGF0dXMgPSBhU3RhdHVzOwotfQotCi1wdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCX0KLXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9XcmFwcGVkT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9XcmFwcGVkT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMzU4NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvV3JhcHBlZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZE9wZXJhdGlvbiBpbXBsZW1lbnRzIElEYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQkKLQlwdWJsaWMgV3JhcHBlZE9wZXJhdGlvbihJRGF0YU1vZGVsT3BlcmF0aW9uIHJvb3RPcGVyYXRpb24pIHsKLQkJdGhpcy5yb290T3BlcmF0aW9uID0gcm9vdE9wZXJhdGlvbjsKLQkJaWYgKG51bGwgPT0gcm9vdE9wZXJhdGlvbikgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uY2FuUmVkbygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmNhblVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpIHsKLQkJcm9vdE9wZXJhdGlvbi5zZXRJRChpZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0SUQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQlyb290T3BlcmF0aW9uLnNldERhdGFNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXREYXRhTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQkJcm9vdE9wZXJhdGlvbi5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7Ci0JfQotCi0JcHVibGljIElFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0RW52aXJvbm1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXRTY2hlZHVsaW5nUnVsZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi51bmRvKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5yZWRvKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgSVVuZG9Db250ZXh0W10gZ2V0Q29udGV4dHMoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldENvbnRleHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29udGV4dChJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5oYXNDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJcm9vdE9wZXJhdGlvbi5hZGRDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJcm9vdE9wZXJhdGlvbi5yZW1vdmVDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJvb3RPcGVyYXRpb24uZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Fic3RyYWN0SWRlbnRpZmlhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQWJzdHJhY3RJZGVudGlmaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkMTQzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQWJzdHJhY3RJZGVudGlmaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0SWRlbnRpZmlhYmxlIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgQWJzdHJhY3RJZGVudGlmaWFibGUoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0FzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0FzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFmYTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9Bc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIHNpbmdsZXRvbjsKLQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpZiAobzIgPT0gbnVsbCAmJiBvMSAhPSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobzEgPT0gbnVsbCAmJiBvMiAhPSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChvMSA9PSBudWxsICYmIG8yID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMSA9IChGdW5jdGlvbkdyb3VwKSBvMTsKLQkJRnVuY3Rpb25Hcm91cCBncm91cDIgPSAoRnVuY3Rpb25Hcm91cCkgbzI7Ci0KLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpID4gZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpID09IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA8IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3Igc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGF0YU1vZGVsRW5hYmxlbWVudEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGUxMjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsRW5hYmxlbWVudEZhY3RvcnkgewotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBJRGF0YU1vZGVsUHJvdmlkZXIgYnkgdGhlIHNwZWNpZmllZCBwcm92aWRlcktpbmQgU3RyaW5nIGFuZCBhCi0JICogY29udGV4dCBvZiB0aGUgY29udGFpbmluZyBQcm9qZWN0LiBUaGUgbWV0aG9kIGdldHMgYW4gYXJyYXkgb2YgRGF0YU1vZGVsUHJvdmlkZXJEZXNjcmlwdG9yCi0JICogZnJvbSB0aGUgYmFzZSBEYXRhTW9kZWxGYWN0b3J5IHRoZW4gZmlsdGVycyBvdXQgUHJvdmlkZXJzIGJhc2VkIG9uIGZ1bmN0aW9uIGdyb3VwIGVuYWJsZW1lbnQuCi0JICogRmluYWxseSB0aGUgUHJvdmlkZXIgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSBpcyByZXR1cm5lZC4gSWYgdGhlIElEYXRhTW9kZWxQcm92aWRlciBpcyBub3QKLQkgKiBmb3VuZCB0aGVuIGEgUnVudGltZUV4Y2VwdGlvbiBpcyBsb2dnZWQgYW5kIG51bGwgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyS2luZAotCSAqICAgICAgICAgICAgdGhlIFN0cmluZyBpZCBvZiB0aGUgcHJvdmlkZXIga2luZAotCSAqIEBwYXJhbSBjdXJQcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBJUHJvamVjdAotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoU3RyaW5nIHByb3ZpZGVyS2luZCwgSVByb2plY3QgY3VyUHJvamVjdCkgewotCQlTdHJpbmdbXSBwcm92aWRlcklEcyA9IERhdGFNb2RlbEZhY3RvcnkuZ2V0RGF0YU1vZGVsUHJvdmlkZXJJRHNGb3JLaW5kKHByb3ZpZGVyS2luZCk7Ci0JCWlmIChwcm92aWRlcklEcyA9PSBudWxsIHx8IHByb3ZpZGVySURzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0b3BQcm92aWRlciA9IGdldEhpZ2hlc3RQcmlvcml0eUVuYWJsZWRQcm92aWRlckRlc2MocHJvdmlkZXJJRHMsIGN1clByb2plY3QpOwotCQlpZiAodG9wUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwodG9wUHJvdmlkZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIaWdoZXN0UHJpb3JpdHlFbmFibGVkUHJvdmlkZXJEZXNjKFN0cmluZ1tdIHByb3ZpZGVySURzLCBJUHJvamVjdCBjdXJQcm9qZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0SUQgPSBwcm92aWRlcklEc1swXTsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGVuYWJsZW1lbnRJZGVudGlmaWVyOwotCQlJZGVudGlmaWFibGUgdGVtcElkZW50aWZpYWJsZTsKLQkJSWRlbnRpZmlhYmxlIHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8IHByb3ZpZGVySURzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0ZW1wSWRlbnRpZmlhYmxlID0gbmV3IEFic3RyYWN0SWRlbnRpZmlhYmxlKHByb3ZpZGVySURzW2ldKTsKLQkJCWVuYWJsZW1lbnRJZGVudGlmaWVyID0gRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcih0ZW1wSWRlbnRpZmlhYmxlLmdldElEKCksIGN1clByb2plY3QpOwotCQkJaWYgKGVuYWJsZW1lbnRJZGVudGlmaWVyLmlzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID09IG51bGwpCi0JCQkJCXRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID0gdGVtcElkZW50aWZpYWJsZTsKLQkJCQllbHNlIGlmIChJZGVudGlmaWFibGVDb21wYXJhdG9yLmluc3RhbmNlLmNvbXBhcmUodGVtcElkZW50aWZpYWJsZSwgdG9wUHJpb3JpdHlJZGVudGlmaWFibGUpID09IElkZW50aWZpYWJsZUNvbXBhcmF0b3IuR1JFQVRFUl9USEFOKQotCQkJCQl0b3BQcmlvcml0eUlkZW50aWZpYWJsZSA9IHRlbXBJZGVudGlmaWFibGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdElEOwotCQlyZXR1cm4gdG9wUHJpb3JpdHlJZGVudGlmaWFibGUuZ2V0SUQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Rlc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyMDg1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIHNpbmdsZXRvbjsKLQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpZiAobzEgPT0gbnVsbCAmJiBvMiAhPSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobzIgPT0gbnVsbCAmJiBvMSAhPSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChvMSA9PSBudWxsICYmIG8yID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMSA9IChGdW5jdGlvbkdyb3VwKSBvMTsKLQkJRnVuY3Rpb25Hcm91cCBncm91cDIgPSAoRnVuY3Rpb25Hcm91cCkgbzI7Ci0KLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpID4gZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA9PSBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAwOwotCQlpZiAoZ3JvdXAxLmdldFByaW9yaXR5KCkgPCBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gMDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQ3YTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVtZW50SWRlbnRpZmllciBpbXBsZW1lbnRzIElFbmFibGVtZW50SWRlbnRpZmllciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9GQUNUT1IgPSA4OTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBIQVNIX0lOSVRJQUwgPSBFbmFibGVtZW50SWRlbnRpZmllci5jbGFzcy5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFNldCBzdHJvbmdSZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgU2V0IGZ1bmN0aW9uR3JvdXBJZHM7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBTdHJpbmdbXSBmdW5jdGlvbkdyb3VwSWRzQXNBcnJheTsKLQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2hDb2RlOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBoYXNoQ29kZUNvbXB1dGVkOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIExpc3QgaWRlbnRpZmllckxpc3RlbmVyczsKLQotCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBzdHJpbmc7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgRW5hYmxlbWVudElkZW50aWZpZXIoU3RyaW5nIGlkKSB7Ci0JCXRoaXMoaWQsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBFbmFibGVtZW50SWRlbnRpZmllcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZElkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpIHsKLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWlkZW50aWZpZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKCFpZGVudGlmaWVyTGlzdGVuZXJzLmNvbnRhaW5zKGlkZW50aWZpZXJMaXN0ZW5lcikpCi0JCQlpZGVudGlmaWVyTGlzdGVuZXJzLmFkZChpZGVudGlmaWVyTGlzdGVuZXIpOwotCi0JCXN0cm9uZ1JlZmVyZW5jZXMuYWRkKHRoaXMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmplY3QpIHsKLQkJRW5hYmxlbWVudElkZW50aWZpZXIgY2FzdGVkT2JqZWN0ID0gKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBvYmplY3Q7Ci0JCXJldHVybiBVdGlsLmNvbXBhcmUoaWQsIGNhc3RlZE9iamVjdC5pZCk7Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBFbmFibGVtZW50SWRlbnRpZmllcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRW5hYmxlbWVudElkZW50aWZpZXIgY2FzdGVkT2JqZWN0ID0gKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBvYmplY3Q7Ci0JCWJvb2xlYW4gZXF1YWxzID0gVXRpbC5lcXVhbHMoaWQsIGNhc3RlZE9iamVjdC5pZCk7Ci0JCXJldHVybiBlcXVhbHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZnVuY3Rpb25JZGVudGlmaWVyRXZlbnQpIHsKLQkJaWYgKGZ1bmN0aW9uSWRlbnRpZmllckV2ZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlpZiAoaWRlbnRpZmllckxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGlkZW50aWZpZXJMaXN0ZW5lcnMpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlkZW50aWZpZXJMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspCi0JCQkJCSgoSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIpIGlkZW50aWZpZXJMaXN0ZW5lcnMuZ2V0KGkpKS5pZGVudGlmaWVyQ2hhbmdlZChmdW5jdGlvbklkZW50aWZpZXJFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEZ1bmN0aW9uR3JvdXBJZHMoKSB7Ci0JCXJldHVybiBmdW5jdGlvbkdyb3VwSWRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoIWhhc2hDb2RlQ29tcHV0ZWQpIHsKLQkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShpZCk7Ci0JCQloYXNoQ29kZUNvbXB1dGVkID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpIHsKLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCWlkZW50aWZpZXJMaXN0ZW5lcnMucmVtb3ZlKGlkZW50aWZpZXJMaXN0ZW5lcik7Ci0KLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lcnMuaXNFbXB0eSgpKQotCQkJc3Ryb25nUmVmZXJlbmNlcy5yZW1vdmUodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RnVuY3Rpb25Hcm91cElkcyhTZXQgZnVuY3Rpb25Hcm91cElkcykgewotCQlTZXQgc2FmZUZ1bmN0aW9uR3JvdXBJZHMgPSBVdGlsLnNhZmVDb3B5KGZ1bmN0aW9uR3JvdXBJZHMsIFN0cmluZy5jbGFzcyk7Ci0KLQkJaWYgKCFVdGlsLmVxdWFscyhzYWZlRnVuY3Rpb25Hcm91cElkcywgdGhpcy5mdW5jdGlvbkdyb3VwSWRzKSkgewotCQkJdGhpcy5mdW5jdGlvbkdyb3VwSWRzID0gc2FmZUZ1bmN0aW9uR3JvdXBJZHM7Ci0JCQl0aGlzLmZ1bmN0aW9uR3JvdXBJZHNBc0FycmF5ID0gKFN0cmluZ1tdKSB0aGlzLmZ1bmN0aW9uR3JvdXBJZHMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMuZnVuY3Rpb25Hcm91cElkcy5zaXplKCldKTsKLQotCQkJaGFzaENvZGVDb21wdXRlZCA9IGZhbHNlOwotCQkJaGFzaENvZGUgPSAwOwotCQkJc3RyaW5nID0gbnVsbDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChlbmFibGVkICE9IHRoaXMuZW5hYmxlZCkgewotCQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQkJCWhhc2hDb2RlQ29tcHV0ZWQgPSBmYWxzZTsKLQkJCWhhc2hDb2RlID0gMDsKLQkJCXN0cmluZyA9IG51bGw7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWNvbXB1dGUgdGhlIGVuYWJsZWQgc3RhdGUgYW5kIHJldHVybiB3aGV0aGVyIHRoZSBzdGF0ZSBjaGFuZ2VkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzZXRFbmFibGVkKCkgewotCQlyZXR1cm4gc2V0RW5hYmxlZChnZXROZXdFbmFibGVkKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldE5ld0VuYWJsZWQoKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGZ1bmN0aW9uR3JvdXBJZHNBc0FycmF5Lmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb25Hcm91cElkc0FzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSBGdW5jdGlvbkdyb3VwUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRHcm91cEJ5SUQoZnVuY3Rpb25Hcm91cElkc0FzQXJyYXlbaV0pOwotCQkJaWYgKGdyb3VwICE9IG51bGwgJiYgZ3JvdXAuaXNFbmFibGVkKHByb2plY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCdbJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZ1bmN0aW9uR3JvdXBJZHMpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChlbmFibGVkKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJywnKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoaWQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnXScpOwotCQkJc3RyaW5nID0gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFRoZSBhc3NvY2lhdGVkIFByb2plY3QgbWF5IGJlIG51bGwKLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUZ1bmN0aW9uR3JvdXBJZCgpIHsKLQkJaW50IHNlbGVjdGVkUHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJaW50IHByaW9yaXR5ID0gMDsKLQkJU3RyaW5nIHNlbGVjdGVkRnVuY3Rpb25Hcm91cElkID0gbnVsbDsKLQkJU3RyaW5nIGZ1bmN0aW9uR3JvdXBJZCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRGdW5jdGlvbkdyb3VwSWRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJZnVuY3Rpb25Hcm91cElkID0gaXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCk7Ci0JCQlwcmlvcml0eSA9IEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEdyb3VwUHJpb3JpdHkoZnVuY3Rpb25Hcm91cElkKTsKLQkJCWlmIChwcmlvcml0eSA8IHNlbGVjdGVkUHJpb3JpdHkpCi0JCQkJc2VsZWN0ZWRGdW5jdGlvbkdyb3VwSWQgPSBmdW5jdGlvbkdyb3VwSWQ7Ci0JCQlpZiAocHJpb3JpdHkgPT0gMCkKLQkJCQlyZXR1cm4gc2VsZWN0ZWRGdW5jdGlvbkdyb3VwSWQ7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkRnVuY3Rpb25Hcm91cElkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDc3YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgewotCi0JcHJpdmF0ZSBib29sZWFuIGZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkQ2hhbmdlZDsKLQlwcml2YXRlIElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyOwotCi0JcHVibGljIEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIsIGJvb2xlYW4gZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQsIGJvb2xlYW4gZW5hYmxlZENoYW5nZWQpIHsKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCXRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7Ci0JCXRoaXMuZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQgPSBmdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZDsKLQkJdGhpcy5lbmFibGVkQ2hhbmdlZCA9IGVuYWJsZWRDaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBjaGFuZ2VkLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSUVuYWJsZW1lbnRJZGVudGlmaWVyIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGZ1bmN0aW9uR3JvdXBJZHMgcHJvcGVydHkgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUsIGlmZiB0aGUgZnVuY3Rpb25Hcm91cElkcyBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Z1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkKCkgewotCQlyZXR1cm4gZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZW5hYmxlZCBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSwgaWZmIHRoZSBlbmFibGVkIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRW5hYmxlZENoYW5nZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkQ2hhbmdlZDsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IFtpZGVudGlmaWVyPSIgKyBpZGVudGlmaWVyLnRvU3RyaW5nKCkgKyAiLCBmdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZD0iICsgaGFzRnVuY3Rpb25Hcm91cElkc0NoYW5nZWQoKSArICIsIGVuYWJsZWRDaGFuZ2VkPSIgKyBoYXNFbmFibGVkQ2hhbmdlZCgpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyMWRlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDMsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtCi0gKiBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVtZW50TWFuYWdlciBpbXBsZW1lbnRzIElFbmFibGVtZW50TWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbmFibGVtZW50TWFuYWdlciBJTlNUQU5DRSA9IG5ldyBFbmFibGVtZW50TWFuYWdlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGlkZW50aWZpZXJzQnlQcm9qZWN0ID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgRW5hYmxlbWVudE1hbmFnZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIE1hcCBpbiB3aGljaCB0aGUga2V5cyBhcmUgaWRzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgaWRlbnRpZmllcnMKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldElkZW50aWZpZXJzQnlJZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCU1hcCBhTWFwID0gKE1hcCkgaWRlbnRpZmllcnNCeVByb2plY3QuZ2V0KHByb2plY3QpOwotCQlpZiAoYU1hcCA9PSBudWxsKSB7Ci0JCQlhTWFwID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0JCQlpZGVudGlmaWVyc0J5UHJvamVjdC5wdXQocHJvamVjdCwgYU1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFNYXA7Ci0JfQotCi0gICAgcHVibGljIElFbmFibGVtZW50SWRlbnRpZmllciBnZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVySWQsIElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgaWYgKGlkZW50aWZpZXJJZCA9PSBudWxsKXsKLSAgICAgICAgCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIElQcm9qZWN0IGlubmVyUHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIGlmIChpbm5lclByb2plY3QgIT0gbnVsbCAmJiAhaW5uZXJQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXsKLSAgICAgICAgCWlubmVyUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBudWxsOwotICAgICAgICBib29sZWFuIGlkZW50aWZpZXJSZXF1aXJlc1VwZGF0ZSA9IGZhbHNlOwotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotCSAgICAgICAgTWFwIGlkZW50aWZpZXJzQnlJZCA9IGdldElkZW50aWZpZXJzQnlJZChpbm5lclByb2plY3QpOwkKLQkgICAgICAgIGlkZW50aWZpZXIgPSAoRW5hYmxlbWVudElkZW50aWZpZXIpIGlkZW50aWZpZXJzQnlJZC5nZXQoaWRlbnRpZmllcklkKTsKLQkgICAgICAgIGlmKGlkZW50aWZpZXIgPT0gbnVsbCl7Ci0JICAgICAgICAJaWRlbnRpZmllclJlcXVpcmVzVXBkYXRlID0gdHJ1ZTsKLQkgICAgICAgIAlpZGVudGlmaWVyID0gY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVySWQsIGlubmVyUHJvamVjdCk7Ci0JICAgICAgICAgICAgaWRlbnRpZmllcnNCeUlkLnB1dChpZGVudGlmaWVySWQsIGlkZW50aWZpZXIpOwotCSAgICAgICAgfQotCSAgICB9Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKGlkZW50aWZpZXIpewotICAgICAgICAJaWYoaWRlbnRpZmllclJlcXVpcmVzVXBkYXRlKXsKLSAgICAgICAgICAgICAgICB1cGRhdGVJZGVudGlmaWVyKGlkZW50aWZpZXIpOwotICAgICAgICAJfQotICAgICAgICAJcmV0dXJuIGlkZW50aWZpZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcm90ZWN0ZWQgRW5hYmxlbWVudElkZW50aWZpZXIgY3JlYXRlSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcklkLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRW5hYmxlbWVudElkZW50aWZpZXIoaWRlbnRpZmllcklkLCBwcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgdXBkYXRlSWRlbnRpZmllcihFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCVN0cmluZyBpZCA9IGlkZW50aWZpZXIuZ2V0SWQoKTsKLQkJU2V0IGZ1bmN0aW9uR3JvdXBJZHMgPSBuZXcgSGFzaFNldCgpOwotCi0JCUxpc3QgZ3JvdXBzID0gRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0S25vd25Hcm91cHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGdyb3Vwcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gKEZ1bmN0aW9uR3JvdXApIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJaWYgKGdyb3VwLmlzTWF0Y2goaWQpKQotCQkJCWZ1bmN0aW9uR3JvdXBJZHMuYWRkKGdyb3VwLmdldEdyb3VwSUQoKSk7Ci0JCX0KLQotCQlib29sZWFuIGZ1bmN0aW9uR3JvdXBzQ2hhbmdlZCA9IGlkZW50aWZpZXIuc2V0RnVuY3Rpb25Hcm91cElkcyhmdW5jdGlvbkdyb3VwSWRzKTsKLQkJYm9vbGVhbiBlbmFibGVkQ2hhbmdlZCA9IGlkZW50aWZpZXIucmVzZXRFbmFibGVkKCk7Ci0KLQkJaWYgKGZ1bmN0aW9uR3JvdXBzQ2hhbmdlZCB8fCBlbmFibGVkQ2hhbmdlZCkKLQkJCXJldHVybiBuZXcgRW5hYmxlbWVudElkZW50aWZpZXJFdmVudChpZGVudGlmaWVyLCBmdW5jdGlvbkdyb3Vwc0NoYW5nZWQsIGVuYWJsZWRDaGFuZ2VkKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGFsbCBpZGVudGlmaWVyIGxpc3RlbmVycyB0aGF0IHRoZSBzdGF0ZSBvZiBhIHByb2plY3QgaGFzIGNoYW5nZWQgdGhhdCBhZmZlY3RzIHRoZQotCSAqIGVuYWJsZW1lbnQgb2YgYSBncm91cCBmb3IgYSBwcm9qZWN0LiBUaGlzIG1ldGhvZCBpcyBmYWlsIHNhZmUsIGluIHRoYXQgaWYgb25lIGxpc3RlbmVyIHRocm93cwotCSAqIGFuIGV4Y2VwdGlvbiB3aGlsZSBiZWluZyBub3RpZmllZCwgaXQgd2lsbCBub3Qgc3RvcCB0aGUgbm90aWZpY2F0aW9uIG9mIG90aGVyIGxpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gZXZ0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgZXhjZXB0aW9ucyB3ZXJlIGNhdWdodCBub3RpZnlpbmcgYW55IG9mIHRoZSBsaXN0ZW5lcnMuIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlCi0JICogICAgICAgICAgICAgY29yZSBleGNlcHRpb24gZm9yIHRoZSBuZXN0ZWQgZXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBub3RpZnlGdW5jdGlvbkdyb3VwQ2hhbmdlZChTdHJpbmcgZ3JvdXBJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCU1hcCBpZGVudGlmaWVycyA9IGdldElkZW50aWZpZXJzQnlJZChwcm9qZWN0KTsKLQotCQlpZiAoaWRlbnRpZmllcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlciA9IGlkZW50aWZpZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUlTdGF0dXMgZXJyb3JTdGF0dXMgPSBudWxsOwotCQlJU3RhdHVzIG5leHRTdGF0dXMgPSBudWxsOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJaWRlbnRpZmllciA9IChFbmFibGVtZW50SWRlbnRpZmllcikgaXRlci5uZXh0KCk7Ci0KLQkJCUVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZXZ0ID0gdXBkYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGV2dCAhPSBudWxsKQotCQkJCQlpZGVudGlmaWVyLmZpcmVJZGVudGlmaWVyQ2hhbmdlZChldnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy9EZWZlciB0aGUgZXhjZXB0aW9uIHNvIG90aGVycyBjYW4gaGFuZGxlIGl0LgotCQkJCW5leHRTdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uTWVzc2FnZXMuSU5URVJOQUxfRVJST1IsIGV4KTsKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoZXgpOwotCQkJCWlmIChlcnJvclN0YXR1cyA9PSBudWxsKQotCQkJCQllcnJvclN0YXR1cyA9IG5leHRTdGF0dXM7Ci0JCQkJZWxzZSBpZiAoZXJyb3JTdGF0dXMuaXNNdWx0aVN0YXR1cygpKQotCQkJCQkoKE11bHRpU3RhdHVzKSBlcnJvclN0YXR1cykuYWRkKG5leHRTdGF0dXMpOwotCQkJCWVsc2UgewotCQkJCQlJU3RhdHVzW10gY2hpbGRyZW4gPSB7ZXJyb3JTdGF0dXMsIG5leHRTdGF0dXN9OwotCQkJCQllcnJvclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhlcnJvclN0YXR1cy5nZXRQbHVnaW4oKSwgZXJyb3JTdGF0dXMuZ2V0Q29kZSgpLCBjaGlsZHJlbiwgV1RQQ29tbW9uTWVzc2FnZXMuSU5URVJOQUxfRVJST1IsIG51bGwpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChlcnJvclN0YXR1cyAhPSBudWxsKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oZXJyb3JTdGF0dXMpOwotCi0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGNsaWVudHMgdG8gZGlzcG9zZSBvZiBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlbWVudElkZW50aWZpZXJzCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcihDb2xsZWN0aW9uIGVuYWJsZW1lbnRJZGVudGlmaWVycywgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGVuYWJsZW1lbnRJZGVudGlmaWVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gKElFbmFibGVtZW50SWRlbnRpZmllcikgaXRlci5uZXh0KCk7Ci0JCQlpZGVudGlmaWVyLnJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDcwYmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlci9ibGFuY2V0dAotICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25Hcm91cCBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFNRV9BVFRSID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfREVTQ19BVFRSID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VOQUJMRURfQllfREVGQVVMVF9BVFRSID0gImVuYWJsZWRCeURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfUFJJT1JJVFlfQVRUUiA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9JTlRJQUxJWkVSX0NMQVNTX0FUVFIgPSAiaW5pdGlhbGl6ZXJDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FR0FUSVZFX1BSSU9SSVRZID0gLTE7Ci0KLQlwcml2YXRlIFN0cmluZyBncm91cElEOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgaW50aWFsaXplckNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdFeHRlbnNpb247Ci0JcHJpdmF0ZSBpbnQgcHJpb3JpdHkgPSBORUdBVElWRV9QUklPUklUWTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgSUdyb3VwSW5pdGlhbGl6ZXIgZ3JvdXBJbnRlcmZhY2U7Ci0JcHJpdmF0ZSBTZXQgZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nczsKLS8vCXByaXZhdGUgdHJhbnNpZW50IEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ1tdIGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3NBc0FycmF5OwotCXByaXZhdGUgYm9vbGVhbiBlcnJvclJlcG9ydGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgRnVuY3Rpb25Hcm91cChTdHJpbmcgZ3JvdXBJRCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5ncm91cElEID0gZ3JvdXBJRDsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfREVTQ19BVFRSKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCVN0cmluZyBnZXRJbml0YWxpemVyQ2xhc3NOYW1lKCkgewotCQlpZiAoaW50aWFsaXplckNsYXNzTmFtZSA9PSBudWxsKQotCQkJaW50aWFsaXplckNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX0lOVElBTElaRVJfQ0xBU1NfQVRUUik7Ci0JCXJldHVybiBpbnRpYWxpemVyQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShHUk9VUF9OQU1FX0FUVFIpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWNsYXJpbmdFeHRlbnNpb25OYW1lKCkgewotCQlpZiAoZGVjbGFyaW5nRXh0ZW5zaW9uID09IG51bGwpIHsKLQkJCWlmIChlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlkZWNsYXJpbmdFeHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmluZ0V4dGVuc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwSUQoKSB7Ci0JCXJldHVybiBncm91cElEOwotCX0KLQotCUlHcm91cEluaXRpYWxpemVyIGdldEluaXRpYWxpemVyQ2xhc3MoKSB7Ci0JCWlmIChncm91cEludGVyZmFjZSA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQlncm91cEludGVyZmFjZSA9IChJR3JvdXBJbml0aWFsaXplcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEdST1VQX0lOVElBTElaRVJfQ0xBU1NfQVRUUik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjkiLCBuZXcgT2JqZWN0W117R1JPVVBfSU5USUFMSVpFUl9DTEFTU19BVFRSLCBnZXRJbml0YWxpemVyQ2xhc3NOYW1lKCksIGdldERlY2xhcmluZ0V4dGVuc2lvbk5hbWUoKX0pICsgIlxyXG4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCXJldHVybiBncm91cEludGVyZmFjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlwiIiArIGdldE5hbWUoKSArICJcIiAoIiArIGdldEdyb3VwSUQoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgewotCQlpZiAocHJpb3JpdHkgPT0gTkVHQVRJVkVfUFJJT1JJVFkpCi0JCQlwcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfUFJJT1JJVFlfQVRUUikpOwotCQlyZXR1cm4gcHJpb3JpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGdldEluaXRpYWxpemVyQ2xhc3MoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEluaXRpYWxpemVyQ2xhc3MoKS5pc0dyb3VwRW5hYmxlZChwcm9qZWN0KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJaWYgKHRoaXMuZXF1YWxzKG8pKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKCEobyBpbnN0YW5jZW9mIEZ1bmN0aW9uR3JvdXApKQotCQkJcmV0dXJuIDE7Ci0KLQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBvOwotCQlpZiAoZ2V0UHJpb3JpdHkoKSA9PSBncm91cC5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIGdldEdyb3VwSUQoKS5jb21wYXJlVG8oZ3JvdXAuZ2V0R3JvdXBJRCgpKTsKLQotCQllbHNlIGlmIChnZXRQcmlvcml0eSgpIDwgZ3JvdXAuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzID09IG51bGwpIHsKLQkJCWlmICghZXJyb3JSZXBvcnRlZCkgewotCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMCIsIG5ldyBPYmplY3RbXXtnZXRHcm91cElEKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllcnJvclJlcG9ydGVkID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcgZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nID0gKEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmdldFBhdHRlcm4oKS5tYXRjaGVyKHN0cmluZykubWF0Y2hlcygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWJvb2xlYW4gc2V0RnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncyhTZXQgZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncykgewotCQlTZXQgc2FmZUZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MgPSBVdGlsLnNhZmVDb3B5KGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3MsIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZy5jbGFzcyk7Ci0KLQkJaWYgKCFVdGlsLmVxdWFscyhzYWZlRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncywgdGhpcy5mdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzKSkgewotCQkJdGhpcy5mdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzID0gc2FmZUZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3M7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0YmNjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBIQVNIX0ZBQ1RPUiA9IDg5OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBIQVNIX0lOSVRJQUwgPSBGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuY2xhc3MuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVuY3Rpb25Hcm91cElkOwotCXByaXZhdGUgdHJhbnNpZW50IGludCBoYXNoQ29kZTsKLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGhhc2hDb2RlQ29tcHV0ZWQ7Ci0JcHJpdmF0ZSBQYXR0ZXJuIHBhdHRlcm47Ci0JcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIHN0cmluZzsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nKFN0cmluZyBmdW5jdGlvbkdyb3VwSWQsIFBhdHRlcm4gcGF0dGVybikgewotCQlpZiAocGF0dGVybiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJdGhpcy5mdW5jdGlvbkdyb3VwSWQgPSBmdW5jdGlvbkdyb3VwSWQ7Ci0JCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iamVjdCkgewotCQlGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcgY2FzdGVkT2JqZWN0ID0gKEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykgb2JqZWN0OwotCQlpbnQgY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKGZ1bmN0aW9uR3JvdXBJZCwgY2FzdGVkT2JqZWN0LmZ1bmN0aW9uR3JvdXBJZCk7Ci0KLQkJaWYgKGNvbXBhcmVUbyA9PSAwKQotCQkJY29tcGFyZVRvID0gVXRpbC5jb21wYXJlKHBhdHRlcm4ucGF0dGVybigpLCBjYXN0ZWRPYmplY3QucGF0dGVybi5wYXR0ZXJuKCkpOwotCi0JCXJldHVybiBjb21wYXJlVG87Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcgY2FzdGVkT2JqZWN0ID0gKEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykgb2JqZWN0OwotCQlib29sZWFuIGVxdWFscyA9IHRydWU7Ci0JCWVxdWFscyAmPSBVdGlsLmVxdWFscyhmdW5jdGlvbkdyb3VwSWQsIGNhc3RlZE9iamVjdC5mdW5jdGlvbkdyb3VwSWQpOwotCQllcXVhbHMgJj0gVXRpbC5lcXVhbHMocGF0dGVybiwgY2FzdGVkT2JqZWN0LnBhdHRlcm4pOwotCQlyZXR1cm4gZXF1YWxzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlJZCgpIHsKLQkJcmV0dXJuIGZ1bmN0aW9uR3JvdXBJZDsKLQl9Ci0KLQlwdWJsaWMgUGF0dGVybiBnZXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gcGF0dGVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoIWhhc2hDb2RlQ29tcHV0ZWQpIHsKLQkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShmdW5jdGlvbkdyb3VwSWQpOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShwYXR0ZXJuKTsKLQkJCWhhc2hDb2RlQ29tcHV0ZWQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQoZnVuY3Rpb25Hcm91cElkKS5hcHBlbmQoIixwYXR0ZXJuPVwiIikuYXBwZW5kKHBhdHRlcm4ucGF0dGVybigpKS5hcHBlbmQoIlwiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0cmluZyA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTVjYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogVGhlIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSB3aWxsIGNvbnN1bWUgQ29uZmlndXJhdGlvbiBlbGVtZW50cyBjb25mb3JtaW5nIHRvIHRoZSBGdW5jdGlvbkdyb3VwCi0gKiBFeHRlbnNpb24gUG9pbnQgc2NoZW1hLgotICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VMRU1FTlQgPSAiZnVuY3Rpb25Hcm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9JRF9BVFRSID0gImZ1bmN0aW9uR3JvdXBJRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9HUk9VUF9QQVRURVJOX0JJTkRJTkdfRUxNVCA9ICJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9BVFRSID0gInBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBncm91cE1hcEJ5SWQ7Ci0JcHJpdmF0ZSBMaXN0IGtub3duR3JvdXBzOwotCXByaXZhdGUgTWFwIHBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZDsKLQotCXByaXZhdGUgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5KCkgewotCQlzdXBlcihXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCBXVFBDb21tb25QbHVnaW4uR1JPVVBfUkVHSVNUUllfRVhURU5TSU9OX1BPSU5UKTsKLQkJcGF0dGVybkJpbmRpbmdzQnlHcm91cElkID0gbmV3IEhhc2hNYXAoKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5KCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIFJlYWQgYWxsIHRoZSBlbGVtZW50cyBmaXJzdCwgdGhlbiBzZXQgdGhlIHBhdHRlcm4gYmluZGluZ3Mgb24gdGhlIGZ1bmN0aW9uCi0JICogZ3JvdXBzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlzdXBlci5yZWFkUmVnaXN0cnkoKTsKLQkJc2V0UGF0dGVybkJpbmRpbmdzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhdHRlcm5CaW5kaW5ncygpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBncm91cElkID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlTZXQgdmFsdWUgPSAoU2V0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJRnVuY3Rpb25Hcm91cCBhR3JvdXAgPSBnZXRHcm91cEJ5SUQoZ3JvdXBJZCk7Ci0JCQlpZiAoYUdyb3VwICE9IG51bGwpCi0JCQkJYUdyb3VwLnNldEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3ModmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEdST1VQX0VMRU1FTlQpKSB7Ci0JCQlyZWFkR3JvdXAoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRlVOQ1RJT05fR1JPVVBfUEFUVEVSTl9CSU5ESU5HX0VMTVQpKSB7Ci0JCQlyZWFkUGF0dGVybkJpbmRpbmcoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZFBhdHRlcm5CaW5kaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBncm91cElEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfSURfQVRUUik7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUEFUVEVSTl9BVFRSKTsKLQkJaWYgKCFpc051bGxPckVtcHR5KGdyb3VwSUQpICYmICFpc051bGxPckVtcHR5KHBhdHRlcm4pKSB7Ci0JCQlQYXR0ZXJuIGFQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm4pOwotCQkJRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGJpbmRpbmcgPSBuZXcgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nKGdyb3VwSUQsIGFQYXR0ZXJuKTsKLQkJCWFkZFBhdHRlcm5CaW5kaW5nKGdyb3VwSUQsIGJpbmRpbmcpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmluZGluZwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQYXR0ZXJuQmluZGluZyhTdHJpbmcgZ3JvdXBJRCwgRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGJpbmRpbmcpIHsKLQkJU2V0IGJpbmRpbmdzID0gKFNldCkgcGF0dGVybkJpbmRpbmdzQnlHcm91cElkLmdldChncm91cElEKTsKLQkJaWYgKGJpbmRpbmdzID09IG51bGwpIHsKLQkJCWJpbmRpbmdzID0gbmV3IEhhc2hTZXQoKTsKLQkJCXBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZC5wdXQoZ3JvdXBJRCwgYmluZGluZ3MpOwotCQl9Ci0JCWJpbmRpbmdzLmFkZChiaW5kaW5nKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcubGVuZ3RoKCkgPT0gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEdyb3VwKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBncm91cElEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfSURfQVRUUik7Ci0JCWlmICghaXNOdWxsT3JFbXB0eShncm91cElEKSkgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IG5ldyBGdW5jdGlvbkdyb3VwKGdyb3VwSUQsIGVsZW1lbnQpOwotCQkJZ2V0R3JvdXBNYXBCeUlkKCkucHV0KGdyb3VwSUQsIGdyb3VwKTsKLQkJCWdldEtub3duR3JvdXBzKCkuYWRkKGdyb3VwKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRBc2NlbmRpbmdTb3J0ZWRHcm91cHMoSVByb2plY3QgcHJvamVjdCkgewotCQlDb21wYXJhdG9yIGFzY2VuZGluZ0dycENvbXBhcmF0b3IgPSBBc2NlbmRpbmdHcm91cENvbXBhcmF0b3Iuc2luZ2xldG9uKCk7Ci0JCUxpc3QgZ3JvdXBMaXN0ID0gZ2V0S25vd25Hcm91cHMocHJvamVjdCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoZ3JvdXBMaXN0LCBhc2NlbmRpbmdHcnBDb21wYXJhdG9yKTsKLQkJcmV0dXJuIGdyb3VwTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RGVzY2VuZGluZ1NvcnRlZEdyb3VwcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUNvbXBhcmF0b3IgZGVzY2VuZGluZ0dycENvbXBhcmF0b3IgPSBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLnNpbmdsZXRvbigpOwotCQlMaXN0IGdyb3VwTGlzdCA9IGdldEtub3duR3JvdXBzKHByb2plY3QpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGdyb3VwTGlzdCwgZGVzY2VuZGluZ0dycENvbXBhcmF0b3IpOwotCQlyZXR1cm4gZ3JvdXBMaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEtub3duR3JvdXBzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJyYXlMaXN0IGdyb3VwQnlQcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoZ2V0S25vd25Hcm91cHMoKS5zaXplKCkpOwotCQlMaXN0IGdyb3VwTGlzdCA9IGdldEtub3duR3JvdXBzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gKEZ1bmN0aW9uR3JvdXApIGdyb3VwTGlzdC5nZXQoaSk7Ci0JCQlpZiAoZ3JvdXAuaXNFbmFibGVkKHByb2plY3QpKQotCQkJCWdyb3VwQnlQcm9qZWN0TGlzdC5hZGQoZ3JvdXApOwotCQl9Ci0JCXJldHVybiBncm91cEJ5UHJvamVjdExpc3Q7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXNjZW5kaW5nUHJpb3JpdHlHcm91cE5hbWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCBzb3J0ZWRHcm91cCA9IGdldEFzY2VuZGluZ1NvcnRlZEdyb3Vwcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGdldEdyb3VwTGlzdE5hbWVzKHNvcnRlZEdyb3VwLCBuZXcgQXJyYXlMaXN0KHNvcnRlZEdyb3VwLnNpemUoKSkpOwotCi0JfQotCi0JcHVibGljIExpc3QgZ2V0RGVzY2VuZGluZ1ByaW9yaXR5R3JvdXBOYW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgc29ydGVkR3JvdXAgPSBnZXREZXNjZW5kaW5nU29ydGVkR3JvdXBzKHByb2plY3QpOwotCQlyZXR1cm4gZ2V0R3JvdXBMaXN0TmFtZXMoc29ydGVkR3JvdXAsIG5ldyBBcnJheUxpc3Qoc29ydGVkR3JvdXAuc2l6ZSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEdyb3VwTGlzdE5hbWVzKExpc3Qgc29ydGVkR3JvdXAsIExpc3Qgc29ydGVkR3JvdXBOYW1lcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZEdyb3VwLnNpemUoKTsgaSsrKSB7Ci0JCQlGdW5jdGlvbkdyb3VwIGdycCA9IChGdW5jdGlvbkdyb3VwKSBzb3J0ZWRHcm91cC5nZXQoaSk7Ci0JCQlzb3J0ZWRHcm91cE5hbWVzLmFkZChncnAuZ2V0R3JvdXBJRCgpKTsKLQkJfQotCQlyZXR1cm4gc29ydGVkR3JvdXBOYW1lczsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0R3JvdXBJRHMoKSB7Ci0JCXJldHVybiBnZXRHcm91cE1hcEJ5SWQoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBGdW5jdGlvbkdyb3VwIGdldEdyb3VwQnlJRChTdHJpbmcgZ3JvdXBJRCkgewotCQlyZXR1cm4gKEZ1bmN0aW9uR3JvdXApIGdldEdyb3VwTWFwQnlJZCgpLmdldChncm91cElEKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dyb3VwRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZ3JvdXBJRCkgewotCQlGdW5jdGlvbkdyb3VwIGdyb3VwID0gZ2V0R3JvdXBCeUlEKGdyb3VwSUQpOwotCQlpZiAoZ3JvdXAgIT0gbnVsbCkKLQkJCXJldHVybiBncm91cC5pc0VuYWJsZWQocHJvamVjdCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRLbm93bkdyb3VwcygpIHsKLQkJaWYgKGtub3duR3JvdXBzID09IG51bGwpCi0JCQlrbm93bkdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGtub3duR3JvdXBzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZ3JvdXBNYXBCeUlkLgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0R3JvdXBNYXBCeUlkKCkgewotCQlpZiAoZ3JvdXBNYXBCeUlkID09IG51bGwpCi0JCQlncm91cE1hcEJ5SWQgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZ3JvdXBNYXBCeUlkOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSBwcmlvcml0eSBvZiB0aGUgdHdvIGdyb3VwcyByZWZlcmVuY2VkIGJ5Ci0JICogCi0JICogQGdyb3VwSUQxIGFuZAotCSAqIEBncm91cElEMgotCSAqIAotCSAqIEBwYXJhbSBncm91cElEMQotCSAqIEBwYXJhbSBncm91cElEMgotCSAqIEByZXR1cm4gMCBpZiB0aGUgdHdvIGdyb3VwcyBhcmUgZXF1YWwsIDEgaWYKLQkgKiBAZ3JvdXBJRDEgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UsIG90aGVyd2lzZSAtMQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgZ3JvdXBJRDEsIFN0cmluZyBncm91cElEMikgewotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMSA9IGdldEdyb3VwQnlJRChncm91cElEMSk7Ci0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAyID0gZ2V0R3JvdXBCeUlEKGdyb3VwSUQyKTsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlXVFBDb21tb25QbHVnaW4ubG9nRXJyb3IobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyOCIsIG5ldyBPYmplY3RbXXtncm91cElEMX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI4IiwgbmV3IE9iamVjdFtde2dyb3VwSUQyfSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlyZXR1cm4gZ3JvdXAxLmNvbXBhcmVUbyhncm91cDIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0R3JvdXBQcmlvcml0eShTdHJpbmcgZ3JwSWQpIHsKLQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IGdldEdyb3VwQnlJRChncnBJZCk7Ci0JCXJldHVybiAoZ3JvdXAgIT0gbnVsbCkgPyBncm91cC5nZXRQcmlvcml0eSgpIDogLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRGdW5jdGlvblByaW9yaXR5KFN0cmluZyBlbmFibGVtZW50SUQpIHsKLQkJaW50IHByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRLbm93bkdyb3VwcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBpdGVyLm5leHQoKTsKLQkJCWlmIChncm91cC5pc01hdGNoKGVuYWJsZW1lbnRJRCkpCi0JCQkJcHJpb3JpdHkgPSBNYXRoLm1pbihwcmlvcml0eSwgZ3JvdXAuZ2V0UHJpb3JpdHkoKSk7Ci0JCX0KLQkJcmV0dXJuIHByaW9yaXR5OwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2Q4MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVuYWJsZW1lbnRJZGVudGlmaWVyIHsKLQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGluc3RhbmNlIG9mIDxjb2RlPklJZGVudGlmaWVyTGlzdGVuZXI8L2NvZGU+IHRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0bwotCSAqIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWRlbnRpZmllckxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gcmVnaXN0ZXIuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBJZiBhbiBhdHRlbXB0IGlzIG1hZGUKLQkgKiAgICAgICAgICAgIHRvIHJlZ2lzdGVyIGFuIGluc3RhbmNlIHdoaWNoIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaW5zdGFuY2UsIG5vCi0JICogICAgICAgICAgICBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgotCSAqLwotCXZvaWQgYWRkSWRlbnRpZmllckxpc3RlbmVyKElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGlkZW50aWZpZXJMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZnVuY3Rpb24gZ3JvdXAgaWRzIHRoYXQgdGhpcyBpbnN0YW5jZSBtYXRjaGVzLgotCSAqIDxwPgotCSAqIE5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBpZiB0aGlzIHByb3BlcnR5IGNoYW5nZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBhY3Rpdml0eSBpZHMgdGhhdCB0aGlzIGluc3RhbmNlIG1hdGNoZXMuIFRoaXMgc2V0IG1heSBiZSBlbXB0eSwgYnV0IGlzCi0JICogICAgICAgICBndWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBzZXQgaXMgbm90IGVtcHR5LCBpdCBpcyBndWFyYW50ZWVkCi0JICogICAgICAgICB0byBvbmx5IGNvbnRhaW4gaW5zdGFuY2VzIG9mIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICovCi0JU2V0IGdldEZ1bmN0aW9uR3JvdXBJZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgaW5zdGFuY2UuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIGluc3RhbmNlIGlzIGVuYWJsZWQuCi0JICogPHA+Ci0JICogTm90aWZpY2F0aW9uIGlzIHNlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzIGlmIHRoaXMgcHJvcGVydHkgY2hhbmdlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0cnVlLCBpZmYgdGhpcyBpbnN0YW5jZSBpcyBlbmFibGVkLgotCSAqLwotCWJvb2xlYW4gaXNFbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lcjwvY29kZT4gbGlzdGVuaW5nIGZvciBjaGFuZ2VzCi0JICogdG8gcHJvcGVydGllcyBvZiB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpZGVudGlmaWVyTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSB0byB1bnJlZ2lzdGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcwotCSAqICAgICAgICAgICAgbWFkZSB0byB1bnJlZ2lzdGVyIGFuIGluc3RhbmNlIHdoaWNoIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLAotCSAqICAgICAgICAgICAgbm8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwY2Y5MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEwLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IG9uZSBvciBtb3JlIHByb3BlcnRpZXMgb2YgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUlkZW50aWZpZXI8L2NvZGU+IGhhdmUKLQkgKiBjaGFuZ2VkLiBTcGVjaWZpYyBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlIDxjb2RlPklkZW50aWZpZXJFdmVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlkZW50aWZpZXJFdmVudAotCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZXZlbnQuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXZvaWQgaWRlbnRpZmllckNoYW5nZWQoRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCBpZGVudGlmaWVyRXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjZmY2RjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFbmFibGVtZW50TWFuYWdlciB7Ci0JU3RyaW5nIElOVEVSTkFMX0VOQUJMRU1FTlRfREVURVJNSU5BVElPTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRW5hYmxlbWVudERldGVybWluYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlJRW5hYmxlbWVudE1hbmFnZXIgSU5TVEFOQ0UgPSAoSUVuYWJsZW1lbnRNYW5hZ2VyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKElOVEVSTkFMX0VOQUJMRU1FTlRfREVURVJNSU5BVElPTl9JRCk7Ci0KLQlJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcklkLCBJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgaWRlbnRpZmllciBsaXN0ZW5lcnMgdGhhdCB0aGUgc3RhdGUgb2YgYSBwcm9qZWN0IGhhcyBjaGFuZ2VkIHRoYXQgYWZmZWN0cyB0aGUKLQkgKiBlbmFibGVtZW50IG9mIGEgZ3JvdXAgZm9yIGEgcHJvamVjdC4gVGhpcyBtZXRob2QgaXMgZmFpbCBzYWZlLCBpbiB0aGF0IGlmIG9uZSBsaXN0ZW5lciB0aHJvd3MKLQkgKiBhbiBleGNlcHRpb24gd2hpbGUgYmVpbmcgbm90aWZpZWQsIGl0IHdpbGwgbm90IHN0b3AgdGhlIG5vdGlmaWNhdGlvbiBvZiBvdGhlciBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2dAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGV4Y2VwdGlvbnMgd2VyZSBjYXVnaHQgbm90aWZ5aW5nIGFueSBvZiB0aGUgbGlzdGVuZXJzLiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZQotCSAqICAgICAgICAgICAgIGNvcmUgZXhjZXB0aW9uIGZvciB0aGUgbmVzdGVkIGV4Y2VwdGlvbnMuCi0JICovCi0Jdm9pZCBub3RpZnlGdW5jdGlvbkdyb3VwQ2hhbmdlZChTdHJpbmcgZ3JvdXBJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY2xpZW50cyB0byBkaXNwb3NlIG9mIGxpc3RlbmVycwotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVtZW50SWRlbnRpZmllcnMKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIoQ29sbGVjdGlvbiBlbmFibGVtZW50SWRlbnRpZmllcnMsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUdyb3VwSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JR3JvdXBJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNkYzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JR3JvdXBJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdyb3VwSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIGJvb2xlYW4gaXNHcm91cEVuYWJsZWQoSVByb2plY3QgcHJvamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzNjRiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZSB7Ci0KLQkvKioKLQkgKiByZXR1cm4gaWQgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgaW5zdGFuY2Ugb2YgYW4gZXh0ZW5zaW9uIHBvaW50LiBJdCBpcyB1cCB0byBlYWNoCi0JICogaW5kaXZpZHVhbCBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXIgdG8gZGVjaWRlIHdoYXQgdGhhdCBtaWdodCBiZSAoZS5nLiwgImVkaXRvcklEIiwgInBhZ2VJRCIsCi0JICogZXRjLgotCSAqLwotCVN0cmluZyBnZXRJRCgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgb3JkZXIgdGhlIElkZW50aWZpYWJsZSBlbGVtZW50IHdhcyBsb2FkZWQKLQkgKi8KLQlpbnQgZ2V0TG9hZE9yZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lkZW50aWZpYWJsZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkOWE2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIElkZW50aWZpYWJsZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSX1RIQU4gPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEVTU19USEFOID0gLTE7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFUVVBTCA9IDA7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElkZW50aWZpYWJsZUNvbXBhcmF0b3IgaW5zdGFuY2UgPSBuZXcgSWRlbnRpZmlhYmxlQ29tcGFyYXRvcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJJT1JJVFkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgSWRlbnRpZmlhYmxlQ29tcGFyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlJZGVudGlmaWFibGUgbHZhbHVlID0gbnVsbDsKLQkJSWRlbnRpZmlhYmxlIHJ2YWx1ZSA9IG51bGw7Ci0JCWlmIChvMSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZSkKLQkJCWx2YWx1ZSA9IChJZGVudGlmaWFibGUpIG8xOwotCQlpZiAobzIgaW5zdGFuY2VvZiBJZGVudGlmaWFibGUpCi0JCQlydmFsdWUgPSAoSWRlbnRpZmlhYmxlKSBvMjsKLQotCQlpZiAocnZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gR1JFQVRFUl9USEFOOwotCQlpZiAobHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gTEVTU19USEFOOwotCi0JCWlmICgobHZhbHVlLmdldElEKCkgPT0gbnVsbCAmJiBydmFsdWUuZ2V0SUQoKSA9PSBudWxsKSB8fCAoZ2V0UHJpb3JpdHkobHZhbHVlKSA9PSBnZXRQcmlvcml0eShydmFsdWUpKSkKLQkJCXJldHVybiBjb21wYXJlTG9hZE9yZGVyKGx2YWx1ZSwgcnZhbHVlKTsKLQkJLyogUiAtIEwgaW1wbGllcyAwIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5ICovCi0JCXJldHVybiBnZXRQcmlvcml0eShsdmFsdWUpIC0gZ2V0UHJpb3JpdHkocnZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBJZGVudGlmaWFibGVDb21wYXJhdG9yOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wYXJlTG9hZE9yZGVyKElkZW50aWZpYWJsZSBsdmFsdWUsIElkZW50aWZpYWJsZSBydmFsdWUpIHsKLQkJLyogUiAtIEwgaW1wbGllcyAwIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5ICovCi0JCXJldHVybiBsdmFsdWUuZ2V0TG9hZE9yZGVyKCkgLSBydmFsdWUuZ2V0TG9hZE9yZGVyKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmlvcml0eShJZGVudGlmaWFibGUgaWRlbnRpZmlhYmxlKSB7Ci0JCWlmIChpZGVudGlmaWFibGUuZ2V0SUQoKSAhPSBudWxsICYmIGlkZW50aWZpYWJsZS5nZXRJRCgpLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBGdW5jdGlvbkdyb3VwUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRGdW5jdGlvblByaW9yaXR5KGlkZW50aWZpYWJsZS5nZXRJRCgpKTsKLQkJcmV0dXJuIERFRkFVTFRfUFJJT1JJVFk7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0OTc3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKgotICogUmVuYW1lIHRoaXMgY2xhc3MgdG8gRW5hYmxlbWVudHNVdGlsCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFV0aWwgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU29ydGVkTWFwIEVNUFRZX1NPUlRFRF9NQVAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRNYXAobmV3IFRyZWVNYXAoKSk7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTb3J0ZWRTZXQgRU1QVFlfU09SVEVEX1NFVCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChuZXcgVHJlZVNldCgpKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBaRVJPX0xFTkdUSF9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlKE9iamVjdCBvYmplY3QsIENsYXNzIGMpIHsKLQkJYXNzZXJ0SW5zdGFuY2Uob2JqZWN0LCBjLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlKE9iamVjdCBvYmplY3QsIENsYXNzIGMsIGJvb2xlYW4gYWxsb3dOdWxsKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCAmJiBhbGxvd051bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQllbHNlIGlmICghYy5pc0luc3RhbmNlKG9iamVjdCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShib29sZWFuIGxlZnQsIGJvb2xlYW4gcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgPT0gZmFsc2UgPyAocmlnaHQgPT0gdHJ1ZSA/IC0xIDogMCkgOiAxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoQ29tcGFyYWJsZSBsZWZ0LCBDb21wYXJhYmxlIHJpZ2h0KSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmIChsZWZ0ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UgaWYgKHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIGxlZnQuY29tcGFyZVRvKHJpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKENvbXBhcmFibGVbXSBsZWZ0LCBDb21wYXJhYmxlW10gcmlnaHQpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQllbHNlIHsKLQkJCWludCBsID0gbGVmdC5sZW5ndGg7Ci0JCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKLQotCQkJaWYgKGwgIT0gcikKLQkJCQlyZXR1cm4gbCAtIHI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotCQkJCWludCBjb21wYXJlVG8gPSBjb21wYXJlKGxlZnRbaV0sIHJpZ2h0W2ldKTsKLQotCQkJCWlmIChjb21wYXJlVG8gIT0gMCkKLQkJCQkJcmV0dXJuIGNvbXBhcmVUbzsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCXJldHVybiBsZWZ0IC0gcmlnaHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShMaXN0IGxlZnQsIExpc3QgcmlnaHQpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQllbHNlIHsKLQkJCWludCBsID0gbGVmdC5zaXplKCk7Ci0JCQlpbnQgciA9IHJpZ2h0LnNpemUoKTsKLQotCQkJaWYgKGwgIT0gcikKLQkJCQlyZXR1cm4gbCAtIHI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotCQkJCWludCBjb21wYXJlVG8gPSBjb21wYXJlKChDb21wYXJhYmxlKSBsZWZ0LmdldChpKSwgKENvbXBhcmFibGUpIHJpZ2h0LmdldChpKSk7Ci0KLQkJCQlpZiAoY29tcGFyZVRvICE9IDApCi0JCQkJCXJldHVybiBjb21wYXJlVG87Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmKE1hcCBsZWZ0LCBNYXAgcmlnaHQsIFNldCBsZWZ0T25seSwgU2V0IGRpZmZlcmVudCwgU2V0IHJpZ2h0T25seSkgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwgfHwgbGVmdE9ubHkgPT0gbnVsbCB8fCBkaWZmZXJlbnQgPT0gbnVsbCB8fCByaWdodE9ubHkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGVmdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghcmlnaHQuY29udGFpbnNLZXkoa2V5KSkKLQkJCQlsZWZ0T25seS5hZGQoa2V5KTsKLQkJCWVsc2UgaWYgKCFVdGlsLmVxdWFscyhsZWZ0LmdldChrZXkpLCByaWdodC5nZXQoa2V5KSkpCi0JCQkJZGlmZmVyZW50LmFkZChrZXkpOwotCQl9Ci0KLQkJaXRlcmF0b3IgPSByaWdodC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghbGVmdC5jb250YWluc0tleShrZXkpKQotCQkJCXJpZ2h0T25seS5hZGQoa2V5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmKFNldCBsZWZ0LCBTZXQgcmlnaHQsIFNldCBsZWZ0T25seSwgU2V0IHJpZ2h0T25seSkgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwgfHwgbGVmdE9ubHkgPT0gbnVsbCB8fCByaWdodE9ubHkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGVmdC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghcmlnaHQuY29udGFpbnMob2JqZWN0KSkKLQkJCQlsZWZ0T25seS5hZGQob2JqZWN0KTsKLQkJfQotCi0JCWl0ZXJhdG9yID0gcmlnaHQuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoIWxlZnQuY29udGFpbnMob2JqZWN0KSkKLQkJCQlyaWdodE9ubHkuYWRkKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoTGlzdCBsZWZ0LCBMaXN0IHJpZ2h0LCBib29sZWFuIGVxdWFscykgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBsID0gbGVmdC5zaXplKCk7Ci0JCWludCByID0gcmlnaHQuc2l6ZSgpOwotCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0JCQlpZiAoIWVxdWFscyhsZWZ0LmdldChsIC0gaSAtIDEpLCByaWdodC5nZXQociAtIGkgLSAxKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoT2JqZWN0W10gbGVmdCwgT2JqZWN0W10gcmlnaHQsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKLQkJaW50IHIgPSByaWdodC5sZW5ndGg7Ci0JCWlmIChyID4gbCB8fCAhZXF1YWxzICYmIHIgPT0gbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0JCQlpZiAoIWVxdWFscyhsZWZ0W2wgLSBpIC0gMV0sIHJpZ2h0W3IgLSBpIC0gMV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhib29sZWFuIGxlZnQsIGJvb2xlYW4gcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgPT0gcmlnaHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCXJldHVybiBsZWZ0ID09IHJpZ2h0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQlyZXR1cm4gbGVmdCA9PSBudWxsID8gcmlnaHQgPT0gbnVsbCA6IGxlZnQuZXF1YWxzKHJpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShib29sZWFuIGIpIHsKLQkJcmV0dXJuIGIgPyBCb29sZWFuLlRSVUUuaGFzaENvZGUoKSA6IEJvb2xlYW4uRkFMU0UuaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShpbnQgaSkgewotCQlyZXR1cm4gaTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgIT0gbnVsbCA/IG9iamVjdC5oYXNoQ29kZSgpIDogMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2FmZUNvcHkoTGlzdCBsaXN0LCBDbGFzcyBjKSB7Ci0JCXJldHVybiBzYWZlQ29weShsaXN0LCBjLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNhZmVDb3B5KExpc3QgbGlzdCwgQ2xhc3MgYywgYm9vbGVhbiBhbGxvd051bGxFbGVtZW50cykgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCUxpc3Qgc2FmZUxpc3QgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3QobGlzdCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNhZmVMaXN0Lml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCWFzc2VydEluc3RhbmNlKGl0ZXJhdG9yLm5leHQoKSwgYywgYWxsb3dOdWxsRWxlbWVudHMpOwotCi0JCXJldHVybiBzYWZlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBzYWZlQ29weShNYXAgbWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcykgewotCQlyZXR1cm4gc2FmZUNvcHkobWFwLCBrZXlDbGFzcywgdmFsdWVDbGFzcywgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBzYWZlQ29weShNYXAgbWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcywgYm9vbGVhbiBhbGxvd051bGxLZXlzLCBib29sZWFuIGFsbG93TnVsbFZhbHVlcykgewotCQlpZiAobWFwID09IG51bGwgfHwga2V5Q2xhc3MgPT0gbnVsbCB8fCB2YWx1ZUNsYXNzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlNYXAgc2FmZU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChuZXcgSGFzaE1hcChtYXApKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzYWZlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSwga2V5Q2xhc3MsIGFsbG93TnVsbEtleXMpOwotCQkJYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0VmFsdWUoKSwgdmFsdWVDbGFzcywgYWxsb3dOdWxsVmFsdWVzKTsKLQkJfQotCi0JCXJldHVybiBzYWZlTWFwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IHNhZmVDb3B5KFNldCBzZXQsIENsYXNzIGMpIHsKLQkJcmV0dXJuIHNhZmVDb3B5KHNldCwgYywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IHNhZmVDb3B5KFNldCBzZXQsIENsYXNzIGMsIGJvb2xlYW4gYWxsb3dOdWxsRWxlbWVudHMpIHsKLQkJaWYgKHNldCA9PSBudWxsIHx8IGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCVNldCBzYWZlU2V0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0KHNldCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNhZmVTZXQuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJYXNzZXJ0SW5zdGFuY2UoaXRlcmF0b3IubmV4dCgpLCBjLCBhbGxvd051bGxFbGVtZW50cyk7Ci0KLQkJcmV0dXJuIHNhZmVTZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgc2FmZUNvcHkoU29ydGVkTWFwIHNvcnRlZE1hcCwgQ2xhc3Mga2V5Q2xhc3MsIENsYXNzIHZhbHVlQ2xhc3MpIHsKLQkJcmV0dXJuIHNhZmVDb3B5KHNvcnRlZE1hcCwga2V5Q2xhc3MsIHZhbHVlQ2xhc3MsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgc2FmZUNvcHkoU29ydGVkTWFwIHNvcnRlZE1hcCwgQ2xhc3Mga2V5Q2xhc3MsIENsYXNzIHZhbHVlQ2xhc3MsIGJvb2xlYW4gYWxsb3dOdWxsS2V5cywgYm9vbGVhbiBhbGxvd051bGxWYWx1ZXMpIHsKLQkJaWYgKHNvcnRlZE1hcCA9PSBudWxsIHx8IGtleUNsYXNzID09IG51bGwgfHwgdmFsdWVDbGFzcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJU29ydGVkTWFwIHNhZmVTb3J0ZWRNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRNYXAobmV3IFRyZWVNYXAoc29ydGVkTWFwKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2FmZVNvcnRlZE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0S2V5KCksIGtleUNsYXNzLCBhbGxvd051bGxLZXlzKTsKLQkJCWFzc2VydEluc3RhbmNlKGVudHJ5LmdldFZhbHVlKCksIHZhbHVlQ2xhc3MsIGFsbG93TnVsbFZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2FmZVNvcnRlZE1hcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBzYWZlQ29weShTb3J0ZWRTZXQgc29ydGVkU2V0LCBDbGFzcyBjKSB7Ci0JCXJldHVybiBzYWZlQ29weShzb3J0ZWRTZXQsIGMsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvcnRlZFNldCBzYWZlQ29weShTb3J0ZWRTZXQgc29ydGVkU2V0LCBDbGFzcyBjLCBib29sZWFuIGFsbG93TnVsbEVsZW1lbnRzKSB7Ci0JCWlmIChzb3J0ZWRTZXQgPT0gbnVsbCB8fCBjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlTb3J0ZWRTZXQgc2FmZVNvcnRlZFNldCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChuZXcgVHJlZVNldChzb3J0ZWRTZXQpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzYWZlU29ydGVkU2V0Lml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCWFzc2VydEluc3RhbmNlKGl0ZXJhdG9yLm5leHQoKSwgYywgYWxsb3dOdWxsRWxlbWVudHMpOwotCi0JCXJldHVybiBzYWZlU29ydGVkU2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoKExpc3QgbGVmdCwgTGlzdCByaWdodCwgYm9vbGVhbiBlcXVhbHMpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbCA9IGxlZnQuc2l6ZSgpOwotCQlpbnQgciA9IHJpZ2h0LnNpemUoKTsKLQkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykKLQkJCWlmICghZXF1YWxzKGxlZnQuZ2V0KGkpLCByaWdodC5nZXQoaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGgoT2JqZWN0W10gbGVmdCwgT2JqZWN0W10gcmlnaHQsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKLQkJaW50IHIgPSByaWdodC5sZW5ndGg7Ci0JCWlmIChyID4gbCB8fCAhZXF1YWxzICYmIHIgPT0gbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykKLQkJCWlmICghZXF1YWxzKGxlZnRbaV0sIHJpZ2h0W2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYW5zbGF0ZVN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gVXRpbC50cmFuc2xhdGVTdHJpbmcocmVzb3VyY2VCdW5kbGUsIGtleSwga2V5LCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIFN0cmluZyBrZXksIFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gc2lnbmFsLCBib29sZWFuIHRyaW0pIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwgJiYga2V5ICE9IG51bGwpCi0JCQl0cnkgewotCQkJCWZpbmFsIFN0cmluZyB0cmFuc2xhdGVkU3RyaW5nID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0KLQkJCQlpZiAodHJhbnNsYXRlZFN0cmluZyAhPSBudWxsKQotCQkJCQlyZXR1cm4gdHJpbSA/IHRyYW5zbGF0ZWRTdHJpbmcudHJpbSgpIDogdHJhbnNsYXRlZFN0cmluZzsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlTWlzc2luZ1Jlc291cmNlKSB7Ci0JCQkJaWYgKHNpZ25hbCkKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGVNaXNzaW5nUmVzb3VyY2UpOwotCQkJfQotCi0JCXJldHVybiB0cmltID8gc3RyaW5nLnRyaW0oKSA6IHN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIFV0aWwoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjc2ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHByZU9wcyA9IG51bGw7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgcG9zdE9wcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIgY3JlYXRlRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIoU3RyaW5nIG9wZXJhdGlvbklEKSB7Ci0JCUNvbGxlY3Rpb24gZXh0ZW5zaW9ucyA9IChDb2xsZWN0aW9uKSBPcGVyYXRpb25FeHRlbnNpb25SZWFkZXIuZ2V0RXh0ZW5zaW9uUG9pbnRzKCkuZ2V0KG9wZXJhdGlvbklEKTsKLQkJaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDb21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyIGV4dE9wZXJhdGlvbkhvbGRlciA9IG5ldyBDb21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyKCk7Ci0JCU9iamVjdCBwcmVPcCA9IG51bGw7Ci0JCU9iamVjdCBwb3N0T3AgPSBudWxsOwotCQlPcGVyYXRpb25FeHRlbnNpb24gY3VycmVudEV4dCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRlbnNpb25zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWN1cnJlbnRFeHQgPSAoT3BlcmF0aW9uRXh0ZW5zaW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcihjdXJyZW50RXh0LmdldEV4dGVuc2lvbklkKCksIG51bGwpLmlzRW5hYmxlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJlT3AgPSBjdXJyZW50RXh0LmdldFByZU9wZXJhdGlvbigpOwotCQkJCQlpZiAocHJlT3AgIT0gbnVsbCkgewotCQkJCQkJZXh0T3BlcmF0aW9uSG9sZGVyLmFkZFByZU9wZXJhdGlvbihwcmVPcCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlwb3N0T3AgPSBjdXJyZW50RXh0LmdldFBvc3RPcGVyYXRpb24oKTsKLQkJCQkJaWYgKHBvc3RPcCAhPSBudWxsKSB7Ci0JCQkJCQlleHRPcGVyYXRpb25Ib2xkZXIuYWRkUG9zdE9wZXJhdGlvbihwb3N0T3ApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV4dE9wZXJhdGlvbkhvbGRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVPcGVyYXRpb24oT2JqZWN0IHByZU9wZXJhdGlvbikgewotCQlpZiAocHJlT3BzID09IG51bGwpIHsKLQkJCXByZU9wcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlwcmVPcHMuYWRkKHByZU9wZXJhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9zdE9wZXJhdGlvbihPYmplY3QgcG9zdE9wZXJhdGlvbikgewotCQlpZiAocG9zdE9wcyA9PSBudWxsKSB7Ci0JCQlwb3N0T3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXBvc3RPcHMuYWRkKHBvc3RPcGVyYXRpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZU9wcygpIHsKLQkJcmV0dXJuIHByZU9wcyAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1Bvc3RPcHMoKSB7Ci0JCXJldHVybiBwb3N0T3BzICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRQb3N0T3BzKCkgewotCQlyZXR1cm4gcG9zdE9wczsKLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldFByZU9wcygpIHsKLQkJcmV0dXJuIHByZU9wczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZGI4NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogU2ltaWFsYXIgdG8gb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcywgaG93ZXZlciB3aXRob3V0IFVJIGRlcGVuZGVuY2llcy4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JLyoqCi0JICogUnVucyB0aGlzIG9wZXJhdGlvbiB3aXRob3V0IGZvcmNpbmcgYSBVSSBkZXBlbmRlbmN5LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgdG8gZGlzcGxheSBwcm9ncmVzcyBhbmQgcmVjZWl2ZSByZXF1ZXN0cyBmb3IKLQkgKiAgICAgICAgICAgIGNhbmNlbGF0aW9uCi0JICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwgaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlCi0JICogICAgICAgICAgICAgICAgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUKLQkgKiAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlCi0JICogICAgICAgICAgICAgICAgY2FsbGluZyBjb250ZXh0Ci0JICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvcGVyYXRpb24gZGV0ZWN0cyBhIHJlcXVlc3QgdG8gY2FuY2VsLCB1c2luZwotCSAqICAgICAgICAgICAgICAgIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JT3BlcmF0aW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lPcGVyYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2U0YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lPcGVyYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0vKioKLSAqIFBhc3NlZCB0byBjb21wbGV4IG1ldGhvZHMgdGhhdCBtYXkgcmVxdWlyZSByZXBvcnRpbmcgb2YgbWVzc2FnZXMsIG9yIGludGVyYWN0aW9ucyBmcm9tIHRoZSB1c2VyOwotICogRGVmaW5lZCBhcyBhbiBpbnRlcmZhY2UgYmVjYXVzZSB0aGUgYWN0aW9ucyBtYXkgcnVuIGluIGhlYWRsZXNzIGVudmlyb25tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRpb25IYW5kbGVyIHsKLQlpbnQgWUVTID0gMDsKLQlpbnQgWUVTX1RPX0FMTCA9IDE7Ci0JaW50IE5PID0gMjsKLQlpbnQgQ0FOQ0VMID0gMzsKLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUuIDxjb2RlPml0ZW1zPC9jb2RlPgotCSAqIGlzIGFuIGFycmF5IG9mIGRldGFpbHMgdGhhdCBhY2NvbXBhbnkgdGhlIDxjb2RlPm1lc3NhZ2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcyk7Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZS4gVGhlIGJvb2xlYW4gYXJyYXkKLQkgKiB3aWxsIHJldHVybiB0d28gYm9vbGVhbnMuIFRoZSBmaXJzdCBpbmRpY2F0ZXMgdGhlaXIgcmVzcG9uc2UgdG8gdGhlIG9yaWdpbmFsIHF1ZXN0aW9uIGFuZCB0aGUKLQkgKiBzZWNvbmQgaW5kaWNhdGVzIGlmIHRoZXkgc2VsZWN0ZWQgdGhlIGFwcGx5IHRvIGFsbCBjaGVjayBib3guCi0JICogCi0JICogUmV0dXJuIHRoZSByZXR1cm4gY29kZSBmb3IgdGhlIGRpYWxvZy4gMCA9IFllcywgMSA9IFllcyB0byBhbGwsIDIgPSBObwotCSAqLwotCWludCBjYW5Db250aW51ZVdpdGhBbGxDaGVjayhTdHJpbmcgbWVzc2FnZSk7Ci0KLQlpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2tBbGxvd0NhbmNlbChTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBBbiBlcnJvciBoYXMgb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBBbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgbmVlZHMgdG8gYmUgcHJlc2VudGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5mb3JtKFN0cmluZyBtZXNzYWdlKTsKLQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzZjZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldyB7Ci0KLQkvKioKLQkgKiBBIHJlcXVpcmVkIGRhdGFNb2RlbCBwcm9wZXJ0eU5hbWUgZm9yIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gdHlwZS4gVGhpcyBpcyB1c2VkIHRvCi0JICogc3BlY2lmeSB0aGUgcHJvamVjdCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIEJvb2xlYW4gcHJvcGVydHkgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgaG93IHRoZSBQUk9KRUNUX0xPQ0FUSU9OIGlzIGNvbXB1dGVkLiBJZiB0aGlzCi0JICogcHJvcGVydHkgaXMgdHJ1ZSB0aGVuIHRoZSBQUk9KRUNUX0xPQ0FUSU9OIGlzIG51bGwuIE90aGVyd2lzZSB0aGUgUFJPSkVDVF9MT0NBVElPTiBpcyB0aGUKLQkgKiB2YWx1ZSBvZiBVU0VSX0RFRklORURfTE9DQVRJT04uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0RFRkFVTFRfTE9DQVRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFX0RFRkFVTFRfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIFN0cmluZyBwcm9wZXJ0eSB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBVU0VfREVGQVVMVF9MT0NBVElPTiB0byBvdmVycmlkZSB0aGUKLQkgKiBERUZBVUxUX0xPQ0FUSU9OLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfREVGSU5FRF9MT0NBVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5VU0VSX0RFRklORURfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIFN0cmluZyBwcm9wZXJ0eSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rICNVU0VfREVGQVVMVF9MT0NBVElPTn0gYW5kCi0JICoge0BsaW5rICNQUk9KRUNUX05BTUV9IHRvIG92ZXJyaWQgdGhlIHtAbGluayAjUFJPSkVDVF9MT0NBVElPTn0uCi0JICogCi0JICogSWYge0BsaW5rICNVU0VfREVGQVVMVF9MT0NBVElPTn0gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCB0aGlzIHByb3BlcnR5IGlzIHNldCwgdGhlbiB0aGUKLQkgKiB7QGxpbmsgI1BST0pFQ1RfTE9DQVRJT059IGlzIGRlZmluZWQgYnkge0BsaW5rICNVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTn0ve0BsaW5rICNQUk9KRUNUX05BTUV9LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gdW5zZXR0YWJsZSBwcm9wZXJ0eSB3aGljaCBzcGVjaWZpZWQgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIGEgbmV3bHkgY3JlYXRlZCBwcm9qZWN0LiBUaGUKLQkgKiB2YWx1ZSBpcyBjb21wdXRlZCBieSBhcHBlbmRpbmcgdGhlIHByb2plY3QgbmFtZSB0byB0aGUgd29ya3NwYWNlIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9DQVRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuREVGQVVMVF9MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIHVuc2V0dGFibGUgcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcm9qZWN0IGxvY2F0aW9uLiBJZiBVU0VfREVGQVVMVF9MT0NBVElPTiB0aGlzCi0JICogcHJvcGVydHkgZXZhbHVhdGVzIHRvIFVTRVJfREVGSU5FRF9MT0NBVElPTjsgb3RoZXJ3aXNlIGl0IGkgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9MT0NBVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3B0aW9uYWwgZGF0YU1vZGVsIHByb3BlcnR5TmFtZSBmb3IgYSA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nW108L2NvZGU+IHR5cGUuIFRoaXMgaXMgYQotCSAqIGxpc3Qgb2YgYWxsIG5hdHVyZXMgdG8gYWRkIHRvIHRoZSBwcm9qZWN0LiBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFUVVJFUyA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX05BVFVSRVMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJUHJvamVjdC4gQW4gbm9uIHNldHRhYmxlIHByb3BlcnR5LiBUaGlzIGlzIGEgY29udmVuaWVjZSBmb3IgY29uc3RydWN0aW9uZyBnZXR0aW5nIHRoZQotCSAqIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVCA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSVByb2plY3REZXNjcmlwdGlvbi4gQW4gbm9uIHNldHRhYmxlIHByb3BlcnR5LiBUaGlzIGlzIGEgY29udmVuaWVjZSBmb3IgY29uc3RydWN0aW9uZyBhCi0JICogcHJvamVjdCBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0RFU0NSSVBUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfREVTQ1JJUFRJT04iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25FeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjZDE2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRXh0ZW5zaW9uIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgb3BJRCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGJhc2VFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJlT3BlcmF0aW9uQ2xhc3MgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwb3N0T3BlcmF0aW9uQ2xhc3MgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb25JZDsKLQotCXB1YmxpYyBPcGVyYXRpb25FeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBpZCwgU3RyaW5nIHByZU9wLCBTdHJpbmcgcG9zdE9wKSB7Ci0JCXN1cGVyKCk7Ci0JCWJhc2VFbGVtZW50ID0gZWxlbWVudDsKLQkJc2V0VXBFeHRlbnNpb24oaWQsIHByZU9wLCBwb3N0T3ApOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRVcEV4dGVuc2lvbihTdHJpbmcgaWQsIFN0cmluZyBwcmVPcCwgU3RyaW5nIHBvc3RPcCkgewotCQlvcElEID0gaWQ7Ci0JCXByZU9wZXJhdGlvbkNsYXNzID0gcHJlT3A7Ci0JCXBvc3RPcGVyYXRpb25DbGFzcyA9IHBvc3RPcDsKLQkJdGhpcy5leHRlbnNpb25JZCA9IGJhc2VFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsKLQkJaWYgKHRoaXMuZXh0ZW5zaW9uSWQgPT0gbnVsbCkKLQkJCXRoaXMuZXh0ZW5zaW9uSWQgPSBiYXNlRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE9wSUQoKSB7Ci0JCXJldHVybiBvcElEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zdE9wZXJhdGlvbkNsYXNzKCkgewotCQlyZXR1cm4gcG9zdE9wZXJhdGlvbkNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlT3BlcmF0aW9uQ2xhc3MoKSB7Ci0JCXJldHVybiBwcmVPcGVyYXRpb25DbGFzczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBvc3RPcGVyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwb3N0T3BlcmF0aW9uQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYmFzZUVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihPcGVyYXRpb25FeHRlbnNpb25SZWFkZXIuQVRUX1BPU1RfT1ApOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJlT3BlcmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJlT3BlcmF0aW9uQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYmFzZUVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihPcGVyYXRpb25FeHRlbnNpb25SZWFkZXIuQVRUX1BSRV9PUCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbnNpb25JZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uSWQ7Ci0JfQotCi0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRCYXNlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGJhc2VFbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25FeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25FeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyODAzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEhhc2hNYXAgb3BFeHRlbnNpb25zID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSjJFRU9QRVhUID0gIm9wZXJhdGlvbkV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUkVfT1AgPSAicHJlT3BlcmF0aW9uQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BPU1RfT1AgPSAicG9zdE9wZXJhdGlvbkNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlcigpIHsKLQkJc3VwZXIoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgIk9wZXJhdGlvbkV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6IDxvcGVyYXRpb25FeHRlbnNpb24KLQkgKiBwcmVPcGVyYXRpb25DbGFzcz0iY29tLmlibS5ldG9vbHMuLi4uUHJlRGVsZXRlT3BlcmF0aW9uIgotCSAqIHBvc3RPcGVyYXRpb25DbGFzcz0iY29tLmlibS5ldG9vbHMuLi4uUG9zdERlbGV0ZU9wZXJhdGlvbiI+IDwvb3BlcmF0aW9uRXh0ZW5zaW9uPgotCSAqLwotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9KMkVFT1BFWFQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlTdHJpbmcgcHJlT3AgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJFX09QKTsKLQkJU3RyaW5nIHBvc3RPcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QT1NUX09QKTsKLQkJT3BlcmF0aW9uRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IG5ldyBPcGVyYXRpb25FeHRlbnNpb24oZWxlbWVudCwgaWQsIHByZU9wLCBwb3N0T3ApOwotCQlhZGRFeHRlbnNpb25Qb2ludChleHRlbnNpb24pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvbnMKLQkgKiAgICAgICAgICAgIFRoZSBleHRlbnNpb25zIHRvIHNldAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRXh0ZW5zaW9uUG9pbnQoT3BlcmF0aW9uRXh0ZW5zaW9uIG5ld0V4dGVuc2lvbikgewotCQlDb2xsZWN0aW9uIHRlbXAgPSBudWxsOwotCQlPYmplY3QgaG9sZGVyID0gb3BFeHRlbnNpb25zLmdldChuZXdFeHRlbnNpb24uZ2V0T3BJRCgpKTsKLQkJaWYgKGhvbGRlciA9PSBudWxsKSB7Ci0JCQl0ZW1wID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdGVtcC5hZGQobmV3RXh0ZW5zaW9uKTsKLQkJCW9wRXh0ZW5zaW9ucy5wdXQobmV3RXh0ZW5zaW9uLmdldE9wSUQoKSwgdGVtcCk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wID0gKENvbGxlY3Rpb24pIGhvbGRlcjsKLQkJCXRlbXAuYWRkKG5ld0V4dGVuc2lvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZ2V0RXh0ZW5zaW9uUG9pbnRzKCkgewotCQlpZihvcEV4dGVuc2lvbnMgPT0gbnVsbCl7Ci0JCQlvcEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyIG9wRXh0ZW5zaW9uUmVhZGVyID0gbmV3IE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlcigpOwotCQkJb3BFeHRlbnNpb25SZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIG9wRXh0ZW5zaW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYmYwZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25TdGF0dXMgZXh0ZW5kcyBNdWx0aVN0YXR1cyB7Ci0KLQlwdWJsaWMgT3BlcmF0aW9uU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlzdXBlcihXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCAwLCBuZXcgSVN0YXR1c1tde30sIG1lc3NhZ2UsIGUpOwotCX0KLQotCXB1YmxpYyBPcGVyYXRpb25TdGF0dXMoSVN0YXR1c1tdIGNoaWxkcmVuKSB7Ci0JCXRoaXMoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgY2hpbGRyZW4sICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPcGVyYXRpb25TdGF0dXMoU3RyaW5nIHBsdWdpbklkLCBpbnQgY29kZSwgSVN0YXR1c1tdIGNoaWxkcmVuLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihwbHVnaW5JZCwgY29kZSwgY2hpbGRyZW4sIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXh0ZW5kZWRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IG9sZFNldmVyaXR5ID0gZ2V0U2V2ZXJpdHkoKTsKLQkJc3VwZXIuYWRkKHN0YXR1cyk7Ci0JCWlmIChvbGRTZXZlcml0eSAhPSBJU3RhdHVzLkVSUk9SICYmIGdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJc2V0U2V2ZXJpdHkoSVN0YXR1cy5XQVJOSU5HKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gZXhwb3NlIGFzIHB1YmxpYyBpbnN0ZWFkIG9mIHByb3RlY3RlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvZGUoaW50IGNvZGUpIHsKLQkJc3VwZXIuc2V0Q29kZShjb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGV4cG9zZSBhcyBwdWJsaWMgaW5zdGVhZCBvZiBwcm90ZWN0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlci5zZXRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGV4cG9zZSBhcyBwdWJsaWMgaW5zdGVhZCBvZiBwcm90ZWN0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBleHBvc2UgYXMgcHVibGljIGluc3RlYWQgb2YgcHJvdGVjdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KSB7Ci0JCXN1cGVyLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IG5ld1NldiA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAobmV3U2V2ID4gZ2V0U2V2ZXJpdHkoKSkgewotCQkJc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCXNldEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JCXN1cGVyLmFkZChzdGF0dXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OTZmNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldyBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldyB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbk5ldyhtb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFX0RFRkFVTFRfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChERUZBVUxUX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BVFVSRVMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX0RFU0NSSVBUSU9OKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0xPQ0FUSU9OKSkgewotCQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSBpZiAoaXNQcm9wZXJ0eVNldChVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTikpIHsKLQkJCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pICsgRmlsZS5zZXBhcmF0b3IgKyBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQkJfQotCQkJcmV0dXJuIGdldFByb3BlcnR5KFVTRVJfREVGSU5FRF9MT0NBVElPTik7Ci0JCX0gZWxzZSBpZiAoREVGQVVMVF9MT0NBVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRMb2NhdGlvbigpOwotCQl9IGVsc2UgaWYgKFVTRV9ERUZBVUxUX0xPQ0FUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9IGVsc2UgaWYgKFVTRVJfREVGSU5FRF9MT0NBVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0RFU0NSSVBUSU9OKSkKLQkJCXJldHVybiBnZXRQcm9qZWN0RGVzY3JpcHRpb24oKTsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRMb2NhdGlvbigpIHsKLQkJSVBhdGggcGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwpCi0JCQlwYXRoID0gcGF0aC5hcHBlbmQocHJvamVjdE5hbWUpOwotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9MT0NBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX0xPQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfREVTQ1JJUFRJT04pKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJSVN0YXR1cyBzdGF0ID0gbW9kZWwudmFsaWRhdGVQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQkJaWYgKHN0YXQgIT0gT0tfU1RBVFVTKQotCQkJCXJldHVybiB0cnVlOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVCwgZ2V0UHJvamVjdCgpKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERFRkFVTFRfTE9DQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoVVNFX0RFRkFVTFRfTE9DQVRJT04pIHx8IGlzUHJvcGVydHlTZXQoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pKSB7Ci0JCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9MT0NBVElPTiwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFX0RFRkFVTFRfTE9DQVRJT04pKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCX0gZWxzZSBpZiAoKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OKSkgJiYgIWdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTE9DQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0RGVzY3JpcHRpb24gZ2V0UHJvamVjdERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3ROYW1lKTsKLQkJU3RyaW5nIHByb2plY3RMb2NhdGlvbiA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQlpZiAocHJvamVjdExvY2F0aW9uICE9IG51bGwpCi0JCQlkZXNjLnNldExvY2F0aW9uKG5ldyBQYXRoKHByb2plY3RMb2NhdGlvbikpOwotCQllbHNlCi0JCQlkZXNjLnNldExvY2F0aW9uKG51bGwpOwotCQlyZXR1cm4gZGVzYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIChudWxsICE9IHByb2plY3ROYW1lICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkgPyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpIDogbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLQkJCVN0cmluZyBuYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVOYW1lKG5hbWUpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9MT0NBVElPTikpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVMb2NhdGlvbigpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9MT0NBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCi0JCQlTdHJpbmcgcHJvamVjdExvYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX0xPQ0FUSU9OKSkgewotCQkJCXByb2plY3RMb2MgPSBnZXREZWZhdWx0TG9jYXRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvamVjdExvYyA9IGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkYXRlRXhpc3RpbmcocHJvamVjdE5hbWUsIHByb2plY3RMb2MpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHBhcmFtIHByb2plY3RMb2MKLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUV4aXN0aW5nKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHByb2plY3RMb2MpIHsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwgJiYgIXByb2plY3ROYW1lLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwcm9qZWN0TG9jKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlGaWxlIGRvdFByb2plY3QgPSBuZXcgRmlsZShmaWxlLCAiLnByb2plY3QiKTsvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkb3RQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5QUk9KRUNUX0VYSVNUU19BVF9MT0NBVElPTl9FUlJPUiwgbmV3IE9iamVjdFtde2ZpbGUudG9TdHJpbmcoKX0pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdEhhbmRsZUZyb21Qcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShwcm9qZWN0TmFtZSwgSVJlc291cmNlLlBST0pFQ1QpOwotCQlyZXR1cm4gKG51bGwgIT0gcHJvamVjdE5hbWUgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICYmIHN0YXR1cy5pc09LKCkpID8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUocHJvamVjdE5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJaWYgKHByb2plY3ROYW1lLmVuZHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiNDEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9zcGVjaWFsIEZSQUdNRU5UX1NFUEFSQVRPUiBjaGFyIGluIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKLQkJaWYgKHByb2plY3ROYW1lLmluZGV4T2YoJyMnKSAhPSAtMSkgCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVQcm9qZWN0TmFtZShuYW1lKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlBST0pFQ1RfRVhJU1RTX1NBTUVOQU1FX0VSUk9SLCBuZXcgT2JqZWN0W117bmFtZX0pKTsKLQkJfQotCQlpZiAoIVdUUFBsdWdpbi5pc1BsYXRmb3JtQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkvLyBub3cgbG9vayBmb3IgYSBtYXRjaGluZyBjYXNlIHZhcmlhbnQgaW4gdGhlIHRyZWUKLQkJCUlSZXNvdXJjZSB2YXJpYW50ID0gKChSZXNvdXJjZSkgcHJvamVjdCkuZmluZEV4aXN0aW5nUmVzb3VyY2VWYXJpYW50KHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlpZiAodmFyaWFudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI0MiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVMb2NhdGlvbigpIHsKLQkJU3RyaW5nIGxvYyA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQlpZiAobnVsbCAhPSBsb2MpIHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvYyk7Ci0JCQlyZXR1cm4gd29ya3NwYWNlLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKGdldFByb2plY3QoKSwgcGF0aCk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uTmV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmE3YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbk9wZXJhdGlvbk5ldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBpbXBsZW1lbnRzIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3IHsKLQotCXB1YmxpYyBQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IChJUHJvamVjdERlc2NyaXB0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUX0RFU0NSSVBUSU9OKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJcHJvamVjdC5jcmVhdGUoZGVzYywgc3ViTW9uaXRvcik7Ci0JCQl9Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQlzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQlwcm9qZWN0Lm9wZW4oc3ViTW9uaXRvcik7Ci0KLQkJCVN0cmluZ1tdIG5hdHVyZUlkcyA9IChTdHJpbmdbXSkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9OQVRVUkVTKTsKLQkJCWlmIChudWxsICE9IG5hdHVyZUlkcykgewotCQkJCWRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlSWRzKTsKLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdUUENvbW1vblBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNThmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPnd0cCBvcGVyYXRpb24gYXBpIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VGhlIFdUUCBPcGVyYXRpb24gQVBJIGFsbG93cyBjbGllbnRzIHRvIGRvLi4uZXZlcnl0aGluZyE8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyI+PC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpPkZpZ3VyZSAxOiBJbWFnZSBkZXNjcmlwdGlvbjwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwNTBkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAKLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPnd0cCBvcGVyYXRpb24gYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotICAgICAgICA8YWJzdHJhY3Q+VGhlIFdUUCBPcGVyYXRpb24gQVBJIGFsbG93cyBjbGllbnRzIHRvIGRvLi4uZXZlcnl0aGluZyE8L2Fic3RyYWN0PgotCi0JCTwhLS0gZm9ybWF0dGluZyBoYW5kbGVkIGJ5IFhTTFQgVHJhbnNmb3JtYXRpb24gLS0+Ci0JCTxwPlVuZGVyIENvbnN0cnVjdGlvbi48L3A+Ci0JCTxpbWcgc3JjPSJlc2NhcGVfb3V0X3RvX3NvdXJjZV9mb2xkZXIgbGV2ZWwvb3ZlcnZpZXcveW91cl9pbWFnZS5qcGciIGNhcHRpb24gPSJJbWFnZSBkZXNjcmlwdGlvbiIgLz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vbk1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDgwYTc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBDb21tb25NZXNzYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9FWElTVFNfRVJST1IgPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05PVF9FQVIgPSAiMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNPTVBBVEFCTEVfSjJFRV9WRVJTSU9OUyA9ICIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTUVfTU9EVUxFX0FORF9FQVJfTkFNRSA9ICI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkVfRklMRV9OQU1FX0VNUFRZX0VSUk9SID0gIjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9ET0VTX05PVF9FWElTVF9FUlJPUiA9ICI2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX0VSUk9SID0gIjciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FX0lOVkFMSUQgPSAiOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUSU5BVElPTl9BUkNISVZFX1NIT1VMRF9FTkRfV0lUSCA9ICI5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RJTkFUSU9OX0lOVkFMSUQgPSAiMTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfUkVBRF9PTkxZID0gIjExIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0VYSVNUU19FUlJPUiA9ICIxMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05PVF9FWElTVFNfRVJST1IgPSAiMTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ19MRVZFTF9OT1RfRk9VTkQgPSAiMTQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FX0VNUFRZID0gIjE1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ2xPU0VEID0gIjMxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRVhJU1RTX0FUX0xPQ0FUSU9OX0VSUk9SID0gIjMyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9FTVBUWV9NT0RVTEVfTkFNRSA9ICIzNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfSU5WQUxJRF9DSEFSUyA9ICIzNSI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVQTElDQVRFX0NPTVBPTkVOVF9OQU1FPSIzNiI7Ly8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTk9UX1NVUFBPUlRFRD0iMzciOy8vJE5PTi1OTFMtMSQgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0VYSVNUU19FUlJPUiA9ICIzOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VGT0xERVJfRU1QVFkgPSAiMzkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQ09OVEVOVEZPTERFUl9FTVBUWSA9ICI0MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0VYSVNUU19TQU1FTkFNRV9FUlJPUiA9ICI0MyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX05PTkUgPSAiNDQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX1dJTExfQkVfQ1JFQVRFRCA9ICI0NSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1FX01PRFVMRV9BTkRfRUFSX05BTUVfRElGRkVSRU5UX0NBU0UgPSAiNDYiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZjODdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgamF2YS5sYW5nLlRocm93YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFdUUENvbW1vblBsdWdpbiBleHRlbmRzIFdUUFBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCA9ICJmdW5jdGlvbkdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCS8vCVRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgV1RQQ29tbW9uUGx1Z2luIHBsdWdpbjsKLQotCXB1YmxpYyBXVFBDb21tb25QbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid3RwX2NvbW1vbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdUUENvbW1vblBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZUVycm9yU3RhdHVzKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVdhcm5pbmdTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVdhcm5pbmdTdGF0dXMobWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUNhbmNlbFN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlQ2FuY2VsU3RhdHVzKG1lc3NhZ2UsIG51bGwpOwotCX0JCi0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCAtMSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIC0xLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVDYW5jZWxTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIFBMVUdJTl9JRCwgLTEsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFdUUENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmdzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbiNnZXRQbHVnaW5JRCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvd3RwX2NvbW1vbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL3d0cF9jb21tb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlZTNmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvd3RwX2NvbW1vbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0xPUEgcHJvamVjdCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoaXMgbmFtZSBhbmQgbG9jYXRpb24uCi0yPVRoZSBzcGVjaWZpZWQgRUFSIHByb2plY3QgInswfSIgaXMgbm90IGFuIEVBUiBwcm9qZWN0LgotMz1UaGUgRUFSIHByb2plY3QgInswfSIgaGFzIGEgSjJFRVZlcnNpb24gb2YgezF9IHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgdmVyc2lvbi4KLTQ9VGhlIEVBUiBwcm9qZWN0IG5hbWUsICJ7MH0iLCBjYW4gbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9qZWN0IG5hbWUuCi01PXswfSBmaWxlIG5hbWUgbXVzdCBiZSBlbnRlcmVkLgotNj1UaGUgezB9IGRvZXMgbm90IGV4aXN0LgotNz1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gIFZpZXcgbG9nIGZpbGVzIGZvciBkZXRhaWxzLgotOD1Qcm9qZWN0IG5hbWUgaXMgaW52YWxpZC4KLTk9RGVzdGluYXRpb24gYXJjaGl2ZSBzaG91bGQgZW5kIHdpdGggezB9LgotMTA9RGVzdGluYXRpb24gYXJjaGl2ZSBpcyBpbnZhbGlkLgotMTE9RGVzdGluYXRpb24gbG9jYXRpb24gaXMgcmVhZCBvbmx5LgotMTI9UmVzb3VyY2UgezB9IGFscmVhZHkgZXhpc3RzLiBJZiB5b3Ugd2lzaCB0byBvdmVyd3JpdGUgc2VsZWN0IHRoZSAiT3ZlcndyaXRlIEV4aXN0aW5nIGZpbGUiIG9wdGlvbi4KLTEzPVByb2plY3QgezB9IGRvZXMgbm90IGV4aXN0LgotMTQ9VGhlIHNlbGVjdGVkIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotMTU9RW50ZXIgYSBwcm9qZWN0IG5hbWUuCi0xNj1TYXZlIHByb2JsZW1zCi0xNz1TYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuICBTb21lIHJlbGF0ZWQgZmlsZXMgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHNhdmVkLlxuXG5SZWFzb24KLTE4PXswfSBoYXMgYmVlbiBsb2NrZWQuIFBsZWFzZSBlbnN1cmUgdGhlIG9wZXJhdGlvbiBpcyBub3QgY3VycmVudGx5IGV4ZWN1dGluZy4KLTE5PVRoZSBleHRlbmRlZFJvb3QgaXMgbnVsbC4gTWFrZSBzdXJlIHRoYXQgaXNFeHRlbmRlZCgpIHJldHVybnMgdHJ1ZS4KLTIwPVByb3BlcnR5IG5vdCBsb2NhdGVkOgotMjE9TmVzdGVkIG1vZGVsIG5vdCBsb2NhdGVkOgotMjI9Q2Fubm90IG1vZGlmeSBpZCBvbmNlIGl0IGhhcyBiZWVuIHNldC4KLTIzPVRoZSBpZCBjYW5ub3QgYmUgbnVsbC4KLTI0PUVSUk9SOgotMjU9RXh0ZW5kZWQgT3BlcmF0aW9uIGZhaWx1cmU6IHswfQotMjY9VGhlIEpvYiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0yNz1FeGNlcHRpb24gb2NjdXJyZWQgcnVubmluZyBqb2IuCi0yOD1Hcm91cCBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci0yOT1DbGFzcyBub3QgZm91bmQgZm9yIGF0dHJpYnV0ZSB7MH0gOiB7MX0sIERlY2xhcmluZyBwbHVnaW4gZXh0ZW5zaW9uOiB7Mn0KLTMwPUZ1bmN0aW9uIGdyb3VwIHswfSBjb250YWlucyBubyBwYXR0ZXJuIGJpbmRpbmdzCi0zMT1Qcm9qZWN0IHswfSBpcyBjbG9zZWQuCi0zMj1BIHByb2plY3QgYWxyZWFkeSBleGlzdHMgb24gdGhlIGZpbGUgc3lzdGVtIGF0IHRoaXMgbG9jYXRpb246IHswfS4gIEVpdGhlciB1c2UgIkltcG9ydCBFeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZSIgdG8gY3JlYXRlIGEgcHJvamVjdCBhdCB0aGlzIGxvY2F0aW9uIG9yIGRlbGV0ZSB0aGUgY29udGVudHMgb2YgezB9IGZyb20gdGhlIGZpbGUgc3lzdGVtLgotMzM9QSBtb2RlbCBpbnN0YW5jZSBtYXkgb25seSBiZSBuZXN0ZWQgb25jZSB1bmRlciBhbm90aGVyIG1vZGVsIGluc3RhbmNlLgotMzQ9TW9kdWxlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotMzU9SW52YWxpZCBjaGFyYWN0ZXJzLgotMzY9VGhlIG1vZHVsZSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLTM3PVRoZSBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlci4KLTM4PU1vZHVsZSBuYW1lIGlzIGludmFsaWQuCi0zOT1FbnRlciBTb3VyY2UgRm9sZGVyCi00MD1FbnRlciBXZWIgY29udGVudCBGb2xkZXIKLTQxPVByb2plY3QgbmFtZXMgY2Fubm90IGVuZCB3aXRoIHdoaXRlIHNwYWNlLgotNDI9UmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCBjYXNlLgotNDM9QSBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIHdpdGggdGhpcyBuYW1lLgotNDQ9PE5vbmU+Ci00NT1FQVIgcHJvamVjdCB7MH0gZG9lcyBub3QgZXhpc3QuIEl0IHdpbGwgYmUgY3JlYXRlZC4KLTQ2PVRoZSBFQVIgcHJvamVjdCBuYW1lLCAiezB9IiwgY2FuIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJvamVjdCBuYW1lIHdpdGggYSBkaWZmZXJlbnQgY2FzZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTAyNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDY4Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMzoxMjo0MiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3NGUzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDM6MTI6MzYgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNWM4Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9TbmlwcGV0c0NvbnRleHRzLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL1NuaXBwZXRzQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2IwYzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL1NuaXBwZXRzQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJsaWJ2MTAwMCI+Ci08ZGVzY3JpcHRpb24+VXNlIHRoaXMgdmlldyB0byBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBtYXJrdXAsIGFsb25nIHdpdGggY3VzdG9tIHRhZ3MsIHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluIGV4aXN0aW5nIGZpbGVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJsaWJ2MTEwMCI+Ci08ZGVzY3JpcHRpb24+U3VwcGx5IHZhbHVlcyBpbiB0aGlzIGRpYWxvZyB0byBkZWZpbmUgdGhlIFNuaXBwZXRzIHZpZXcgb2JqZWN0IHRvIGJlIGluc2VydGVkIGluIHRoZSBjdXJyZW50IGZpbGUgYXQgdGhlIGN1cnNvciBwb3NpdGlvbi4gQXNzaWduIGEgdmFsdWUgdG8gdGhlIHZhcmlhYmxlcyBiZWluZyBpbnNlcnRlZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9Ikluc2VydGluZyBhbmQgZWRpdGluZyBpdGVtcyBpbiB0aGUgYWN0aXZlIGVkaXRvciIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ibGlidjEyMDAiPgotPGRlc2NyaXB0aW9uPkluIHRoZSA8Yj5OYW1lPC9iPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGFzIHlvdSB3YW50IGl0IGJlIGRpc3BsYXllZCBpbiB0aGUgU25pcHBldHMgdmlldy4gIE9wdGlvbmFsbHksIGFkZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgaW4gdGhlIDxiPkRlc2NyaXB0aW9uPC9iPiBmaWVsZC4KLQotU2VsZWN0IHRoZSA8Yj5IaWRlPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGlzIHNuaXBwZXQgb2JqZWN0IG5vdCB2aXNpYmxlIGluIHRoZSB2aWV3LgotCi1UbyBhZGQgYSBuZXcgdmFyaWFibGUsIGNsaWNrIHRoZSA8Yj5OZXc8L2I+IHB1c2ggYnV0dG9uLCBhbmQgdHlwZSB2YWx1ZXMgaW4gdGhlIGNlbGxzIG9mIHRoZSA8Yj5WYXJpYWJsZXM8L2I+IHRhYmxlLiBUaGUgPGI+TmFtZTwvYj4gZmllbGQgcmVwcmVzZW50cyBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgd2hlbiB5b3UgYWRkIGl0IHRvIGEgZG9jdW1lbnQuIDxiPkRlZmF1bHQgdmFsdWU8L2I+IGlzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBuYW1lZCB2YXJpYWJsZS4gT3B0aW9uYWxseSwgYWRkIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhYmxlLgotCi1JbnNlcnQgdGhlIHZhcmlhYmxlcyB0aGF0IHlvdSBkZWZpbmUgaW50byB0aGUgPGI+VGVtcGxhdGUgUGF0dGVybjwvYj4gZmllbGQgdXNpbmcgdGhlIDxiPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvYj4gcHVzaCBidXR0b24uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJsaWJ2MTMwMCI+Ci08ZGVzY3JpcHRpb24+VHlwZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGNhdGVnb3J5IGluIHRoZSA8Yj5OYW1lPC9iPiBmaWVsZCBhbmQgb3B0aW9uYWxseSBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2F0ZWdvcnkgaW4gdGhlIDxiPkRlc2NyaXB0aW9uPC9iPiBmaWVsZC4KLQotU2VsZWN0IDxiPk9wZW4gZHJhd2VyIGF0IHN0YXJ0LXVwPC9iPiB0byBoYXZlIHRoZSBjYXRlZ29yeSBkcmF3ZXIgb3BlbmVkIGluIHRoZSBTbmlwcGV0cyB2aWV3IHdoZW4gdGhlIHdvcmtiZW5jaCBzdGFydHMgdXAuCi0KLVlvdSBjYW4gc3BlY2lmeSBob3cgeW91IHdhbnQgdGhlIGNhdGVnb3J5IGRyYXdlciBkaXNwbGF5ZWQgaW4gdGhlIFNuaXBwZXRzIHZpZXcgYnkgc2VsZWN0aW5nIGEgcmFkaW8gYnV0dG9uIGZvciB0aGUgPGI+U2hvdy9IaWRlIERyYXdlcjwvYj4gZmllbGQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJzbmlwMDAxMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPkltcG9ydDwvYj4gZGlhbG9nLCB3aGljaCBsZXRzIHlvdSBpbXBvcnQgc25pcHBldCBjYXRlZ29yaWVzIGZyb20gdGhlIGZpbGUgc3lzdGVtLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDIwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+RXhwb3J0PC9iPiBkaWFsb2csIHdoaWNoIGxldHMgeW91IGV4cG9ydCBzbmlwcGV0IGNhdGVnb3JpZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDMwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGNvbnRlbnQgdHlwZXMgdGhhdCBzaG91bGQgYmUgdmlzaWJsZSBpbiB0aGlzIGRyYXdlciBmb3IgaW4gdGhlIFNuaXBwZXRzIHZpZXcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJzbmlwMDA0MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBtZW51IGl0ZW0gYWRkcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgU25pcHBldHMgdmlldyBhcyBhIG5ldyBpdGVtLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDUwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIG1lbnUgaXRlbSBjdXRzIHRoZSBzZWxlY3RlZCBTbmlwcGV0IGl0ZW0gdG8gdGhlIGNsaXBib2FyZC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic25pcDAwNjAiPgotPGRlc2NyaXB0aW9uPlRoaXMgbWVudSBpdGVtIGNvcGllcyB0aGUgc2VsZWN0ZWQgU25pcHBldCBpdGVtIHRvIHRoZSBjbGlwYm9hcmQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzbmlwcGV0IGl0ZW1zIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InNuaXAwMDcwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIG1lbnUgaXRlbSBjcmVhdGVzIGEgbmV3IFNuaXBwZXRzIHZpZXcgaXRlbSBjb250YWluaW5nIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTbmlwcGV0cyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InNuaXAwMDgwIj4KLTxkZXNjcmlwdGlvbj5UeXBlIGEgbmFtZSBmb3IgdGhlIGNhdGVnb3J5LiBUaGUgY2F0ZWdvcnkgYXBwZWFycyBpbiB0aGUgQ3VzdG9taXplIFBhbGV0dGUgZGlhbG9nIGJveC4gT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgY2F0ZWdvcnksIHlvdSBjYW4gYWRkIGl0ZW1zIHRvIHRoZSBjYXRlZ29yeS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNuaXBwZXRzIHZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkM2RiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgU25pcHBldHNDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFlOGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbmZvcG9wCi1CdW5kbGUtTmFtZS4wID0gQ29tbW9uIFdTVCBpbmZvcG9wcwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlMTc4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IlNuaXBwZXRzQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzdlYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQ4MmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSNGcmkgU2VwIDExIDE3OjEzOjA4IFBEVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjlmZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC41LnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTW9kdWxlQ29yZVVJUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMi43LDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4yMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjUuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjIwMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS52ZXJpZmllcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZTt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZDViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+QXVndXN0LCAyMDA5PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjA3ODdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9pY29ucy9hc3NlbWJseS1iYW5uZXIucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvaWNvbnMvYXNzZW1ibHktYmFubmVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyOGFmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9pY29ucy9hc3NlbWJseS1iYW5uZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvaWNvbnMvZm9sZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWIyNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvaWNvbnMvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL2phcl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvaWNvbnMvamFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMzE1ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvaWNvbnMvamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9pY29ucy9wcmpfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL3Byal9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGVhNTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL2ljb25zL3Byal9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2MzA3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXI9RWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBNb2R1bGVjb3JlIFVJIFBsdWctaW4KLU1vZHVsZV9hc3NlbWJseS5uYW1lID0gRGVwbG95bWVudCBBc3NlbWJseQotUHJvamVjdD1Qcm9qZWN0Ci1Gb2xkZXJfTWFwcGluZz1Gb2xkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNjM1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIiBuYW1lPSJtb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlZmVyZW5jZVdpemFyZEZyYWdtZW50IiBuYW1lPSJyZWZlcmVuY2VXaXphcmRGcmFnbWVudCIgc2NoZW1hPSJzY2hlbWEvcmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiIG5hbWU9InZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyIiBzY2hlbWE9InNjaGVtYS92aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllciIgbmFtZT0iRGVwbG95bWVudCBBc3NlbWJseSBWZXJpZmllciIgc2NoZW1hPSJzY2hlbWEvZGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb3VyY2VNYXBwaW5nRmlsdGVyIiBuYW1lPSJyZXNvdXJjZU1hcHBpbmdGaWx0ZXIiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlTWFwcGluZ0ZpbHRlci5leHNkIi8+Ci0gICA8IS0tID09PT09PT09PT09IERlcGxveW1lbnRBc3NlbWJseVBhZ2UgPT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gCTxwYWdlCi0gICAgICAJCW5hbWU9IiVNb2R1bGVfYXNzZW1ibHkubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLk1vZHVsZUFzc2VtYmx5Um9vdFBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLkRlcGxveW1lbnRBc3NlbWJseVBhZ2UiPgotICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0Ci0JCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9qZWN0TmF0dXJlIgotICAgICAgICAgIAkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiLz4KLQkJCQk8L2FkYXB0PgotICAgICAgICAgPC9lbmFibGVkV2hlbj4gICAgICAgICAgCi0gICAgICA8L3BhZ2U+Ci0gICAgICA8L2V4dGVuc2lvbj4KLQotCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkucmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQiPgotICAgICAgIDxyZWZlcmVuY2VGcmFnbWVudAotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLlByb2plY3RSZWZlcmVuY2VXaXphcmRGcmFnbWVudCIKLSAgICAgICAgICAgICBpY29uPSJpY29ucy9wcmpfb2JqLmdpZiIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLm5ld1Byb2plY3RSZWZlcmVuY2UiCi0gICAgICAgICAgICAgbmFtZT0iJVByb2plY3QiPgotICAgICAgIDwvcmVmZXJlbmNlRnJhZ21lbnQ+Ci0gICAgICAgPHJlZmVyZW5jZUZyYWdtZW50Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuRm9sZGVyTWFwcGluZ1dpemFyZEZyYWdtZW50IgotICAgICAgICAgICAgIGljb249Imljb25zL2ZvbGRlci5naWYiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5yZXNvdXJjZU1hcHBpbmdSZWZlcmVuY2UiCi0gICAgICAgICAgICAgbmFtZT0iJUZvbGRlcl9NYXBwaW5nIj4KLSAgICAgICA8L3JlZmVyZW5jZUZyYWdtZW50PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5yZXNvdXJjZU1hcHBpbmdGaWx0ZXIiPgotICAgICAgICA8cmVzb3VyY2VNYXBwaW5nIAotICAgICAgICAgICAgICBzb3VyY2UtcGF0aD0iXC5zZXR0aW5ncyI+ICAgICAgICAgICAgCi0gICAgICAgIDwvcmVzb3VyY2VNYXBwaW5nPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvZGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS9kZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmUyMjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS9kZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkiIGlkPSJEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllciIgbmFtZT0iRGVwbG95bWVudCBBc3NlbWJseSBWZXJpZmllciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZXh0ZW5zaW9uIHBvaW50IGdpdmVzIHRoZSBhYmlsaXR5IHRvIGV4dGVuZCBkZXBsb3ltZW50IGFzc2VtYmx5IHZhbGlkYXRpb24gZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiByZXNvdXJjZSBhbmQgZGVwZW5kZW5jeSBtYXBwaW5ncy4gUmVnaXN0cmF0aW9uIG9mIHRoZSB2ZXJpZmllciBpcyBiYXNlZCBvbiBjb21wb25lbnQgdHlwZSBhbmQgc2VydmVyIHRhcmdldC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZlcmlmaWVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idmVyaWZpZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbXBvbmVudCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSB1c2VkIGFzIHRoZSB2ZXJpZmllcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iQWJzdHJhY3REZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVfc2VydmVyX2lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBydW50aW1lIHNlcnZlciBpZCBmb3IgdGhpcyB2ZXJpZmllcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wb25lbnRfdHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgc3VwcG9ydGVkIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIHZlcmlmaWVyKHVzZXMgZmFjZXQgaWQpCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvbW9kdWxlRGVwZW5kZW5jeVByb3BlcnR5UGFnZS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc2NoZW1hL21vZHVsZURlcGVuZGVuY3lQcm9wZXJ0eVBhZ2UuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2MmE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvbW9kdWxlRGVwZW5kZW5jeVByb3BlcnR5UGFnZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkiIGlkPSJtb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIiBuYW1lPSJtb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXBlbmRlbmN5UGFnZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXBlbmRlbmN5UGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS9yZWZlcmVuY2VXaXphcmRGcmFnbWVudC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc2NoZW1hL3JlZmVyZW5jZVdpemFyZEZyYWdtZW50LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjAzODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc2NoZW1hL3JlZmVyZW5jZVdpemFyZEZyYWdtZW50LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aSIgaWQ9InJlZmVyZW5jZVdpemFyZEZyYWdtZW50IiBuYW1lPSJyZWZlcmVuY2VXaXphcmRGcmFnbWVudCIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGludGVybmFsPSJ0cnVlIiAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZWZlcmVuY2VGcmFnbWVudCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VGcmFnbWVudCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBVSSwgaW5zaWRlIHRoZSB2aWV3ZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLldpemFyZEZyYWdtZW50OiIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhpZGRlbiIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVHJ1ZSBpZiB0aGlzIHJlZmVyZW5jZSB0eXBlIHNob3VsZCBiZSBoaWRkZW4gYW5kIE5PVCBleHBvc2VkIGFzIGEgcG9zc2libGUgcmVmZXJlbmNlIGZvciBhbGwgdmlydHVhbCBjb21wb25lbnRzLCBmYWxzZSBpZiBpdCB3aWxsIGJlIGhpZGRlbiBhbmQgYWRkZWQgbWFudWFsbHkgdG8gcmVsZXZhbnQgY29tcG9uZW50cyZhcG9zOyByZWZlcmVuY2Ugd2l6YXJkcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS9yZXNvdXJjZU1hcHBpbmdGaWx0ZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS9yZXNvdXJjZU1hcHBpbmdGaWx0ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiNzc1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvcmVzb3VyY2VNYXBwaW5nRmlsdGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpIiBpZD0icmVzb3VyY2VNYXBwaW5nRmlsdGVyIiBuYW1lPSJyZXNvdXJjZU1hcHBpbmdGaWx0ZXIiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdG8gYmUgdXNlZCB0byBzcGVjaWZ5IGFueSBmb2xkZXIgdGhhdCBzaG91bGQgbm90IGJlIGRpc3BsYXllZCBvciBhbGxvd2VkIHRvIGJlIGFkZGVkIGFzIHJlc291cmNlIG1hcHBpbmcgdXNpbmcgdGhlICZhcG9zO0RlcGxveW1lbnQgQXNzZW1ibHkmYXBvczsgcHJvcGVydGllcyBwYWdlCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBpbnRlcm5hbD0idHJ1ZSIgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb3VyY2VNYXBwaW5nIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZU1hcHBpbmciPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UtcGF0aCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBQcm9qZWN0IHJlbGF0aXZlIHNvdXJjZSBwYXRoIHRoYXQgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCByZXByZXNlbnRlZCBhcyByZWd1bGFyIGV4cHJlc3Npb24uIChpLmUuIHNvdXJjZS1wYXRoPSZxdW90O1wuc2V0dGluZ3MmcXVvdDsgd291bGQgZmlsdGVyIG91dCB0aGUgJmFwb3M7LnNldHRpbmdzJmFwb3M7IGZvbGRlciBhbmQgaXRzIGNvbnRlbnRzOyBTaW5jZSBpdCBleHBlY3RzIGEgcmVsYXRpdmUgcGF0aCBmaWx0ZXJpbmcgc291cmNlLXBhdGg9JnF1b3Q7L1wuc2V0dGluZ3MmcXVvdDsgd291bGQgbm90IGZpbHRlciBvdXQgdGhlICZhcG9zOy5zZXR0aW5ncyZhcG9zOyBmb2xkZXIpCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFdUUCAzLjIuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7ZXh0ZW5zaW9uIAotIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5yZXNvdXJjZU1hcHBpbmdGaWx0ZXImcXVvdDsmZ3Q7Ci0gICZsdDtyZXNvdXJjZU1hcHBpbmcKLSAgIHNvdXJjZS1wYXRoPSZxdW90O1wuc2V0dGluZ3MmcXVvdDsmZ3Q7Ci0gICZsdDsvcmVzb3VyY2VNYXBwaW5nJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zY2hlbWEvdmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS92aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Q4N2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NjaGVtYS92aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkiIGlkPSJ2aXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlciIgbmFtZT0idmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5JVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWlnaHQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvVGFza01vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvVGFza01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjEwMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Rhc2tNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0vKioKLSAqIEEgdGFzayBtb2RlbCByZXByZXNlbnRzIGEgbW9kZWwgdGhhdCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUKLSAqIHRhc2tzIGluIGEgY29tbW9uIHdvcmtmbG93LgotICogPHA+Ci0gKiBUaGUgdGFzayBtb2RlbCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3ZlcmFsbCB0YXNrIGZsb3cgYW5kIGFsbG93cwotICogdGFza3MgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGRhdGEuIEl0cyB1c2FnZSBhbGxvd3MgbXVsdGlwbGUgdGFza3MgdG8gYmUKLSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAotICogb2YgYW5vdGhlci4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza01vZGVsIHsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBpbiB0aGUgdGFzayBtb2RlbCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgaWQgY2FuIGJlIGFueSBvZiB0aGUgcHJlZGVmaW5lZCBpZHMgd2l0aGluIFRhc2tNb2RlbCwgb3IKLQkgKiBhbnkgb3RoZXIga2V5IHRvIHJldHJpZXZlIHRhc2stc3BlY2lmaWMgZGF0YS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkIGZvciB0aGUgb2JqZWN0Ci0JICogQHJldHVybiB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIG5vIG9iamVjdCBjb3VsZCBiZSBmb3VuZCB3aXRoIHRoYXQgaWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgaWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYXAuZ2V0KGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHV0IGFuIG9iamVjdCBpbnRvIHRoZSB0YXNrIG1vZGVsIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqIDxwPgotCSAqIFRoZSBpZCBjYW4gYmUgYW55IG9mIHRoZSBwcmVkZWZpbmVkIGlkcyB3aXRoaW4gVGFza01vZGVsLCBvcgotCSAqIGFueSBvdGhlciBrZXkgdG8gc3RvcmUgdGFzay1zcGVjaWZpYyBkYXRhLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NvY2lhdGUgdGhlIG9iamVjdCB3aXRoCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlc2V0IChjbGVhcikgdGhlIGlkCi0JICovCi0JcHVibGljIHZvaWQgcHV0T2JqZWN0KFN0cmluZyBpZCwgT2JqZWN0IG9iaikgewotCQltYXAucHV0KGlkLCBvYmopOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvSU1vZHVsZUNvcmVVSUNvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvSU1vZHVsZUNvcmVVSUNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyNmM2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL0lNb2R1bGVDb3JlVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWk7Ci0KLS8qKgotICogQGF1dGhvcjogQWlkeWwgS2FyZWgKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlQ29yZVVJQ29udGV4dElkcyB7Ci0JLy8JIE5ldyByZWZlcmVuY2VzIHdpemFyZHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lNRU5UX0FTU0VNQkxZX1BSRUZFUkVOQ0VfUEFHRV9BRERfTkVXX1JFRkVSRU5DRV9QMSA9IE1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLkRFUExPWU1FTlRfQVNTRU1CTFlfUFJFRkVSRU5DRV9QQUdFX0FERF9ORVdfUkVGRVJFTkNFX1AxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlRfQVNTRU1CTFlfUFJFRkVSRU5DRV9QQUdFX0FERF9ORVdfUFJPSkVDVF9SRUZFUkVOQ0VfUDEgPSBNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ERVBMT1lNRU5UX0FTU0VNQkxZX1BSRUZFUkVOQ0VfUEFHRV9BRERfTkVXX1BST0pFQ1RfUkVGRVJFTkNFX1AxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlRfQVNTRU1CTFlfUFJFRkVSRU5DRV9QQUdFX0FERF9ORVdfRk9MREVSX01BUFBJTkdfUDEgPSBNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ERVBMT1lNRU5UX0FTU0VNQkxZX1BSRUZFUkVOQ0VfUEFHRV9BRERfTkVXX0ZPTERFUl9NQVBQSU5HX1AxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlRfQVNTRU1CTFlfUFJFRkVSRU5DRV9QQUdFX0RFUExPWU1FTlRfQVNTRU1CTFlfVEFCID0gTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCArICIuREVQTE9ZTUVOVF9BU1NFTUJMWV9QUkVGRVJFTkNFX1BBR0VfREVQTE9ZTUVOVF9BU1NFTUJMWV9UQUIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODFkNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogQVBJIGluIHRoZXNlIHBhY2thZ2VzIGlzIHByb3Zpc2lvbmFsIGluIHRoaXMgcmVsZWFzZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2R1bGVBc3NlbWJseVJvb3RQYWdlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JDaGVja2luZ0ZhY2V0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvck5vdFZpcnR1YWxDb21wb25lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJIZWxwZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXBsb3lQYXRoQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvdXJjZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbExpYkphcldhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkRm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEZvbGRlckVsaXBzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkRm9sZGVyTWFwcGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkRWxsaXBzaXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdEVsbGlwc2lzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZVNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVybmFsSmFyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxKYXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UmVmZXJlbmNlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UmVmZXJlbmNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3UmVmZXJlbmNlV2l6YXJkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RSZWZlcmVuY2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0UmVmZXJlbmNlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVSZWZlcmVuY2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYXJpYWJsZVJlZmVyZW5jZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RDb252ZXJzaW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhpc3RpbmdGb2xkZXJFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXZlcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JFbnRyeU5vdEZvdW5kOwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvTW9kdWxlQ29yZVVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL01vZHVsZUNvcmVVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzM0NTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvTW9kdWxlQ29yZVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICAKLSAqIEFQSSBpbiB0aGVzZSBwYWNrYWdlcyBpcyBwcm92aXNpb25hbCBpbiB0aGlzIHJlbGVhc2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElDT05fRElSUyA9IG5ldyBTdHJpbmdbXXsiaWNvbnMvZnVsbC9vYmoxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvY3ZpZXcxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvY3Rvb2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvY2xjbDE2IiwgLy8kTk9OLU5MUy0xJAotCQkiaWNvbnMvZnVsbC9vdnIxNiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zL2Z1bGwvZXh0cmEiLCAvLyROT04tTkxTLTEkCi0JCSJpY29ucy9mdWxsL3dpemJhbiIsIC8vJE5PTi1OTFMtMSQKLQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkiIn07IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBNb2R1bGVDb3JlVUlQbHVnaW4gcGx1Z2luOwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlQ29yZVVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyVUlQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZUNvcmVVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgLmdpZiBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwgfHwgaW1hZ2UuaXNEaXNwb3NlZCgpKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWltYWdlID0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXksZ2V0QnVuZGxlKCkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXksIEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElDT05fRElSUy5sZW5ndGg7IGkrKykgewotCQkJcGF0aCA9IG5ldyBQYXRoKElDT05fRElSU1tpXSkuYXBwZW5kKGdpZik7Ci0JCQlpZiAoUGxhdGZvcm0uZmluZChidW5kbGUscGF0aCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoIGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZUNvcmVVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpIHsKLQkJbG9nKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgbWVzc2FnZSwgZSk7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggZXhjZXB0aW9uLmdldFN0YXR1cygpICk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL1RyYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWQzNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogQVBJIGluIHRoZXNlIHBhY2thZ2VzIGlzIHByb3Zpc2lvbmFsIGluIHRoaXMgcmVsZWFzZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aTsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBJTkZPID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV0FSTklORyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFVkVSRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVTVCA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEZJTkVSID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEVSRk9STUFOQ0UgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFWFRFTlNJT05fUE9JTlQgPSA3OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV2ZWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJDT05GSUcgIiwgIklORk8gICAiLCAiV0FSTklORyIsICJTRVZFUkUgIiwgIkZJTkVSICAiLCAiRklORVNUICIsICJQRVJGICAgIiwgIkVYVEVOU0lPTiJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiZGQvTU0veXkgSEg6bW0uc3MuU1NTIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBsb2dnZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgYSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobGV2ZWwgPT0gU0VWRVJFKSB7Ci0JCQlpZiAoIWxvZ2dlZC5jb250YWlucyhzKSkgewotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZygKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgCi0JCQkJCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsIHMsIHQpKTsKLQkJCQlsb2dnZWQuYWRkKHMpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIU1vZHVsZUNvcmVVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKE1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKGxldmVsTmFtZXNbbGV2ZWxdKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvQWRkRm9sZGVyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9BZGRGb2xkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5M2EzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9BZGRGb2xkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1lc3NhZ2VzOwotCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIEFkZEZvbGRlckRpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBJQ29udGFpbmVyIHNlbGVjdGVkID0gbnVsbDsKLQlwdWJsaWMgQWRkRm9sZGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsgICAgICAgIAotICAgICAgICBzZXRTaGVsbFN0eWxlKCBnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFICk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQkKLQkJc2hlbGwuc2V0Qm91bmRzKHNoZWxsLmdldExvY2F0aW9uKCkueCwgc2hlbGwuZ2V0TG9jYXRpb24oKS55LCA0MDAsMzAwKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYyA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlwYXJlbnQuZ2V0U2hlbGwoKS5zZXRUZXh0KE1lc3NhZ2VzLkFkZEZvbGRlcik7Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLkFkZEZvbGRlcik7Ci0JICAgIHNldE1lc3NhZ2UoTWVzc2FnZXMuQWRkRm9sZGVyTWFwcGluZ3MpOwotCSAgICAvL3NldFRpdGxlSW1hZ2UoICApOwotCQl0aGlzLnZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGMsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihnZXRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5hZGRGaWx0ZXIoZ2V0RmlsdGVyKCkpOwotCQl2aWV3ZXIuc2V0SW5wdXQocHJvamVjdCk7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBmaXJzdCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiggZmlyc3QgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSAKLQkJCQkJc2VsZWN0ZWQgPSAoSUNvbnRhaW5lcilmaXJzdDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIElDb250YWluZXIgZ2V0U2VsZWN0ZWQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LAotCQkJCQlPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHByb2plY3QubWVtYmVycygpOwotCQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCQkJCXJldHVybiBuZXcgT2JqZWN0W117fTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gKChJQ29udGFpbmVyKWVsZW1lbnQpLm1lbWJlcnMoKS5sZW5ndGggPiAwOwotCQkJCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlICkgewotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCQkJcmV0dXJuICgoSVJlc291cmNlKWVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlpZiggcGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiAoKElDb250YWluZXIpcGFyZW50RWxlbWVudCkubWVtYmVycygpOwotCQkJCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlICkgewotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgT2JqZWN0W117fTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJCQlyZXR1cm4gKChJUmVzb3VyY2UpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjYyNjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0NvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLkFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuQ29tcG9uZW50UmVzb3VyY2VQcm94eTsKLQotCi0vKgotICogIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnRzIHRoaXMgY29udGVudCBwcm92aWRlciAoc2hvdWxkKSBwcm92aWRlCi0gKiAgYXJlIElQcm9qZWN0IG9yIElWaXJ0dWFsQ29tcG9uZW50IG9iamVjdHMuIFRoZSBydW50aW1lIHBhdGhzIHBvcnRpb24gaXMgCi0gKiAgc2hhcmVkIHdpdGggdGhlIHByZWZlcmVuY2UgcGFnZSBpdHNlbGYgd2hlcmUgdGhleSBjYW4gYm90aCBtb2RpZnkgdGhlIGRhdGEuIAotICogCi0gKiBUaGlzIHByb3ZpZGVyIG5vIGxvbmdlciAibWVkZGxlcyIgaW4gdG8gdGhlIGNvbnRlbnQgYXMgaXQgdXNlZCB0bywgCi0gKiBidXQgcmF0aGVyIHNlcnZlcyBhcyBvbmx5IGEgdmlldyBvZiBpdC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyLCBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCi0JZmluYWwgc3RhdGljIFN0cmluZyBQQVRIX1NFUEFSQVRPUiA9IFN0cmluZy52YWx1ZU9mKElQYXRoLlNFUEFSQVRPUik7Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJ1bnRpbWVQYXRoczsKLQlwcml2YXRlIEFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZVByb3h5PiByZXNvdXJjZU1hcHBpbmdzOwotCXByaXZhdGUgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgZGVjUHJvdmlkZXIgPSBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JICAgICAgICAgICAgICAgIG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuCi0JICAgICAgICAgICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXJbXSBkZWxlZ2F0ZXM7Ci0JcHVibGljIENvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXIoQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UgYWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UpIHsKLQkJc3VwZXIoKTsKLQkJZGVjUHJvdmlkZXIuYWRkTGlzdGVuZXIoYWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UpOwotCQlkZWxlZ2F0ZXMgPSBEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIubG9hZERlbGVnYXRlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVQYXRocyhBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJ1bnRpbWVQYXRocykgewotCQl0aGlzLnJ1bnRpbWVQYXRocyA9IHJ1bnRpbWVQYXRoczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hcHBpbmdzKEFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZVByb3h5PiBtYXBwaW5ncykgewotCQl0aGlzLnJlc291cmNlTWFwcGluZ3MgPSBtYXBwaW5nczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJT2JqZWN0W10gZW1wdHkgPSBuZXcgT2JqZWN0WzBdOwotCQlpZiggIShpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkpCi0JCQlyZXR1cm4gZW1wdHk7Ci0JCUFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJbGlzdC5hZGRBbGwocmVzb3VyY2VNYXBwaW5ncyk7Ci0JCWxpc3QuYWRkQWxsKHJ1bnRpbWVQYXRocyk7Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRSZXNvdXJjZVByb3h5KSB7Ci0JCQlyZXR1cm4gTW9kdWxlQ29yZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImZvbGRlciIpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCWlmKCBjb2x1bW5JbmRleCA9PSBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5TT1VSQ0VfQ09MVU1OICl7Ci0JCQkJcmV0dXJuIGhhbmRsZVNvdXJjZUltYWdlKCgoSVZpcnR1YWxSZWZlcmVuY2UpZWxlbWVudCkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCX0gZWxzZSBpZihjb2x1bW5JbmRleCA9PSBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5ERVBMT1lfQ09MVU1OKXsKLQkJCQlyZXR1cm4gTW9kdWxlQ29yZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImphcl9vYmoiKTsKLQkJCX0KLQkJfSAKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCl7Ci0JCQlyZXR1cm4gZGVjUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRSZXNvdXJjZVByb3h5KSB7Ci0JCQlpZiggY29sdW1uSW5kZXggPT0gQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuU09VUkNFX0NPTFVNTiApIHsgCi0JCQkJcmV0dXJuICgoQ29tcG9uZW50UmVzb3VyY2VQcm94eSllbGVtZW50KS5zb3VyY2UudG9TdHJpbmcoKTsKLQkJCX0gZWxzZSBpZiggY29sdW1uSW5kZXggPT0gQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuREVQTE9ZX0NPTFVNTiApIHsKLQkJCQlpZigoKENvbXBvbmVudFJlc291cmNlUHJveHkpZWxlbWVudCkucnVudGltZVBhdGguaXNSb290KCkpCi0JCQkJCXJldHVybiAoKENvbXBvbmVudFJlc291cmNlUHJveHkpZWxlbWVudCkucnVudGltZVBhdGgudG9TdHJpbmcoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAoKENvbXBvbmVudFJlc291cmNlUHJveHkpZWxlbWVudCkucnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlKSB7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuU09VUkNFX0NPTFVNTikgewotCQkJCXJldHVybiBoYW5kbGVTb3VyY2VUZXh0KCgoSVZpcnR1YWxSZWZlcmVuY2UpZWxlbWVudCkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuREVQTE9ZX0NPTFVNTikgewotCQkJCXJldHVybiBuZXcgUGF0aChBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5nZXRTYWZlUnVudGltZVBhdGgoKElWaXJ0dWFsUmVmZXJlbmNlKWVsZW1lbnQpKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCQkJfSAKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQlwcml2YXRlIFN0cmluZyBoYW5kbGVTb3VyY2VUZXh0KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiggZGVsZWdhdGVzICE9IG51bGwgKSB7Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5sZW5ndGg7IGkrKyApCi0JCQkJaWYoIGRlbGVnYXRlc1tpXS5jYW5IYW5kbGUoY29tcG9uZW50KSkKLQkJCQkJcmV0dXJuIGRlbGVnYXRlc1tpXS5nZXRTb3VyY2VUZXh0KGNvbXBvbmVudCk7Ci0JCX0KLQkJCi0JCS8vIGRlZmF1bHQgaW1wbAotCQlpZiggY29tcG9uZW50LmlzQmluYXJ5KCkgKSB7Ci0JCQlJUGF0aCBwID0gKElQYXRoKWNvbXBvbmVudC5nZXRBZGFwdGVyKElQYXRoLmNsYXNzKTsJCQkKLQkJCXJldHVybiBwID09IG51bGwgPyBjb21wb25lbnQuZ2V0TmFtZSgpIDogcC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBjb21wb25lbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGhhbmRsZVNvdXJjZUltYWdlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiggZGVsZWdhdGVzICE9IG51bGwgKSB7Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5sZW5ndGg7IGkrKyApCi0JCQkJaWYoIGRlbGVnYXRlc1tpXS5jYW5IYW5kbGUoY29tcG9uZW50KSkKLQkJCQkJcmV0dXJuIGRlbGVnYXRlc1tpXS5nZXRTb3VyY2VJbWFnZShjb21wb25lbnQpOwotCQl9Ci0JCQotCQkvLyBkZWZhdWx0IGltcGwKLQkJaWYoY29tcG9uZW50LmlzQmluYXJ5KCkpCi0JCQlyZXR1cm4gTW9kdWxlQ29yZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImphcl9vYmoiKTsKLQkJZWxzZSByZXR1cm4gZGVjUHJvdmlkZXIuZ2V0SW1hZ2UoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpewotCQlyZXR1cm4gY29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9EZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1ZGYzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9EZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVkIEhhdCBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBhZGRlZCBzdXBwb3J0IGZvciBlbmFibGVtZW50IGV4cHJlc3Npb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5XaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLklEZXBlbmRlbmN5UGFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLQotcHVibGljIGNsYXNzIERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmKCBtYW5hZ2VyID09IG51bGwgKQotCQkJbWFuYWdlciA9IG5ldyBEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCQotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIElEZXBlbmRlbmN5UGFnZVByb3ZpZGVyPiBwcm92aWRlcnMgPSBudWxsOwotCQotCXB1YmxpYyBJRGVwZW5kZW5jeVBhZ2VQcm92aWRlciBnZXRQcm92aWRlcihJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewotCQlpZiggcHJvdmlkZXJzID09IG51bGwgKQotCQkJbG9hZFByb3ZpZGVycygpOwotCQlJdGVyYXRvcjxJRGVwZW5kZW5jeVBhZ2VQcm92aWRlcj4gaSA9IHByb3ZpZGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlJRGVwZW5kZW5jeVBhZ2VQcm92aWRlciB0ZW1wOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJdGVtcCA9IGkubmV4dCgpOwotCQkJaWYoIHRlbXAuY2FuSGFuZGxlKHByb2plY3QpKQotCQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFByb3ZpZGVycygpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIElEZXBlbmRlbmN5UGFnZVByb3ZpZGVyPiB0ZW1wID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJRGVwZW5kZW5jeVBhZ2VQcm92aWRlcj4oKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0JCQkJTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCwgIm1vZHVsZURlcGVuZGVuY3lQcm9wZXJ0eVBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IoIGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrICkgewotCQkJdHJ5IHsKLQkJCQl0ZW1wLnB1dChjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksICAvLyROT04tTkxTLTEkCi0JCQkJCShJRGVwZW5kZW5jeVBhZ2VQcm92aWRlciljZltpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSAKLQkJCXsKLQkJCQlNb2R1bGVDb3JlVUlQbHVnaW4ubG9nKCBjZSApOwotCQkJfQotCQl9Ci0JCXByb3ZpZGVycyA9IHRlbXA7Ci0JfQotCQotCXB1YmxpYyBXaXphcmRGcmFnbWVudFtdIGxvYWRBbGxSZWZlcmVuY2VXaXphcmRGcmFnbWVudHMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsICJyZWZlcmVuY2VXaXphcmRGcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5TGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8V2l6YXJkRnJhZ21lbnQ+KCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgY2YubGVuZ3RoOyBpKysgKSB7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKChXaXphcmRGcmFnbWVudCljZltpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpKTsKLQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UpIAotCQkJewotCQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2coIGNlICk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgV2l6YXJkRnJhZ21lbnRbbGlzdC5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIFdpemFyZEZyYWdtZW50IGxvYWRSZWZlcmVuY2VXaXphcmRGcmFnbWVudChTdHJpbmcgaWQpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0JCQkJTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCwgInJlZmVyZW5jZVdpemFyZEZyYWdtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBjZi5sZW5ndGg7IGkrKyApIHsKLQkJCWlmKCBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKGlkKSkgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiAoV2l6YXJkRnJhZ21lbnQpY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UpIAotCQkJCXsKLQkJCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZyggY2UgKTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBMaXN0PFJlZmVyZW5jZUV4dGVuc2lvbj4gZ2V0RXhwb3NlZFJlZmVyZW5jZUV4dGVuc2lvbnMoKSAKLQl7Ci0JCWZpbmFsIExpc3Q8UmVmZXJlbmNlRXh0ZW5zaW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+KCk7Ci0JCWZpbmFsIFNldDxTdHJpbmc+IGhpZGRlbiA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCi0gICAgICAgIGZvciggUmVmZXJlbmNlRXh0ZW5zaW9uIGV4dCA6IGdldEFsbFJlZmVyZW5jZUV4dGVuc2lvbnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBleHQuaXNIaWRkZW4oKSApCi0gICAgICAgICAgICB7Ci0JCQkJaGlkZGVuLmFkZCggZXh0LmdldElkKCkgKTsKLQkJCX0KLQkJfQotCQkKLSAgICAgICAgZm9yKCBSZWZlcmVuY2VFeHRlbnNpb24gZXh0IDogZ2V0QWxsUmVmZXJlbmNlRXh0ZW5zaW9ucygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICEgZXh0LmlzSGlkZGVuKCkgJiYgISBoaWRkZW4uY29udGFpbnMoIGV4dC5nZXRJZCgpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKCBleHQgKTsKLSAgICAgICAgICAgIH0KLQkJfQotCQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyBMaXN0PFJlZmVyZW5jZUV4dGVuc2lvbj4gZ2V0QWxsUmVmZXJlbmNlRXh0ZW5zaW9ucygpIAotCXsKLQkJZmluYWwgQXJyYXlMaXN0PFJlZmVyZW5jZUV4dGVuc2lvbj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVmZXJlbmNlRXh0ZW5zaW9uPigpOwotCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkKLQkJZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2YgOiByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIE1vZHVsZUNvcmVVSVBsdWdpbi5QTFVHSU5fSUQsICJyZWZlcmVuY2VXaXphcmRGcmFnbWVudCIgKSApCi0JCXsKLQkJCWxpc3QuYWRkKCBuZXcgUmVmZXJlbmNlRXh0ZW5zaW9uKCBjZiApICk7Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHVibGljIFJlZmVyZW5jZUV4dGVuc2lvbiBmaW5kUmVmZXJlbmNlRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLQkJCQlNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lELCAicmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUxpc3Q8UmVmZXJlbmNlRXh0ZW5zaW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+KCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgY2YubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZihjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKGlkKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgUmVmZXJlbmNlRXh0ZW5zaW9uKGNmW2ldKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGNsYXNzIFJlZmVyZW5jZUV4dGVuc2lvbiB7Ci0JCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JCXByaXZhdGUgU3RyaW5nIGlkLCBuYW1lLCBpbWFnZUxvYzsKLQkJcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQkJcHJpdmF0ZSBib29sZWFuIGhpZGRlbjsKLQkJcHJpdmF0ZSBFeHByZXNzaW9uIGVuYWJsZW1lbnRFeHByZXNzaW9uOwotCQkKLQkJcHVibGljIFJlZmVyZW5jZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgCi0JCXsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQl0aGlzLmlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMubmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuaW1hZ2VMb2MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWNvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmhpZGRlbiA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJoaWRkZW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJZm9yKCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgOiBlbGVtZW50LmdldENoaWxkcmVuKCAiZW5hYmxlbWVudCIgKSApIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkgICAgICAgICAgICB0cnkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlbWVudEV4cHJlc3Npb24gPSBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKCBjaGlsZCApOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2coIGUgKTsKLQkgICAgICAgICAgICB9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7IHJldHVybiB0aGlzLmlkO30KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gdGhpcy5uYW1lOyB9Ci0JCXB1YmxpYyBib29sZWFuIGlzSGlkZGVuKCkgeyByZXR1cm4gdGhpcy5oaWRkZW47IH0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0JCXsKLQkJCWlmKCB0aGlzLmVuYWJsZW1lbnRFeHByZXNzaW9uICE9IG51bGwgKQotCQkJewotCQkgICAgICAgIGZpbmFsIEV2YWx1YXRpb25Db250ZXh0IGV2YWxDb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCBudWxsLCBwcm9qZWN0ICk7Ci0JCSAgICAgICAgZXZhbENvbnRleHQuc2V0QWxsb3dQbHVnaW5BY3RpdmF0aW9uKCB0cnVlICk7Ci0JCSAgICAgICAgCi0JICAgICAgICAgICAgdHJ5Ci0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBmaW5hbCBFdmFsdWF0aW9uUmVzdWx0IGV2YWxSZXN1bHQgPSB0aGlzLmVuYWJsZW1lbnRFeHByZXNzaW9uLmV2YWx1YXRlKCBldmFsQ29udGV4dCApOwotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgaWYoIGV2YWxSZXN1bHQgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSApCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2coIGUgKTsKLQkgICAgICAgICAgICB9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7IAotCQkJaWYoIGltYWdlID09IG51bGwgKSB7Ci0JCQkJaWYoIGltYWdlTG9jICE9IG51bGwgJiYgZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGltYWdlTG9jKTsKLQkJCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGltYWdlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2VJbWFnZSgpIHsKLQkJCWlmKCBpbWFnZSAhPSBudWxsICkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQlpbWFnZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXJbXSBsb2FkRGVsZWdhdGVzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLQkJCQlNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lELCAidmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gbGlzdCA9IEFycmF5cy5hc0xpc3QoY2YpOwotCQlDb21wYXJhdG9yIGMgPSBuZXcgQ29tcGFyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKElDb25maWd1cmF0aW9uRWxlbWVudCBvMSwKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG8yKSB7Ci0JCQkJU3RyaW5nIG8xU3RyaW5nLCBvMlN0cmluZzsKLQkJCQlpbnQgbzFpbnQsIG8yaW50OwotCQkJCW8xU3RyaW5nPW8xLmdldEF0dHJpYnV0ZSgid2VpZ2h0Iik7Ci0JCQkJbzJTdHJpbmc9bzIuZ2V0QXR0cmlidXRlKCJ3ZWlnaHQiKTsKLQkJCQl0cnkgewotCQkJCQlvMWludCA9IEludGVnZXIucGFyc2VJbnQobzFTdHJpbmcpOwotCQkJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSApIHsKLQkJCQkJbzFpbnQgPSAwOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlvMmludCA9IEludGVnZXIucGFyc2VJbnQobzJTdHJpbmcpOwotCQkJCX0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSApIHsKLQkJCQkJbzJpbnQgPSAwOwotCQkJCX0KLQkJCQlyZXR1cm4gbzFpbnQtbzJpbnQ7Ci0JCQl9Ci0JCX07Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgYyk7Ci0JCUFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXI+IHJldExpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlcj4oKTsKLQkJSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBpID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwgPSBpLm5leHQoKTsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gZWwuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwotCQkJCXJldExpc3QuYWRkKChJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIpZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKSk7Ci0JCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZyggY2UgKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0TGlzdC50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXJbcmV0TGlzdC5zaXplKCldKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0ZvbGRlck1hcHBpbmdXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvRm9sZGVyTWFwcGluZ1dpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjEzMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvRm9sZGVyTWFwcGluZ1dpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFJlZCBIYXQgYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gbWlzYy4gVUkgY2xlYW51cAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLklNb2R1bGVDb3JlVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuQ29tcG9uZW50UmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLklSZWZlcmVuY2VXaXphcmRDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGb2xkZXJNYXBwaW5nV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBJQ29udGFpbmVyIHNlbGVjdGVkID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSBoYW5kbGU7Ci0KLQlib29sZWFuIGlzQ29tcGxldGUgPSBmYWxzZTsKLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBpc0NvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKSB7Ci0JCXRoaXMuaGFuZGxlID0gaGFuZGxlOwotCQloYW5kbGUuc2V0VGl0bGUoTWVzc2FnZXMuQWRkRm9sZGVyKTsKLQkJaGFuZGxlLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkFkZEZvbGRlck1hcHBpbmdzKTsKLQkJaGFuZGxlLnNldEltYWdlRGVzY3JpcHRvcihJREVXb3JrYmVuY2hQbHVnaW4uZ2V0SURFSW1hZ2VEZXNjcmlwdG9yKCJ3aXpiYW4vbmV3Zm9sZGVyX3dpei5wbmciKSk7Ci0JCXByb2plY3QgPSAoSVByb2plY3QpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuUFJPSkVDVCk7CQkKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSU1vZHVsZUNvcmVVSUNvbnRleHRJZHMuREVQTE9ZTUVOVF9BU1NFTUJMWV9QUkVGRVJFTkNFX1BBR0VfQUREX05FV19GT0xERVJfTUFQUElOR19QMSk7Ci0JCXRoaXMudmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoYywgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLmFkZEZpbHRlcihnZXRGaWx0ZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChwcm9qZWN0KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDM5MDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTg1OwotCQl2aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBmaXJzdCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiggZmlyc3QgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXNlbGVjdGVkID0gKElDb250YWluZXIpZmlyc3Q7Ci0JCQkJCVN0cmluZyBlcnJvck1lc3NhZ2U9dmFsaWRhdGVGb2xkZXIoKTsKLQkJCQkJaWYgKGVycm9yTWVzc2FnZSAhPSAgbnVsbCkKLQkJCQkJCWhhbmRsZS5zZXRNZXNzYWdlKGVycm9yTWVzc2FnZSxJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCQkJZWxzZQotCQkJCQkJaGFuZGxlLnNldE1lc3NhZ2UoTWVzc2FnZXMuQWRkRm9sZGVyTWFwcGluZ3MsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJCWhhbmRsZS51cGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGVGb2xkZXIoKSB7Ci0JCUlDb250YWluZXIgYyA9IGdldFNlbGVjdGVkKCk7Ci0JCUlQYXRoIHAgPSBjLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5tYWtlQWJzb2x1dGUoKTsJCQkJCQotCQlBcnJheUxpc3Q8T2JqZWN0PiBjdXJyZW50UmVmcyA9IChBcnJheUxpc3Q8T2JqZWN0PilnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5BTExfRElSRUNUSVZFUyk7Ci0JCWlmICghY3VycmVudFJlZnMuaXNFbXB0eSgpKQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50UmVmcy5zaXplKCk7IGorKykgCi0JCQl7Ci0JCQkJT2JqZWN0IHJlZiA9IGN1cnJlbnRSZWZzLmdldChqKTsKLQkJCQlpZiAocmVmIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSkKLQkJCQl7CQkJCQkKLQkJCQkJQ29tcG9uZW50UmVzb3VyY2VQcm94eSBmb2xkZXIgPSAoQ29tcG9uZW50UmVzb3VyY2VQcm94eSkgcmVmOwotCQkJCQlpZiAocC5lcXVhbHMoZm9sZGVyLnNvdXJjZSkpewkJCQkJCQotCQkJCQkJaXNDb21wbGV0ZT1mYWxzZTsJCQkJCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuRXhpc3RpbmdGb2xkZXJFcnJvciwgZm9sZGVyLnNvdXJjZSk7IAkJCQkJCQotCQkJCQl9Ci0JCQkJfQkJCQkJCQkKLQkJCX0JCi0JCWlzQ29tcGxldGUgPSB0cnVlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElDb250YWluZXIgZ2V0U2VsZWN0ZWQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewkJCQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LAotCQkJCQlPYmplY3QgZWxlbWVudCkgewotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIGVsZW1lbnQ7Ci0JCQkJCUlQYXRoIHBhdGggPSBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCQlpZighUmVzb3VyY2VNYXBwaW5nRmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnkuc2hvdWxkRmlsdGVyKHBhdGgpKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHByb2plY3QubWVtYmVycygpOwotCQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCQkJCXJldHVybiBuZXcgT2JqZWN0W117fTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gKChJQ29udGFpbmVyKWVsZW1lbnQpLm1lbWJlcnMoKS5sZW5ndGggPiAwOwotCQkJCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlICkgewotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLQkJCQkJcmV0dXJuICgoSVJlc291cmNlKWVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlpZiggcGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiAoKElDb250YWluZXIpcGFyZW50RWxlbWVudCkubWVtYmVycygpOwotCQkJCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlICkgewotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgT2JqZWN0W117fTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJCQlyZXR1cm4gKChJUmVzb3VyY2UpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29udGFpbmVyIGMgPSBnZXRTZWxlY3RlZCgpOwotCQlpZiggYyAhPSBudWxsICkgewotCQkJSVBhdGggcCA9IGMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLm1ha2VBYnNvbHV0ZSgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VQcm94eSBwcm94eSA9IG5ldyBDb21wb25lbnRSZXNvdXJjZVByb3h5KHAsIG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0JCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5GT0xERVJfTUFQUElORywgcHJveHkpOwotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0lSZWZlcmVuY2VFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0lSZWZlcmVuY2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwMGFiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9JUmVmZXJlbmNlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIFdpemFyZEZyYWdtZW50cyB0aGF0IGFyZSBwcm92aWRpbmcgcmVmZXJlbmNlIHdpemFyZCBleHRlbnNpb25zCi0gKiBtYXkgYWxzbyBpbXBsZW1lbnQgSVJlZmVyZW5jZUVkaXRvciB0byBzaG93IHRoYXQgdGhpcyBwYXJ0aWN1bGFyCi0gKiBmcmFnbWVudCBtYXkgYmUgYWJsZSB0byBlZGl0IGNvbXBvbmVudHMgaXQgaGFzIGNyZWF0ZWQuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZlcmVuY2VFZGl0b3IgewotCQotCS8qKgotCSAqIFRoZSB3aXphcmQgZnJhZ21lbnQgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIAotCSAqIGFuZCBpcyBhYmxlIHRvIGVkaXQgdGhlIHByb3ZpZGVkIHJlZmVyZW5jZSBpcyBleHBlY3RlZCAKLQkgKiB0byBjYWNoZSB0aGlzIHJlZmVyZW5jZSBhdCB0aGUgdGltZSBjYW5FZGl0KGV0YykgaXMgY2FsbGVkCi0JICogCi0JICogQHBhcmFtIHZjCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVkaXQoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0lWaXJ0dWFsQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSVZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDdjMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSVZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGludGVyZmFjZSBJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbGFiZWwgcHJvdmlkZXIgY2FuIHByb3ZpZGUKLQkgKiBVSSBlbGVtZW50cyBmb3IgdGhpcyBjb21wb25lbnQKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpOwotCQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBjb21wb25lbnQKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVGV4dChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpOwotCQotCS8qKgotCSAqIFJldHVybiBhbiBpbWFnZSByZXByZXNlbnRpbmcgdGhpcyBjb21wb25lbnQKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTb3VyY2VJbWFnZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpOwotCQotCS8qKgotCSAqIENsZWFuIHVwIGFueSBpbWFnZXMgeW91IGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9OZXdSZWZlcmVuY2VSb290V2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL05ld1JlZmVyZW5jZVJvb3RXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZmY2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL05ld1JlZmVyZW5jZVJvb3RXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0IGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIG1pc2MuIFVJIGNsZWFudXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5JTW9kdWxlQ29yZVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkRlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5SZWZlcmVuY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5XaXphcmRGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIE5ld1JlZmVyZW5jZVJvb3RXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnQ+IGZyYWdtZW50TWFwID0gCi0JCW5ldyBIYXNoTWFwPFN0cmluZywgV2l6YXJkRnJhZ21lbnQ+KCk7Ci0JcHJpdmF0ZSBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgTGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+IGV4dGVuc2lvbnMgPSBudWxsOwotCXB1YmxpYyBOZXdSZWZlcmVuY2VSb290V2l6YXJkRnJhZ21lbnQoTGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+IGV4dGVuc2lvbnMpIHsKLQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJaWYoIHRoaXMuZXh0ZW5zaW9ucy5zaXplKCkgPT0gMCApCi0JCQlzZXRDb21wbGV0ZShmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy5OZXdSZWZlcmVuY2VUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5OZXdSZWZlcmVuY2VEZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbiggTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL2Fzc2VtYmx5LWJhbm5lci5wbmciICkgKTsKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElNb2R1bGVDb3JlVUlDb250ZXh0SWRzLkRFUExPWU1FTlRfQVNTRU1CTFlfUFJFRkVSRU5DRV9QQUdFX0FERF9ORVdfUkVGRVJFTkNFX1AxKTsKLQkJYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9CT1RIICkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldENvbXBhcmF0b3IoIG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkgKTsKLQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXZpZXdlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCXZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlhZHZhbmNlVG9OZXh0UGFnZU9yRmluaXNoKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2aWV3ZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQl3aXphcmQudXBkYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBXaXphcmRGcmFnbWVudCBnZXRXaXphcmRGcmFnbWVudChTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJRCkgewotCQl0cnkgewotCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBmcmFnbWVudE1hcC5nZXQoZXh0ZW5zaW9uUG9pbnRJRCk7Ci0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSBEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmxvYWRSZWZlcmVuY2VXaXphcmRGcmFnbWVudChleHRlbnNpb25Qb2ludElEKTsKLQkJaWYgKGZyYWdtZW50ICE9IG51bGwpCi0JCQlmcmFnbWVudE1hcC5wdXQoZXh0ZW5zaW9uUG9pbnRJRCwgZnJhZ21lbnQpOwotCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRGcmFnbWVudHMoKSB7Ci0JCUxpc3Q8V2l6YXJkRnJhZ21lbnQ+IGxpc3RJbXBsID0gbmV3IEFycmF5TGlzdDxXaXphcmRGcmFnbWVudD4oKTsKLQkJY3JlYXRlQ2hpbGRGcmFnbWVudHMobGlzdEltcGwpOwotCQlyZXR1cm4gbGlzdEltcGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQkvLyBJbnN0YW50aWF0ZSBhbmQgYWRkIHRoZSBmcmFnbWVudCBmb3IgdGhlIGN1cnJlbnQgSUQKLQkJaWYoIHZpZXdlciAhPSBudWxsICkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCVJlZmVyZW5jZUV4dGVuc2lvbiBzZWxlY3RlZCA9IChSZWZlcmVuY2VFeHRlbnNpb24pc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYoIHNlbGVjdGVkICE9IG51bGwgKSB7Ci0JCQkJV2l6YXJkRnJhZ21lbnQgY2hpbGQgPSBnZXRXaXphcmRGcmFnbWVudChzZWxlY3RlZC5nZXRJZCgpKTsKLQkJCQlpZiggY2hpbGQgIT0gbnVsbCApCi0JCQkJCWxpc3QuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCQotCXByaXZhdGUgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIExhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJaWYoIGxhYmVsUHJvdmlkZXIgPT0gbnVsbCApIHsKLQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBSZWZlcmVuY2VFeHRlbnNpb24pCi0JCQkJCQlyZXR1cm4gKChSZWZlcmVuY2VFeHRlbnNpb24pZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIFJlZmVyZW5jZUV4dGVuc2lvbikKLQkJCQkJCXJldHVybiAoKFJlZmVyZW5jZUV4dGVuc2lvbillbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJCXJldHVybiBlbGVtZW50ID09IG51bGwgPyAiIiA6IGVsZW1lbnQudG9TdHJpbmcoKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCSAgICAJc3VwZXIuZGlzcG9zZSgpOwotCQkJICAgIAlpZiggZXh0ZW5zaW9ucyAhPSBudWxsICkgewotCQkJICAgIAkJZm9yKCBSZWZlcmVuY2VFeHRlbnNpb24gZXggOiBleHRlbnNpb25zICkKLQkJCSAgICAJCXsKLQkJCSAgICAJCQlleC5kaXNwb3NlSW1hZ2UoKTsKLQkJCSAgICAJCX0KLQkJCSAgICAJfQotCQkJICAgIH0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCWlmKCBjb250ZW50UHJvdmlkZXIgPT0gbnVsbCApIHsKLQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gZXh0ZW5zaW9ucy50b0FycmF5KCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gY29udGVudFByb3ZpZGVyOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL05ld1JlZmVyZW5jZVdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvTmV3UmVmZXJlbmNlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTY0NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvTmV3UmVmZXJlbmNlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gbWlzYy4gVUkgY2xlYW51cAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5EZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuUmVmZXJlbmNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLlRhc2tXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgTmV3UmVmZXJlbmNlV2l6YXJkIGV4dGVuZHMgVGFza1dpemFyZCBpbXBsZW1lbnRzIElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBSRUZFUkVOQ0VfRkFNSUxZID0gbmV3IE9iamVjdCgpOwotCXB1YmxpYyBOZXdSZWZlcmVuY2VXaXphcmQoTGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+IGV4dGVuc2lvbnMpIHsKLQkJc3VwZXIoTWVzc2FnZXMuTmV3UmVmZXJlbmNlV2l6YXJkLCBuZXcgUm9vdFdpemFyZEZyYWdtZW50KGV4dGVuc2lvbnMpKTsKLQkJc2V0RmluaXNoSm9iRmFtaWx5KFJFRkVSRU5DRV9GQU1JTFkpOwotCQlnZXRSb290RnJhZ21lbnQoKS5zZXRUYXNrTW9kZWwoZ2V0VGFza01vZGVsKCkpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJvb3RXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQkJcHJpdmF0ZSBMaXN0PFJlZmVyZW5jZUV4dGVuc2lvbj4gZXh0ZW5zaW9ucyA9IG51bGw7Ci0JCXB1YmxpYyBSb290V2l6YXJkRnJhZ21lbnQoTGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+IGV4dGVuc2lvbnMpIHsKLQkJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSBvcmlnUmVmID0gKElWaXJ0dWFsUmVmZXJlbmNlKWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChPUklHSU5BTF9SRUZFUkVOQ0UpOwotCQkJaWYoIG9yaWdSZWYgPT0gbnVsbCApCi0JCQkJbGlzdC5hZGQobmV3IE5ld1JlZmVyZW5jZVJvb3RXaXphcmRGcmFnbWVudChleHRlbnNpb25zKSk7Ci0JCQllbHNlIHsKLQkJCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IGdldEZpcnN0RWRpdGluZ0ZyYWdtZW50KG9yaWdSZWYpOwotCQkJCWlmKCBmcmFnbWVudCAhPSBudWxsICkKLQkJCQkJbGlzdC5hZGQoZnJhZ21lbnQpOwotCQkJfQotCQkJaWYoIGxpc3Quc2l6ZSgpID09IDAgKQotCQkJCXNldENvbXBsZXRlKGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2l6YXJkRnJhZ21lbnQgZ2V0Rmlyc3RFZGl0aW5nRnJhZ21lbnQoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCVdpemFyZEZyYWdtZW50W10gZnJhZ3MgPSBEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmxvYWRBbGxSZWZlcmVuY2VXaXphcmRGcmFnbWVudHMoKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBmcmFncy5sZW5ndGg7IGkrKyApIHsKLQkJCWlmKCBmcmFnc1tpXSBpbnN0YW5jZW9mIElSZWZlcmVuY2VFZGl0b3IgKSB7Ci0JCQkJaWYoICgoSVJlZmVyZW5jZUVkaXRvcilmcmFnc1tpXSkuY2FuRWRpdChyZWZlcmVuY2UpKSB7Ci0JCQkJCS8vIGFjY2VwdCBmaXJzdCBvbmUKLQkJCQkJcmV0dXJuIGZyYWdzW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9Qcm9qZWN0UmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL1Byb2plY3RSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjM4YTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL1Byb2plY3RSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0IGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIG1pc2MuIFVJIGNsZWFudXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVXb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLklNb2R1bGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLklNb2R1bGVDb3JlVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTW9kdWxlQ29yZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuVGFza1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5Qcm9qZWN0Q29udmVydGVyT3BlcmF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCXByb3RlY3RlZCBUcmVlVmlld2VyIHZpZXdlcjsKLQlwcm90ZWN0ZWQgSVByb2plY3RbXSBzZWxlY3RlZDsKLQkKLQlwdWJsaWMgUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50KCkgewotCQlzdXBlcigpOwotCQlzZXRDb21wbGV0ZShmYWxzZSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJaGFuZGxlLnNldFRpdGxlKE1lc3NhZ2VzLlByb2plY3RSZWZlcmVuY2VUaXRsZSk7Ci0JCWhhbmRsZS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5Qcm9qZWN0UmVmZXJlbmNlRGVzY3JpcHRpb24pOwotCQloYW5kbGUuc2V0SW1hZ2VEZXNjcmlwdG9yKElERVdvcmtiZW5jaFBsdWdpbi5nZXRJREVJbWFnZURlc2NyaXB0b3IoIndpemJhbi9uZXdwcmpfd2l6LnBuZyIpKTsKLQkJCi0JCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSU1vZHVsZUNvcmVVSUNvbnRleHRJZHMuREVQTE9ZTUVOVF9BU1NFTUJMWV9QUkVGRVJFTkNFX1BBR0VfQUREX05FV19QUk9KRUNUX1JFRkVSRU5DRV9QMSk7Ci0JCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGMsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIoZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2VsQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWFkdmFuY2VUb05leHRQYWdlT3JGaW5pc2goKTsKLQkJCX0KLQkJfSk7Ci0JCXZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzkwOwotCQlkYXRhLmhlaWdodEhpbnQgPSAxODU7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNlbENoYW5nZWQoKSB7Ci0JCWlmKCB2aWV3ZXIgIT0gbnVsbCApIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiggc2VsICE9IG51bGwgKSB7Ci0JCQkJTGlzdCBzZWxlY3Rpb25MaXN0ID0gc2VsLnRvTGlzdCgpOwotCQkJCXNlbGVjdGVkID0gKElQcm9qZWN0W10pc2VsZWN0aW9uTGlzdC50b0FycmF5KG5ldyBJUHJvamVjdFtzZWxlY3Rpb25MaXN0LnNpemUoKV0pOwotCQkJCWlmIChzZWxlY3RlZC5sZW5ndGggIT0gMCkgc2V0Q29tcGxldGUodHJ1ZSk7Ci0JCQkJZWxzZSBzZXRDb21wbGV0ZShmYWxzZSk7Ci0JCQl9IGVsc2Ugc2V0Q29tcGxldGUoZmFsc2UpOwotCQl9Ci0JCSgoVGFza1dpemFyZFBhZ2UpZ2V0UGFnZSgpKS51cGRhdGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBuZXcgVmlydHVhbFJlZmVyZW5jZVtzZWxlY3RlZC5sZW5ndGhdOwotCQlTdHJpbmcgcnVudGltZUxvYyA9IChTdHJpbmcpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkRFRkFVTFRfTElCUkFSWV9MT0NBVElPTik7Ci0JCVByb2plY3RDb252ZXJ0ZXJPcGVyYXRpb25Qcm92aWRlciBjb252ZXJ0ZXIgPSAoUHJvamVjdENvbnZlcnRlck9wZXJhdGlvblByb3ZpZGVyKWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlBST0pFQ1RfQ09OVkVSVEVSX09QRVJBVElPTl9QUk9WSURFUik7Ci0JCXJ1bnRpbWVMb2MgPSBydW50aW1lTG9jICE9IG51bGwgPyBydW50aW1lTG9jIDogIi8iOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2ogPSBzZWxlY3RlZFtpXTsKLQkJCQotCQkJaWYoICFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2opKSB7Ci0JCQkJY29udmVydFByb2plY3Qoc2VsZWN0ZWRbaV0sIGNvbnZlcnRlciwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQlyZWZzW2ldID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoCi0JCQkJCShJVmlydHVhbENvbXBvbmVudClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5ST09UX0NPTVBPTkVOVCksIAotCQkJCQlDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qLCBmYWxzZSkpOwotCQkJcmVmc1tpXS5zZXRBcmNoaXZlTmFtZShuZXcgUGF0aChnZXRBcmNoaXZlTmFtZShwcm9qLCByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSkpLmxhc3RTZWdtZW50KCkpOwotCQkJcmVmc1tpXS5zZXRSdW50aW1lUGF0aChuZXcgUGF0aChydW50aW1lTG9jKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCX0KLQkJZ2V0VGFza01vZGVsKCkucHV0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuRklOQUxfUkVGRVJFTkNFLCByZWZzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0UHJvamVjdChJUHJvamVjdCBwcm9qLCBQcm9qZWN0Q29udmVydGVyT3BlcmF0aW9uUHJvdmlkZXIgY29udmVydGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYoIGNvbnZlcnRlciAhPSBudWxsICkgewotCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvbk9wZXJhdGlvbihwcm9qKTsKLQkJCWlmKCBvcGVyYXRpb24gIT0gbnVsbCApIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0gY2F0Y2goIEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSApIHsKLQkJCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZyhOTFMuYmluZChNZXNzYWdlcy5Qcm9qZWN0Q29udmVyc2lvbkVycm9yLCBwcm9qLmdldE5hbWUoKSksIGVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCXRyeSB7Ci0JCQlpZiggIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvaikpIHsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlLmFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShwcm9qLCBtb25pdG9yKTsKLQkJCQlQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvaiwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2coTkxTLmJpbmQoTWVzc2FnZXMuUHJvamVjdENvbnZlcnNpb25FcnJvciwgcHJvai5nZXROYW1lKCkpLCBjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJUHJvamVjdCBwcm9qLCBJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCXJldHVybiBnZXRNb2R1bGVIYW5kbGVyKCkuZ2V0QXJjaGl2ZU5hbWUocHJvaixjb21wKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgSU1vZHVsZUhhbmRsZXIgZ2V0TW9kdWxlSGFuZGxlcigpIHsKLQkJcmV0dXJuIChJTW9kdWxlSGFuZGxlcilnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5NT0RVTEVIQU5ETEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiggbGFiZWxQcm92aWRlciA9PSBudWxsICkgewotCQkJbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVCk7Ci0JCQkJfQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICkKLQkJCQkJCXJldHVybiAoKElQcm9qZWN0KWVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQkJcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlpZiggY29udGVudFByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQljb250ZW50UHJvdmlkZXIgPSBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJSVByb2plY3Qgcm9vdCA9IChJUHJvamVjdClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5QUk9KRUNUKTsKLQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBjdXJyZW50UmVmcyA9IChBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KWdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkNVUlJFTlRfUkVGUyk7Ci0JCQkJCUFycmF5TGlzdDxJUHJvamVjdD4gYXZhaWxhYmxlTGlzdCA9IGdldEF2YWlsYWJsZVByb2plY3RzKHByb2plY3RzLGN1cnJlbnRSZWZzKTsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudClnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5ST09UX0NPTVBPTkVOVCk7Ci0JCQkJCUxpc3QgZmlsdGVyZWQgPSBnZXRNb2R1bGVIYW5kbGVyKCkuZ2V0RmlsdGVyZWRQcm9qZWN0TGlzdEZvckFkZChjb21wLCBhdmFpbGFibGVMaXN0KTsKLQkJCQkJcmV0dXJuIGZpbHRlcmVkLnRvQXJyYXkobmV3IElQcm9qZWN0W2ZpbHRlcmVkLnNpemUoKV0pOwotCQkJCX0KLQkJCQlwcml2YXRlIEFycmF5TGlzdDxJUHJvamVjdD4gZ2V0QXZhaWxhYmxlUHJvamVjdHMoSVByb2plY3RbXSBwcm9qZWN0cywgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBjdXJyZW50UmVmcykgewotCQkJCQlpZiAoY3VycmVudFJlZnMuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KEFycmF5cy5hc0xpc3QocHJvamVjdHMpKTsKLQkJCQkJQXJyYXlMaXN0IGF2YWlsUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlQcm9qZWN0IHByb2ogPSBwcm9qZWN0c1tpXTsKLQkJCQkJCWJvb2xlYW4gbWF0Y2hlcyA9IGZhbHNlOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50UmVmcy5zaXplKCkgJiYgIW1hdGNoZXM7IGorKykgewotCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGN1cnJlbnRSZWZzLmdldChqKTsKLQkJCQkJCQlpZiAoKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qKSkgfHwgYXZhaWxQcm9qZWN0cy5jb250YWlucyhwcm9qKSkKLQkJCQkJCQkJbWF0Y2hlcyA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZiggIW1hdGNoZXMgKQotCQkJCQkJCWF2YWlsUHJvamVjdHMuYWRkKHByb2opOwotCQkJCQl9Ci0JCQkJCXJldHVybiBhdmFpbFByb2plY3RzOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9SZXNvdXJjZU1hcHBpbmdGaWx0ZXJFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvUmVzb3VyY2VNYXBwaW5nRmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0YzMxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9SZXNvdXJjZU1hcHBpbmdGaWx0ZXJFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTW9kdWxlQ29yZVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYXBwaW5nRmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTkFNRSA9ICJyZXNvdXJjZU1hcHBpbmdGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9NQVBQSU5HID0gInJlc291cmNlTWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9QQVRIID0gInNvdXJjZS1wYXRoIjsgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZU1hcHBpbmdGaWx0ZXJFeHRlbnNpb25SZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFBhdHRlcm4+IHJlc291cmNlTWFwcGluZ0ZpbHRlcnMgPSBudWxsOwotCQotCQotCXB1YmxpYyBSZXNvdXJjZU1hcHBpbmdGaWx0ZXJFeHRlbnNpb25SZWdpc3RyeSgpIHsKLQkJc3VwZXIoTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlTWFwcGluZ0ZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiggaW5zdGFuY2UgPT0gbnVsbCApIHsKLQkJCWluc3RhbmNlID0gbmV3IFJlc291cmNlTWFwcGluZ0ZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlpbnN0YW5jZS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUkVTT1VSQ0VfTUFQUElORykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBzb3VyY2VQYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoU09VUkNFX1BBVEgpOwotCQlpZihzb3VyY2VQYXRoICE9IG51bGwpCi0JCQlhZGRSZXNvdXJjZU1hcHBpbmdGaWx0ZXIoc291cmNlUGF0aCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSZXNvdXJjZU1hcHBpbmdGaWx0ZXIoU3RyaW5nIGZpbHRlclJlZ0V4cCkgewotCQlpZihyZXNvdXJjZU1hcHBpbmdGaWx0ZXJzID09IG51bGwpCi0JCQlyZXNvdXJjZU1hcHBpbmdGaWx0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXR0ZXJuPigpOwotCQlpZihmaWx0ZXJSZWdFeHAgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoZmlsdGVyUmVnRXhwKTsKLQkJCQlyZXNvdXJjZU1hcHBpbmdGaWx0ZXJzLnB1dChmaWx0ZXJSZWdFeHAsIHBhdHRlcm4pOwotCQkJfSBjYXRjaChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCQlNb2R1bGVDb3JlVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZEZpbHRlcihJUGF0aCBwYXRoKSB7Ci0JCVJlc291cmNlTWFwcGluZ0ZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCWlmKHBhdGggIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IHJlc291cmNlTWFwcGluZ0ZpbHRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCVBhdHRlcm4gcGF0dGVybiA9IChQYXR0ZXJuKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKHJlbGF0aXZlUGF0aCk7Ci0JCQkJaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVBhdHRlcm4gY2hpbGRyZW5QYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm4ucGF0dGVybigpKyIvLioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQltYXRjaGVyID0gY2hpbGRyZW5QYXR0ZXJuLm1hdGNoZXIocmVsYXRpdmVQYXRoKTsKLQkJCQkJaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkRmlsdGVyKFN0cmluZyBwYXRoKSB7Ci0JCWlmKHBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHNob3VsZEZpbHRlcihuZXcgUGF0aChwYXRoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFJlc291cmNlTWFwcGluZ0ZpbHRlcnNSZWd1bGFyRXhwcmVzc2lvbnMoKSB7Ci0JCXJldHVybiByZXNvdXJjZU1hcHBpbmdGaWx0ZXJzLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tyZXNvdXJjZU1hcHBpbmdGaWx0ZXJzLmtleVNldCgpLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBhdHRlcm5bXSBnZXRSZXNvdXJjZU1hcHBpbmdGaWx0ZXJzUmVsYXRpdmVQYXR0ZXJucygpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFwcGluZ0ZpbHRlcnMudmFsdWVzKCkudG9BcnJheShuZXcgUGF0dGVybltyZXNvdXJjZU1hcHBpbmdGaWx0ZXJzLnZhbHVlcygpLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0Fic3RyYWN0RGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0Fic3RyYWN0RGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjNDgzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS92ZXJpZmllci9BYnN0cmFjdERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLnZlcmlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQWxsIGV4dGVuZGVycyBvZiBBYnN0cmFjdERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyIG11c3QgaW1wbGVtZW50IHRoZSB2ZXJpZnkgbWV0aG9kcyB0byBwZXJmb3JtIGFueSB2ZXJpZmljYXRpb24gb24gdGhlIGRlcGxveW1lbnQgYXNzZW1ibHkgd2l6YXJkIHBhZ2UKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyIGltcGxlbWVudHMgSURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyIHsKLQotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIHZlcmlmeShEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEgZGF0YSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0RlZmF1bHREZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvdmVyaWZpZXIvRGVmYXVsdERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMTU4ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvdmVyaWZpZXIvRGVmYXVsdERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLnZlcmlmaWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLlJlc291cmNlTWFwcGluZ0ZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuQ29tcG9uZW50UmVzb3VyY2VQcm94eTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRvZXMgYmFzaWMgdmFsaWRhdGlvbiBvZiB0aGUgZGVwbG95bWVudCBhc3NlbWJseS4gSXQgdmFsaWRhdGVzIHRoYXQgCi0gKiByZWZlcmVuY2VzIHRvIG90aGVyIGNvbXBvbmVudHMgbGlrZSBwcm9qZWN0cyBhbmQgYXJjaGl2ZXMgZXhpc3RzLiBJdCBhbHNvIHZhbGlkYXRlcyB0aGF0Ci0gKiBmb2xkZXIgbWFwcGluZ3MgZXhpc3RzIGluIHRoZSBwcm9qZWN0LiAgCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyIGV4dGVuZHMgQWJzdHJhY3REZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllciB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2ZXJpZnkoRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJEYXRhIGRhdGEpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZVJlc291cmNlTWFwcGluZ3MoZGF0YSwgbnVsbCk7Ci0JCXJldHVybiB2YWxpZGF0ZU1pc3NpbmdSZWZlcmVuY2VzKGRhdGEsIHN0YXR1cyk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUmVzb3VyY2VNYXBwaW5ncyhEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEgZGF0YSwgSVN0YXR1cyBleGlzdGluZ1N0YXR1cyl7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZXhpc3RpbmdTdGF0dXMhPW51bGw/ZXhpc3RpbmdTdGF0dXM6U3RhdHVzLk9LX1NUQVRVUzsKLQkJQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+IG1hcHBpbmdzID0gZGF0YS5nZXRSZXNvdXJjZU1hcHBpbmdzKCk7Ci0JCWlmIChtYXBwaW5ncyA9PSBudWxsKQotCQkJcmV0dXJuIHN0YXR1czsJCQotCQlpbnQgc2V2ZXJpdHkgPSBTdGF0dXMuRVJST1I7Ci0JCVN0cmluZyBtc2cgPSBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZGF0YS5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JCWZvciAoQ29tcG9uZW50UmVzb3VyY2VQcm94eSBtYXBwaW5nOm1hcHBpbmdzKXsKLQkJCWlmIChSZXNvdXJjZU1hcHBpbmdGaWx0ZXJFeHRlbnNpb25SZWdpc3RyeS5zaG91bGRGaWx0ZXIobWFwcGluZy5zb3VyY2UpKQotCQkJCWNvbnRpbnVlOyAgLy8gRG8gbm90IHZhbGlkYXRlIGZpbHRlcmVkIGVudHJpZXMKLQkJCWlmICghcHJvamVjdC5leGlzdHMobWFwcGluZy5zb3VyY2UpKXsKLQkJCQltc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvckVudHJ5Tm90Rm91bmQsIG1hcHBpbmcuc291cmNlKTsgCi0JCQkJc3RhdHVzID0gYXBwZW5kU3RhdHVzTWVzc2FnZShzdGF0dXMsIG1zZywgc2V2ZXJpdHkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZU1pc3NpbmdSZWZlcmVuY2VzKERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YSBkYXRhLCBJU3RhdHVzIGV4aXN0aW5nU3RhdHVzKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZXhpc3RpbmdTdGF0dXMhPW51bGw/ZXhpc3RpbmdTdGF0dXM6U3RhdHVzLk9LX1NUQVRVUzsKLQkJQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiByZWZlcmVuY2VzID0gZGF0YS5nZXRDdXJyZW50UmVmZXJlbmNlcygpOwotCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsKXsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJaW50IHNldmVyaXR5ID0gU3RhdHVzLkVSUk9SOwotCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2U6cmVmZXJlbmNlcyl7Ci0JCQlpZiAoIXJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXhpc3RzKCkpewotCQkJCVN0cmluZyBuYW1lOwotCQkJCWlmKCByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmlzQmluYXJ5KCkgKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJSVBhdGggcCA9IChJUGF0aCl2Yy5nZXRBZGFwdGVyKElQYXRoLmNsYXNzKTsKLQkJCQkJbmFtZT0gcCA9PSBudWxsID8gdmMuZ2V0TmFtZSgpIDogcC50b1N0cmluZygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JFbnRyeU5vdEZvdW5kLCBuYW1lKTsgCi0JCQkJc3RhdHVzID0gYXBwZW5kU3RhdHVzTWVzc2FnZShzdGF0dXMsIG1zZywgc2V2ZXJpdHkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIGFwcGVuZFN0YXR1c01lc3NhZ2UoSVN0YXR1cyBleGlzdGluZ1N0YXR1cywgU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSkgewotICAgICAgICBNdWx0aVN0YXR1cyBtdWx0aVN0YXR1czsKLSAgICAgICAgSVN0YXR1cyBuZXdTdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJaW50IG5ld1NldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JCWlmKGV4aXN0aW5nU3RhdHVzLmdldFNldmVyaXR5KCkgPiBzZXZlcml0eSkKLQkJCW5ld1NldmVyaXR5ID0gZXhpc3RpbmdTdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgaWYoZXhpc3RpbmdTdGF0dXMgaW5zdGFuY2VvZiBNdWx0aVN0YXR1cyl7Ci0gICAgICAgICAgICBtdWx0aVN0YXR1cyA9IChNdWx0aVN0YXR1cylleGlzdGluZ1N0YXR1czsKLSAgICAgICAgICAgIG11bHRpU3RhdHVzLm1lcmdlKG5ld1N0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlpZighZXhpc3RpbmdTdGF0dXMuaXNNdWx0aVN0YXR1cygpICYmIGV4aXN0aW5nU3RhdHVzLmlzT0soKSkgewotICAgICAgICAJCXJldHVybiBuZXdTdGF0dXM7Ci0gICAgICAgIAl9Ci0gICAgICAgICAgICBJU3RhdHVzIFtdIGNoaWxkcmVuID0gbmV3IElTdGF0dXMgW10ge2V4aXN0aW5nU3RhdHVzLCBuZXdTdGF0dXN9OwotICAgICAgICAgICAgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCwgbmV3U2V2ZXJpdHksIGNoaWxkcmVuLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbXVsdGlTdGF0dXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS92ZXJpZmllci9EZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0RlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTgzODM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0RlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS52ZXJpZmllcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5BZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5Db21wb25lbnRSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YSB7Ci0JCi0JcHVibGljIERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElSdW50aW1lIHJ1bnRpbWUsIEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gY3VycmVudFJlZmVyZW5jZXMsCi0JCQlBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4gcmVzb3VyY2VNYXBwaW5ncywgYm9vbGVhbiByZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQkJdGhpcy5jdXJyZW50UmVmZXJlbmNlcyA9IGN1cnJlbnRSZWZlcmVuY2VzOwotCQl0aGlzLnJlc291cmNlTWFwcGluZ3MgPSByZXNvdXJjZU1hcHBpbmdzOwotCQl0aGlzLnJlc291cmNlTWFwcGluZ3NDaGFuZ2VkID0gcmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQ7Ci0JfQotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCXByaXZhdGUgSVJ1bnRpbWUgcnVudGltZTsKLQlwcml2YXRlIEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gY3VycmVudFJlZmVyZW5jZXM7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4gcmVzb3VyY2VNYXBwaW5nczsKLQlwcml2YXRlIGJvb2xlYW4gcmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQ7Ci0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQl0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQl9Ci0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKSB7Ci0JCXJldHVybiBydW50aW1lOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKLQl9Ci0JcHVibGljIEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gZ2V0Q3VycmVudFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBjdXJyZW50UmVmZXJlbmNlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q3VycmVudFJlZmVyZW5jZXMoQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBjdXJyZW50UmVmZXJlbmNlcykgewotCQl0aGlzLmN1cnJlbnRSZWZlcmVuY2VzID0gY3VycmVudFJlZmVyZW5jZXM7Ci0JfQotCXB1YmxpYyBBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4gZ2V0UmVzb3VyY2VNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFwcGluZ3M7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTWFwcGluZ3MoQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+IHJlc291cmNlTWFwcGluZ3MpIHsKLQkJdGhpcy5yZXNvdXJjZU1hcHBpbmdzID0gcmVzb3VyY2VNYXBwaW5nczsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNSZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFwcGluZ3NDaGFuZ2VkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZChib29sZWFuIHJlc291cmNlTWFwcGluZ3NDaGFuZ2VkKSB7Ci0JCXRoaXMucmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQgPSByZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0RlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS92ZXJpZmllci9EZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFiNmNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0RlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLnZlcmlmaWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLkFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlLkNvbXBvbmVudFJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVySGVscGVyIHsKLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgZmFjZXQgZnJhbWV3b3JrIHRvIGZpbmQgYWxsIHJlZ2lzdGVyZWQgdmVyaWZpZXJzIGJhc2VkIG9uIGluc3RhbGxlZCBmYWNldHMgYW5kIHJ1bnRpbWVzLgotCSAqIEFsbCB0aGUgdmVyaWZpZXJzIHdpbGwgaGF2ZSBhbiBvcHBvcnR1bml0eSB0byB2ZXJpZnkgYW5kIHJldHVybiBzdGF0dXMgb24gdGhlIHByb3Bvc2VkIGNvbXBvbmVudCBtYXBwaW5ncwotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEBwYXJhbSByZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCAKLQkgKiBAcGFyYW0gcmVzb3VyY2VNYXBwaW5ncyAKLQkgKiBAcGFyYW0gY3VycmVudFJlZmVyZW5jZXMgCi0JICogQHJldHVybiBJU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZlcmlmeShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsSVJ1bnRpbWUgcnVudGltZSwgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBjdXJyZW50UmVmZXJlbmNlcywgQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+IHJlc291cmNlTWFwcGluZ3MsIGJvb2xlYW4gcmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQotCQlMaXN0IHZlcmlmaWVycyA9IGNvbGxlY3RBbGxWZXJpZmllcnMocHJvamVjdCxydW50aW1lKTsKLQkJaWYgKHZlcmlmaWVycy5pc0VtcHR5KCkpIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlNdWx0aVN0YXR1cyBtYXN0ZXJTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgTWVzc2FnZXMuRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJIZWxwZXJfMCxudWxsKTsgCi0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcmlmaWVycy5zaXplKCk7IGkrKykgewotCQkJaWYgKCEodmVyaWZpZXJzLmdldChpKSBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkpCi0JCQkJY29udGludWU7Ci0JCQlJRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIgdmVyaWZpZXIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl2ZXJpZmllciA9IChJRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIpICgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSB2ZXJpZmllcnMuZ2V0KGkpKS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFZlcmlmaWVyUmVnaXN0cnlSZWFkZXIuVkVSSUZJRVJfQ0xBU1MpOwotCQkJCURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YSBkYXRhID0gbmV3IERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YShjb21wb25lbnQsIHJ1bnRpbWUsY3VycmVudFJlZmVyZW5jZXMscmVzb3VyY2VNYXBwaW5ncyxyZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCk7Ci0JCQkJSVN0YXR1cyB2ZXJpZnlTdGF0dXMgPSB2ZXJpZmllci52ZXJpZnkoZGF0YSk7Ci0JCQkJaWYodmVyaWZ5U3RhdHVzICE9IG51bGwgJiYgdmVyaWZ5U3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJCQltYXN0ZXJTdGF0dXMuYWRkQWxsKHZlcmlmeVN0YXR1cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFzdGVyU3RhdHVzLmFkZCh2ZXJpZnlTdGF0dXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZyhlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBtYXN0ZXJTdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEByZXR1cm4gYWxsIHZlcmlmaWVycyBieSBpdGVyYXRpbmcgdGhyb3VnaCBwcm9qZWN0cyBpbnN0YWxsZWQgZmFjZXRzLCBhbmQgcXVlcnlpbmcgdGhlIHJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNvbGxlY3RBbGxWZXJpZmllcnMoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgewotCQlJRmFjZXRlZFByb2plY3QgZlByb2ogPSBudWxsOwotCQl0cnkgewotCQkJZlByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCVNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gZlByb2ouZ2V0UHJvamVjdEZhY2V0cygpOwotCQlMaXN0IHZlcmlmaWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZhY2V0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldCA9IChJUHJvamVjdEZhY2V0VmVyc2lvbilpdGVyYXRvci5uZXh0KCk7Ci0JCQl2ZXJpZmllcnMuYWRkQWxsKFZlcmlmaWVyUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRWZXJpZmllckV4dGVuc2lvbnMoZmFjZXQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSwgcnVudGltZSkpOwkKLQkJfQotCQlyZXR1cm4gdmVyaWZpZXJzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL0lEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvdmVyaWZpZXIvSURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTc2YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvdmVyaWZpZXIvSURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLnZlcmlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBhbGxvdyB2ZXJpZmljYXRpb25zIGZyb20gZXh0ZW5kaW5nIHBsdWdpbnMgcmVnaXN0ZXJlZCBieSBydW50aW1lIHRhcmdldHMgYW5kIGNvbXBvbmVudCB0eXBlCi0gKiBUaGlzIGludGVyZmFjZSBpbiBOT1QgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQsIGJ1dCBpbnN0ZWFkIGV4dGVuZCB0aGUgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllcgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIgewotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb21wb25lbnQgcmVzb3VyY2UgYW5kIHJlZmVyZW5jZSBtYXBwaW5ncwotCSAqIAotCSAqIEBwYXJhbSBkYXRhIC0gQWxsIG9mIHRoZSByZWxldmFudCBkaWFsb2cgcHJvcGVydGllcy92YWx1ZXMgaXMgc2VudCB2aWEgYSBEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEgb2JqZWN0Ci0JICogQHJldHVybiBJU3RhdHVzIGluZGljYXRpbmcgT0ssIFdhcm5pbmcgLCBvciBFcnJvci4gIFdhcm5pbmcgdGV4dCB3aWxsIGRpc3BsYXkgaW4gdGhlIHdpemFyZCBkaWFsb2csIGJ1dCBub3QgcHJldmVudCBjb21wbGV0aW9uLiAKLQkgKiBFcnJvciBzdGF0dXMgd2lsbCBwcmV2ZW50IGNvbXBsZXRpb24KLQkgKi8KLQlJU3RhdHVzIHZlcmlmeShEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEgZGF0YSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL1ZlcmlmaWVyUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL1ZlcmlmaWVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3NGJhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS92ZXJpZmllci9WZXJpZmllclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLnZlcmlmaWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBWZXJpZmllclJlZ2lzdHJ5IHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmVyaWZpZXJSZWdpc3RyeSBJTlNUQU5DRTsKLQlwcml2YXRlIEhhc2hNYXAgYXNzZW1ibHlWZXJpZmllckV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFZlcmlmaWVyUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZlcmlmaWVyCi0JICogQHBhcmFtIHNlcnZlclRhcmdldHMKLQkgKiBAcGFyYW0gY29tcG9uZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyKElDb25maWd1cmF0aW9uRWxlbWVudCB2ZXJpZmllciwgTGlzdCBzZXJ2ZXJUYXJnZXRzLCBMaXN0IGNvbXBvbmVudHMpIHsKLQkJSGFzaE1hcCB0YXJnZXRWZXJpZmllcnM7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgY29tcElEID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyVGFyZ2V0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJ1bnRpbWVJRCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl0YXJnZXRWZXJpZmllcnMgPSBnZXRWZXJpZmllckV4dGVuc2lvbnMoY29tcElEKTsKLQkJCQlnZXRUYXJnZXRWZXJpZmllcnModGFyZ2V0VmVyaWZpZXJzLCBydW50aW1lSUQpLmFkZCh2ZXJpZmllcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0VmVyaWZpZXJzKFN0cmluZyBjb21wSUQsIFN0cmluZyBzZXJ2ZXJUYXJnZXQpIHsKLQkJSGFzaE1hcCB0YXJnZXRWZXJpZmllcnMgPSBnZXRWZXJpZmllckV4dGVuc2lvbnMoY29tcElEKTsKLQkJcmV0dXJuIGdldFRhcmdldFZlcmlmaWVycyh0YXJnZXRWZXJpZmllcnMsIHNlcnZlclRhcmdldCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBWZXJpZmllclJlZ2lzdHJ5IGluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgVmVyaWZpZXJSZWdpc3RyeSgpOwotCQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJVmVyaWZpZXJSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBuZXcgVmVyaWZpZXJSZWdpc3RyeVJlYWRlcigpOwotCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldFZlcmlmaWVycwotCSAqIEBwYXJhbSBzZXJ2ZXJUYXJnZXQKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VGFyZ2V0VmVyaWZpZXJzKEhhc2hNYXAgdGFyZ2V0VmVyaWZpZXJzLCBTdHJpbmcgc2VydmVyVGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXRWZXJpZmllcnMuZ2V0KHNlcnZlclRhcmdldCkgPT0gbnVsbCkKLQkJCXRhcmdldFZlcmlmaWVycy5wdXQoc2VydmVyVGFyZ2V0LCBuZXcgQXJyYXlMaXN0KCkpOwotCQlyZXR1cm4gKExpc3QpIHRhcmdldFZlcmlmaWVycy5nZXQoc2VydmVyVGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcElECi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRWZXJpZmllckV4dGVuc2lvbnMoU3RyaW5nIGNvbXBJRCkgewotCQlpZiAoZ2V0VmVyaWZpZXJFeHRlbnNpb25zKCkuZ2V0KGNvbXBJRCkgPT0gbnVsbCkKLQkJCWdldFZlcmlmaWVyRXh0ZW5zaW9ucygpLnB1dChjb21wSUQsIG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gKEhhc2hNYXApIGdldFZlcmlmaWVyRXh0ZW5zaW9ucygpLmdldChjb21wSUQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmVyaWZpZXJFeHRlbnNpb25zLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRWZXJpZmllckV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBhc3NlbWJseVZlcmlmaWVyRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmFjZXRUeXBlSUQKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEByZXR1cm4gTGlzdCBvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnRzIHJlcHJlc2VudGluZyBpbnN0YW5jZXMgb2YgSURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyCi0JICovCi0JcHVibGljIExpc3QgZ2V0VmVyaWZpZXJFeHRlbnNpb25zKFN0cmluZyBmYWNldFR5cGVJRCwgSVJ1bnRpbWUgcnVudGltZSkgewotCQkvLyBJZGVudGlmaWVyIHVzZWQgYnkgdmVyaWZpZXJzIHRoYXQgd2lsbCBydW4gZm9yIGFueSBydW50aW1lCi0JCVN0cmluZyBhbGxSdW50aW1lcyA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkuZGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIuYW55cnVudGltZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJ1bnRpbWVJRCA9IG51bGw7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlydW50aW1lSUQgPSAiTm9uZSI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJcnVudGltZUlEID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCS8vIEdldCB0aGUgdmVyaWZpZXJzIHNwZWNpZmljIGZvciB0aGUgdGFyZ2V0IHJ1bnRpbWUKLQkJTGlzdCB2ZXJpZmllcnMgPSBnZXRWZXJpZmllcnMoZmFjZXRUeXBlSUQsIHJ1bnRpbWVJRCk7CQkKLQkJaWYgKHZlcmlmaWVycyA9PSBudWxsKQotCQkJdmVyaWZpZXJzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJLy8gR2V0IHRoZSB2ZXJpZmllcnMgZm9yIGFueSBydW50aW1lCi0JCUxpc3QgZ2VuZXJpY1ZlcmlmaWVycyA9IGdldFZlcmlmaWVycyhmYWNldFR5cGVJRCwgYWxsUnVudGltZXMpOwotCQlpZiAoZ2VuZXJpY1ZlcmlmaWVycyA9PSBudWxsKQotCQkJZ2VuZXJpY1ZlcmlmaWVycyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCS8vIE1lcmdlIGJvdGggdmVyaWZpZXJzIGludG8gb25lIGxpc3QgYW5kIHJldHVybgotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QodmVyaWZpZXJzKTsKLQkJcmVzdWx0LmFkZEFsbChnZW5lcmljVmVyaWZpZXJzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvdmVyaWZpZXIvVmVyaWZpZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvdmVyaWZpZXIvVmVyaWZpZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQ1NGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL3ZlcmlmaWVyL1ZlcmlmaWVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS52ZXJpZmllcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5Nb2R1bGVDb3JlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci0KLQotcHVibGljIGNsYXNzIFZlcmlmaWVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JLyoqCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRU1CTFlfVkVSSUZJRVJfRVhURU5TSU9OX1BPSU5UID0gImRlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NFUlZFUl9SVU5USU1FX0lEID0gInJ1bnRpbWVfc2VydmVyX2lkIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRSA9ICJydW50aW1lIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSSUZJRVIgPSAidmVyaWZpZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSSUZJRVJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRV9JRCA9ICJjb21wb25lbnRfdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVCA9ICJjb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgVmVyaWZpZXJSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoTW9kdWxlQ29yZVVJUGx1Z2luLlBMVUdJTl9JRCwgQVNTRU1CTFlfVkVSSUZJRVJfRVhURU5TSU9OX1BPSU5UKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFZFUklGSUVSKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJTGlzdCBydW50aW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBjb21wcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVudGltZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKFJVTlRJTUUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVudGltZSA9IHJ1bnRpbWVzW2ldOwotCQkJU3RyaW5nIHNlcnZlclRhcmdldCA9IHJ1bnRpbWUuZ2V0QXR0cmlidXRlKFRBUkdFVF9TRVJWRVJfUlVOVElNRV9JRCk7Ci0JCQlydW50aW1lTGlzdC5hZGQoc2VydmVyVGFyZ2V0KTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb21wb25lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihDT01QT05FTlQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOwotCQkJU3RyaW5nIGNvbXBUeXBlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShDT01QT05FTlRfVFlQRV9JRCk7Ci0JCQljb21wcy5hZGQoY29tcFR5cGUpOwotCQl9Ci0KLQkJU3RyaW5nIGRlcGxveWVyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVkVSSUZJRVJfQ0xBU1MpOwotCQlpZiAoZGVwbG95ZXIgIT0gbnVsbCkgewotCQkJVmVyaWZpZXJSZWdpc3RyeS5pbnN0YW5jZSgpLnJlZ2lzdGVyKGVsZW1lbnQsIHJ1bnRpbWVMaXN0LCBjb21wcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvSVdpemFyZEhhbmRsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC90YXNrd2l6YXJkL0lXaXphcmRIYW5kbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmNzYzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvSVdpemFyZEhhbmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0vKioKLSAqIEEgd2l6YXJkIGhhbmRsZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXaXphcmRIYW5kbGUgZXh0ZW5kcyBJTWVzc2FnZVByb3ZpZGVyIHsKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSB3aXphcmQgZXJyb3IgbWVzc2FnZXMgYW5kIGJ1dHRvbnMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSBvZiB0aGlzIHdpemFyZCBwYWdlLgotCSAqICAKLQkgKiBAcGFyYW0gdGl0bGUgdGhlIHRpdGxlIG9mIHRoZSB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSk7Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSdzIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjIHRoZSBwYWdlJ3MgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYyk7Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSdzIGltYWdlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGltYWdlIHRoZSBwYWdlJ3MgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgaW1hZ2UpOwotCi0JLyoqCi0JICogU2V0IGFuIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWVzc2FnZSB0aGUgbmV3IG1lc3NhZ2UKLQkgKiBAcGFyYW0gbmV3VHlwZSB0aGUgbmV3IHR5cGUsIGZyb20gSVN0YXR1cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKTsKLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBydW5uYWJsZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHdpemFyZC4gVGhpcyB3aWxsIHR5cGljYWxseQotCSAqIGRpc2FibGUgdGhlIHdpemFyZCB3aGlsZSB0aGUgcnVubmFibGUgaXMgcnVubmluZywgYW5kIHByb3ZpZGUgYSBwcm9ncmVzcwotCSAqIG1vbml0b3IgZm9yIHRoZSB1c2VyLiAgCi0JICogCi0JICogQHBhcmFtIGZvcmsgdHJ1ZSBpZiBhIHNlcGFyYXRlIHRocmVhZCBzaG91bGQgYmUgdXNlZAotCSAqIEBwYXJhbSBjYW5jZWxhYmxlIHRydWUgaWYgaXQgc2hvdWxkIGJlIGNhbmNlbGFibGUKLQkgKiBAcGFyYW0gcnVubmFibGUgdGhlIHJ1bm5hYmxlCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJvd24gaWYgaXQgaXMgaW50ZXJydXB0ZWQKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0JICovCi0JcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvVGFza1dpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC90YXNrd2l6YXJkL1Rhc2tXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhMjQxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvVGFza1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5Nb2R1bGVDb3JlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLlRyYWNlOwotCi0KLQotLyoqCi0gKiBBIHdpemFyZCB1c2VkIHRvIGV4ZWN1dGUgdGFza3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrV2l6YXJkIGltcGxlbWVudHMgSVdpemFyZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBGSU5JU0ggPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ0FOQ0VMID0gMzsKLQotCXByaXZhdGUgTGlzdDxJV2l6YXJkUGFnZT4gcGFnZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGFkZGluZ1BhZ2VzOwotCXByaXZhdGUgTWFwPFdpemFyZEZyYWdtZW50LCBUYXNrV2l6YXJkUGFnZT4gZnJhZ21lbnREYXRhID0gbmV3IEhhc2hNYXA8V2l6YXJkRnJhZ21lbnQsIFRhc2tXaXphcmRQYWdlPigpOwotCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOwotCQotCXByaXZhdGUgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCQotCXByaXZhdGUgYm9vbGVhbiBuZWVkc1Byb2dyZXNzTW9uaXRvciA9IGZhbHNlOwotCQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0hlbHBBdmFpbGFibGUgPSBmYWxzZTsKLQkKLQlwcml2YXRlIEltYWdlIGRlZmF1bHRJbWFnZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBSR0IgdGl0bGVCYXJDb2xvciA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB3aW5kb3dUaXRsZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBudWxsOwotCQotCXByaXZhdGUgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50OwotCXByaXZhdGUgV2l6YXJkRnJhZ21lbnQgY3VycmVudEZyYWdtZW50OwotCXByaXZhdGUgT2JqZWN0IGZpbmlzaEZhbWlseTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVGFza1dpemFyZCB3aXRoIHRoZSBnaXZlbiB0aXRsZSBhbmQgcm9vdCBmcmFnbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUgYSB0aXRsZQotCSAqIEBwYXJhbSByb290RnJhZ21lbnQgYSByb290IGZyYWdtZW50Ci0JICovCi0JcHVibGljIFRhc2tXaXphcmQoU3RyaW5nIHRpdGxlLCBXaXphcmRGcmFnbWVudCByb290RnJhZ21lbnQpIHsKLQkJdGhpcyh0aXRsZSwgcm9vdEZyYWdtZW50LCBudWxsKTsKLQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXNrV2l6YXJkIHdpdGggdGhlIGdpdmVuIHRpdGxlLCByb290IGZyYWdtZW50LCBhbmQgdGFzayBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUgYSB0aXRsZQotCSAqIEBwYXJhbSByb290RnJhZ21lbnQgYSByb290IGZyYWdtZW50Ci0JICogQHBhcmFtIHRhc2tNb2RlbCBhIHRhc2sgbW9kZWwKLQkgKi8KLQlwdWJsaWMgVGFza1dpemFyZChTdHJpbmcgdGl0bGUsIFdpemFyZEZyYWdtZW50IHJvb3RGcmFnbWVudCwgVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQlzdXBlcigpOwotCQlpZiAodGl0bGUgIT0gbnVsbCkKLQkJCXNldFdpbmRvd1RpdGxlKHRpdGxlKTsKLQkJdGhpcy5yb290RnJhZ21lbnQgPSByb290RnJhZ21lbnQ7Ci0JCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOwotCQlpZiAodGFza01vZGVsID09IG51bGwpCi0JCQl0aGlzLnRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKLQkJCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JfQotCQotCXB1YmxpYyBUYXNrTW9kZWwgZ2V0VGFza01vZGVsKCkgewotCQlyZXR1cm4gdGFza01vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RGcmFnbWVudChXaXphcmRGcmFnbWVudCByb290RnJhZ21lbnQpIHsKLQkJdGhpcy5yb290RnJhZ21lbnQgPSByb290RnJhZ21lbnQ7Ci0JfQotCQotCXB1YmxpYyBXaXphcmRGcmFnbWVudCBnZXRSb290RnJhZ21lbnQoKSB7Ci0JCXJldHVybiByb290RnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogQ2FuY2VsIHRoZSBjbGllbnQgc2VsZWN0aW9uLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJZmluYWwgTGlzdCBsaXN0ID0gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCk7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJCQlleGVjdXRlVGFzaygoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKSwgQ0FOQ0VMLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlUaHJvd2FibGUgdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwotCQkJZWxzZQotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRlKSB7Ci0JCQl0ID0gdGUuZ2V0Q2F1c2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXQgPSBlOwotCQl9Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbmNlbGxpbmcgdGFzayB3aXphcmQiLCB0KTsKLQkJaGFuZGxlVGhyb3dhYmxlKHQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmIChjdXJyZW50RnJhZ21lbnQgIT0gbnVsbCkKLQkJCWN1cnJlbnRGcmFnbWVudC5leGl0KCk7Ci0JCQotCQlmaW5hbCBXaXphcmRGcmFnbWVudCBjRnJhZ21lbnQgPSBjdXJyZW50RnJhZ21lbnQ7Ci0KLQkJZmluYWwgTGlzdCBsaXN0ID0gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCk7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJLy8gZW50ZXIgJiBleGl0IHRoZSByZW1haW5pbmcgcGFnZXMKLQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YoY0ZyYWdtZW50KTsKLQkJCQl3aGlsZSAoaW5kZXggPiAwICYmIGluZGV4IDwgbGlzdC5zaXplKCkgLSAxKSB7Ci0JCQkJCWZpbmFsIFdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gKFdpemFyZEZyYWdtZW50KSBsaXN0LmdldCgrK2luZGV4KTsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWZyYWdtZW50LmVudGVyKCk7Ci0JCQkJCQkJCWZyYWdtZW50LmV4aXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZW50ZXIvZXhpdCBwYWdlIiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHVzZUpvYigpKSB7Ci0JCQkJCWNsYXNzIEZpbmlzaFdpemFyZEpvYiBleHRlbmRzIEpvYiB7Ci0JCQkJCQlwdWJsaWMgRmluaXNoV2l6YXJkSm9iKCkgewotCQkJCQkJCXN1cGVyKGdldEpvYlRpdGxlKCkpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCQkJCXJldHVybiAoZ2V0RmluaXNoSm9iRmFtaWx5KCkgPT0gbnVsbCAmJiBmYW1pbHkgPT0gbnVsbCApIAotCQkJCQkJCXx8IChnZXRGaW5pc2hKb2JGYW1pbHkoKSAhPSBudWxsICYmIGdldEZpbmlzaEpvYkZhbWlseSgpLmVxdWFscyhmYW1pbHkpKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCQkJCQkJCWV4ZWN1dGVUYXNrKChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpLCBGSU5JU0gsIG1vbml0b3IyKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmlzaGluZyB3aXphcmQgam9iIiwgY2UpOwotCQkJCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lELCAwLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJRmluaXNoV2l6YXJkSm9iIGpvYiA9IG5ldyBGaW5pc2hXaXphcmRKb2IoKTsKLQkJCQkJam9iLnNldFVzZXIodHJ1ZSk7Ci0JCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCQkJZXhlY3V0ZVRhc2soKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCksIEZJTklTSCwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJVGhyb3dhYmxlIHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGdldENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG5ldyBXb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIocnVubmFibGUpKTsKLQkJCWVsc2UKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0ZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZmluaXNoaW5nIHRhc2sgd2l6YXJkIiwgdGUpOwotCQkJdCA9IHRlLmdldENhdXNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaW5pc2hpbmcgdGFzayB3aXphcmQgMiIsIGUpOwotCQkJdCA9IGU7Ci0JCX0KLQkJCi0JCS8vIFRPRE86IHNob3cgYmV0dGVyIGVycm9yIGRpYWxvZywgZS5nLiB3aGVuIFRvbWNhdCBjb25maWcgaXMgY29ycnVwdCB3aGlsZSBkb2luZyBBZGQvUmVtb3ZlCi0JCS8vIGl0IGN1cnJlbnRseSBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZSB0d2ljZQotCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgY29tcGxldGluZyB3aXphcmQiLCB0KTsKLQkJaGFuZGxlVGhyb3dhYmxlKHQpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaEpvYkZhbWlseSgpIHsKLQkJcmV0dXJuIGZpbmlzaEZhbWlseTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmluaXNoSm9iRmFtaWx5KE9iamVjdCBvKSB7Ci0JCXRoaXMuZmluaXNoRmFtaWx5ID0gbzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXBhZ2VzLmFkZChwYWdlKTsKLQkJcGFnZS5zZXRXaXphcmQodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVUYXNrKFdpemFyZEZyYWdtZW50IGZyYWdtZW50LCBieXRlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmICh0eXBlID09IEZJTklTSCkKLQkJCWZyYWdtZW50LnBlcmZvcm1GaW5pc2gobW9uaXRvcik7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ0FOQ0VMKQotCQkJZnJhZ21lbnQucGVyZm9ybUNhbmNlbChtb25pdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGdldEN1cnJlbnRXaXphcmRGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGN1cnJlbnRGcmFnbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3dpdGNoV2l6YXJkRnJhZ21lbnQoV2l6YXJkRnJhZ21lbnQgbmV3RnJhZ21lbnQpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCk7Ci0JCWludCBvbGRJbmRleCA9IGxpc3QuaW5kZXhPZihjdXJyZW50RnJhZ21lbnQpOwotCQlpbnQgbmV3SW5kZXggPSBsaXN0LmluZGV4T2YobmV3RnJhZ21lbnQpOwotCQlpZiAob2xkSW5kZXggPT0gbmV3SW5kZXgpCi0JCQlyZXR1cm47Ci0JCQotCQkvL3NhZmVFeGVjdXRlVGFzayhjdXJyZW50RnJhZ21lbnQsIERFUEFSVFVSRSk7Ci0JCWlmIChjdXJyZW50RnJhZ21lbnQgIT0gbnVsbCkKLQkJCWN1cnJlbnRGcmFnbWVudC5leGl0KCk7Ci0JCQotCQlpZiAob2xkSW5kZXggPCBuZXdJbmRleCkKLQkJCW9sZEluZGV4ICsrOwotCQllbHNlCi0JCQlvbGRJbmRleCAtLTsKLQkJCi0JCXdoaWxlIChvbGRJbmRleCAhPSBuZXdJbmRleCkgewotCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGxpc3QuZ2V0KG9sZEluZGV4KTsKLQkJCS8vc2FmZUV4ZWN1dGVUYXNrKGZyYWdtZW50LCBBUlJJVkFMKTsKLQkJCS8vc2FmZUV4ZWN1dGVUYXNrKGZyYWdtZW50LCBERVBBUlRVUkUpOwotCQkJZnJhZ21lbnQuZW50ZXIoKTsKLQkJCWZyYWdtZW50LmV4aXQoKTsKLQkJCWlmIChvbGRJbmRleCA8IG5ld0luZGV4KQotCQkJCW9sZEluZGV4ICsrOwotCQkJZWxzZQotCQkJCW9sZEluZGV4IC0tOwotCQl9Ci0JCQotCQljdXJyZW50RnJhZ21lbnQgPSBuZXdGcmFnbWVudDsKLQkJLy9zYWZlRXhlY3V0ZVRhc2soY3VycmVudEZyYWdtZW50LCBBUlJJVkFMKTsKLQkJY3VycmVudEZyYWdtZW50LmVudGVyKCk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxXaXphcmRGcmFnbWVudD4gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCkgewotCQlMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxXaXphcmRGcmFnbWVudD4oKTsKLQkJbGlzdC5hZGQocm9vdEZyYWdtZW50KTsKLQkJYWRkU3ViV2l6YXJkRnJhZ21lbnRzKHJvb3RGcmFnbWVudCwgbGlzdCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghdGFza01vZGVsLmVxdWFscyhmcmFnbWVudC5nZXRUYXNrTW9kZWwoKSkpCi0JCQkJZnJhZ21lbnQuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFN1YldpemFyZEZyYWdtZW50cyhXaXphcmRGcmFnbWVudCBmcmFnbWVudCwgTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZyYWdtZW50LmdldENoaWxkRnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJV2l6YXJkRnJhZ21lbnQgY2hpbGQgPSAoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWxpc3QuYWRkKGNoaWxkKTsKLQkJCWFkZFN1YldpemFyZEZyYWdtZW50cyhjaGlsZCwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmIChhZGRpbmdQYWdlcykKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlhZGRpbmdQYWdlcyA9IHRydWU7Ci0JCQlwYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0JCQlJdGVyYXRvcjxXaXphcmRGcmFnbWVudD4gaXRlcmF0b3IgPSBnZXRBbGxXaXphcmRGcmFnbWVudHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCVRhc2tXaXphcmRQYWdlIHBhZ2UgPSBnZXRGcmFnbWVudERhdGEoZnJhZ21lbnQpOwotCQkJCWlmIChmcmFnbWVudC5oYXNDb21wb3NpdGUoKSkgewotCQkJCQlpZiAocGFnZSAhPSBudWxsKQotCQkJCQkJYWRkUGFnZShwYWdlKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlUYXNrV2l6YXJkUGFnZSBwYWdlMiA9IG5ldyBUYXNrV2l6YXJkUGFnZShmcmFnbWVudCk7Ci0JCQkJCQlmcmFnbWVudERhdGEucHV0KGZyYWdtZW50LCBwYWdlMik7Ci0JCQkJCQlhZGRQYWdlKHBhZ2UyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyBmcmFnbWVudHMgdG8gd2l6YXJkIiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlhZGRpbmdQYWdlcyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLypwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVdpemFyZFBhZ2VzKCkgewotCQl0cnkgewotCQkJY3VycmVudC51cGRhdGVQYWdlcygpOwotCQkJY3VycmVudC5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB1cGRhdGluZyB3aXphcmQgcGFnZXMiLCBlKTsKLQkJfQotCX0qLwotCi0JcHJpdmF0ZSBUYXNrV2l6YXJkUGFnZSBnZXRGcmFnbWVudERhdGEoV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQpIHsKLQkJdHJ5IHsKLQkJCVRhc2tXaXphcmRQYWdlIHBhZ2UgPSBmcmFnbWVudERhdGEuZ2V0KGZyYWdtZW50KTsKLQkJCWlmIChwYWdlICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhZ2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIGZyYWdtZW50IGRhdGEiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFnZXMoKSB7Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgdG8gY2hlY2sgaWYgYWxsIHBhZ2VzIGFyZSBjb21wbGV0ZS4KLQkJZm9yIChpbnQgaT0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoIShwYWdlcy5nZXQoaSkpLmlzUGFnZUNvbXBsZXRlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCS8vIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNyZWF0ZSBhbGwgdGhlIHBhZ2VzIGNvbnRyb2xzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspewotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHBhZ2VzLmdldChpKTsKLQkJCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vdGlmeSBwYWdlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlwYWdlcy5nZXQoaSkuZGlzcG9zZSgpOwotCQl9Ci0KLQkJLy8gZGlzcG9zZSBvZiBpbWFnZQotCQlpZiAoZGVmYXVsdEltYWdlICE9IG51bGwpIHsKLQkJCWRlZmF1bHRJbWFnZS5kaXNwb3NlKCk7Ci0JCQlkZWZhdWx0SW1hZ2UgPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0Q29udGFpbmVyKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldERlZmF1bHRQYWdlSW1hZ2UoKSB7Ci0JCXJldHVybiBkZWZhdWx0SW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0RGlhbG9nU2V0dGluZ3MoKQotCSAqLwotCXB1YmxpYyBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCXJldHVybiBkaWFsb2dTZXR0aW5nczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXROZXh0UGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaW50IGluZGV4ID0gcGFnZXMuaW5kZXhPZihwYWdlKTsKLQkJaWYgKGluZGV4ID09IHBhZ2VzLnNpemUoKSAtIDEgfHwgaW5kZXggPT0gLTEpCi0JCQkvLyBsYXN0IHBhZ2Ugb3IgcGFnZSBub3QgZm91bmQKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIHBhZ2VzLmdldChpbmRleCArIDEpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFBhZ2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UGFnZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSBwYWdlcy5nZXQoaSk7Ci0JCQlTdHJpbmcgcGFnZU5hbWUgPSBwYWdlLmdldE5hbWUoKTsKLQkJCWlmIChwYWdlTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UGFnZUNvdW50KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBhZ2VDb3VudCgpIHsKLQkJcmV0dXJuIHBhZ2VzLnNpemUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRQYWdlcygpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlW10gZ2V0UGFnZXMoKSB7Ci0JCXJldHVybiBwYWdlcy50b0FycmF5KG5ldyBJV2l6YXJkUGFnZVtwYWdlcy5zaXplKCldKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRQcmV2aW91c1BhZ2Uob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpbnQgaW5kZXggPSBwYWdlcy5pbmRleE9mKHBhZ2UpOwotCQlpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAtMSkKLQkJCS8vIGZpcnN0IHBhZ2Ugb3IgcGFnZSBub3QgZm91bmQKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcGFnZXMuZ2V0KGluZGV4IC0gMSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0U3RhcnRpbmdQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkgewotCQlpZiAocGFnZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBwYWdlcy5nZXQoMCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0VGl0bGVCYXJDb2xvcigpCi0JICovCi0JcHVibGljIFJHQiBnZXRUaXRsZUJhckNvbG9yKCkgewotCQlyZXR1cm4gdGl0bGVCYXJDb2xvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRXaW5kb3dUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaW5kb3dUaXRsZSgpIHsKLQkJcmV0dXJuIHdpbmRvd1RpdGxlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2lzSGVscEF2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIZWxwQXZhaWxhYmxlKCkgewotCQlyZXR1cm4gaXNIZWxwQXZhaWxhYmxlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI25lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNQcmV2aW91c0FuZE5leHRCdXR0b25zKCkgewotCQlyZXR1cm4gZm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zIHx8IHBhZ2VzLnNpemUoKSA+IDE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjbmVlZHNQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gbmVlZHNQcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjc2V0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihJV2l6YXJkQ29udGFpbmVyIHdpemFyZENvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IHdpemFyZENvbnRhaW5lcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGlhbG9nU2V0dGluZ3MoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCWRpYWxvZ1NldHRpbmdzID0gc2V0dGluZ3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKGJvb2xlYW4gYikgewotCQluZWVkc1Byb2dyZXNzTW9uaXRvciA9IGI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyhib29sZWFuIGIpIHsKLQkJZm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zID0gYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2luZG93VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0JCXdpbmRvd1RpdGxlID0gdGl0bGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlSm9iKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKb2JUaXRsZSgpIHsKLQkJcmV0dXJuIGdldFdpbmRvd1RpdGxlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVUaHJvd2FibGUoZmluYWwgVGhyb3dhYmxlIHQpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHQuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9ICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgPyAoKENvcmVFeGNlcHRpb24pdCkuZ2V0U3RhdHVzKCkgOiBudWxsOwotCQkKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiggc3RhdHVzID09IG51bGwgKQotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuV2l6YXJkRXJyb3IsIG1lc3NhZ2UpOwotCQkJCWVsc2UKLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5XaXphcmRFcnJvciwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9UYXNrV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC90YXNrd2l6YXJkL1Rhc2tXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZDQ2NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9pbnRlcm5hbC90YXNrd2l6YXJkL1Rhc2tXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5UcmFjZTsKLQotLyoqCi0gKiBBIHRhc2sgd2l6YXJkIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJV2l6YXJkSGFuZGxlIHsKLQlwcm90ZWN0ZWQgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBUYXNrV2l6YXJkUGFnZShXaXphcmRGcmFnbWVudCBmcmFnbWVudCkgewotCQlzdXBlcihmcmFnbWVudC50b1N0cmluZygpKTsKLQkJdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudENvbXApIHsKLQkJQ29tcG9zaXRlIGNvbXAgPSBudWxsOwotCQl0cnkgewotCQkJZnJhZ21lbnQuc2V0UGFnZSh0aGlzKTsKLQkJCWNvbXAgPSBmcmFnbWVudC5jcmVhdGVDb21wb3NpdGUocGFyZW50Q29tcCwgdGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSB3aXphcmQgcGFnZSBjb21wb3NpdGUiLCBlKTsKLQkJfQotCQlpZiAoY29tcCA9PSBudWxsKSB7Ci0JCQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnRDb21wLCBTV1QuTk9ORSk7Ci0JCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoIkludGVybmFsIGVycm9yIik7Ci0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDE1MCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2V0Q29udHJvbChjb21wKTsKLQkJCi0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0JCXVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQl0cnkgewotCQkJaWYgKCFmcmFnbWVudC5pc0NvbXBsZXRlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlpZiAoZ2V0TmV4dFBhZ2UoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJaWYgKCFmcmFnbWVudC5pc0NvbXBsZXRlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQotCQlpZiAodmlzaWJsZSkgewotCQkJVGFza1dpemFyZCB3aXphcmQgPSAoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCQl3aXphcmQuc3dpdGNoV2l6YXJkRnJhZ21lbnQoZnJhZ21lbnQpOwotCQkJCi0JCQlpZiAoZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSAhPSBudWxsKQotCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IElNZXNzYWdlUHJvdmlkZXIuRVJST1IgJiYgIiIuZXF1YWxzKG1lc3NhZ2UpKSB7Ci0JCQltZXNzYWdlID0gbnVsbDsKLQkJfQotCQlzdXBlci5zZXRNZXNzYWdlKG1lc3NhZ2UsIHR5cGUpOwotCQlXaXphcmRGcmFnbWVudCBmcmFnID0gKChUYXNrV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0Q3VycmVudFdpemFyZEZyYWdtZW50KCk7Ci0JCWlmICghZnJhZ21lbnQuZXF1YWxzKGZyYWcpKQotCQkJcmV0dXJuOwotCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnJ1bihmb3JrLCBjYW5jZWxhYmxlLCBydW5uYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoIWlzQ3JlYXRlZCkKLQkJCXJldHVybjsKLQkJCi0JCWZpbmFsIElXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmcmFnbWVudC51cGRhdGVDaGlsZEZyYWdtZW50cygpOwotCQkJCSgoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCkpLnVwZGF0ZVBhZ2VzKCk7Ci0JCQkJCi0JCQkJaWYgKGNvbnRhaW5lci5nZXRDdXJyZW50UGFnZSgpICE9IG51bGwpCi0JCQkJCWNvbnRhaW5lci51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M5NjM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuVGFza01vZGVsOwotCi0vKioKLSAqIEEgd2l6YXJkIGZyYWdtZW50IGlzIGEgbm9kZSB3aXRoaW4gYSB3aXphcmQgdGhhdCBwcm92aWRlcyBhIGNvbXBsZXRlbHkKLSAqIGV4dGVuZGFibGUgd2l6YXJkIGZsb3cgYnkgc3VwcG9ydGluZyBhIGZsZXhpYmxlIHRyZWUgc3RydWN0dXJlIGZvciB0aGUKLSAqIHBhZ2VzLiBBcyB0aGUgdXNlciB3YWxrcyBwYWdlcyB0aHJvdWdoIHRoZSB3aXphcmQsIHRoZXkgYXJlIGFjdHVhbGx5Ci0gKiB0cmF2ZXJzaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUsIGFuZCBlYWNoIG5vZGUgY2FuIGFkZCBvciByZW1vdmUgY2hpbGRyZW4KLSAqIGF0IGFueSB0aW1lLgotICogCi0gKiBFYWNoIG5vZGUgbWF5IGJlIG5vbi1VSSAodXNlZnVsIGZvciBpbmplY3RpbmcgYmVoYXZpb3VyIGludG8gdGhlIHRyZWUpCi0gKiBvciBjb250YWluIGEgc2luZ2xlIHdpemFyZCBwYWdlIChAc2VlIGhhc0NvbXBvc2l0ZSgpIGFuZAotICogY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSwgSVdpemFyZEhhbmRsZSkpLiBUaGUgbm9kZSBtYXkgYWxzbyBoYXZlCi0gKiBjaGlsZHJlbiAoQHNlZSBnZXRDaGlsZEZyYWdtZW50cygpLCB3aGljaCBzaG91bGQgYmUgdXBkYXRlZCBvciByZWZyZXNoZWQKLSAqIHdoZW5ldmVyIHRoZSB1cGRhdGVDaGlsZEZyYWdtZW50cygpIG1ldGhvZCBpcyBjYWxsZWQgYnkgYW5vdGhlciBub2RlIHRvCi0gKiBsZXQgdGhpcyBub2RlIGtub3cgdGhhdCBpdCdzIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQuCi0gKiAKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKCkgbWV0aG9kIHRvIGFsbG93IHRoZQotICogZnJhZ21lbnQgdG8gYWRkIGl0J3MgY2hpbGRyZW4gaW50byB0aGUgdHJlZS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heQotICogYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHRoZSB0cmVlIGlzIHVwZGF0ZWQgYW5kIGl0IG11c3QgcmV0dXJuIHRoZQotICogc2FtZSBpbnN0YW5jZSBvZiBhbnkgY2hpbGRyZW4gdGhhdCBoYXZlIHByZXZpb3VzbHkgYmVlbiByZXR1cm5lZC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkRnJhZ21lbnQgewotCXByaXZhdGUgVGFza1dpemFyZFBhZ2UgcGFnZTsKLQlwcml2YXRlIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGUgPSB0cnVlOwotCXByaXZhdGUgTGlzdDxXaXphcmRGcmFnbWVudD4gbGlzdEltcGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZnJhZ21lbnQgaGFzIGFuIGFzc29jaWF0ZWQgVUksCi0JICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBoYXMgYSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb21wb3NpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhZ21lbnQuCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiBoYXNDb21wb3NpdGUoKSByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gaGFuZGxlIGEgd2l6YXJkIGhhbmRsZQotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2l6YXJkIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogQSB0YXNrIG1vZGVsIGlzIHNoYXJlZCBieSBhbGwgZnJhZ21lbnRzIGluIHRoZSB3aXphcmQgYW5kIGlzIHVzZWQgdG8gc2hhcmUKLQkgKiBkYXRhLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3ZlcmFsbCB0YXNrIGZsb3cgYW5kIGFsbG93cwotCSAqIGZyYWdtZW50cyB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdWx0aXBsZSBmcmFnbWVudHMKLQkgKiB0byBiZSBjaGFpbmVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBkYXRhIGZyb20gdGhlIG91dHB1dCBvZiBvbmUgZnJhZ21lbnQgdG8KLQkgKiB0aGUgaW5wdXQgb2YgYW5vdGhlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHRhc2tNb2RlbCB0aGUgdGFzayBtb2RlbAotCSAqIEBzZWUgI2dldFRhc2tNb2RlbCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLQkJdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHRhc2sgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgdGFzayBtb2RlbAotCSAqIEBzZWUgI3NldFRhc2tNb2RlbChUYXNrTW9kZWwpCi0JICovCi0JcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7Ci0JCXJldHVybiB0YXNrTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhZ2UoVGFza1dpemFyZFBhZ2UgcGFnZSkgewotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCX0KLQkKLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UGFnZSgpIHsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBoYXMgdHJhdmVyc2VkCi0JICogaW50byB0aGlzIHdpemFyZCBmcmFnbWVudC4gSXQgaXMgY2FsbGVkIHRvIGdpdmUgdGhlIGZyYWdtZW50IHRoZQotCSAqIG9wcG9ydHVuaXR5IHRvIGluaXRpYWxpemUgYW55IHZhbHVlcyBzaG93biBpbiB0aGUgY29tcG9zaXRlIG9yCi0JICogdXBkYXRlIHRoZSB0YXNrIG1vZGVsLgotCSAqIDxwPgotCSAqIFdoZW4gZmluaXNoIGlzIHByZXNzZWQsIHRoZSBjdXJyZW50IGZyYWdtZW50IGlzIGV4aXQoKWVkLCBhbmQgdGhlbgotCSAqIHBlcmZvcm1GaW5pc2goKSBpcyBjYWxsZWQgb24gYWxsIG9mIHRoZSBmcmFnbWVudHMgaW4gdGhlIHRyZWUuCi0JICogZW50ZXIoKSBhbmQgZXhpdCgpIGFyZSBub3QgY2FsbGVkIG9uIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaGFzIHRyYXZlcnNlZAotCSAqIG91dCBvZiB0aGlzIHdpemFyZCBmcmFnbWVudC4gSXQgaXMgY2FsbGVkIHRvIGdpdmUgdGhlIGZyYWdtZW50IHRoZQotCSAqIG9wcG9ydHVuaXR5IHRvIHNhdmUgYW55IHZhbHVlcyBlbnRlcmVkIGludG8gdGhlIGNvbXBvc2l0ZSBvcgotCSAqIHVwZGF0ZSB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBXaGVuIGZpbmlzaCBpcyBwcmVzc2VkLCB0aGUgY3VycmVudCBmcmFnbWVudCBpcyBleGl0KCllZCwgYW5kIHRoZW4KLQkgKiBwZXJmb3JtRmluaXNoKCkgaXMgY2FsbGVkIG9uIGFsbCBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSB0cmVlLgotCSAqIGVudGVyKCkgYW5kIGV4aXQoKSBhcmUgbm90IGNhbGxlZCBvbiB0aGUgcmVtYWluaW5nIGZyYWdtZW50cy4gCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGlzIGZpbmlzaGVkLgotCSAqIEFmdGVyIGV4aXQoKWluZyB0aGUgY3VycmVudCBwYWdlLCBhbGwgZnJhZ21lbnQncyBwZXJmb3JtRmluaXNoKCkKLQkgKiBtZXRob2RzIGFyZSBjYWxsZWQgaW4gb3JkZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkIGFuZCBtdXN0IG5vdCBhY2Nlc3MgdGhlCi0JICogY29tcG9zaXRlLiBOb3Qgb25seSBtaWdodCB0aGUgdXNlciBuZXZlciBoYXZlIGFjY2Vzc2VkIHRoZSBmcmFnbWVudCdzCi0JICogY29tcG9zaXRlLCBidXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBvbiBhIGpvYgotCSAqIG9uY2UgdGhlIHdpemFyZCBoYXMgY2xvc2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaXMgY2FuY2VsZWQuCi0JICogQWZ0ZXIgZXhpdCgpaW5nIHRoZSBjdXJyZW50IHBhZ2UsIGFsbCBmcmFnbWVudCdzIHBlcmZvcm1DYW5jZWwoKQotCSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBpbiBvcmRlci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQgYW5kIG11c3Qgbm90IGFjY2VzcyB0aGUKLQkgKiBjb21wb3NpdGUuIE5vdCBvbmx5IG1pZ2h0IHRoZSB1c2VyIG5ldmVyIGhhdmUgYWNjZXNzZWQgdGhlIGZyYWdtZW50J3MKLQkgKiBjb21wb3NpdGUsIGJ1dCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IG9uIGEgam9iCi0JICogb25jZSB0aGUgd2l6YXJkIGhhcyBjbG9zZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQ2FuY2VsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgZnJhZ21lbnRzLiBDaGlsZCBmcmFnbWVudHMgY29tZSBkaXJlY3RseSBhZnRlciB0aGlzIGZyYWdtZW50Ci0JICogaW4gdGhlIHdpemFyZCBmbG93LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGNoaWxkIGZyYWdtZW50cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQlpZiAobGlzdEltcGwgPT0gbnVsbCkgewotCQkJbGlzdEltcGwgPSBuZXcgQXJyYXlMaXN0PFdpemFyZEZyYWdtZW50PigpOwotCQkJY3JlYXRlQ2hpbGRGcmFnbWVudHMobGlzdEltcGwpOwotCQl9Ci0JCXJldHVybiBsaXN0SW1wbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gZ2l2ZSB0aGUgZnJhZ21lbnQgYSBjaGFuY2UgdG8gdXBkYXRlIGl0J3MgY2hpbGQgZnJhZ21lbnRzIGluCi0JICogcmVzcG9uc2UgdG8gb3RoZXIgY2hhbmdlcyB3aXRoaW4gdGhlIHdpemFyZCBvciB0YXNrIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNoaWxkRnJhZ21lbnRzKCkgewotCQlsaXN0SW1wbCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRDaGlsZEZyYWdtZW50cygpIHRvCi0JICogYWxsb3cgdGhpcyBmcmFnbWVudCB0byBhZGQgaXQncyBjaGlsZHJlbi4gVGhpcyBtZXRob2QgbXVzdCBjYWNoZSBhbmQKLQkgKiByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgYW55IGNoaWxkIGZyYWdtZW50IGNyZWF0ZWQuIElmIG5ldwotCSAqIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBlYWNoIHRpbWUgdGhlIHdpemFyZCBpcyB1cGRhdGVkLCB0aGUgZW5hYmxlbWVudAotCSAqIHN0YXRlIGFuZCB0aGUgZmxvdyBvZiB0aGUgd2l6YXJkIHdpbGwgYmUgaW5jb3JyZWN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdCBhIGxpc3QgdG8gYWRkIHRoZSBjaGlsZCBmcmFnbWVudHMgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0PFdpemFyZEZyYWdtZW50PiBsaXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmcmFnbWVudCBpcyBjb21wbGV0ZSAoY2FuIGZpbmlzaCkuIElmIGl0IGlzCi0JICogY29tcGxldGUgdGhlIHVzZXIgd2lsbCBiZSBhbGxvd2VkIHRvIGdvIHRvIHRoZSBuZXh0IGZyYWdtZW50IG9yCi0JICogZmluaXNoIHRoZSB3aXphcmQuIElmIHRoZSBmcmFnbWVudCBpcyBub3QgY29tcGxldGUsIHRoZSBOZXh0IGJ1dHRvbgotCSAqIHdpbGwgYmUgZGlzYWJsZWQuIElmIHRoZSBmcmFnbWVudCBpcyBjb21wbGV0ZSBidXQgYW5vdGhlciBmcmFnbWVudAotCSAqIGlzIG5vdCBjb21wbGV0ZSwgdGhlIEZpbmlzaCBidXR0b24gd2lsbCBub3QgYmUgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmcmFnbWVudCBpcyBjb21wbGV0ZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBpc0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaXNDb21wbGV0ZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcGxldGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZyYWdtZW50IGlzIGNvbXBsZXRlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29tcGxldGUoYm9vbGVhbiBjb21wbGV0ZSkgewotCQl0aGlzLmlzQ29tcGxldGUgPSBjb21wbGV0ZTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgYWR2YW5jZVRvTmV4dFBhZ2VPckZpbmlzaCgpIHsKLQkJaWYgKGdldFBhZ2UoKS5jYW5GbGlwVG9OZXh0UGFnZSgpKSB7Ci0JCQlnZXRQYWdlKCkuZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkuc2hvd1BhZ2UoZ2V0UGFnZSgpLmdldE5leHRQYWdlKCkpOwotCQl9IGVsc2UgaWYoZ2V0UGFnZSgpLmdldFdpemFyZCgpLmNhbkZpbmlzaCgpKSB7Ci0JCQlpZiAoZ2V0UGFnZSgpLmdldFdpemFyZCgpLnBlcmZvcm1GaW5pc2goKSkgewotCQkJCSgoV2l6YXJkRGlhbG9nKWdldFBhZ2UoKS5nZXRXaXphcmQoKS5nZXRDb250YWluZXIoKSkuY2xvc2UoKTsKLQkJCX0KLQkJfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9Xb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvaW50ZXJuYWwvdGFza3dpemFyZC9Xb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0N2U1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL2ludGVybmFsL3Rhc2t3aXphcmQvV29ya3NwYWNlUnVubmFibGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLS8qKgotICogSVJ1bm5hYmxlV2l0aFByb2dyZXNzQWRhcHRlciB0byBhbGxvdyBpdCB0byBydW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlLgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQlwcml2YXRlIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZTsKLQkKLQlwdWJsaWMgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSkgewotCQl3b3Jrc3BhY2VSdW5uYWJsZSA9IHJ1bm5hYmxlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDgzNjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLU1vZHVsZUFzc2VtYmx5Um9vdFBhZ2VEZXNjcmlwdGlvbj1EZWZpbmUgcGFja2FnaW5nIHN0cnVjdHVyZSBmb3IgdGhpcyBwcm9qZWN0LgotRXJyb3JDaGVja2luZ0ZhY2V0cz1FcnJvciBDaGVja2luZyBQcm9qZWN0IEZhY2V0cwotRXJyb3JOb3RWaXJ0dWFsQ29tcG9uZW50PVRoZSBnaXZlbiBwcm9qZWN0IGlzIG5vdCBhIHZpcnR1YWwgY29tcG9uZW50IHByb2plY3QKLURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVySGVscGVyXzA9VmVyaWZ5aW5nIENvbXBvbmVudAotRGVwbG95UGF0aENvbHVtbj1EZXBsb3kgUGF0aAotU291cmNlQ29sdW1uPVNvdXJjZQotSW50ZXJuYWxMaWJKYXJXYXJuaW5nPVRoaXMgbGlicmFyeSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcHJvamVjdCBieSB1c2luZyB0aGUgcHJvamVjdCB0cmVlIG9yIHRoZSBmaWxlIHN5c3RlbS4gSWYgeW91IHdhbnQgdG8gbW92ZSAvIHJlbW92ZSBpdCwgdXNlIHRoZSBzYW1lIGFwcHJvYWNoLgotQWRkRm9sZGVyPUZvbGRlcgotQWRkRm9sZGVyRWxpcHNlcz1BZGQgRm9sZGVyLi4uCi1BZGRGb2xkZXJNYXBwaW5ncz1TZWxlY3QgYSBwcm9qZWN0IGZvbGRlciB0byBpbmNsdWRlIGluIHRoZSBkZXBsb3ltZW50IGFzc2VtYmx5LgotQWRkRWxsaXBzaXM9QSZkZC4uLgotRWRpdEVsbGlwc2lzPSZFZGl0Li4uCi1SZW1vdmVTZWxlY3RlZD0mUmVtb3ZlCi1FeHRlcm5hbEphclRpdGxlPUFkZCBhbiBFeHRlcm5hbCBKYXIgUmVmZXJlbmNlCi1FeHRlcm5hbEphckRlc2NyaXB0aW9uPUhlcmUgeW91IGNhbiByZWZlcmVuY2UgYSBmaWxlc3lzdGVtIEphclxuVGhpcyBpcyBub3QgYSBzdWdnZXN0ZWQgdXNlLWNhc2UsIGJ1dCBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KLUphclRpdGxlPUFkZCBhIEphciBSZWZlcmVuY2UKLUphckRlc2NyaXB0aW9uPSJIZXJlIHlvdSBjYW4gcmVmZXJlbmNlIGEgd29ya3NwYWNlIEphclxuVGhpcyBpcyBub3QgYSBzdWdnZXN0ZWQgdXNlLWNhc2UsIGJ1dCBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KLUJyb3dzZT1Ccm93c2UuLi4KLU5ld1JlZmVyZW5jZVRpdGxlPVNlbGVjdCBEaXJlY3RpdmUgVHlwZQotTmV3UmVmZXJlbmNlRGVzY3JpcHRpb249QWRkIGEgbmV3IGFzc2VtYmx5IGRpcmVjdGl2ZS4KLU5ld1JlZmVyZW5jZVdpemFyZD1OZXcgQXNzZW1ibHkgRGlyZWN0aXZlCi1Qcm9qZWN0UmVmZXJlbmNlVGl0bGU9UHJvamVjdHMKLVByb2plY3RSZWZlcmVuY2VEZXNjcmlwdGlvbj1TZWxlY3QgcHJvamVjdHMgdG8gaW5jbHVkZSBpbiB0aGUgZGVwbG95bWVudCBhc3NlbWJseS4KLVZhcmlhYmxlUmVmZXJlbmNlVGl0bGU9QWRkIGEgVmFyaWFibGUgUmVmZXJlbmNlCi1WYXJpYWJsZVJlZmVyZW5jZURlc2NyaXB0aW9uPSJIZXJlIHlvdSBjYW4gcmVmZXJlbmNlIGEgdmFyaWFibGUgd2hpY2ggbWFwcyB0byBhIHNpbmdsZSBqYXIuXG5UaGlzIGlzIG5vdCBhIHN1Z2dlc3RlZCB1c2UtY2FzZSwgYnV0IGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5LgotV2l6YXJkRXJyb3I9V2l6YXJkIEVycm9yCi1Qcm9qZWN0Q29udmVyc2lvbkVycm9yPUVycm9yIGNvbnZlcnRpbmcgcHJvamVjdCB7MH0gaW50byBhIGZsZXhpYmxlIHByb2plY3QKLUV4aXN0aW5nRm9sZGVyRXJyb3I9IEZvbGRlciAiezB9IiBhbHJlYWR5IGV4aXN0cy4KLVJldmVydD1SZSZ2ZXJ0Ci1FcnJvckVudHJ5Tm90Rm91bmQ9Q2Fubm90IGZpbmQgZW50cnk6ICJ7MH0iLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0Fic3RyYWN0SU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0Fic3RyYWN0SU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4NDVkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9BYnN0cmFjdElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sIGltcGxlbWVudHMgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wgewotCi0JLyoqCi0JICogUmV0dXJucyBhbnkgZXJyb3Ivd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgcGFnZSAgCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgQ29tcG9zaXRlLgotCSAqIEByZXR1cm4gSVN0YXR1cyB3aXRoIGFsbCB0aGUgZXJyb3Ivd2FybmluZyBtZXNzYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhZ2UKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9BZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczMGYwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9BZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgUmVkIEhhdCBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFJvYiBTdHJ5a2VyIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBtaXNjLiBVSSBjbGVhbnVwCi0gKiAgICBSb2JlcnRvIFNhbmNoZXogKElCTSkgLSBIYW5kbGUgdGFncyBpbiBtYXBwaW5ncwotICogICAgCi0gKiBBUEkgaW4gdGhlc2UgcGFja2FnZXMgaXMgcHJvdmlzaW9uYWwgaW4gdGhpcyByZWxlYXNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5WaWV3ZXJFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRm9jdXNDZWxsT3duZXJEcmF3SGlnaGxpZ2h0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXJGb2N1c0NlbGxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlZmF1bHRNb2R1bGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSU1vZHVsZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5BZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLlZpcnR1YWxSZWZlcmVuY2VVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVGFnZ2VkVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5JTW9kdWxlQ29yZVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1vZHVsZUNvcmVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkNvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5EZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5EZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuUmVmZXJlbmNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuTmV3UmVmZXJlbmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuUmVzb3VyY2VNYXBwaW5nRmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS52ZXJpZmllci5EZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLmZhY2V0cy5GYWNldFV0aWw7Ci0gCi1wdWJsaWMgY2xhc3MgQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sIGltcGxlbWVudHMgTGlzdGVuZXIsCi0JCUlMYWJlbFByb3ZpZGVyTGlzdGVuZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX0NPTFVNTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVQTE9ZX0NPTFVNTiA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1BST1BFUlRZID0gbmV3IEludGVnZXIoU09VUkNFX0NPTFVNTikudG9TdHJpbmcoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfUEFUSF9QUk9QRVJUWSA9IG5ldyBJbnRlZ2VyKERFUExPWV9DT0xVTU4pLnRvU3RyaW5nKCk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBQQVRIX1NFUEFSQVRPUiA9IFN0cmluZy52YWx1ZU9mKElQYXRoLlNFUEFSQVRPUik7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0luaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIElSdW50aW1lIHJ1bnRpbWU7Ci0JcHJvdGVjdGVkIGZpbmFsIE1vZHVsZUFzc2VtYmx5Um9vdFBhZ2UgcHJvcFBhZ2U7Ci0JcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IGNvbXBvbmVudE5hbWVUZXh0OwotCXByb3RlY3RlZCBUcmVlVmlld2VyIGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXI7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRNYXBwaW5nQnV0dG9uLCBhZGRSZWZlcmVuY2VCdXR0b24sIGVkaXRSZWZlcmVuY2VCdXR0b24sIHJlbW92ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1dHRvbkNvbHVtbjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgT0tfU1RBVFVTID0gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQkvL3Byb3RlY3RlZCBMaXN0ZW5lciB0YWJsZUxpc3RlbmVyOwotCXByb3RlY3RlZCBMaXN0ZW5lciBsYWJlbExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gb3JpZ2luYWxSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBjdXJyZW50UmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0KLQkvLyBBIHNpbmdsZSBsaXN0IG9mIHdiLXJlc291cmNlIG1hcHBpbmdzLiBJZiB0aGVyZSdzIGFueSBjaGFuZ2UsIAotCS8vIGFsbCBvbGQgd2lsbCBiZSByZW1vdmVkIGFuZCBuZXcgb25lcyBhZGRlZAotCXByb3RlY3RlZCBBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4gcmVzb3VyY2VNYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4oKTsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+IGhpZGRlbk1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZVByb3h5PigpOwotCQotCS8vIGtlZXBzIHRyYWNrIGlmIGEgY2hhbmdlIGhhcyBvY2N1cnJlZCBpbiB3Yi1yZXNvdXJjZSBtYXBwaW5ncwotCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlTWFwcGluZ3NDaGFuZ2VkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVIYW5kbGVyIG1vZHVsZUhhbmRsZXI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2FmZVJ1bnRpbWVQYXRoKElWaXJ0dWFsUmVmZXJlbmNlIHJlZikgewotCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSByZWYuZ2V0RGVwZW5kZW5jeVR5cGUoKSA9PSBEZXBlbmRlbmN5VHlwZS5DT05TVU1FUyA/IG51bGwgOiByZWYuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCWlmKGFyY2hpdmVOYW1lICE9IG51bGwpIHsKLQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoYXJjaGl2ZU5hbWUpOwotCQkJaWYocnVudGltZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJdmFsID0gYXJjaGl2ZU5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCXZhbCA9IHJlZi5nZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhcmNoaXZlTmFtZSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZhbCA9IHJlZi5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYoIHZhbCA9PSBudWxsICkgdmFsID0gIi8iOwotCQlyZXR1cm4gdmFsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSdW50aW1lUGF0aFNhZmUoSVZpcnR1YWxSZWZlcmVuY2UgcmVmLCBTdHJpbmcgbmV3UGF0aCkgewotCQlpZiggcmVmLmdldERlcGVuZGVuY3lUeXBlKCkgPT0gSVZpcnR1YWxSZWZlcmVuY2UuREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTKQotCQkJcmVmLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKG5ld1BhdGggPT0gbnVsbCA/ICIvIiA6IG5ld1BhdGgudHJpbSgpKS5tYWtlUmVsYXRpdmUoKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCWVsc2UgewotCQkJSVBhdGggcGF0aDIgPSBuZXcgUGF0aChuZXdQYXRoID09IG51bGwgPyAiLyIgOiBuZXdQYXRoLnRyaW0oKSkubWFrZVJlbGF0aXZlKCkubWFrZUFic29sdXRlKCk7Ci0JCQlyZWYuc2V0UnVudGltZVBhdGgocGF0aDIuc2VnbWVudENvdW50KCkgPiAxID8gcGF0aDIucmVtb3ZlTGFzdFNlZ21lbnRzKDEpIDogbmV3IFBhdGgoIi8iKSk7Ci0JCQlpZihwYXRoMi5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCQlyZWYuc2V0QXJjaGl2ZU5hbWUocGF0aDIubGFzdFNlZ21lbnQoKSk7Ci0JCQl9IGVsc2UgaWYocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50ICYmICgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSkuZ2V0QXJjaGl2ZVR5cGUoKS5lcXVhbHMoVmlydHVhbEFyY2hpdmVDb21wb25lbnQuVkFSQVJDSElWRVRZUEUpICkgewotCQkJCUZpbGUgZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKXJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0QWRhcHRlcihqYXZhLmlvLkZpbGUuY2xhc3MpOwotCQkJCUlQYXRoIGZpbGVQYXRoID0gbnVsbDsKLQkJCQlpZiAoZGlza0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkaXNrRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCXJlZi5zZXRBcmNoaXZlTmFtZShmaWxlUGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJlZi5zZXRBcmNoaXZlTmFtZShWaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzLklOU1RBTkNFLmdldERlZmF1bHRBcmNoaXZlTmFtZShyZWYpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWRkTW9kdWxlc3RvRUFSUHJvcGVydGllc0NvbnRyb2wuCi0JICovCi0JcHVibGljIEFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0JCQlmaW5hbCBNb2R1bGVBc3NlbWJseVJvb3RQYWdlIHBhZ2UpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5wcm9wUGFnZSA9IHBhZ2U7Ci0JCXRoaXMucnVudGltZSA9IHNldFJ1bnRpbWUoKTsKLQkJcm9vdENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCX0KLQotCXByaXZhdGUgSVJ1bnRpbWUgc2V0UnVudGltZSgpIHsKLQkJSVJ1bnRpbWUgYVJ1bnRpbWUgPSBudWxsOwotCQl0cnkgewotCQkJYVJ1bnRpbWUgPSBnZXRTZXJ2ZXJSdW50aW1lKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIGFSdW50aW1lOwotCX0KLQotCS8qCi0JICogVUkgQ3JlYXRpb24gTWV0aG9kcwotCSAqLwotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSU1vZHVsZUNvcmVVSUNvbnRleHRJZHMuREVQTE9ZTUVOVF9BU1NFTUJMWV9QUkVGRVJFTkNFX1BBR0VfREVQTE9ZTUVOVF9BU1NFTUJMWV9UQUIpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVEZXNjcmlwdGlvbkNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVMaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJcmVmcmVzaCgpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlc2NyaXB0aW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpewotCQlNb2R1bGVBc3NlbWJseVJvb3RQYWdlLmNyZWF0ZURlc2NyaXB0aW9uQ29tcG9zaXRlKHBhcmVudCwgZ2V0TW9kdWxlQXNzZW1ibHlSb290UGFnZURlc2NyaXB0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlQXNzZW1ibHlSb290UGFnZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuTW9kdWxlQXNzZW1ibHlSb290UGFnZURlc2NyaXB0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBsaXN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxpc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGlzdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWNyZWF0ZVRhYmxlQ29tcG9zaXRlKGxpc3RHcm91cCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ0RhdGEpOwotCQlmaWxsVGFibGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVUYWJsZShwYXJlbnQpOwotCQljcmVhdGVCdXR0b25Db2x1bW4ocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25Db2x1bW4oQ29tcG9zaXRlIHBhcmVudCkgewotCQlidXR0b25Db2x1bW4gPSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUocGFyZW50KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWJ1dHRvbkNvbHVtbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljcmVhdGVQdXNoQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1c2hCdXR0b25zKCkgewotCQlhZGRSZWZlcmVuY2VCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKE1lc3NhZ2VzLkFkZEVsbGlwc2lzKTsKLQkJZWRpdFJlZmVyZW5jZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oTWVzc2FnZXMuRWRpdEVsbGlwc2lzKTsKLQkJcmVtb3ZlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihNZXNzYWdlcy5SZW1vdmVTZWxlY3RlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29sdW1uLCBTV1QuUFVTSCk7Ci0JCWFCdXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWFCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0ZvciggYUJ1dHRvbiApLmFwcGx5VG8oIGFCdXR0b24gKTsKLQkJcmV0dXJuIGFCdXR0b247Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVCdXR0b25Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYUJ1dHRvbkNvbHVtbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYUJ1dHRvbkNvbHVtbi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWFCdXR0b25Db2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGFCdXR0b25Db2x1bW47Ci0JfQotCi0JcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChyb290Q29tcG9uZW50ICE9IG51bGwpIHsKLQkJCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIgPSBjcmVhdGVBdmFpbGFibGVDb21wb25lbnRzVmlld2VyKHBhcmVudCk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9CT1RIICk7Ci0JCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGNyZWF0ZVByb3ZpZGVyKCk7Ci0JCQlwcm92aWRlci5zZXRDb21wb25lbnQocm9vdENvbXBvbmVudCk7Ci0JCQlwcm92aWRlci5zZXRSdW50aW1lUGF0aHMoY3VycmVudFJlZmVyZW5jZXMpOwotCQkJcHJvdmlkZXIuc2V0UmVzb3VyY2VNYXBwaW5ncyhyZXNvdXJjZU1hcHBpbmdzKTsKLQkJCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJCS8vYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLQkgICAgICAgIC8vICAgICAgICBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLgotCSAgICAgICAgLy8gICAgICAgICBnZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJCWFkZFRhYmxlTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVyLXJpZGUgdGhpcyBhbmQgZXh0ZW5kIHRoZSBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyIGNyZWF0ZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBMaXN0ZW5lcnMgb2YgdmFyaW91cyBldmVudHMKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlTGlzdGVuZXJzKCkgewotCQlhZGRIb3ZlckhlbHBMaXN0ZW5lcnMoKTsKLQkJYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcigpOwotCQlhZGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEhvdmVySGVscExpc3RlbmVycygpIHsKLQkJZmluYWwgVHJlZSB0cmVlID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUcmVlKCk7Ci0JCWNyZWF0ZUxhYmVsTGlzdGVuZXIodHJlZSk7Ci0vLwkJY3JlYXRlVGFibGVMaXN0ZW5lcih0YWJsZSk7Ci0vLwkJdGFibGUuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIHRhYmxlTGlzdGVuZXIpOwotLy8JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCB0YWJsZUxpc3RlbmVyKTsKLS8vCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCB0YWJsZUxpc3RlbmVyKTsKLS8vCQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VIb3ZlciwgdGFibGVMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGFiZWxMaXN0ZW5lcihmaW5hbCBUcmVlIHRyZWUpIHsKLQkJbGFiZWxMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSAoTGFiZWwpIGV2ZW50LndpZGdldDsKLQkJCQlTaGVsbCBzaGVsbCA9IGxhYmVsLmdldFNoZWxsKCk7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0JCQkJCWUuaXRlbSA9IChUcmVlSXRlbSkgbGFiZWwuZ2V0RGF0YSgiX1RyZWVJdGVtIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyAoVHJlZUl0ZW0pIGUuaXRlbSB9KTsKLQkJCQkJdHJlZS5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgZSk7Ci0JCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCQkJdHJlZS5zZXRGb2N1cygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZUV4aXQ6Ci0JCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotLy8JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVMaXN0ZW5lcihmaW5hbCBUYWJsZSB0YWJsZSkgewotLy8JCXRhYmxlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0vLwkJCVNoZWxsIHRpcCA9IG51bGw7Ci0vLwkJCUxhYmVsIGxhYmVsID0gbnVsbDsKLS8vCi0vLwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0vLwkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLS8vCQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0vLwkJCQljYXNlIFNXVC5LZXlEb3duOgotLy8JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOiB7Ci0vLwkJCQkJaWYgKHRpcCA9PSBudWxsKQotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl0aXAuZGlzcG9zZSgpOwotLy8JCQkJCXRpcCA9IG51bGw7Ci0vLwkJCQkJbGFiZWwgPSBudWxsOwotLy8JCQkJCWJyZWFrOwotLy8JCQkJfQotLy8JCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjogewotLy8JCQkJCVRyZWVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0vLwkJCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmdldERhdGEoKSAhPSBudWxsICYmICFjYW5FZGl0KGl0ZW0uZ2V0RGF0YSgpKSkgewotLy8JCQkJCQlpZiAodGlwICE9IG51bGwgJiYgIXRpcC5pc0Rpc3Bvc2VkKCkpCi0vLwkJCQkJCQl0aXAuZGlzcG9zZSgpOwotLy8JCQkJCQl0aXAgPSBuZXcgU2hlbGwoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotLy8JCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotLy8JCQkJCQkJCVNXVC5PTl9UT1AgfCBTV1QuTk9fRk9DVVMgfCBTV1QuVE9PTCk7Ci0vLwkJCQkJCXRpcC5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKAotLy8JCQkJCQkJCVNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLS8vCQkJCQkJRmlsbExheW91dCBsYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotLy8JCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotLy8JCQkJCQl0aXAuc2V0TGF5b3V0KGxheW91dCk7Ci0vLwkJCQkJCWxhYmVsID0gbmV3IExhYmVsKHRpcCwgU1dULldSQVApOwotLy8JCQkJCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKERpc3BsYXkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCQkJLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLS8vCQkJCQkJbGFiZWwuc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldERlZmF1bHQoKQotLy8JCQkJCQkJCS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0vLwkJCQkJCWxhYmVsLnNldERhdGEoIl9UcmVlSXRlbSIsIGl0ZW0pOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCWxhYmVsLnNldFRleHQoIE1lc3NhZ2VzLkludGVybmFsTGliSmFyV2FybmluZyk7Ci0vLwkJCQkJCWxhYmVsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUV4aXQsIGxhYmVsTGlzdGVuZXIpOwotLy8JCQkJCQlsYWJlbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsYWJlbExpc3RlbmVyKTsKLS8vCQkJCQkJUG9pbnQgc2l6ZSA9IHRpcC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotLy8JCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzKDApOwotLy8JCQkJCQlQb2ludCBwdCA9IHRhYmxlLnRvRGlzcGxheShyZWN0LngsIHJlY3QueSk7Ci0vLwkJCQkJCXRpcC5zZXRCb3VuZHMocHQueCwgcHQueSAtIHNpemUueSwgc2l6ZS54LCBzaXplLnkpOwotLy8JCQkJCQl0aXAuc2V0VmlzaWJsZSh0cnVlKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9OwotLy8JfQotCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FZGl0KE9iamVjdCBkYXRhKSB7Ci0vLwkJaWYoIGRhdGEgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLS8vCQlpZiggIShkYXRhIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpKSByZXR1cm4gdHJ1ZTsKLS8vCQkKLS8vCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBkMiA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudClkYXRhOwotLy8JCWJvb2xlYW4gc2FtZVByb2plY3QgPSBkMi5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSAhPSBudWxsCi0vLwkJCSYmIGQyLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpLnNlZ21lbnQoMCkKLS8vCQkJCS5lcXVhbHMocm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLS8vCQlyZXR1cm4gIShzYW1lUHJvamVjdCAmJiBpc1BoeXNpY2FsbHlBZGRlZChkMikpOwotLy8JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyAKLQkJCQlTT1VSQ0VfUFJPUEVSVFksIERFUExPWV9QQVRIX1BST1BFUlRZIH0pOwotCQkKLQkJQ2VsbEVkaXRvcltdIGVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltdIHsKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IoKSwKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IoYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUcmVlKCkpfTsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLQkJYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcgotCQkJCS5zZXRDZWxsTW9kaWZpZXIoZ2V0UnVudGltZVBhdGhDZWxsTW9kaWZpZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVQYXRoQ2VsbE1vZGlmaWVyIGdldFJ1bnRpbWVQYXRoQ2VsbE1vZGlmaWVyKCkgewotCQlyZXR1cm4gbmV3IFJ1bnRpbWVQYXRoQ2VsbE1vZGlmaWVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCl7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl2aWV3ZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmlld2VyU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJZWRpdFJlZmVyZW5jZUJ1dHRvbi5zZXRFbmFibGVkKGhhc0VkaXRXaXphcmRQYWdlKGdldFNlbGVjdGVkT2JqZWN0KCkpKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoY2FuUmVtb3ZlKGdldFNlbGVjdGVkT2JqZWN0KCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW1vdmUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCXJldHVybiBzZWxlY3RlZE9iamVjdCAhPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNFZGl0V2l6YXJkUGFnZShPYmplY3QgbykgewotCQlpZiggbyA9PSBudWxsIHx8ICEobyBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVdpemFyZEZyYWdtZW50IHdmID0gTmV3UmVmZXJlbmNlV2l6YXJkLmdldEZpcnN0RWRpdGluZ0ZyYWdtZW50KChJVmlydHVhbFJlZmVyZW5jZSlvKTsKLQkJcmV0dXJuIHdmICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3RlZE9iamVjdCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBSdW50aW1lUGF0aENlbGxNb2RpZmllciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIgewotCi0JCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiggcHJvcGVydHkuZXF1YWxzKERFUExPWV9QQVRIX1BST1BFUlRZKSkgewotCQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UgJiYgISgoSVZpcnR1YWxSZWZlcmVuY2UpZWxlbWVudCkuaXNEZXJpdmVkKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSApCi0JCQkJCXJldHVybiB0cnVlOyAKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSApIHsKLQkJCQlyZXR1cm4gbmV3IFBhdGgoZ2V0U2FmZVJ1bnRpbWVQYXRoKChJVmlydHVhbFJlZmVyZW5jZSllbGVtZW50KSkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCX0gZWxzZSBpZiggZWxlbWVudCBpbnN0YW5jZW9mIENvbXBvbmVudFJlc291cmNlUHJveHkpIHsKLQkJCQlpZigoKENvbXBvbmVudFJlc291cmNlUHJveHkpZWxlbWVudCkucnVudGltZVBhdGguaXNSb290KCkpCi0JCQkJCXJldHVybiAoKENvbXBvbmVudFJlc291cmNlUHJveHkpZWxlbWVudCkucnVudGltZVBhdGgudG9TdHJpbmcoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAoKENvbXBvbmVudFJlc291cmNlUHJveHkpZWxlbWVudCkucnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQlpZiAocHJvcGVydHkuZXF1YWxzKERFUExPWV9QQVRIX1BST1BFUlRZKSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGVsZW1lbnQ7Ci0JCQkJVHJlZUl0ZW1bXSBjb21wb25lbnRzID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKLQkJCQlpbnQgdGFibGVJbmRleCA9IC0xOwotCQkJCWZvcihpbnQgaT0wOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZihjb21wb25lbnRzW2ldID09IGl0ZW0pIHsKLQkJCQkJCXRhYmxlSW5kZXggPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpIHsKLQkJCQkJc2V0UnVudGltZVBhdGhTYWZlKChJVmlydHVhbFJlZmVyZW5jZSlpdGVtLmdldERhdGEoKSwgKFN0cmluZykgdmFsdWUpOwotCQkJCQlpZih0YWJsZUluZGV4ID49IDApIHsKLQkJCQkJCUlQYXRoIGRlcGxveVBhdGggPSAoKElWaXJ0dWFsUmVmZXJlbmNlKWl0ZW0uZ2V0RGF0YSgpKS5nZXRSdW50aW1lUGF0aCgpLmFwcGVuZCgoKElWaXJ0dWFsUmVmZXJlbmNlKWl0ZW0uZ2V0RGF0YSgpKS5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJCQkJCWNvbXBvbmVudHNbdGFibGVJbmRleF0uc2V0VGV4dChBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5ERVBMT1lfQ09MVU1OLCBkZXBsb3lQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmKCBpdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIENvbXBvbmVudFJlc291cmNlUHJveHkpIHsKLQkJCQkJQ29tcG9uZW50UmVzb3VyY2VQcm94eSBjID0gKChDb21wb25lbnRSZXNvdXJjZVByb3h5KWl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQkJYy5ydW50aW1lUGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpdmFsdWUpLm1ha2VBYnNvbHV0ZSgpOwotCQkJCQlTdHJpbmcgcnVudGltZVBhdGg7Ci0JCQkJCWlmKGMucnVudGltZVBhdGguaXNSb290KCkpCi0JCQkJCQlydW50aW1lUGF0aCA9IGMucnVudGltZVBhdGgudG9TdHJpbmcoKTsKLQkJCQkJZWxzZQotCQkJCQkJcnVudGltZVBhdGggPSBjLnJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCXJlc291cmNlTWFwcGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJaWYodGFibGVJbmRleCA+PSAwKQotCQkJCQkJY29tcG9uZW50c1t0YWJsZUluZGV4XS5zZXRUZXh0KEFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlLkRFUExPWV9DT0xVTU4sIHJ1bnRpbWVQYXRoKTsKLQkJCQl9Ci0JCQkJdmVyaWZ5KCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmKCBldmVudC53aWRnZXQgPT0gYWRkUmVmZXJlbmNlQnV0dG9uKSAKLQkJCWhhbmRsZUFkZFJlZmVyZW5jZUJ1dHRvbigpOwotCQllbHNlIGlmKCBldmVudC53aWRnZXQgPT0gZWRpdFJlZmVyZW5jZUJ1dHRvbikgCi0JCQloYW5kbGVFZGl0UmVmZXJlbmNlQnV0dG9uKCk7Ci0JCWVsc2UgaWYoIGV2ZW50LndpZGdldCA9PSByZW1vdmVCdXR0b24gKSAKLQkJCWhhbmRsZVJlbW92ZVNlbGVjdGVkQnV0dG9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZFJlZmVyZW5jZUJ1dHRvbigpIHsKLQkJc2hvd1JlZmVyZW5jZVdpemFyZChmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVkaXRSZWZlcmVuY2VCdXR0b24oKSB7Ci0JCXNob3dSZWZlcmVuY2VXaXphcmQodHJ1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpbHRlclJlZmVyZW5jZVR5cGVzKExpc3Q8UmVmZXJlbmNlRXh0ZW5zaW9uPiBkZWZhdWx0cykgCi0JewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaG93UmVmZXJlbmNlV2l6YXJkKCBmaW5hbCBib29sZWFuIGVkaXRpbmcgKSAKLQl7Ci0JCWZpbmFsIExpc3Q8UmVmZXJlbmNlRXh0ZW5zaW9uPiBleHRlbnNpb25zID0gCi0JCQlEZXBlbmRlbmN5UGFnZUV4dGVuc2lvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEV4cG9zZWRSZWZlcmVuY2VFeHRlbnNpb25zKCk7Ci0JCQotCQlmb3IoIEl0ZXJhdG9yPFJlZmVyZW5jZUV4dGVuc2lvbj4gaXRyID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApCi0JCXsKLQkJCWZpbmFsIFJlZmVyZW5jZUV4dGVuc2lvbiBleHRlbnNpb24gPSBpdHIubmV4dCgpOwotCQkJCi0JCQlpZiggISBleHRlbnNpb24uaXNBcHBsaWNhYmxlKCB0aGlzLnByb2plY3QgKSApCi0JCQl7Ci0JCQkJaXRyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlmaWx0ZXJSZWZlcmVuY2VUeXBlcyggZXh0ZW5zaW9ucyApOwotCQkKLQkJTmV3UmVmZXJlbmNlV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdSZWZlcmVuY2VXaXphcmQoZXh0ZW5zaW9ucyk7Ci0JCQotCQkvLyBmaWxsIHRoZSB0YXNrIG1vZGVsCi0JCXdpemFyZC5nZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5QUk9KRUNULCBwcm9qZWN0KTsKLQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlJPT1RfQ09NUE9ORU5ULCByb290Q29tcG9uZW50KTsKLQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLk1PRFVMRUhBTkRMRVIsIGdldE1vZHVsZUhhbmRsZXIoKSk7Ci0JCXdpemFyZC5nZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5DVVJSRU5UX1JFRlMsIGN1cnJlbnRSZWZlcmVuY2VzKTsKLQkJCi0JCWZpbmFsIExpc3Q8T2JqZWN0PiBkaXJlY3RpdmVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQotCQlmb3IoIFRyZWVJdGVtIGl0ZW0gOiB0aGlzLmF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCkgKQotCQl7Ci0JCQlkaXJlY3RpdmVzLmFkZCggaXRlbS5nZXREYXRhKCkgKTsKLQkJfQotCQkKLQkJd2l6YXJkLmdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkFMTF9ESVJFQ1RJVkVTLCBkaXJlY3RpdmVzKTsKLQkJCi0JCXNldEN1c3RvbVJlZmVyZW5jZVdpemFyZFByb3BlcnRpZXMod2l6YXJkLmdldFRhc2tNb2RlbCgpKTsKLQotCQlJVmlydHVhbFJlZmVyZW5jZSBzZWxlY3RlZCA9IG51bGw7Ci0JCWlmKCBlZGl0aW5nICkgewotCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYoIG8gaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSApIHsKLQkJCQlzZWxlY3RlZCA9IChJVmlydHVhbFJlZmVyZW5jZSlvOwotCQkJCXdpemFyZC5nZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5PUklHSU5BTF9SRUZFUkVOQ0UsIHNlbGVjdGVkKTsKLQkJCX0gCi0JCX0KLQkJCi0JCVdpemFyZERpYWxvZyB3ZCA9IG5ldyBXaXphcmREaWFsb2coYWRkUmVmZXJlbmNlQnV0dG9uLmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWlmKCB3ZC5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJaWYoIGVkaXRpbmcgJiYgc2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJCS8vIHJlbW92ZSBvbGQKLQkJCQljdXJyZW50UmVmZXJlbmNlcy5yZW1vdmUoc2VsZWN0ZWQpOwotCQkJfQotCQkJCi0JCQloYW5kbGVBZGREaXJlY3RpdmUoIHdpemFyZCApOwotCQkJcmVmcmVzaCgpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ2xpZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBzZXQgY3VzdG9tIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21SZWZlcmVuY2VXaXphcmRQcm9wZXJ0aWVzKFRhc2tNb2RlbCBtb2RlbCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZERpcmVjdGl2ZSggZmluYWwgVGFza1dpemFyZCB3aXphcmQgKQotCXsKLQkJZmluYWwgT2JqZWN0IGZvbGRlck1hcHBpbmcgPSB3aXphcmQuZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuRk9MREVSX01BUFBJTkcpOwotCQkKLQkJaWYoIGZvbGRlck1hcHBpbmcgIT0gbnVsbCAmJiBmb2xkZXJNYXBwaW5nIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSApIAotCQl7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVByb3h5IHByb3h5ID0gKENvbXBvbmVudFJlc291cmNlUHJveHkpIGZvbGRlck1hcHBpbmc7Ci0JCQlyZXNvdXJjZU1hcHBpbmdzLmFkZChwcm94eSk7Ci0JCQlyZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlPYmplY3QgcmVmZXJlbmNlID0gd2l6YXJkLmdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkZJTkFMX1JFRkVSRU5DRSk7Ci0JCQkKLQkJCWlmKCByZWZlcmVuY2UgIT0gbnVsbCApIAotCQkJewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlQXJyYXkgPSByZWZlcmVuY2UgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSA/IAotCQkJCQkJbmV3IElWaXJ0dWFsUmVmZXJlbmNlW10geyAoSVZpcnR1YWxSZWZlcmVuY2UpcmVmZXJlbmNlIH0gOiAKLQkJCQkJCQkoSVZpcnR1YWxSZWZlcmVuY2VbXSlyZWZlcmVuY2U7Ci0JCQkJY3VycmVudFJlZmVyZW5jZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVmZXJlbmNlQXJyYXkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIGFyZSBlbmNvdXJhZ2VkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIAotCSAqIHRoZXkgaGF2ZSBzb21lIHNwZWNpZmljIHBsYWNlICh3ZWJpbmYvbGliIGV0Yykgd2hlcmUgY2VydGFpbgotCSAqIHR5cGVzIG9mIHJlZmVyZW5jZXMgc2hvdWxkIGRlZmF1bHQgdG8uIAotCSAqIAotCSAqIElmIHRoZSBzdWJjbGFzcyBkb2VzIG5vdCB1bmRlcnN0YW5kIG9yIGtub3cgYWJvdXQgdGhlIAotCSAqIHRoaXMgY29tcG9uZW50IHR5cGUsIG9yIGlmIGl0IGhhcyBubyBjdXN0b21pemF0aW9ucyB0byBwZXJmb3JtLAotCSAqIGl0IHNob3VsZCByZXR1cm4gdGhlIHByb3ZpZGVkIHdpemFyZFBhdGggdW5jaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIGFkZGVkQ29tcCBUaGUgY29tcG9uZW50IGJlaW5nIGFkZGVkIGFzIGEgcmVmZXJlbmNlCi0JICogQHBhcmFtIGFkZGVkUGF0aCBUaGUgcGF0aCB0aGF0IHRoZSB3aXphcmQgc3VnZ2VzdHMgYXMgdGhlIHBhdGgKLQkgKiBAcmV0dXJuIFRoZSBydW50aW1lIHBhdGggdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHByb3BlcnRpZXMgcGFnZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UnVudGltZVBhdGgoSVZpcnR1YWxDb21wb25lbnQgYWRkZWRDb21wLCBTdHJpbmcgd2l6YXJkUGF0aCkgewotCQlyZXR1cm4gd2l6YXJkUGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlU2VsZWN0ZWRCdXR0b24oKSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoIHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsMiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWw7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZFN0dWZmID0gc2VsMi50b0FycmF5KCk7Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IHNlbGVjdGVkU3R1ZmYubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgbyA9IHNlbGVjdGVkU3R1ZmZbaV07Ci0JCQkJcmVtb3ZlKG8pOwotCQkJfQotCQkJcmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBzZWxlY3RlZEl0ZW0pewotCQlpZiggc2VsZWN0ZWRJdGVtIGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpCi0JCQljdXJyZW50UmVmZXJlbmNlcy5yZW1vdmUoc2VsZWN0ZWRJdGVtKTsKLQkJZWxzZSBpZiggc2VsZWN0ZWRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSkgewotCQkJcmVzb3VyY2VNYXBwaW5ncy5yZW1vdmUoc2VsZWN0ZWRJdGVtKTsKLQkJCXJlc291cmNlTWFwcGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcm92aWRlcyB0d28gcG9zc2libGUgc29ydHMgZm9yIGVhY2ggY29sdW1uIGJhc2VkIG9uIHRoZSB0ZXh0IGxhYmVscy4KLQkgKiBDbGlja2luZyBvbiB0aGUgY29sdW1uIHdpbGwgdG9nZ2xlIGZvcndhcmRzL2JhY2t3YXJkcyBzb3J0aW5nCi0JICogQGF1dGhvciBqc2hvbGwKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUcmVlVmlld2VyVGFibGVDb2x1bW5Tb3J0VG9nZ2xlciB7Ci0JCXByaXZhdGUgaW50IHNvcnREaXJlY3Rpb24gPSAwOwotCQlwcml2YXRlIGludCBzb3J0Q29sdW1uID0gMDsKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JCQotCQlwcml2YXRlIFRyZWVWaWV3ZXJUYWJsZUNvbHVtblNvcnRUb2dnbGVyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcil7Ci0JCQl0aGlzLnRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgdG9nZ2xlU29ydChpbnQgY29sdW1uKXsKLQkJCWlmKHNvcnRDb2x1bW4gPT0gY29sdW1uKXsKLQkJCQkvL2N5Y2xlIHRocm91Z2ggc29ydCBvcHRpb25zCi0JCQkJc3dpdGNoKHNvcnREaXJlY3Rpb24pewotCQkJCWNhc2UgU1dULk5PTkU6Ci0JCQkJCXNvcnREaXJlY3Rpb24gPSBTV1QuVVA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlVQOgotCQkJCQlzb3J0RGlyZWN0aW9uID0gU1dULkRPV047Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULkRPV046Ci0JCQkJCXNvcnREaXJlY3Rpb24gPSBTV1QuVVA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy9jbGlja2VkIG9uIGEgZGlmZmVyZW50IGNvbHVtbiByZXNldCBjeWNsZQotCQkJCXNvcnRDb2x1bW4gPSBjb2x1bW47Ci0JCQkJc29ydERpcmVjdGlvbiA9IFNXVC5VUDsKLQkJCX0KLQkJCQotCQkJVmlld2VyQ29tcGFyYXRvciBjb21wYXJhdG9yID0gZ2V0Vmlld2VyQ29tcGFyYXRvcihjb2x1bW4sIHNvcnREaXJlY3Rpb24pOwotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKGNvbXBhcmF0b3IpOwotCQkJCi0JCQlUcmVlIHRyZWUgPSB0cmVlVmlld2VyLmdldFRyZWUoKTsKLQkJCVRyZWVDb2x1bW4gc29ydENvbHVtbiA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldENvbHVtbihjb2x1bW4pOwotCQkJdHJlZS5zZXRTb3J0Q29sdW1uKHNvcnRDb2x1bW4pOwotCQkJdHJlZS5zZXRTb3J0RGlyZWN0aW9uKHNvcnREaXJlY3Rpb24pOwotCQl9Ci0JCQotCQlwcml2YXRlIFZpZXdlckNvbXBhcmF0b3IgZ2V0Vmlld2VyQ29tcGFyYXRvcihmaW5hbCBpbnQgY29sdW1uSW5kZXgsIGZpbmFsIGludCBzb3J0RGlyZWN0aW9uKSB7Ci0JCQlpZihzb3J0RGlyZWN0aW9uID09IFNXVC5OT05FKXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBuZXcgVmlld2VyQ29tcGFyYXRvcigpIHsKLQkJCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXJMb2NhbCwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQkJSUJhc2VMYWJlbFByb3ZpZGVyIGJhc2VMYWJlbFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJCWlmKGJhc2VMYWJlbFByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlTGFiZWxQcm92aWRlcil7Ci0JCQkJCQlJVGFibGVMYWJlbFByb3ZpZGVyIHRhYmxlTGFiZWxQcm92aWRlciA9IChJVGFibGVMYWJlbFByb3ZpZGVyKWJhc2VMYWJlbFByb3ZpZGVyOwotCQkJCQkJU3RyaW5nIHRleHQxID0gdGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZTEsIGNvbHVtbkluZGV4KTsKLQkJCQkJCWlmKHRleHQxICE9IG51bGwpewotCQkJCQkJCVN0cmluZyB0ZXh0MiA9IHRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KGUyLCBjb2x1bW5JbmRleCk7Ci0JCQkJCQkJaW50IGNvbXAgPSBjb2xsYXRvci5jb21wYXJlKHRleHQxLCB0ZXh0Mik7Ci0JCQkJCQkJaWYoc29ydERpcmVjdGlvbiA9PSBTV1QuRE9XTil7Ci0JCQkJCQkJCWNvbXAgPSAtY29tcDsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGNvbXA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0JCi0JcHVibGljIFRyZWVWaWV3ZXIgY3JlYXRlQXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWludCBmbGFncyA9IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEk7Ci0KLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBmbGFncyk7Ci0JCVRyZWVWaWV3ZXIgdGVtcFZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwotCQlmaW5hbCBUcmVlVmlld2VyVGFibGVDb2x1bW5Tb3J0VG9nZ2xlciBzb3J0Q29udHJvbGxlciA9IG5ldyBUcmVlVmlld2VyVGFibGVDb2x1bW5Tb3J0VG9nZ2xlcih0ZW1wVmlld2VyKTsKLQkJCi0JCVRyZWVWaWV3ZXJGb2N1c0NlbGxNYW5hZ2VyIGZvY3VzQ2VsbE1hbmFnZXIgPSBuZXcgVHJlZVZpZXdlckZvY3VzQ2VsbE1hbmFnZXIodGVtcFZpZXdlcixuZXcgRm9jdXNDZWxsT3duZXJEcmF3SGlnaGxpZ2h0ZXIodGVtcFZpZXdlcikpOwotCQlDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kgYWN0U3VwcG9ydCA9IG5ldyBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kodGVtcFZpZXdlcikgewotCQkJcHJpdmF0ZSBmaW5hbCBpbnQgU1BBQ0UgPSAzMjsKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdG9yQWN0aXZhdGlvbkV2ZW50KAotCQkJCQlDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm4gZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5UUkFWRVJTQUwKLQkJCQkJCXx8IGV2ZW50LmV2ZW50VHlwZSA9PSBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQuTU9VU0VfRE9VQkxFX0NMSUNLX1NFTEVDVElPTgotCQkJCQkJfHwgKGV2ZW50LmV2ZW50VHlwZSA9PSBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQuS0VZX1BSRVNTRUQgJiYgZXZlbnQua2V5Q29kZSA9PSBTUEFDRSkKLQkJCQkJCXx8IGV2ZW50LmV2ZW50VHlwZSA9PSBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uRXZlbnQuUFJPR1JBTU1BVElDOwotCQkJfQotCQl9OwotCQkKLQkJVHJlZVZpZXdlckVkaXRvci5jcmVhdGUodGVtcFZpZXdlciwgZm9jdXNDZWxsTWFuYWdlciwgYWN0U3VwcG9ydCwgQ29sdW1uVmlld2VyRWRpdG9yLlRBQkJJTkdfSE9SSVpPTlRBTAotCQkJCXwgQ29sdW1uVmlld2VyRWRpdG9yLlRBQkJJTkdfTU9WRV9UT19ST1dfTkVJR0hCT1IKLQkJCQl8IENvbHVtblZpZXdlckVkaXRvci5UQUJCSU5HX1ZFUlRJQ0FMIHwgQ29sdW1uVmlld2VyRWRpdG9yLktFWUJPQVJEX0FDVElWQVRJT04pOwotCi0JCS8vIHNldCB1cCB0YWJsZSBsYXlvdXQKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dCgpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQwMCwgdHJ1ZSkpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwMCwgdHJ1ZSkpOwotCQl0cmVlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRlbXBWaWV3ZXIuc2V0U29ydGVyKG51bGwpOwotCi0JCVRyZWVDb2x1bW4gcHJvamVjdENvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCBTT1VSQ0VfQ09MVU1OKTsKLQkJcHJvamVjdENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLlNvdXJjZUNvbHVtbik7Ci0JCXByb2plY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQlwcm9qZWN0Q29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzb3J0Q29udHJvbGxlci50b2dnbGVTb3J0KDApOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJVHJlZUNvbHVtbiBibmRDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgREVQTE9ZX0NPTFVNTik7Ci0JCWJuZENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLkRlcGxveVBhdGhDb2x1bW4pOwotCQlibmRDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQlibmRDb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNvcnRDb250cm9sbGVyLnRvZ2dsZVNvcnQoMSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlTGF5b3V0LmxheW91dCh0cmVlLCB0cnVlKTsKLQkJc29ydENvbnRyb2xsZXIudG9nZ2xlU29ydCgwKTsKLQkJcmV0dXJuIHRlbXBWaWV3ZXI7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBjaGFuZ2VzLCBzdWNoIGFzIGFkZGluZyBhIHByb2plY3QKLQkgKiByZWZlcmVuY2UsIGFkZGluZyBhIGxpYiByZWZlcmVuY2UgZXRjLgotCSAqIAotCSAqIEl0IHdpbGwgcmVzZXQgdGhlIGlucHV0LCBtYW51YWxseSByZS1hZGQgbWlzc2luZyBlbGVtZW50cywgYW5kIGRvIG90aGVyCi0JICogdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlyZXNldFRhYmxlVUkoKTsKLQkJaWYgKCFoYXNJbml0aWFsaXplZCkgewotCQkJaW5pdGlhbGl6ZSgpOwotCQkJcmVzZXRUYWJsZVVJKCk7Ci0JCX0KLQkJdmVyaWZ5KCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoKSB7Ci0JCXByb3BQYWdlLnJlZnJlc2hQcm9ibGVtc1ZpZXcoKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCUFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZVByb3h5PiBhbGxNYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4oKTsKLQkJYWxsTWFwcGluZ3MuYWRkQWxsKHJlc291cmNlTWFwcGluZ3MpOwotCQlhbGxNYXBwaW5ncy5hZGRBbGwoaGlkZGVuTWFwcGluZ3MpOwotCQkKLQkJcmV0dXJuIERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVySGVscGVyLnZlcmlmeShyb290Q29tcG9uZW50LCBydW50aW1lLCBjdXJyZW50UmVmZXJlbmNlcywgYWxsTWFwcGluZ3MscmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLQkJLy8gQ2xlYXIgdGhlIG1lc3NhZ2VzCi0JCXByb3BQYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJcHJvcFBhZ2Uuc2V0TWVzc2FnZShudWxsKTsKLQkJaWYoc3RhdHVzICE9IG51bGwpIHsKLQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJTXVsdGlTdGF0dXMgbXVsdGkgPSAoTXVsdGlTdGF0dXMpc3RhdHVzOwotCQkJCWlmICghbXVsdGkuaXNPSygpKSB7Ci0JCQkJCXByb3BQYWdlLnNldE1lc3NhZ2UoZ2V0TWVzc2FnZShtdWx0aSksIG11bHRpLmdldFNldmVyaXR5KCkpOwotCQkJCQlpZiAobXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQlwcm9wUGFnZS5zZXRFcnJvck1lc3NhZ2UoZ2V0TWVzc2FnZShtdWx0aSkpOwotCQkJCQkJcHJvcFBhZ2Uuc2V0VmFsaWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgCi0JCQkJCQlwcm9wUGFnZS5zZXRWYWxpZCh0cnVlKTsKLQkJCQl9IGVsc2UgcHJvcFBhZ2Uuc2V0VmFsaWQodHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKHN0YXR1cy5pc09LKCkpIHByb3BQYWdlLnNldFZhbGlkKHRydWUpOwotCQkJcHJvcFBhZ2UuZ2V0Q29udGFpbmVyKCkudXBkYXRlTWVzc2FnZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShNdWx0aVN0YXR1cyBtdWx0aSkgewotCQkvL0FwcGVuZCBNZXNzYWdlcwotCQlTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXVsdGkuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7IGkrKykgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBtdWx0aS5nZXRDaGlsZHJlbigpW2ldOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpICYmIHN0YXR1cy5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2UuYXBwZW5kKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCW1lc3NhZ2UuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0VGFibGVVSSgpIHsKLQkJSVdvcmtzcGFjZVJvb3QgaW5wdXQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpbnQgbnVtbGluZXMgPSBNYXRoLm1pbigxMCwgYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUcmVlKCkKLQkJCQkuZ2V0SXRlbUNvdW50KCkpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtSGVpZ2h0KCkKLQkJCQkqIG51bWxpbmVzOwotCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlHcmlkRGF0YSBidG5kYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJYnV0dG9uQ29sdW1uLnNldExheW91dERhdGEoYnRuZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW9wdGlvbnMucHV0KElWaXJ0dWFsQ29tcG9uZW50LlJFUVVFU1RFRF9SRUZFUkVOQ0VfVFlQRSwgSVZpcnR1YWxDb21wb25lbnQuRElTUExBWUFCTEVfUkVGRVJFTkNFU19BTEwpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSByb290Q29tcG9uZW50LmdldFJlZmVyZW5jZXMob3B0aW9ucyk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXA7Ci0JCW9yaWdpbmFsUmVmZXJlbmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZWZzKSk7Ci0JCWN1cnJlbnRSZWZlcmVuY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsb25lUmVmZXJlbmNlcyhyZWZzKSkpOwotCi0JCUNvbXBvbmVudFJlc291cmNlW10gYWxsTWFwcGluZ3MgPSBmaW5kQWxsRXhwb3NlZE1hcHBpbmdzKCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgYWxsTWFwcGluZ3MubGVuZ3RoOyBpKysgKSB7Ci0JCQlyZXNvdXJjZU1hcHBpbmdzLmFkZChuZXcgQ29tcG9uZW50UmVzb3VyY2VQcm94eSgKLQkJCQkJYWxsTWFwcGluZ3NbaV0uZ2V0U291cmNlUGF0aCgpLCBhbGxNYXBwaW5nc1tpXS5nZXRSdW50aW1lUGF0aCgpLCBhbGxNYXBwaW5nc1tpXS5nZXRUYWcoKQotCQkJKSk7Ci0JCX0KLQkJQ29tcG9uZW50UmVzb3VyY2VbXSBvbmx5SGlkZGVuTWFwcGluZ3MgPSBmaW5kT25seUhpZGRlbk1hcHBpbmdzKCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgb25seUhpZGRlbk1hcHBpbmdzLmxlbmd0aDsgaSsrICkgewotCQkJaGlkZGVuTWFwcGluZ3MuYWRkKG5ldyBDb21wb25lbnRSZXNvdXJjZVByb3h5KAotCQkJCQlvbmx5SGlkZGVuTWFwcGluZ3NbaV0uZ2V0U291cmNlUGF0aCgpLCBvbmx5SGlkZGVuTWFwcGluZ3NbaV0uZ2V0UnVudGltZVBhdGgoKSwgb25seUhpZGRlbk1hcHBpbmdzW2ldLmdldFRhZygpCi0JCQkpKTsKLQkJfQotCQlpZihlZGl0UmVmZXJlbmNlQnV0dG9uICE9IG51bGwpCi0JCQllZGl0UmVmZXJlbmNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZihyZW1vdmVCdXR0b24gIT0gbnVsbCkKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaGFzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCX0KLQotCXByaXZhdGUgSVJ1bnRpbWUgZ2V0U2VydmVyUnVudGltZShJUHJvamVjdCBwcm9qZWN0MikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lID0gZmFjZXRlZFByb2plY3QuZ2V0UnVudGltZSgpOwotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBGYWNldFV0aWwuZ2V0UnVudGltZShydW50aW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2VbXSBjbG9uZVJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW3JlZnMubGVuZ3RoXTsKLQkJVmlydHVhbFJlZmVyZW5jZSB0ZW1wOwotCQlmb3IoIGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKyApIHsKLQkJCXRlbXAgPSBuZXcgVmlydHVhbFJlZmVyZW5jZShyZWZzW2ldLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpLCByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7Ci0JCQl0ZW1wLnNldERlcGVuZGVuY3lUeXBlKHJlZnNbaV0uZ2V0RGVwZW5kZW5jeVR5cGUoKSk7Ci0JCQl0ZW1wLnNldERlcml2ZWQocmVmc1tpXS5pc0Rlcml2ZWQoKSk7Ci0JCQl0ZW1wLnNldEFyY2hpdmVOYW1lKHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQl0ZW1wLnNldFJ1bnRpbWVQYXRoKHJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQlyZXN1bHRbaV0gPSB0ZW1wOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRBbGxNYXBwaW5ncygpIHsKLQkJU3RydWN0dXJlRWRpdCBzdHJ1Y3R1cmVFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cnVjdHVyZUVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IHN0cnVjdHVyZUVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JCQlPYmplY3RbXSBhcnIgPSBjb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkudG9BcnJheSgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXN1bHQgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VbYXJyLmxlbmd0aF07Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKyApCi0JCQkJcmVzdWx0W2ldID0gKENvbXBvbmVudFJlc291cmNlKWFycltpXTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHN0cnVjdHVyZUVkaXQgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvbmVudFJlc291cmNlW117fTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvbmVudFJlc291cmNlW10gZmluZEFsbEV4cG9zZWRNYXBwaW5ncygpIHsKLQkJU3RydWN0dXJlRWRpdCBzdHJ1Y3R1cmVFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cnVjdHVyZUVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IHN0cnVjdHVyZUVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JCQlPYmplY3RbXSBhcnIgPSBjb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkudG9BcnJheSgpOwotCQkJQXJyYXlMaXN0IDxDb21wb25lbnRSZXNvdXJjZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZT4oKTsKLQkJCWZvciggaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrICkgewotCQkJCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKWFycltpXTsKLQkJCQlpZighUmVzb3VyY2VNYXBwaW5nRmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnkuc2hvdWxkRmlsdGVyKHJlc291cmNlLmdldFNvdXJjZVBhdGgoKSkpIHsKLQkJCQkJcmVzdWx0LmFkZCgoQ29tcG9uZW50UmVzb3VyY2UpYXJyW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IENvbXBvbmVudFJlc291cmNlW3Jlc3VsdC5zaXplKCldKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYoc3RydWN0dXJlRWRpdCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZUVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tcG9uZW50UmVzb3VyY2VbXXt9OwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kT25seUhpZGRlbk1hcHBpbmdzKCkgewotCQlTdHJ1Y3R1cmVFZGl0IHN0cnVjdHVyZUVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJc3RydWN0dXJlRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gc3RydWN0dXJlRWRpdC5nZXRDb21wb25lbnQoKTsKLQkJCU9iamVjdFtdIGFyciA9IGNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS50b0FycmF5KCk7Ci0JCQlBcnJheUxpc3QgPENvbXBvbmVudFJlc291cmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlPigpOwotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKysgKSB7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpYXJyW2ldOwotCQkJCWlmKFJlc291cmNlTWFwcGluZ0ZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5LnNob3VsZEZpbHRlcihyZXNvdXJjZS5nZXRTb3VyY2VQYXRoKCkpKSB7Ci0JCQkJCXJlc3VsdC5hZGQoKENvbXBvbmVudFJlc291cmNlKWFycltpXSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBDb21wb25lbnRSZXNvdXJjZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHN0cnVjdHVyZUVkaXQgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvbmVudFJlc291cmNlW117fTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb21wb25lbnRSZXNvdXJjZVByb3h5IHsKLQkJcHVibGljIElQYXRoIHNvdXJjZSwgcnVudGltZVBhdGg7Ci0JCXB1YmxpYyBTdHJpbmcgdGFnOwotCQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VQcm94eShJUGF0aCBzb3VyY2UsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCQl0aGlzKHNvdXJjZSwgcnVudGltZVBhdGgsIG51bGwpOwotCQl9Ci0JCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVByb3h5KElQYXRoIHNvdXJjZSwgSVBhdGggcnVudGltZVBhdGgsIFN0cmluZyB0YWcpIHsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5ydW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoOwotCQkJdGhpcy50YWcgPSB0YWc7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDbGVhbi11cCBtZXRob2RzIGFyZSBiZWxvdy4gVGhlc2UgaW5jbHVkZSBwZXJmb3JtQ2FuY2VsLCBwZXJmb3JtRGVmYXVsdHMsCi0JICogcGVyZm9ybU9LLCBhbmQgYW55IG90aGVyIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkICpvbmx5KiBieSB0aGlzIG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJY3VycmVudFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBjdXJyZW50VG1wID0KLQkJCW9yaWdpbmFsUmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtvcmlnaW5hbFJlZmVyZW5jZXMuc2l6ZSgpXSk7IAotCQljdXJyZW50UmVmZXJlbmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjbG9uZVJlZmVyZW5jZXMoY3VycmVudFRtcCkpKTsKLQkJcmVzb3VyY2VNYXBwaW5ncy5jbGVhcigpOwotCQlDb21wb25lbnRSZXNvdXJjZVtdIGFsbE1hcHBpbmdzID0gZmluZEFsbEV4cG9zZWRNYXBwaW5ncygpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IGFsbE1hcHBpbmdzLmxlbmd0aDsgaSsrICkgewotCQkJcmVzb3VyY2VNYXBwaW5ncy5hZGQobmV3IENvbXBvbmVudFJlc291cmNlUHJveHkoCi0JCQkJCWFsbE1hcHBpbmdzW2ldLmdldFNvdXJjZVBhdGgoKSwgYWxsTWFwcGluZ3NbaV0uZ2V0UnVudGltZVBhdGgoKSwgYWxsTWFwcGluZ3NbaV0uZ2V0VGFnKCkKLQkJCSkpOwotCQl9Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlUcmVlIHRyZWUgPSBudWxsOwotCQlpZiAoYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cmVlID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUcmVlKCk7Ci0JCX0KLS8vCQlpZiAodGFibGUgPT0gbnVsbCB8fCB0YWJsZUxpc3RlbmVyID09IG51bGwpCi0vLwkJCXJldHVybjsgCi0vLwkJdGFibGUucmVtb3ZlTGlzdGVuZXIoU1dULkRpc3Bvc2UsIHRhYmxlTGlzdGVuZXIpOwotLy8JCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5LZXlEb3duLCB0YWJsZUxpc3RlbmVyKTsKLS8vCQl0YWJsZS5yZW1vdmVMaXN0ZW5lcihTV1QuTW91c2VNb3ZlLCB0YWJsZUxpc3RlbmVyKTsKLS8vCQl0YWJsZS5yZW1vdmVMaXN0ZW5lcihTV1QuTW91c2VIb3ZlciwgdGFibGVMaXN0ZW5lcik7Ci0JfQotCi0JCi0JCi0JLyoKLQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBPSyB3b3JrIGdvZXMuIExvdHMgb2YgaXQuIFdhdGNoIHlvdXIgaGVhZC4KLQkgKiB4aWFvIHhpbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZUhhbmRsZUNoYW5nZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBvc3RIYW5kbGVDaGFuZ2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJcmVzdWx0ICY9IHNhdmVSZXNvdXJjZUNoYW5nZXMoKTsKLQkJcmVzdWx0ICY9IHNhdmVSZWZlcmVuY2VDaGFuZ2VzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNhdmVSZXNvdXJjZUNoYW5nZXMoKSB7Ci0JCWlmKCByZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCApIHsKLQkJCXJlbW92ZUFsbFJlc291cmNlTWFwcGluZ3MoKTsKLQkJCWFkZE5ld1Jlc291cmNlTWFwcGluZ3MoKTsKLQkJCWFkZEFsbEhpZGRlblJlc291cmNlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbEhpZGRlblJlc291cmNlTWFwcGluZ3MoKSB7Ci0JCUNvbXBvbmVudFJlc291cmNlUHJveHlbXSBwcm94aWVzID0gaGlkZGVuTWFwcGluZ3MudG9BcnJheShuZXcgQ29tcG9uZW50UmVzb3VyY2VQcm94eVtoaWRkZW5NYXBwaW5ncy5zaXplKCldKTsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHJvb3RDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IHByb3hpZXMubGVuZ3RoOyBpKysgKSB7Ci0JCQl0cnkgewotCQkJCXJvb3RGb2xkZXIuZ2V0Rm9sZGVyKHByb3hpZXNbaV0ucnVudGltZVBhdGgpLmNyZWF0ZUxpbmsocHJveGllc1tpXS5zb3VyY2UsIDAsIG51bGwpOwotCQkJfSBjYXRjaCggQ29yZUV4Y2VwdGlvbiBjZSApIHsKLQkJCQlNb2R1bGVDb3JlVUlQbHVnaW4ubG9nRXJyb3IoY2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGFkZE5ld1Jlc291cmNlTWFwcGluZ3MoKSB7Ci0JCUNvbXBvbmVudFJlc291cmNlUHJveHlbXSBwcm94aWVzID0gcmVzb3VyY2VNYXBwaW5ncy50b0FycmF5KG5ldyBDb21wb25lbnRSZXNvdXJjZVByb3h5W3Jlc291cmNlTWFwcGluZ3Muc2l6ZSgpXSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSByb290Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJSVZpcnR1YWxGb2xkZXIgc3ViRm9sZGVyID0gbnVsbDsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm94aWVzLmxlbmd0aDsgaSsrICkgewotCQkJdHJ5IHsJCQkKLQkJCQlzdWJGb2xkZXI9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKHByb3hpZXNbaV0ucnVudGltZVBhdGgpOwotCQkJCXN1YkZvbGRlci5jcmVhdGVMaW5rKHByb3hpZXNbaV0uc291cmNlLCAwLCBudWxsKTsKLQkJCQlpZiAoc3ViRm9sZGVyIGluc3RhbmNlb2YgSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZSl7Ci0JCQkJCSgoSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZSkgc3ViRm9sZGVyKS50YWdSZXNvdXJjZShwcm94aWVzW2ldLnNvdXJjZSwgcHJveGllc1tpXS50YWcsIG51bGwpOwotCQkJCX0KLQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZ0Vycm9yKGNlKTsKLQkJCX0KLQkJfQotCQlyZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCA9IGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVzb3VyY2VNYXBwaW5ncygpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCW1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCkuZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZVJlZmVyZW5jZUNoYW5nZXMoKSB7Ci0JCS8vIEZpbGwgb3VyIGRlbHRhIGxpc3RzCi0JCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gYWRkZWQgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCi0JCUhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlPiBtYXAgPSBuZXcgSGFzaE1hcDxJVmlydHVhbENvbXBvbmVudCwgSVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCUl0ZXJhdG9yPElWaXJ0dWFsUmVmZXJlbmNlPiBrID0gY3VycmVudFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgdjE7Ci0JCXdoaWxlKGsuaGFzTmV4dCgpKSB7Ci0JCQl2MSA9IGsubmV4dCgpOwotCQkJbWFwLnB1dCh2MS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIHYxKTsKLQkJfQotCQkKLQkJSXRlcmF0b3I8SVZpcnR1YWxSZWZlcmVuY2U+IGogPSBvcmlnaW5hbFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2Ugb3JpZ1JlZiwgbmV3UmVmOwotCQl3aGlsZSAoai5oYXNOZXh0KCkpIHsKLQkJCW9yaWdSZWYgPSBqLm5leHQoKTsKLQkJCW5ld1JlZiA9IG1hcC5nZXQob3JpZ1JlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJaWYoIG5ld1JlZiA9PSBudWxsICkKLQkJCQlyZW1vdmVkLmFkZChvcmlnUmVmKTsKLQkJCWVsc2UgaWYoICFnZXRTYWZlUnVudGltZVBhdGgob3JpZ1JlZikuZXF1YWxzKGdldFNhZmVSdW50aW1lUGF0aChuZXdSZWYpKSkgewotCQkJCXJlbW92ZWQuYWRkKG9yaWdSZWYpOwotCQkJCWFkZGVkLmFkZChuZXdSZWYpOwotCQkJfQotCQkJbWFwLnJlbW92ZShvcmlnUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7Ci0JCX0KLQotCQlhZGRlZC5hZGRBbGwobWFwLnZhbHVlcygpKTsKLQotCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlib29sZWFuIHN1YlJlc3VsdCA9IHByZUhhbmRsZUNoYW5nZXMobW9uaXRvcik7Ci0JCWlmKCAhc3ViUmVzdWx0ICkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWhhbmRsZVJlbW92ZWQocmVtb3ZlZCk7Ci0JCWhhbmRsZUFkZGVkKGFkZGVkKTsKLQotCQlzdWJSZXN1bHQgJj0gcG9zdEhhbmRsZUNoYW5nZXMobW9uaXRvcik7Ci0JCQotCQlvcmlnaW5hbFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJb3JpZ2luYWxSZWZlcmVuY2VzLmFkZEFsbChjdXJyZW50UmVmZXJlbmNlcyk7Ci0JCWN1cnJlbnRSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gY3VycmVudFRtcCA9Ci0JCQlvcmlnaW5hbFJlZmVyZW5jZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2Vbb3JpZ2luYWxSZWZlcmVuY2VzLnNpemUoKV0pOyAKLQkJY3VycmVudFJlZmVyZW5jZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2xvbmVSZWZlcmVuY2VzKGN1cnJlbnRUbXApKSk7Ci0JCXJldHVybiBzdWJSZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZChBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlbW92ZWQpIHsKLQkJLy8gSWYgaXQncyByZW1vdmVkIGl0IHNob3VsZCAqb25seSogYmUgYSB2aXJ0dWFsIGNvbXBvbmVudCBhbHJlYWR5Ci0JCWlmKHJlbW92ZWQuaXNFbXB0eSgpKSByZXR1cm47Ci0JCWZpbmFsIEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCUl0ZXJhdG9yPElWaXJ0dWFsUmVmZXJlbmNlPiBpID0gcmVtb3ZlZC5pdGVyYXRvcigpOwotCQlJVmlydHVhbFJlZmVyZW5jZSBvOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJbyA9IGkubmV4dCgpOwotCQkJcmVmcy5hZGQobyk7Ci0JCX0KLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCQkJcmVtb3ZlUmVmZXJlbmNlcyhyZWZzKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKSB7Ci0JCQlNb2R1bGVDb3JlVUlQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiByZW1vdmVkKSB7Ci0JCUl0ZXJhdG9yPElWaXJ0dWFsUmVmZXJlbmNlPiBpID0gcmVtb3ZlZC5pdGVyYXRvcigpOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJcmVtb3ZlT25lUmVmZXJlbmNlKGkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9uZVJlZmVyZW5jZShJVmlydHVhbFJlZmVyZW5jZSBjb21wKSB7Ci0JCXRyeSB7Ci0JCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldFJlbW92ZUNvbXBvbmVudE9wZXJhdGlvbihjb21wKTsKLQkJCW9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQl9IGNhdGNoKCBFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldFJlbW92ZUNvbXBvbmVudE9wZXJhdGlvbihJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0UmVtb3ZlUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIocmVmZXJlbmNlKTsKLQkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKHByb3ZpZGVyKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgcm9vdENvbXBvbmVudCk7Ci0JCUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKLQkJdG9SZW1vdmUuYWRkKHJlZmVyZW5jZSk7IAotCQltb2RlbC5zZXRQcm9wZXJ0eShJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUkVGRVJFTkNFX0xJU1QsIHRvUmVtb3ZlKTsKLQkJcmV0dXJuIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXRSZW1vdmVSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcihJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdmVSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGRlZChBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGFkZGVkKSB7Ci0JCWZpbmFsIEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCUl0ZXJhdG9yPElWaXJ0dWFsUmVmZXJlbmNlPiBpID0gYWRkZWQuaXRlcmF0b3IoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgbzsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCW8gPSBpLm5leHQoKTsKLQkJCXJlZnMuYWRkKG8pOwotCQl9Ci0JCQotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJCQlhZGRSZWZlcmVuY2VzKHJlZnMpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gZSApIHsKLQkJCU1vZHVsZUNvcmVVSVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VzKEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJdGVyYXRvcjxJVmlydHVhbFJlZmVyZW5jZT4gaSA9IHJlZnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCWFkZE9uZVJlZmVyZW5jZShpLm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXRBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcihJVmlydHVhbFJlZmVyZW5jZSBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPbmVSZWZlcmVuY2UoSVZpcnR1YWxSZWZlcmVuY2UgcmVmKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwYXRoLCBhcmNoaXZlTmFtZTsKLQotCQlJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcihyZWYpOwotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOwotCQlkbS5zZXRQcm9wZXJ0eShJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCByb290Q29tcG9uZW50KTsKLQkJZG0uc2V0UHJvcGVydHkoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX1JFRkVSRU5DRV9MSVNULCBBcnJheXMuYXNMaXN0KHJlZikpOwotCQkKLQkJSVN0YXR1cyBzdGF0ID0gZG0udmFsaWRhdGVQcm9wZXJ0eShJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUkVGRVJFTkNFX0xJU1QpOwotCQlpZiAoc3RhdCAhPSBPS19TVEFUVVMpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0KTsKLQkJdHJ5IHsKLQkJCWRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJTW9kdWxlQ29yZVVJUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9CQotCX0KLQotCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYoIWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VHJlZSgpLmlzRGlzcG9zZWQoKSkKLQkJCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZUhhbmRsZXIgZ2V0TW9kdWxlSGFuZGxlcigpIHsKLQkJaWYobW9kdWxlSGFuZGxlciA9PSBudWxsKQotCQkJbW9kdWxlSGFuZGxlciA9IG5ldyBEZWZhdWx0TW9kdWxlSGFuZGxlcigpOwotCQlyZXR1cm4gbW9kdWxlSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXBlcmZvcm1PaygpOwotCQl2ZXJpZnkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0lEZXBlbmRlbmN5UGFnZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JRGVwZW5kZW5jeVBhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzMzMmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvdWkvcHJvcGVydHlwYWdlL0lEZXBlbmRlbmN5UGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqICAgIAotICogQVBJIGluIHRoZXNlIHBhY2thZ2VzIGlzIHByb3Zpc2lvbmFsIGluIHRoaXMgcmVsZWFzZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLS8qKgotICogU3VnZ2VzdGVkIHVzZSBjYXNlIG9mIHRoaXMgY2xhc3MgaXMgYXMgZm9sbG93czoKLSAqIAotICogCQlwcm92aWRlciA9IERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvdmlkZXIoZmFjZXRlZFByb2plY3QpOwotICoJCWlmKCBwcm92aWRlciAhPSBudWxsICkgewotICoJCQljb250cm9scyA9IHByb3ZpZGVyLmNyZWF0ZVBhZ2VzKGZhY2V0ZWRQcm9qZWN0LCB0aGlzKTsKLSAqCQkJQ29tcG9zaXRlIHJvb3QgPSBwcm92aWRlci5jcmVhdGVSb290Q29udHJvbChjb250cm9scywgcGFyZW50KTsKLSAqCQl9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURlcGVuZGVuY3lQYWdlUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHBhZ2UgcHJvdmlkZXIga25vd3MgaG93IHRvIAotCSAqIGhhbmRsZSB0aGUgZ2l2ZW4gZmFjZXRlZCBwcm9qZWN0LCBmYWxzZSBvdGhlcndpc2UKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwcm92aWRlciBjYW4gaGFuZGxlIGl0LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGUoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHBhZ2UgY29udHJvbCBvYmplY3RzIHdoaWNoIHNob3VsZCBiZQotCSAqIHByZXNlbnRlZCB0byB0aGUgdXNlciBmb3IgdGhpcyBwcm9qZWN0IHR5cGUuIAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbXSBjcmVhdGVQYWdlcyhJRmFjZXRlZFByb2plY3QgcHJvamVjdCwgTW9kdWxlQXNzZW1ibHlSb290UGFnZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIFR1cm4gdGhpcyBhcnJheSBvZiBwYWdlcyAvIGNvbnRyb2xzIGludG8gb25lIHJvb3QgY29udHJvbAotCSAqIHRoYXQgY2FuIGJlIHJldHVybmVkIHRvIHRoZSBQcm9wZXJ0aWVzIFBhZ2UgY29udGFpbmVyLiAKLQotCSAqIEBwYXJhbSBwYWdlcwotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVSb290Q29udHJvbChJRmFjZXRlZFByb2plY3QgcHJvamVjdCwgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbXSBwYWdlcywgQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHBhZ2UgdGl0bGUgc3RyaW5nIG9yIG51bGwgaWYgZGVmYXVsdCB0aXRsZSBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGl0bGUoSVByb2plY3QgcHJvamVjdCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjYTRjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICAKLSAqIEFQSSBpbiB0aGVzZSBwYWNrYWdlcyBpcyBwcm92aXNpb25hbCBpbiB0aGlzIHJlbGVhc2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyByZXByZXNlbnRzIG9uZSBjb250cm9sIHdoaWNoIG1heSBiZSBwcmVzZW50IG9uIGEgcGFnZQotICogYW5kIHJlcXVpcmVzIHRvIGxpc3RlbiBpbiB0byB0aGUgc3BlY2lmaWMgbGlmZWN5Y2xlIAotICogZXZlbnRzIG9mIHRoZSBwYWdlLiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgQ29tcG9zaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRyb2wuCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgQ29tcG9zaXRlLgotCSAqIEByZXR1cm4gQ29tcG9zaXRlIGZvciB0aGUgY29udHJvbC4KLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHByb3BlcnR5IHBhZ2UncyA8Y29kZT5wZXJmb3JtT2soKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBwZXJmb3JtT2soKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHJvcGVydHkgcGFnZSdzIDxjb2RlPnBlcmZvcm1EZWZhdWx0cygpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQl2b2lkIHBlcmZvcm1EZWZhdWx0cygpOwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwcm9wZXJ0eSBwYWdlJ3MgPGNvZGU+cGVyZm9ybUNhbmNlbCgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIHBlcmZvcm1DYW5jZWwoKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHJvcGVydHkgcGFnZSdzIDxjb2RlPnBlcmZvcm1BcHBseSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQl2b2lkIHBlcmZvcm1BcHBseSgpOwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBwcm9wZXJ0eSBwYWdlJ3MgPGNvZGU+c2V0VmlzaWJsZSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQl2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHJvcGVydHkgcGFnZSdzIDxjb2RlPmRpc3Bvc2UoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDhjZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICBJQk0gLSBPbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICAKLSAqIEFQSSBpbiB0aGVzZSBwYWNrYWdlcyBpcyBwcm92aXNpb25hbCBpbiB0aGlzIHJlbGVhc2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cyB7Ci0JLyoqCi0JICogVGhlIGtleSByZXByZXNlbnRpbmcgdGhhdCB0aGlzIHdpemFyZCBjYW4gcmV0dXJuIGEgZm9sZGVyIG1hcHBpbmcKLQkgKiBUaGUgdmFsdWUgc2hvdWxkIGJlIGFuIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9NQVBQSU5HID0gImZvbGRlci5tYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIG1hcCB0byB0aGUgSVByb2plY3Qgd2hpY2ggaXMgdGhlIHJvb3QgcHJvamVjdAotCSAqIHdoaWNoIHdpbGwgZW5jbG9zZSB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVCA9ICJyb290LnByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgbWFwIHRvIHRoZSBJVmlydHVhbENvbXBvbmVudCB3aGljaCBpcyB0aGUgcm9vdCBjb21wb25lbnQKLQkgKiB3aGljaCB3aWxsIGVuY2xvc2UgdGhlIHJldHVybmVkIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfQ09NUE9ORU5UID0gInJvb3QuY29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIG1hcCB0byB0aGUgSU1vZHVsZUhhbmRsZXIgZm9yIGN1c3RvbWl6ZWQgYmVoYXZpb3VyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFSEFORExFUiA9ICJtb2R1bGUuaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBtYXAgdG8gdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSwgaWYgdGhlIHdpemFyZCBoYXMgYmVlbiBvcGVuZWQKLQkgKiBpbiBlZGl0aW5nIG1vZGUuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX1JFRkVSRU5DRSA9ICJkZXBlbmRlbmN5LnJlZmVyZW5jZS5vcmlnaW5hbCI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIG1hcCB0byB0aGUgZmluYWwgcmVmZXJlbmNlLCBlaXRoZXIgbmV3IHJlZmVyZW5jZSwgCi0JICogb3IgYSBuZXcgaW5zdGFuY2Ugb2YgYSBtb2RpZmllZCByZWZlcmVuY2UuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX1JFRkVSRU5DRSA9ICJkZXBlbmRlbmN5LnJlZmVyZW5jZS5maW5hbCI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIG1hcCB0byB0aGUgZGVmYXVsdCBsb2NhdGlvbiB0aGF0IGxpYnJhcmllcyBzaG91bGQgYmUgcGxhY2VkLgotCSAqIElmIHRoaXMgaXMgdW5zZXQsIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHdpemFyZCBmcmFnbWVudCBjYW4gY2hvb3NlIHRvIAotCSAqIHNldCB0aGUgcnVudGltZVBhdGggb2YgdGhlIHJlZmVyZW5jZSB0byB3aGF0ZXZlciBpdCB3YW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfTE9DQVRJT04gPSAiZGVmYXVsdC5saWJyYXJ5LmxvY2F0aW9uIjsKLQkKLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBtYXAgdG8gdGhlIGRlZmF1bHQgbG9jYXRpb24gdGhhdCBnZW5lcmljIHJlc291cmNlcyBzaG91bGQgYmUgcGxhY2VkLgotCSAqIElmIHRoaXMgaXMgdW5zZXQsIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHdpemFyZCBmcmFnbWVudCBjYW4gY2hvb3NlIHRvIAotCSAqIHNldCB0aGUgcnVudGltZVBhdGggb2YgdGhlIHJlZmVyZW5jZSB0byB3aGF0ZXZlciBpdCB3YW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX0xPQ0FUSU9OID0gImRlZmF1bHQucmVzb3VyY2UubG9jYXRpb24iOwotCi0JLyoqCi0JICogVGhpcyBwcm9wZXJ0eSBoZWxwcyB0cmFjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHJlZiBtb2RlbCBhcyBlYWNoIHN1YnNlcXVlbnQgYWN0aW9uIGlzIHRha2VuLCBidXQgbm90IGNvbW1pdHRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfUkVGUyA9ICJjdXJyZW50LnJlZmVyZW5jZXMiOwotCQotCS8qKgotCSAqIFRoaXMga2V5IHNob3VsZCBiZSB1c2VkIHdoZW4geW91IHdhbnQgdG8gY29udmVydCBhIHByb2plY3QgaW50byAKLQkgKiBhIHNwZWNpZmljIG1vZHVsZWNvcmUgcHJvamVjdCB0eXBlLgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ09OVkVSVEVSX09QRVJBVElPTl9QUk9WSURFUiA9ICJwcm9qZWN0LmNvbnZlcnRlci5vcGVyYXRpb24ucHJvdmlkZXIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9ESVJFQ1RJVkVTID0gImFsbC5kaXJlY3RpdmVzIjsKLQkKLQkvKioKLQkgKiBBbiBpbnRlcmZhY2UgdG8gcHJvdmlkZSBhbiBvcGVyYXRpb24gZm9yIGNvbnZlcnRpbmcgYSBzcGVjaWZpYyBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUHJvamVjdENvbnZlcnRlck9wZXJhdGlvblByb3ZpZGVyIHsKLQkJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0Q29udmVyc2lvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9Nb2R1bGVBc3NlbWJseVJvb3RQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3VpL3Byb3BlcnR5cGFnZS9Nb2R1bGVBc3NlbWJseVJvb3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MzYwYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS91aS9wcm9wZXJ0eXBhZ2UvTW9kdWxlQXNzZW1ibHlSb290UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0IGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIG1pc2MuIFVJIGNsZWFudXAKLSAqICAgIAotICogQVBJIGluIHRoZXNlIHBhY2thZ2VzIGlzIHByb3Zpc2lvbmFsIGluIHRoaXMgcmVsZWFzZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBQcmltYXJ5IHByb2plY3QgcHJvcGVydHkgcGFnZSBmb3IgTW9kdWxlIGFzc2VtYmx5OwotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQXNzZW1ibHlSb290UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbXSBjb250cm9scyA9IG5ldyBJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbFswXTsKLQlwcml2YXRlIFNhc2hGb3JtIHNmb3JtMTsKLQlwcml2YXRlIENvbXBvc2l0ZSB0b3BDb21wb3NpdGU7Ci0JcHJpdmF0ZSBTY3JvbGxlZENvbXBvc2l0ZSBwcm9ibGVtc1ZpZXdDb21wb3NpdGU7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgc3ViUHJvYmxlbXNWaWV3Q29tcG9zaXRlOwotCQotCXB1YmxpYyBNb2R1bGVBc3NlbWJseVJvb3RQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBnZXRGYWNldEVycm9yQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgU3RyaW5nIGVycm9yQ2hlY2tpbmdGYWNldCA9IE1lc3NhZ2VzLkVycm9yQ2hlY2tpbmdGYWNldHM7Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvckNoZWNraW5nRmFjZXQpOwotCQlyZXR1cm4gZ2V0RXJyb3JDb21wb3NpdGUocGFyZW50LCBlcnJvckNoZWNraW5nRmFjZXQpOwkJCi0JfQotCXByaXZhdGUgQ29tcG9zaXRlIGdldFZpcnRDb21wRXJyb3JDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBTdHJpbmcgZXJyb3JDaGVja2luZ0ZhY2V0ID0gTWVzc2FnZXMuRXJyb3JOb3RWaXJ0dWFsQ29tcG9uZW50OwotCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3JDaGVja2luZ0ZhY2V0KTsKLQkJcmV0dXJuIGdldEVycm9yQ29tcG9zaXRlKHBhcmVudCwgZXJyb3JDaGVja2luZ0ZhY2V0KTsJCQotCX0KLQkKLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBnZXRFcnJvckNvbXBvc2l0ZShmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBTdHJpbmcgZXJyb3IpIHsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZpbmFsIExhYmVsIGxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZXJyb3IpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwpIHsKLQkJCQlpZiAoIWNvbnRyb2xzW2ldLnBlcmZvcm1PaygpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwpIHsKLQkJCQljb250cm9sc1tpXS5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsKSB7Ci0JCQkJY29udHJvbHNbaV0ucGVyZm9ybUFwcGx5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybUNhbmNlbCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwpIHsKLQkJCQlpZiAoIWNvbnRyb2xzW2ldLnBlcmZvcm1DYW5jZWwoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsKSB7Ci0JCQkJY29udHJvbHNbaV0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaWYoY29udHJvbHNbaV0gIT0gbnVsbCl7Ci0JCQkJY29udHJvbHNbaV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNyZWF0ZURlc2NyaXB0aW9uQ29tcG9zaXRlKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlDb21wb3NpdGUgZGVzY3JpcHRpb25Db21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlkZXNjcmlwdGlvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRlc2NyaXB0aW9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZmlsbERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uQ29tcCwgZGVzY3JpcHRpb24pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxEZXNjcmlwdGlvbihDb21wb3NpdGUgYywgU3RyaW5nIHMpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDI1MDsKLQkJZmluYWwgVGV4dCBsYWJlbCA9IG5ldyBUZXh0KCBjLCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOwotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKGMuZ2V0QmFja2dyb3VuZCgpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0VGV4dChzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJLy8gTmVlZCB0byBmaW5kIG91dCB3aGF0IHR5cGUgb2YgcHJvamVjdCB3ZSBhcmUgaGFuZGxpbmcKLQkJcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJaWYoIHByb2plY3QgIT0gbnVsbCApIHsKLQkJCXRyeSB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOyAKLQkJCQlJRGVwZW5kZW5jeVBhZ2VQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCQkJaWYoIGZhY2V0ZWRQcm9qZWN0ID09IG51bGwgKQotCQkJCQlyZXR1cm4gZ2V0RmFjZXRFcnJvckNvbXBvc2l0ZShwYXJlbnQpOwotCQkJCQotCQkJCXByb3ZpZGVyID0gRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm92aWRlcihmYWNldGVkUHJvamVjdCk7Ci0JCQkJaWYoIHByb3ZpZGVyICE9IG51bGwgKSB7Ci0JCQkJCWNvbnRyb2xzID0gcHJvdmlkZXIuY3JlYXRlUGFnZXMoZmFjZXRlZFByb2plY3QsIHRoaXMpOwotCQkJCQljb250cm9scyA9IGNvbnRyb2xzID09IG51bGwgPyBuZXcgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbXXt9IDogY29udHJvbHM7Ci0JCQkJCWlmIChwcm92aWRlci5nZXRQYWdlVGl0bGUocHJvamVjdCkgIT0gbnVsbCkKLQkJCQkJCXNldFRpdGxlKHByb3ZpZGVyLmdldFBhZ2VUaXRsZShwcm9qZWN0KSk7Ci0JCQkJCQotCQkJCQl0aGlzLnNmb3JtMSA9IG5ldyBTYXNoRm9ybSggcGFyZW50LCBTV1QuVkVSVElDQUwgfCBTV1QuU01PT1RIICk7Ci0JCQkJCUdyaWREYXRhIGdkMSA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCQkgICAgICAgIHRoaXMuc2Zvcm0xLnNldExheW91dERhdGEoZ2QxKTsKLQkJCSAgICAgICAgCi0JCQkJCXRvcENvbXBvc2l0ZSA9IHByb3ZpZGVyLmNyZWF0ZVJvb3RDb250cm9sKGZhY2V0ZWRQcm9qZWN0LCBjb250cm9scywgc2Zvcm0xKTsKLQkJCQl9IGVsc2UgewkJCQkKLQkJCQkJaWYoIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpID09IG51bGwgKQotCQkJCQkJcmV0dXJuIGdldFZpcnRDb21wRXJyb3JDb21wb3NpdGUocGFyZW50KTsKLQkJCQkJCi0JCQkJCUFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlIHBhZ2UgPSBuZXcgQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UocHJvamVjdCwgdGhpcyk7Ci0JCQkJCWNvbnRyb2xzID0gbmV3IElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sWzFdOwotCQkJCQljb250cm9sc1swXSA9IHBhZ2U7Ci0JCQkJCXRoaXMuc2Zvcm0xID0gbmV3IFNhc2hGb3JtKCBwYXJlbnQsIFNXVC5WRVJUSUNBTCB8IFNXVC5TTU9PVEggKTsKLQkJCQkJR3JpZERhdGEgZ2QxID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJCSAgICAgICAgdGhpcy5zZm9ybTEuc2V0TGF5b3V0RGF0YShnZDEpOwotCQkJICAgICAgICAKLQkJCQkJdG9wQ29tcG9zaXRlID0gcGFnZS5jcmVhdGVDb250ZW50cyhzZm9ybTEpOwotCQkJCX0KLQkJCQkKLQkJCQlwcm9ibGVtc1ZpZXdDb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2Zvcm0xLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCSAgICAJCWdkLmhlaWdodEhpbnQgPSAxMDA7Ci0JICAgICAgICAJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCSAgICAJCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJPVFRPTTsKLQkgICAgCQlwcm9ibGVtc1ZpZXdDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICAgIAkJcHJvYmxlbXNWaWV3Q29tcG9zaXRlLnNldEJhY2tncm91bmQoIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkgKTsKLQkJCQlmaWxsUHJvYmxlbXNWaWV3Q29tcG9zaXRlKCk7Ci0JCSAgICAgICAgdGhpcy5zZm9ybTEuc2V0V2VpZ2h0cyggbmV3IGludFtdIHsgODAsIDIwIH0gKTsKLQkJICAgICAgICBwcm9ibGVtc1ZpZXdDb21wb3NpdGUuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQloYW5kbGVQcm9ibGVtc1ZpZXdSZXNpemUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkgICAgICAgIHJldHVybiBzZm9ybTE7Ci0JCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlICkJewotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRGYWNldEVycm9yQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9ibGVtc1ZpZXdSZXNpemUoKSB7Ci0JCWlmKHN1YlByb2JsZW1zVmlld0NvbXBvc2l0ZSAhPSBudWxsICYmICFzdWJQcm9ibGVtc1ZpZXdDb21wb3NpdGUuaXNEaXNwb3NlZCgpICYmIHRvcENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIAlpbnQgd2lkdGggPSB0b3BDb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotICAgICAgICAgICAJaWYod2lkdGggPCA0MDApIHsKLSAgICAgICAgICAgCQl3aWR0aCA9IDQwMDsKLSAgICAgICAgICAgCX0KLQkJCWludCBpID0gMTsKLQkJCWZvciggQ29udHJvbCBjaGlsZCA6IHN1YlByb2JsZW1zVmlld0NvbXBvc2l0ZS5nZXRDaGlsZHJlbigpICkKLQkJCXsKLQkJCQlpZihpJTIgPT0gMCkgewotCQkJCQlHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgY2hpbGQuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCQlnZC53aWR0aEhpbnQgPSB3aWR0aCAtIDUwOwotCQkJCX0KLQkJCQlpKys7Ci0JCQl9Ci0JCQlzdWJQcm9ibGVtc1ZpZXdDb21wb3NpdGUuc2V0U2l6ZShzdWJQcm9ibGVtc1ZpZXdDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0gICAgICAgIAlzdWJQcm9ibGVtc1ZpZXdDb21wb3NpdGUudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFByb2JsZW1zVmlld0NvbXBvc2l0ZSgpIHsKLQkJaWYocHJvYmxlbXNWaWV3Q29tcG9zaXRlICE9IG51bGwpIHsKLQkJCUlTdGF0dXMgW10gcHJvYmxlbXMgPSBnZXRQcm9ibGVtRWxlbWVudHMoKTsKLQkgICAgCWlmKHByb2JsZW1zICE9IG51bGwgJiYgcHJvYmxlbXMubGVuZ3RoID4gMCkgewotCSAgICAJCWJvb2xlYW4gcmVzaXplID0gZmFsc2U7Ci0JCQkJZm9yKCBDb250cm9sIGNoaWxkIDogcHJvYmxlbXNWaWV3Q29tcG9zaXRlLmdldENoaWxkcmVuKCkgKQotCQkJCXsKLQkJCQkJY2hpbGQuZGlzcG9zZSgpOwotCQkJCQlyZXNpemUgPSB0cnVlOwotCQkJCX0KLQotCSAgICAgICAgCXN1YlByb2JsZW1zVmlld0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHByb2JsZW1zVmlld0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCSAgICAgICAgICAgIHN1YlByb2JsZW1zVmlld0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSggU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JICAgICAgICAgICAgc3ViUHJvYmxlbXNWaWV3Q29tcG9zaXRlLnNldExheW91dChnbG1hcmdpbnMoIG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlICksIDAsIDAsIDUsIDUpICk7Ci0JICAgICAgICAgICAgc3ViUHJvYmxlbXNWaWV3Q29tcG9zaXRlLnNldEJhY2tncm91bmQoIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCi0JICAgICAgICAgICAgaW50IHdpZHRoID0gNDAwOwotCSAgICAgICAgICAgIGlmKHRvcENvbXBvc2l0ZSAhPSBudWxsICYmIHRvcENvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCkud2lkdGggPiA0MDApIHsKLQkgICAgICAgICAgICAJd2lkdGggPSB0b3BDb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICBMaXN0ZW5lciBmb2N1c09uUHJvYmxlbUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JICAgICAgICAgICAgICAgICAgQ29udHJvbCBwcm9ibGVtTGFiZWwgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0JICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHByb2JsZW1MYWJlbEJvdW5kcyA9IHByb2JsZW1MYWJlbC5nZXRCb3VuZHMoKTsKLQkgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgc2Nyb2xsYWJsZUFyZWEgPSBwcm9ibGVtc1ZpZXdDb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCSAgICAgICAgICAgICAgICAgIFBvaW50IGN1cnJlbnRTY3JvbGxQb3NpdGlvbiA9IHByb2JsZW1zVmlld0NvbXBvc2l0ZS5nZXRPcmlnaW4oKTsKLQkgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNjcm9sbFBvc2l0aW9uLnkgPiBwcm9ibGVtTGFiZWxCb3VuZHMueSkKLQkgICAgICAgICAgICAgICAgCSAgY3VycmVudFNjcm9sbFBvc2l0aW9uLnkgPSBNYXRoLm1heCgwLCBwcm9ibGVtTGFiZWxCb3VuZHMueSk7Ci0JICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTY3JvbGxQb3NpdGlvbi55ICsgc2Nyb2xsYWJsZUFyZWEuaGVpZ2h0IDwgcHJvYmxlbUxhYmVsQm91bmRzLnkgKyBwcm9ibGVtTGFiZWxCb3VuZHMuaGVpZ2h0KQotCSAgICAgICAgICAgICAgICAJICBjdXJyZW50U2Nyb2xsUG9zaXRpb24ueSA9IE1hdGgubWF4KDAsIHByb2JsZW1MYWJlbEJvdW5kcy55ICsgcHJvYmxlbUxhYmVsQm91bmRzLmhlaWdodCAtIHNjcm9sbGFibGVBcmVhLmhlaWdodCk7Ci0JICAgICAgICAgICAgICAgICAgcHJvYmxlbXNWaWV3Q29tcG9zaXRlLnNldE9yaWdpbihjdXJyZW50U2Nyb2xsUG9zaXRpb24pOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICB9OwotCSAgICAgICAgICAgCQotCSAgICAgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKLQkgICAgCQkJSVN0YXR1cyBzaW5nbGVTdGF0dXMgPSBwcm9ibGVtc1tpXTsKLQkgICAgCQkJaWYgKCFzaW5nbGVTdGF0dXMuaXNPSygpICYmIHNpbmdsZVN0YXR1cy5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCSAgICAJCQkJZmluYWwgTGFiZWwgaW1hZ2UgPSBuZXcgTGFiZWwoIHN1YlByb2JsZW1zVmlld0NvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLQkgICAgCQkJCUdyaWREYXRhIGdkSW1hZ2UgPSBuZXcgR3JpZERhdGEoKTsJICAgIAkJCQkKLQkgICAgCQkJCWdkSW1hZ2UudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCSAgICAJICAgICAgICAgICAgaW1hZ2Uuc2V0QmFja2dyb3VuZCggRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSApOwotCSAgICAJICAgICAgICAgICAgaW1hZ2Uuc2V0SW1hZ2UoZ2V0UHJvYmxlbUltYWdlKHNpbmdsZVN0YXR1cykpOwotCSAgICAJICAgICAgICAgICAgaW1hZ2Uuc2V0TGF5b3V0RGF0YShnZEltYWdlKTsKLQkgICAgCSAgICAgICAgICAgIAotCSAgICAJICAgICAgICAgICAgZmluYWwgVGV4dCB0ZXh0ICA9IG5ldyBUZXh0KCBzdWJQcm9ibGVtc1ZpZXdDb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSk7Ci0JICAgIAkgICAgICAgICAgICBHcmlkRGF0YSBnZExhYmVsID0gbmV3IEdyaWREYXRhKCk7Ci0JICAgIAkgICAgICAgICAgICBnZExhYmVsLndpZHRoSGludCA9IHdpZHRoIC0gNTA7Ci0JICAgIAkgICAgICAgICAgICB0ZXh0LnNldEJhY2tncm91bmQoIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkgKTsKLQkgICAgCSAgICAgICAgICAgIHRleHQuc2V0VGV4dChzaW5nbGVTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkgICAgCSAgICAgICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShnZExhYmVsKTsKLQkgICAgCSAgICAgICAgICAgIHRleHQuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBmb2N1c09uUHJvYmxlbUxpc3RlbmVyKTsKLQkgICAgCQkJfQotCSAgICAJCX0KLQkgICAgICAgICAgICBwcm9ibGVtc1ZpZXdDb21wb3NpdGUuc2V0Q29udGVudChzdWJQcm9ibGVtc1ZpZXdDb21wb3NpdGUpOwotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIGlmKHJlc2l6ZSkKLQkgICAgICAgICAgICAJaGFuZGxlUHJvYmxlbXNWaWV3UmVzaXplKCk7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgaWYoIHRoaXMuc2Zvcm0xLmdldE1heGltaXplZENvbnRyb2woKSAhPSBudWxsICkgewotCSAgICAgICAgICAgICAgICB0aGlzLnNmb3JtMS5zZXRNYXhpbWl6ZWRDb250cm9sKCBudWxsICk7Ci0JICAgICAgICAgICAgfQotCSAgICAJfSBlbHNlIHsKLQkgICAgCQl0aGlzLnNmb3JtMS5zZXRNYXhpbWl6ZWRDb250cm9sKCB0aGlzLnRvcENvbXBvc2l0ZSApOwotCSAgICAJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIEdyaWRMYXlvdXQgZ2xtYXJnaW5zKCBmaW5hbCBHcmlkTGF5b3V0IGxheW91dCwKLQkJCWZpbmFsIGludCBtYXJnaW5XaWR0aCwKLQkJCWZpbmFsIGludCBtYXJnaW5IZWlnaHQsCi0JCQlmaW5hbCBpbnQgbWFyZ2luVG9wLAotCQkJZmluYWwgaW50IG1hcmdpbkJvdHRvbSkKLQl7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSBtYXJnaW5Ub3A7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSBtYXJnaW5Cb3R0b207Ci0KLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KXsKLSAgICAJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIAlnZXREZWZhdWx0c0J1dHRvbigpLnNldFRleHQoTWVzc2FnZXMuUmV2ZXJ0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaFByb2JsZW1zVmlldygpewotICAgIAlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0gICAgCXNldFZhbGlkKHRydWUpOwotICAgIAlmaWxsUHJvYmxlbXNWaWV3Q29tcG9zaXRlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSW1hZ2UgZ2V0UHJvYmxlbUltYWdlKElTdGF0dXMgZWxlbWVudCkgewotCQlmaW5hbCBJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCWZpbmFsIFN0cmluZyBpbWFnZVR5cGU7Ci0KLQkJaWYoZWxlbWVudC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCWltYWdlVHlwZSA9IElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VUeXBlID0gSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSzsKLQkJfQotCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKCBpbWFnZVR5cGUgKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElTdGF0dXNbXSBnZXRQcm9ibGVtRWxlbWVudHMoKSB7Ci0JCWZpbmFsIExpc3Q8SVN0YXR1cz4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOwotCQlmaW5hbCBMaXN0PElTdGF0dXM+IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOwotICAgICAgICAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJaWYoY29udHJvbHNbaV0gaW5zdGFuY2VvZiBBYnN0cmFjdElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sKQotCQkJCQlzdGF0dXMgPSAoKEFic3RyYWN0SU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2wpIGNvbnRyb2xzW2ldKS52YWxpZGF0ZSgpOwotCQkJCWlmKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJCQlNdWx0aVN0YXR1cyBtdWx0aSA9IChNdWx0aVN0YXR1cylzdGF0dXM7Ci0JCQkJCQlpZiAoIW11bHRpLmlzT0soKSkgewotCQkJCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgbXVsdGkuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7IHkrKykgewotCQkJCQkJCQlJU3RhdHVzIHNpbmdsZVN0YXR1cyA9IG11bHRpLmdldENoaWxkcmVuKClbeV07Ci0JCQkJCQkJCWlmKHNpbmdsZVN0YXR1cy5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBzaW5nbGVTdGF0dXMuZ2V0TWVzc2FnZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCWlmKG11bHRpLmdldENoaWxkcmVuKClbeV0uZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQkJCQkJZXJyb3JzLmFkZChtdWx0aS5nZXRDaGlsZHJlbigpW3ldKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJd2FybmluZ3MuYWRkKG11bHRpLmdldENoaWxkcmVuKClbeV0pOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlpZihzdGF0dXMuZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJCQllcnJvcnMuYWRkKHN0YXR1cyk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJd2FybmluZ3MuYWRkKHN0YXR1cyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKGVycm9ycy5zaXplKCkgPiAwKSB7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQllcnJvcnMuYWRkQWxsKHdhcm5pbmdzKTsKLQkJCS8vIFRoaXMgcmV0dXJucyBhbGwgdGhlIGVycm9ycyBmb2xsb3dlZCBieSBhbGwgdGhlIHdhcm5pbmdzCi0JCQlyZXR1cm4gZXJyb3JzLnRvQXJyYXkobmV3IElTdGF0dXNbZXJyb3JzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiB3YXJuaW5ncy50b0FycmF5KG5ldyBJU3RhdHVzW3dhcm5pbmdzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdmY2RhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vZHVsZWNvcmUtc3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzc1OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1tb2R1bGVjb3JlLmphcgotZG9jCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4MTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL0NvbXBvbmVudFJlc29sdmVyPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2RjZDExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYTRmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNGcmkgRGVjIDAyIDE0OjU0OjU5IEVTVCAyMDA1Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NjaGVtYS9jb21wb25lbnRDb3JlLnhzZD1VVEY4CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmIxZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6Mzg6MDggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMThmZjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgTWFyIDE5IDE3OjE4OjQxIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLmphdmFkb2M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGdldHRlciBtZXRob2QiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyY29tbWVudCIgbmFtZVw9ImdldHRlcmNvbW1lbnQiPi8qKlxyXG4gKiBAcmV0dXJuIHRoZSAke2JhcmVfZmllbGRfbmFtZX1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBzZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmNvbW1lbnQiIG5hbWVcPSJzZXR0ZXJjb21tZW50Ij4vKipcclxuICogQHBhcmFtICR7cGFyYW19IHRoZSAke2JhcmVfZmllbGRfbmFtZX0gdG8gc2V0XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIGNvbnN0cnVjdG9ycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmNvbW1lbnQiIG5hbWVcPSJjb25zdHJ1Y3RvcmNvbW1lbnQiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmlsZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgSmF2YSBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5maWxlY29tbWVudCIgbmFtZVw9ImZpbGVjb21tZW50Ij4vKipcclxuICogXHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0idHlwZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGNyZWF0ZWQgdHlwZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMudHlwZWNvbW1lbnQiIG5hbWVcPSJ0eXBlY29tbWVudCI+LyoqXHJcbiAqIEBhdXRob3IgJHt1c2VyfVxyXG4gKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZmllbGRjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBmaWVsZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmllbGRjb21tZW50IiBuYW1lXD0iZmllbGRjb21tZW50Ij4vKipcclxuICogXHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igbm9uLW92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rjb21tZW50IiBuYW1lXD0ibWV0aG9kY29tbWVudCI+LyoqXHJcbiAqICR7dGFnc31cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJvdmVycmlkZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG92ZXJyaWRpbmcgbWV0aG9kcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5vdmVycmlkZWNvbW1lbnQiIG5hbWVcPSJvdmVycmlkZWNvbW1lbnQiPi8qIChub24tSmF2YWRvYylcclxuICogJHtzZWVfdG9fb3ZlcnJpZGRlbn1cclxuICovPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJkZWxlZ2F0ZWNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIGRlbGVnYXRlIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZGVsZWdhdGVjb21tZW50IiBuYW1lXD0iZGVsZWdhdGVjb21tZW50Ij4vKipcclxuICogJHt0YWdzfVxyXG4gKiAke3NlZV90b190YXJnZXR9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibmV3dHlwZV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5uZXd0eXBlIiBuYW1lXD0ibmV3dHlwZSI+JHtmaWxlY29tbWVudH1cclxuJHtwYWNrYWdlX2RlY2xhcmF0aW9ufVxyXG5cclxuJHt0eXBlY29tbWVudH1cclxuJHt0eXBlX2RlY2xhcmF0aW9ufTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY2xhc3Nib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBjbGFzcyB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jbGFzc2JvZHkiIG5hbWVcPSJjbGFzc2JvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImludGVyZmFjZWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGludGVyZmFjZSB0eXBlIGJvZGllcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5pbnRlcmZhY2Vib2R5IiBuYW1lXD0iaW50ZXJmYWNlYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZW51bWJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGVudW0gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZW51bWJvZHkiIG5hbWVcPSJlbnVtYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iYW5ub3RhdGlvbmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGFubm90YXRpb24gdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuYW5ub3RhdGlvbmJvZHkiIG5hbWVcPSJhbm5vdGF0aW9uYm9keSI+XHJcbjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJmYWxzZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoJHtleGNlcHRpb25fdmFyfSk7PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJtZXRob2Rib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgbWV0aG9kIHN0dWJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLm1ldGhvZGJvZHkiIG5hbWVcPSJtZXRob2Rib2R5Ij4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViXHJcbiR7Ym9keV9zdGF0ZW1lbnR9PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJjb25zdHJ1Y3RvcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBjb25zdHJ1Y3RvciBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jb25zdHJ1Y3RvcmJvZHkiIG5hbWVcPSJjb25zdHJ1Y3RvcmJvZHkiPiR7Ym9keV9zdGF0ZW1lbnR9XHJcbi8vICR7dG9kb30gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YjwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZ2V0dGVyYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIGdldHRlcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZ2V0dGVyYm9keSIgbmFtZVw9ImdldHRlcmJvZHkiPnJldHVybiAke2ZpZWxkfTs8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InNldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBzZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnNldHRlcmJvZHkiIG5hbWVcPSJzZXR0ZXJib2R5Ij4ke2ZpZWxkfSBcPSAke3BhcmFtfTs8L3RlbXBsYXRlPjwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYzhmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjcucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb2x2ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI1ZDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IG1vZHVsZWNvcmUtc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZGFhOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvY29tcG9uZW50Q29yZS54c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRDb3JlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjODdlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRDb3JlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9tb2R1bGVDb3JlIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvbW9kdWxlQ29yZSI+DQotCTxlbGVtZW50IG5hbWU9InByb2plY3QtbW9kdWxlcyI+DQotCQk8Y29tcGxleFR5cGU+DQotCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLQkJCQk8ZWxlbWVudCBuYW1lPSJ3Yi1tb2R1bGUiPg0KLQkJCQkJPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTxlbGVtZW50IG5hbWU9Im1vZHVsZS10eXBlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQk8YXR0cmlidXRlIG5hbWU9Im1vZHVsZS10eXBlLWlkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQl0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJ3Yi1yZXNvdXJjZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9InNvdXJjZS1wYXRoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95LXBhdGgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJkZXBlbmRlbnQtbW9kdWxlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iaGFuZGxlIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZU5hbWUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ktcGF0aCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9ImRlcGVuZGVuY3ktdHlwZSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8L2VsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveS1uYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPjwvYXR0cmlidXRlPg0KLQkJCQkJPC9jb21wbGV4VHlwZT4NCi0JCQkJPC9lbGVtZW50Pg0KLQkJCTwvc2VxdWVuY2U+DQotCQkJPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj48L2F0dHJpYnV0ZT4NCi0JCTwvY29tcGxleFR5cGU+DQotCTwvZWxlbWVudD4NCi0NCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRjb3JlX21vZGVsLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfbW9kZWwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhkNjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfbW9kZWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvY29tcG9uZW50Y29yZV9wYWNrYWdlLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfcGFja2FnZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzA0YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvY29tcG9uZW50Y29yZV9wYWNrYWdlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21hcHBpbmcuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWFwcGluZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjZlNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWFwcGluZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9tZXRhbW9kZWxfY29tcG9uZW50cy5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9tZXRhbW9kZWxfY29tcG9uZW50cy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Y2I4MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWV0YW1vZGVsX2NvbXBvbmVudHMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlX3N0cnVjdHVyYWxfbW9kZWwuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlX3N0cnVjdHVyYWxfbW9kZWwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZlMjk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZV9zdHJ1Y3R1cmFsX21vZGVsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZWNvcmUuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlY29yZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWE5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbW9kdWxlY29yZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy92aXJ0dWFsX3BhdGhfYXBpLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL3ZpcnR1YWxfcGF0aF9hcGkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGEzZTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL3ZpcnR1YWxfcGF0aF9hcGkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5lcHggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9KYXZhLmVweApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmZDFjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9KYXZhLmVweAorKysgL2Rldi9udWxsCkBAIC0xLDYxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTx1bWw6UHJvZmlsZSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8xLjAuMC9VTUwiIHhtaTppZD0iXy1ab3l3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmEiIG1ldGFtb2RlbFJlZmVyZW5jZT0iXy1ab3l3WlNrRWRtamF1U2pHOHFPMkEiPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1ab3l4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgIDxkZXRhaWxzIHhtaTppZD0iXy1ab3l4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0icHJvcGVydHlJZCIgdmFsdWU9IjgwOTEzNTk2NiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYXNpMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hc2kxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFzaTE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlUGFja2FnZXMiPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIHhtaTppZD0iXy1hNHY4SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfMCIgbnNVUkk9Imh0dHA6Ly8vXy1hc2kySlNrRWRtamF1U2pHOHFPMkEucHJvZmlsZS51bWwyIiBuc1ByZWZpeD0iSmF2YV8wIj4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0djhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlYyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0djhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLWFzaXg1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0djg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ21JZGVudGlmaWNhdGlvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0djlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29weXJpZ2h0Tm90aWNlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0djlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fUHJvamVjdCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0djlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLWFCMG1aU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0djk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ0FwcGx5MyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0di1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY1NpbmNlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2LVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHbG9iYWxJbXBvcnRzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2LXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHYtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikluc3RhbmNlVmFyaWFibGVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Im1fIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dl9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2hvd0NvZGVnZW5EbGciIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHZfWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vQ2xhc3NDdXN0b21EbGciIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHZfcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1Byb2plY3ROYW1lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2XzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VUYWJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImludCI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdBWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsUHJlZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdBNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVN1ZmZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0JKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ1RleHQyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIb21lU3VmZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWQUphdmFXb3JraW5nRm9sZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0RUpCVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0NKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWF4TnVtQ2hhcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjgwIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0NaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3Q3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RFRETG9jYXRpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdDNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTEiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdESlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlUm9zZUlEIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdEWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0b3BPbkVycm9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0Q1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRBdXRob3IiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdFSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik9wZW5CcmFjZU1ldGhvZFN0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkFzdGVyaXNrQ29tbWVudFN0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcmltYXJ5S2V5U3VmZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFZGl0b3IiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d081U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iQnVpbHRJbiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0ZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ0FwcGx5MiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0ZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3BhY2luZ0l0ZW1zIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIzIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRFRETG9jYXRpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdHSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3R1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnVGV4dDMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdHcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlbW90ZVN1ZmZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0c1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVmZXJlbmNlQ2xhc3NwYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJPcGVuQnJhY2VDbGFzc1N0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsU3VmZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWTSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3UUpTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJTdW4iLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdINVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0lKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlUHJlZml4ZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdJWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW5TdWZmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdJcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW5QcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdJNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ0NvbW1lbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdKSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJvb3REaXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdKWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdUZXh0MSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0pwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUxIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBdXRvU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0tKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0F1dGhvciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0taU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUm9zZURlZmF1bHRDb21tZW50U3R5bGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0twU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDUHJvamVjdFNvdXJjZVJvb3QiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdLNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFDb21tZW50U3R5bGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdMSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ2b2lkIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0xaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3THBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdMNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdFNob3dSb3NlSUREbGciIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdNSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlbW90ZVByZWZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d01aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlU3BhY2VzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdNcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzVmFyaWFibGVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InNfIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d001U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRTaW5jZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d05KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDU2VsZWN0ZWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdOWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkhvbWVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdOcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVByZWZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d041U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ2xhc3NQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3T0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTb3VyY2VDb250cm9sIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3T1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jTnVtQXN0ZXJpc2tzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIwIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d09wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWFyeUtleVByZWZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d081U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGUiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdQSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJ1aWx0SW4iPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d1BaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYUg2ODVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdQcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IldpbmRvd3NTaGVsbCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d1A1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYUg2OXBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d1FKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fUHJvamVjdFZNVHlwZSI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d1FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3VuIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdRcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFCMHBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3UTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNaWNyb3NvZnQiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdSSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFCMHA1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3UlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJQk0iIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdScFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFCMHFwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR3UjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19DbGFzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d1NKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1NaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCTmFtZUluSkFSIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3U3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1M1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1RaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEludEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1Q1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdVSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdVWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1VwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1ZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdWWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVyRm9yd2FyZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1dKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVmZXJlbmNlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1dwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdXNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdYSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1haU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGaW5hbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdYcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHdmNVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1lKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3WVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCTVBfRXh0ZW5kX0NNUCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1lwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHdocFNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkNvbnRhaW5lciIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1k1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdaSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1pwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERhdGVIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdaNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2FwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdhNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdicFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2I1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3aTVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIyLjAiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdjSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlBlcnNpc3RlbmNlVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3a0pTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdjWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cnVjdG9ySXMiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d2w1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0icHVibGljIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3Y3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkT25seSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2M1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdkSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXROYW1lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2Q1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdlWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdlNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlQ29kZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d2Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdnSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3Z1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3R3NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2dwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVsZXNzIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3ZzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3R4cFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2hKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdoWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dHlaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdocFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdpSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDVKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3aVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3aXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3Q1NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3aTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3akpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2paU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0NjVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdqcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2o1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0N3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d2tKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3a1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2twU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0elpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdrNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdsSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3bFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdscFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDA1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdsNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdtSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3bVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3QxNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d21wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3bTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3QycFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d25KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d25aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0M1pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHducFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHduNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDRKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR3b0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19Nb2R1bGVCb2R5Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3b1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tWm95eHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3b3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbUlkZW50aWZpY2F0aW9uIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3bzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb3B5cmlnaHROb3RpY2UiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR3cEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19PcGVyYXRpb24iPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hYU83cFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdwcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlcGxhY2VFeGlzdGluZ0NvZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3A1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdxSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3cXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOYXRpdmUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkFic3RyYWN0IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ckpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTeW5jaHJvbml6ZWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHdycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0RlZmF1bHRfRUpCX19DbGFzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d3I1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLWFPQm81U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3NKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCTmFtZUluSkFSIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3c1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdzcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRnZXRJbmZvIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3czVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3RKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEludEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3RaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd1SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3VaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3U1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVyRm9yd2FyZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3ZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3dKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVmZXJlbmNlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd3cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd3NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3hKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGaW5hbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHc1cFNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3hwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3eDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3eUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCTVBfRXh0ZW5kX0NNUCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3laU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHc3WlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkNvbnRhaW5lciIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3lwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd5NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3pKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERhdGVIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd6cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ejVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcwcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3OHBTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIyLjAiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlBlcnNpc3RlbmNlVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3OTVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcySlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cnVjdG9ySXMiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d19wU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0icHVibGljIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkT25seSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXROYW1lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3M0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHc0SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHc0cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlQ29kZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0dzVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3NTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9Cd3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc2WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CeFpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3N0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0J5SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3N1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3N3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CNDVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc4SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHc4WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjVwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHc4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3ODVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CNnBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHc5WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CN1pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0dzk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0dy1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHctWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjJaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3LXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3LTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0IzSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d19KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3X1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0IzNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3X3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d181U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHVibGljIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQnpKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4QVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhBcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQno1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4QTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4QkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0IwcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eEJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSIgdmFsdWU9IjMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eEJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CMVpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHhCNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3MiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhDWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eENwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4QzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eERKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhEWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhEcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhENVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNtcEZpZWxkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGVudFR5cGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhFcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhGSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRTZWN1cml0eVJvbGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhGNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhHSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhHWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhHcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZXh0UmVmIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SXNTZWN1cmUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4UDVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhINVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eElKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eElaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhJcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4UnBTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJDb250YWluZXIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhJNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0WE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhKcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEtKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblN5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhLWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhLcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklzU2luZ2xlVGhyZWFkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eExKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eExaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4THBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhMNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eFM1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMi4wIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eFVKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHhWNVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InB1YmxpYyIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhNNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE5aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCWE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhOcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhONVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4T1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE9wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhQWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhQNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhRSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4UVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1ZwWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVsZXNzIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4UTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1ZxSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnE1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhScFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4UjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWeHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhTWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhTcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnlaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhTNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhUWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnpaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4VHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIxLngiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhUNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVjBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhVSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4VVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWcjVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhVNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhWSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnNwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4VlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhWcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnRaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhWNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NDdG9yX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHVibGljIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhXWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnVaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4V3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhXNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnZKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4WEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4WFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1Z2NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSIgdmFsdWU9IjMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWd3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHhZSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX1JvbGUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhZWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hYVBDSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhZcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRXcml0ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4YkpTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJSZWFkICZhbXA7IFdyaXRlIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4WTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbml0aWFsVmFsdWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhaSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByb3BlcnR5VHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4YzVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJOb3QgQSBQcm9wZXJ0eSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4WnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVHJhbnNpZW50IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4YUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWb2xhdGlsZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNOYXZpZ2FibGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5kaXZpZHVhbENoYW5nZU1ndCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyQ2xhc3MiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHhiSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX1JvbGVSZWFkV3JpdGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4YlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkICZhbXA7IFdyaXRlIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhicFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUEU1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4YjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkIE9ubHkiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUEZwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4Y1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXcml0ZSBPbmx5IiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4Y3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hYVBHWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4YzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eGRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTm90IEEgUHJvcGVydHkiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eGRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWFQSFpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhkcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpbXBsZSIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eGQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWFQSUpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhlSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJvdW5kIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4ZVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hYVBJNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eGVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RyYWluZWQiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhlNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUEpwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR4ZkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4ZlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ZnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhmNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhnWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4Z3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ZzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbXBGaWVsZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9ySGVhZGVycyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhpSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhpNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4akpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4alpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29va2llIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4anBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ajVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGV4dFJlZiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGtKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGtaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldElzU2VjdXJlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4a3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGs1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eHRKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNhYmxlQXV0b1N5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhsWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhscFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJUcmFuc2FjdGlvblR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eHU1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iQ29udGFpbmVyIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVySW5jbHVkZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFhNTEZpbGVQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG5KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RyaWN0ZnAiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhuWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc1NpbmdsZVRocmVhZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhvWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhvcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yQ29va2llIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHh3SlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIuMCIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHh4WlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4ekpTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJwdWJsaWMiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZV9YTUxfREQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhxcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlhNTEZpbGVQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbnhGYWN0b3J5IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ckpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZW50cmFudCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkVudmlyb25tZW50UHJvcGVydGllcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4c3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUhUTUwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4dEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4dFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1czVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1dHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4dXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV1WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4dTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHh2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NTFKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4dnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4djVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUxNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4d0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjIuMCI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4d3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUyNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54IiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4eEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUzcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4eFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHh4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NXZaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4eUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4eVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV3SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4eTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV3NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4ekpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh6WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4enBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV4NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4MEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV5cFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eDBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1elpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHgwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHgxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NTBKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR4MVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19BdHRyaWJ1dGUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHgxcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1adTVZWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRXcml0ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4M3BTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJSZWFkICZhbXA7IFdyaXRlIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4MkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcm9wZXJ0eVR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eDVaU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTm90IEEgUHJvcGVydHkiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eDJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlRyYW5zaWVudCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eDNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVm9sYXRpbGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkluZGl2aWR1YWxDaGFuZ2VNZ3QiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHgzcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHgzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgJmFtcDsgV3JpdGUiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1Y0pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgT25seSIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1YzVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IldyaXRlIE9ubHkiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWRwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHg1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZUJlYW5Qcm9wZXJ0eV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg1cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdCBBIFByb3BlcnR5Ij4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWVwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4NkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaW1wbGUiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWZaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4NnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCb3VuZCIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1Z0pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHg3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cmFpbmVkIiB2YWx1ZT0iMyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4N1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTVnNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8L2NvbnRlbnRzPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplcTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIudmVyc2lvbnMiPgotICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVySlNrRWRtamF1U2pHOHFPMkEiIGtleT0iMCIgdmFsdWU9IjEuMCIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfLVpveXdaU2tFZG1qYXVTakc4cU8yQSIgdmlzaWJpbGl0eT0icHJpdmF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5TVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOHFiQTY4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfLVpveXdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5TTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0VmUlpvSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il8tWm95dzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlOSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlOWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvSmF2YVByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfUmpteW9LODZFZGllYVlneHRWV044USIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1ab3l4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX01vZHVsZUJvZHkiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVpveXg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVpveXlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWm95eVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5TnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVpveXlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWm95eTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1ab3l6NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQ29tcG9uZW50IiBhc3NvY2lhdGlvbj0iXy1ab3l6SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlPSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSmpLODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1ab3kwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNtSWRlbnRpZmljYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5T1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlPcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWm95MFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWm95MHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb3B5cmlnaHROb3RpY2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5UFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlQcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1WUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5UDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1ab3l6SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbXBvbmVudF9kZWZhdWx0X19Nb2R1bGVCb2R5IiBtZW1iZXJFbmQ9Il8tWm95elpTa0VkbWphdVNqRzhxTzJBIF8tWm95ejVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlRWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWm95elpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fTW9kdWxlQm9keSIgdHlwZT0iXy1ab3l4cFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVpveXpKU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlRNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVpveXpwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlScFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1adTVZWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX0F0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1WXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1WTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlSNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1WlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVacFNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRFbnVtZXJhdGlvbkxpdGVyYWwiIGFzc29jaWF0aW9uPSJfLVp1NVo1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlTSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSZ2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRQcm9wZXJ0eSIgYXNzb2NpYXRpb249Il8tWnU1YTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5UzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205QzFsYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1aHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkV3JpdGUiIHR5cGU9Il8tWnU1YjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5VFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLVp1NWg1U2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWnU1Y0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5VHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1aUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcm9wZXJ0eVR5cGUiIHR5cGU9Il8tWnU1ZVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5VVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLVp1NWlaU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWnU1ZXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5VXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1aXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5VkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlWWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NWk1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlWNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5V0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlXWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NWpaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlXNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWpwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVHJhbnNpZW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTVqNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlYcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVrSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlZvbGF0aWxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTVrWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlZcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVrcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkluZGl2aWR1YWxDaGFuZ2VNZ3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5WkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NWs1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlaNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1WjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbkxpdGVyYWxfZGVmYXVsdF9fQXR0cmlidXRlIiBtZW1iZXJFbmQ9Il8tWnU1YUpTa0VkbWphdVNqRzhxTzJBIF8tWnU1YXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlhSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWnU1YUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fQXR0cmlidXRlIiB0eXBlPSJfLVp1NVlaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1WjVTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5YTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1YVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5YkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOWJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1YTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcm9wZXJ0eV9kZWZhdWx0X19BdHRyaWJ1dGUiIG1lbWJlckVuZD0iXy1adTViSlNrRWRtamF1U2pHOHFPMkEgXy1adTVicFNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOWI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTViSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19BdHRyaWJ1dGUiIHR5cGU9Il8tWnU1WVpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVhNVNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5Y0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTljWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTViWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTljcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5YzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NWI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQXR0cmlidXRlUmVhZFdyaXRlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5ZEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5ZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NWNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZCAmYW1wOyBXcml0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVjWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1Y3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iODEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5ZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVjNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgT25seSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1ZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iODIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5ZUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQwSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVkcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IldyaXRlIE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1ZDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWnU1ZVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQxSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1ZXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb3QgQSBQcm9wZXJ0eSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVlNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1ZkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVmWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpbXBsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVmcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1ZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEMTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQySlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVnSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJvdW5kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NWdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVncFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NWc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RyYWluZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1aEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9Ijc0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEM0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1adTVsSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NWxaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWxwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1bDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEM1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NW1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1bVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVuWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQWN0b3IiIGFzc29jaWF0aW9uPSJfLVp1NW1wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOW5kY2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NW9aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRDbGFzcyIgYXNzb2NpYXRpb249Il8tWnU1bnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX204OHV4cTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1cFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEVudW1lcmF0aW9uIiBhc3NvY2lhdGlvbj0iXy1adTVvcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUmVhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkSW50ZXJmYWNlIiBhc3NvY2lhdGlvbj0iXy1adTVwcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ1WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSm9xODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkU2lnbmFsIiBhc3NvY2lhdGlvbj0iXy1adTVxcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSnphODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJpbWl0aXZlVHlwZSIgYXNzb2NpYXRpb249Il8tWnU1cnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJzYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxENnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1NHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEN0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEN3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NTVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEOHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1NXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEOUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQ5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWnU1NkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxELUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRC1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRC1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxELTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTU2cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTERfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEX1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTU2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEX3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTERfNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NTdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVBNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWnU1N3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFQkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFQjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbkVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVDWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFQzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbkVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRURKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRURwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5GSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVFSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5GWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbkZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVGWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFRnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVGNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuR0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFR0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuR1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVHcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5HcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVISlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5HNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5ISlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVJSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5IWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFSXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVJNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbkhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVKWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVKcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuSUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFS0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUtaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuSVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUtwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbklwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVMWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFTHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVMNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbkpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRU1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVNWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFTXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVNNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbkpwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVOSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFTlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5KNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVOcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRU41U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuS0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFT0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRU9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuS1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVPcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRU81U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuS3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVBaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuSzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgdHlwZT0iXy1adTVzcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVQNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuTEpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTVzNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVRSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFUVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5MWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVRcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuTHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFUjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5NSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVTSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFU1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5NWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFUzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5NcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVUSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5NNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgdHlwZT0iXy1adTUwNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFVHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVUNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuTkpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTUxSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVVSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5OWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5OcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVWSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5ONVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVWcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5PSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVXSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFV1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5PWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFV3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVXNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuT3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVYcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuUEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVZcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuUHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVacFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuUUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFYUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFYTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxblFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEViWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFYnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEViNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblJKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVjWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFY3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVjNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVkcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5TSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5TWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVlcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuU3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuUzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVmNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuVEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuVFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiB0eXBlPSJfLVp1NTJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVncFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1aMW5UcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVp1NTI1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVoWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiB0eXBlPSJfLVp1NXZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVocFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1aMW5VSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVp1NXZaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVpWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgdHlwZT0iXy1adTV4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFaXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVpNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuVXBTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTV4NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVqSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFalpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5VNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFajVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5WSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVrSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFa1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5WWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVrcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWs1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuVnBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVsWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVsNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuV0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRW1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuV1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVtcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRW01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5XcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVuSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFblpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5XNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVuNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuWEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFb0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRW9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuWFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFb3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVvNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5ZSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5ZWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbllwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVyWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxblpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFczVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5acFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuWjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5hSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFdVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5hWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV1cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuYXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuYTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5iSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFd1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NW1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQWN0b3JfRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVp1NW01U2tFZG1qYXVTakc4cU8yQSBfLVp1NW5aU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFd3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFdzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NW01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVtcFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFeEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTVuSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFeDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1adTVucFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzX0RlZmF1bHRfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1adTVuNVNrRWRtamF1U2pHOHFPMkEgXy1adTVvWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTVuNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1bnBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFeTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1b0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFekpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1b3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbl9EZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWnU1bzVTa0VkbWphdVNqRzhxTzJBIF8tWnU1cFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV6cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWnU1bzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1adTVsSlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVp1NW9wU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUwSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTBaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVp1NXBKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEUwNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NXBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW50ZXJmYWNlX0RlZmF1bHRfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1adTVwNVNrRWRtamF1U2pHOHFPMkEgXy1adTVxWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTVwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1cHBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFMTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1cUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFMkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1cXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaWduYWxfRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVp1NXE1U2tFZG1qYXVTakc4cU8yQSBfLVp1NXJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFMnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFMjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NXE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVxcFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFM0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEUzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTVySlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFMzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1adTVycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1pdGl2ZVR5cGVfRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVp1NXI1U2tFZG1qYXVTakc4cU8yQSBfLVp1NXNaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NXI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVycFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTVzSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NXNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTV0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1dFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1dHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1dDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1dXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NXZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTV2WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1dnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRThaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTV3WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1d3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRThwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFODVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1dzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1eEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NXhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1eDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwdWJsaWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1eUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRS1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFLVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1eXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1eTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRS1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1elpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRV9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NTBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTUwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1MHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFX3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVfNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1adTUwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1MUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1MVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NTFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZBcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NTE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTUySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1MlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjEyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGQlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWnU1MnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTUyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjIuMCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTUzSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1M1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGQ1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1M3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIxLngiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1MzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NTRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tWjFuYlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19DbGFzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjFuYnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjFuYjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aMW5jSlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZESlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjFuY1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aMW5jcFNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbmRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRBY3RvciIgYXNzb2NpYXRpb249Il8tWjFuYzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGRHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205bmRjYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0c1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJENsYXNzIiBhc3NvY2lhdGlvbj0iXy1aMW5kNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZFSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTg4dXhxODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3R0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkRW51bWVyYXRpb24iIGFzc29jaWF0aW9uPSJfLVo3dHNwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZFWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSZWE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dHVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRJbnRlcmZhY2UiIGFzc29jaWF0aW9uPSJfLVo3dHRwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZFNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKb3E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dHZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRTaWduYWwiIGFzc29jaWF0aW9uPSJfLVo3dHVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZGWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKemE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dHdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRQcmltaXRpdmVUeXBlIiBhc3NvY2lhdGlvbj0iXy1aN3R2cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZHSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUnNhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3Q4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZHWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3Q4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZHNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3Q4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRnZXRJbmZvIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dDlKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZJSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dDlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRklaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3Q5cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZJNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3Q5NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3QtSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZKNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGS0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3QtWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGS1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZLcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dC1wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRks1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZMSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dC01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZMWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkxwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjd0X0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRk1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0X1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbXBGaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZNWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRk1wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3RfcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZNNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGTkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3RfNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZOcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1QUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRk9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1QVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGVudFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGT1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZPcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1QXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1QTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZQcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dUJKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZRSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1QnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1QjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3VDSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZSNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3VDWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGU3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dUNwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZUSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZUcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dURKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZVSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dURaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZVWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjd1RHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1RDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29va2llIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGVnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3VFSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZWNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGV0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3VFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGV1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZXcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1RXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1RTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGV4dFJlZiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZYWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwVUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGWDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRllKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwVVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZZWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRllwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwVXBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldElzU2VjdXJlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGWnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBWSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZaNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGYUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBWWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGYXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBWcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZhNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGYkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBWNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiB0eXBlPSJfLVo3dHdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZiWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBXSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dHc1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZjSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZjWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwV3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGYzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwVzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNhYmxlQXV0b1N5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGZFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZkcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFhKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZlSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGZVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZlcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZmSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiB0eXBlPSJfLVo3dDQ1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZmWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBZSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dDVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZnSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGZ1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZncFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFlwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2NKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktjWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFhNTEZpbGVQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2NwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLYzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMFpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2RKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktkcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2Q1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBacFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBaNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2VwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBhSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktmSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBhWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2ZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBhcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktnSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZ1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBhNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2dwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBiSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktoSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLaFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBiWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLaHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktoNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwYnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLaUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2laU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwYjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc1NpbmdsZVRocmVhZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktpcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2k1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwY0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLakpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2paU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwY1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktqcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2o1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwY3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLa0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2taU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwYzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2twU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLazVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2xKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktsWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2xwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBkcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkttSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBkNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkttcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS201U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBlSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktuSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLblpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBlWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIHR5cGU9Il8tWjd0NnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS25wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFCMGVwU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWjd0NjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLb0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS29aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIHR5cGU9Il8tWjd0ekpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS29wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFCMGZKU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWjd0elpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLcEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3BaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiB0eXBlPSJfLVo3dDFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3A1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBmcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dDE1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3FKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLcXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktxNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3JKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktyWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLcjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBncFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLc0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3NaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3M1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBoSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBoWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlhNTEZpbGVQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3RwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3VKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt1WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt1cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3U1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBpSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBpWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3Y1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwaXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3daU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwaTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLd3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3hKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLeHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwanBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLeUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3laU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwajVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLeXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwa0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLekpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3paU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwa1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLenBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGtwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkswSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBrNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGxKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUksxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGxaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBscFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUksySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBsNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMG1KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkszWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjFuYzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBY3Rvcl9kZWZhdWx0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVoxbmRKU2tFZG1qYXVTakc4cU8yQSBfLVoxbmRwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLM3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVoxbmRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0NsYXNzIiB0eXBlPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWjFuYzVTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWjFuZFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjFuZDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc19kZWZhdWx0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVoxbmVKU2tFZG1qYXVTakc4cU8yQSBfLVo3dHNaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVoxbmVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0NsYXNzIiB0eXBlPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWjFuZDVTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWjd0c0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjd0c3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbl9kZWZhdWx0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVo3dHM1U2tFZG1qYXVTakc4cU8yQSBfLVo3dHRaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLNnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLNjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVo3dHM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0NsYXNzIiB0eXBlPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWjd0c3BTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLN1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWjd0dEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLN3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjd0dHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbnRlcmZhY2VfZGVmYXVsdF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1aN3R0NVNrRWRtamF1U2pHOHFPMkEgXy1aN3R1WlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1aN3R0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19DbGFzcyIgdHlwZT0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVo3dHRwU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVo3dHVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVo3dHVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2lnbmFsX2RlZmF1bHRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWjd0dTVTa0VkbWphdVNqRzhxTzJBIF8tWjd0dlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWjd0dTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fQ2xhc3MiIHR5cGU9Il8tWjFuYlpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1aN3R1cFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLLUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkstWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1aN3R2SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkstcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1aN3R2cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1pdGl2ZVR5cGVfZGVmYXVsdF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1aN3R2NVNrRWRtamF1U2pHOHFPMkEgXy1aN3R3WlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS19KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS19aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1aN3R2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19DbGFzcyIgdHlwZT0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVo3dHZwU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktfcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS181U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVo3dHdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWjd0d3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMQTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dHc1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3R4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0eFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMQlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0eHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0eDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dHlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dHlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0eXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dHk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTENaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVo3dHpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxDNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0elpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dHpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3R6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMREpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0MFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxEcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDA1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3QxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMRUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxFWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1aN3QxcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3QySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0MlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMRkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxGWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByb3RlY3RlZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3QyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0M0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMRnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxGNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByaXZhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0M3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMR1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0NEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwYWNrYWdlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3Q0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxHcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVo3dDQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxISlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxIWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0NUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0NVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxIcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3Q2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0NlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjEyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTElKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMSVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWjd0NnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxJcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxJNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0NjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0N0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxKSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3Q4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMSnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxKNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLWFCMG1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUHJvamVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUIwbXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUIwbTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hQjBuSlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxLSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUIwblpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hQjBucFNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMG9wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRNb2RlbCIgYXNzb2NpYXRpb249Il8tYUIwbjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEtaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMS3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205bmRiYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg2LVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnQXBwbHkzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEs1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFINi1wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTExaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxMcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFINi01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY1NpbmNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEw1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDZfSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxNWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDZfWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikdsb2JhbEltcG9ydHMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMTTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxOSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg2X3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMTlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTE5wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg2XzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTE41U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMT0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdBSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMT1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTE9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTE81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMUEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0FwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9Im1fIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMUFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaG93Q29kZWdlbkRsZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxQNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3QkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMUVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb0NsYXNzQ3VzdG9tRGxnIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMUkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdCcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMUnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdCNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1Byb2plY3ROYW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0NKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxTcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0NaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlVGFicyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxTNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3Q3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxVSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3REpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0iaW50Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbFByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxVNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdEcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxWWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMVnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdENVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVKYXZhRG9jVGFncyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxWNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdFSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxXWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMV3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVN1ZmZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxXNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdFcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxYWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMWHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdFNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdUZXh0MiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxYNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdGSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxZWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMWXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdGWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkhvbWVTdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMWTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3RnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMWlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWQUphdmFXb3JraW5nRm9sZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFo1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMYUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0dKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxhcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdEVKQlZlcnNpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMYTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxiSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3R3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMYlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNYXhOdW1DaGFycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxiNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYUg3SEpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0iODAiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxjWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMY3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxjNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdIcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxkWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMZHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdINVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREVERMb2NhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxkNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdJSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxlWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMZXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdJWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxmSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3SXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3STVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVJvc2VJRCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxmNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3SkpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxncFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RvcE9uRXJyb3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxoSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0pwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxocFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0o1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY1ZlcnNpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMaDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxpSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0tKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxpcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0taU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRBdXRob3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMaTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxqSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3S3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMalpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3SzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJPcGVuQnJhY2VNZXRob2RTdHlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxqNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGtKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3TEpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGtaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxrcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0xaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQXN0ZXJpc2tDb21tZW50U3R5bGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMazVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxsSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0xwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGxaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxscFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0w1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWFyeUtleVN1ZmZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxsNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTG1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdNSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxtWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMbXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdNWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVkaXRvciIgdHlwZT0iXy1hSDY4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMbTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxuSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYUg3TXBTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hSDY4NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxuWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMbnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdNNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMbjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxvSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3TkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMb1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTG9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3TlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRKMkVFSmF2YWRvYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxvNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3TnBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN041U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3BhY2luZ0l0ZW1zIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMcUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOEs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hSDdPSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSIzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMcVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3T1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJEVERMb2NhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxxNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdPcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMcnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdPNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3UEpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1BaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ1RleHQzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1BwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1A1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVtb3RlU3VmZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1FKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx1cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVmZXJlbmNlQ2xhc3NwYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1FwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx2cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iT3BlbkJyYWNlQ2xhc3NTdHlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx2NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3UkpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTG9jYWxTdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMdzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3UnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMeFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3UjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWTSIgdHlwZT0iXy1hQjBvNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMeDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx5SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYUg3U0pTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hQjBwSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMeXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdTWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx5NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdTcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx6WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMenBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdTNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZVByZWZpeGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHo1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdUSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdUWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW5TdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMMDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwxSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3VHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3VDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1VKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwycFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1VaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDQ29tbWVudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3VXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMM1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3VTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSb290RGlyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1ZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ1RleHQxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1ZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw1cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ05hbWUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1dKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw2cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQXV0b1N5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMNjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw3SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN1dwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1c1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0F1dGhvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3WEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMOFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3WFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3WHBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw5cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDUHJvamVjdFNvdXJjZVJvb3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMOTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwtSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3WUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMLVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTC1wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3WVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhQ29tbWVudFN0eWxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTC01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMX0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdZcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxfWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMX3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdZNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTF81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSRUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1pKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InZvaWQiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJFWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSRXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdaWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJFNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdacFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJGWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSRnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdaNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NEZWZhdWx0VmVyc2lvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJGNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdhSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJHWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSR3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdhWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdFNob3dSb3NlSUREbGciPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSRzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJISlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN2FwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJIcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN2E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVtb3RlUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSSUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN2JKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUklaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJJcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN2JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlU3BhY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSSkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0JrSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSSlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9Ca1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc1ZhcmlhYmxlUHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUko1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSS0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQmtwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InNfIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSS1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUktwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CazVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jRGVmYXVsdFNpbmNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUks1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSTEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQmxKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkxaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJMcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQmxaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU0NDU2VsZWN0ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSTDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJNSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQmxwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUk1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJNcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQmw1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSG9tZVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJNNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUk5KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JtSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJOWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSTnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JtWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsSG9tZVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJONVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUk9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JtcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJPWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhST3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJPNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JuSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJQWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSUHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JuWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNvdXJjZUNvbnRyb2wiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSUDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJRSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQm5wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQm41U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY051bUFzdGVyaXNrcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJRNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYU9Cb0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSUlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9Cb1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcmltYXJ5S2V5UHJlZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQm9wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJTcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYUIwbjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNb2RlbF9kZWZhdWx0X19Qcm9qZWN0IiBtZW1iZXJFbmQ9Il8tYUIwb0pTa0VkbWphdVNqRzhxTzJBIF8tYUIwb3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJTNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJUSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYUIwb0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fUHJvamVjdCIgdHlwZT0iXy1hQjBtWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFCMG41U2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJUWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFCMG9aU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJVSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYUIwbzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19Qcm9qZWN0Vk1UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJVWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJVcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYUIwcEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUIwcFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFCMHBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJVNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFCMHA1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWljcm9zb2Z0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFCMHFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hQjBxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSVlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJWcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hQjBxcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklCTSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hSDY4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUg2OFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSV0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYUg2OHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19Qcm9qZWN0RWRpdG9yVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSV1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSV3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFINjg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQnVpbHRJbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hSDY5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUg2OVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMTAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYUg2OXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXaW5kb3dzU2hlbGwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUg2OTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFINi1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjEwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJYWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQnBaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CcHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CcUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JySlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQWN0b3IiIGFzc29jaWF0aW9uPSJfLWFPQnFaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJZSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUllaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOW5kY2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQnNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRDbGFzcyIgYXNzb2NpYXRpb249Il8tYU9CclpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUllwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX204OHV4cTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CdEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEVudW1lcmF0aW9uIiBhc3NvY2lhdGlvbj0iXy1hT0JzWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUmVhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0J1SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkSW50ZXJmYWNlIiBhc3NvY2lhdGlvbj0iXy1hT0J0WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSWnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJaNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSm9xODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0J2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkU2lnbmFsIiBhc3NvY2lhdGlvbj0iXy1hT0J1WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSYUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSnphODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0J3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJpbWl0aXZlVHlwZSIgYXNzb2NpYXRpb249Il8tYU9CdlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSYTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJzYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9COEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSYkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJiWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9COFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSYnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9COHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSY0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJjWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQjg1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJjNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQjlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9COVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9COXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9COTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CLUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSZlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0ItWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJmcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0ItcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJnWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQi01U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJnNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQl9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSaEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJoWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9CX1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSaHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CX3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSaVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQl81U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJpNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0FKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSalpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQ0FaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJqNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0FwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmtKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSa1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0NBNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJrcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSazVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NCSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQ0JaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmxwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJsNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0JwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSbUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJtWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9DQjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSbXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUm01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DQ0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJuSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUm5aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0NDWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJucFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NDcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUm9KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSb1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0NDNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJvcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NESlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhScEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0RaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJwNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DRDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhScXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DRUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSclpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQ0VaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJyNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0VwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSc0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0U1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJzNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0ZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0ZaU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSdDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NGcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DRjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DR0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DR1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DR3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgdHlwZT0iXy1hT0J3WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYU9DRzVTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0J3cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ3cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSdzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NISlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DSFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSeHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUng1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJTUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSeVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlNWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSeTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlNcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSelpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlNNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ6cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSejVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlOSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgdHlwZT0iXy1hT0I0cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSMEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFIwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYVVJTlpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0I0NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlOcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlONVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIxcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlPSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hVUlPWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIycFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlPcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSM0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFIzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYVVJTzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSM3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJUXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSN1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFVSVE1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSOEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFVSVJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hVUlSNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSOTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlTSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUi1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSLVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlTWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFItcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlTcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUl9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJUzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSX3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUl81U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJVEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTQUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNBWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYVVJVFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0E1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJVHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiB0eXBlPSJfLWFPQjZaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNCSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0JaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hVUlUNVNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFPQjZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNCNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiB0eXBlPSJfLWFPQjJKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0NaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hYU8wWlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFPQjJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0NwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNDNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgdHlwZT0iXy1hT0J5NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTREpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYWFPMDVTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0J6SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNEcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8xSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0VKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU8xWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNFcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8xcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNGSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0ZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPMTVTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0ZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNGNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTR0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNHWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWFPMlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTR3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0c1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPMnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNISlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0haU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU8yNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNIcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTSDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8zSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNJWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWFPM1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0k1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPM3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNKWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhTzM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0pwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNKNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0tKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTS1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU80WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNLcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTSzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU80cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0xKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFhTzQ1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0xwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNMNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU01KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFhTzVaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU01wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNNNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU05KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU81NVNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTTnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU041U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPNkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNPSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU09aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU82WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNPcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU82cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNQSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1BaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPNjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTUHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1A1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPN0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNRSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1FaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU83WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNRcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTUTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQWN0b3JfRGVmYXVsdF9FSkJfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYU9CcXBTa0VkbWphdVNqRzhxTzJBIF8tYU9CckpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNSSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNSWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYU9CcXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9FSkJfX0NsYXNzIiB0eXBlPSJfLWFPQm81U2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYU9CcVpTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTUjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYU9CcTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTU0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1NaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYU9CclpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc19EZWZhdWx0X0VKQl9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hT0JycFNrRWRtamF1U2pHOHFPMkEgXy1hT0JzSlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1NwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1M1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hT0JycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X0VKQl9fQ2xhc3MiIHR5cGU9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hT0JyWlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNUWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hT0JyNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNUcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hT0JzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVudW1lcmF0aW9uX0RlZmF1bHRfRUpCX19DbGFzcyIgbWVtYmVyRW5kPSJfLWFPQnNwU2tFZG1qYXVTakc4cU8yQSBfLWFPQnRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFPQnNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfRUpCX19DbGFzcyIgdHlwZT0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFPQnNaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNVcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1U1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQnM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1ZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNWWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW50ZXJmYWNlX0RlZmF1bHRfRUpCX19DbGFzcyIgbWVtYmVyRW5kPSJfLWFPQnRwU2tFZG1qYXVTakc4cU8yQSBfLWFPQnVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFPQnRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfRUpCX19DbGFzcyIgdHlwZT0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFPQnRaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNXSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1daU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQnQ1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1dwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNXNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2lnbmFsX0RlZmF1bHRfRUpCX19DbGFzcyIgbWVtYmVyRW5kPSJfLWFPQnVwU2tFZG1qYXVTakc4cU8yQSBfLWFPQnZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTWEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTWFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFPQnVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfRUpCX19DbGFzcyIgdHlwZT0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFPQnVaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNYcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1g1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQnU1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1lKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNZWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWl0aXZlVHlwZV9EZWZhdWx0X0VKQl9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hT0J2cFNrRWRtamF1U2pHOHFPMkEgXy1hT0J3SlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1lwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1k1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hT0J2cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X0VKQl9fQ2xhc3MiIHR5cGU9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hT0J2WlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hT0J2NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNacFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTWjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFPQndaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNhSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9Cd3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0J4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTYXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNhNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0J4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0J4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CeDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2JKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTYlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CeUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWZ1bCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0J5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CeXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2JwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTYjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYU9CeTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTY0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTY1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQnpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHVibGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQnpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0J6cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNjcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2M1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQno1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0IwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2RaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0IwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0IxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CMXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY1Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2VKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYU9CMkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNlcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNlNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CMlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0IyNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYc0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFhzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0IzSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CM1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFhzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0I0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYdEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hT0I0cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfRUpCX19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0I0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0I1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CNVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYdVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CNXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0I2SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMTIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYdXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hT0I2WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfRUpCX19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh2WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CNnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CNjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0I3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLWFhTzdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fT3BlcmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYU83NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYU84SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2F0ZWdvcnlOYW1lIiB2YWx1ZT0iSmF2YSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhTzhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJzdXBwcmVzc2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYU84cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhTzg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJ0YWdnZWRWYWx1ZVNldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPOTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJE9wZXJhdGlvbiIgYXNzb2NpYXRpb249Il8tYWFPOUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYeEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205QzJqYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPLUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZXBsYWNlRXhpc3RpbmdDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYeHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU8tWlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYeDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPLXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPLTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYeTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPX0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYenBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU9fWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh6NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYMEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU9fcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU9fNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYVBBSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5hdGl2ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgxWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFQQVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYMTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFQQXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBYnN0cmFjdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFQQTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYMjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFQQkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTeW5jaHJvbml6ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYM1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhUEJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg0SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhUEJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYVBCNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg0NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFhTzlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iT3BlcmF0aW9uX2RlZmF1bHRfX09wZXJhdGlvbiIgbWVtYmVyRW5kPSJfLWFhTzlaU2tFZG1qYXVTakc4cU8yQSBfLWFhTzk1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYNVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFhTzlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX09wZXJhdGlvbiIgdHlwZT0iXy1hYU83cFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFhTzlKU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFhTzlwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg2cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1hYVBDSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX1JvbGUiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUENaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUENwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFQQzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUERKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFQRFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYVBFWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJvcGVydHkiIGFzc29jaWF0aW9uPSJfLWFhUERwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOUMxbGE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZFdyaXRlIiB0eXBlPSJfLWFhUEVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg3cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hZ1ZjNVNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFhUEU1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5pdGlhbFZhbHVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYODVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFnVmRaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJvcGVydHlUeXBlIiB0eXBlPSJfLWFhUEhKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hZ1ZkNVNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFhUEhaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWC1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgtWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWC1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYLTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1ZlWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFhfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYX1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZlcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWF9wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYXzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1ZlNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZQVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZmSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlRyYW5zaWVudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlBcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWZnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWb2xhdGlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWZ0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc05hdmlnYWJsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZ1pTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWURKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlEWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5kaXZpZHVhbENoYW5nZU1ndCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlEcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZRUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWaEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXJDbGFzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlFcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1ZoWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlGSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZRlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFhUERwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJvcGVydHlfZGVmYXVsdF9fUm9sZSIgbWVtYmVyRW5kPSJfLWFhUEQ1U2tFZG1qYXVTakc4cU8yQSBfLWFhUEVaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZRnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZRjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFhUEQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX1JvbGUiIHR5cGU9Il8tYWFQQ0pTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hYVBEcFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZR0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlHWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hYVBFSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlHcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZRzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFhUEVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUm9sZVJlYWRXcml0ZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hYVBFNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgJmFtcDsgV3JpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFQRkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUEZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZSDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQRnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkIE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFQRjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUEdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZSVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQR1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXcml0ZSBPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUEdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBHNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI4MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlJcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFhUEhKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hYVBIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdCBBIFByb3BlcnR5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUEhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBINVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlKcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFhUElKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2ltcGxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUElaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBJcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlLSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUtaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFhUEk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQm91bmQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFQSkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUEpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjczIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUtwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZSzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQSnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJhaW5lZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWY1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlMWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLWFnVmhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSHR0cF9TZXJ2bGV0X19DbGFzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWaDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWaUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1ZpWlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlMcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWaXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1ZpNVNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRBY3RvciIgYXNzb2NpYXRpb249Il8tYWdWakpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUw1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZTUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205bmRjYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWazVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJENsYXNzIiBhc3NvY2lhdGlvbj0iXy1hZ1ZrSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlNcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTg4dXhxODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZsNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkRW51bWVyYXRpb24iIGFzc29jaWF0aW9uPSJfLWFnVmxKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlNNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWU5KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSZWE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVm01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRJbnRlcmZhY2UiIGFzc29jaWF0aW9uPSJfLWFnVm1KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlOWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWU5wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKb3E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVm41U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRTaWduYWwiIGFzc29jaWF0aW9uPSJfLWFnVm5KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlONVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWU9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOVZKemE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVm81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRQcmltaXRpdmVUeXBlIiBhc3NvY2lhdGlvbj0iXy1hZ1ZvSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZT1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlPcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUnNhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlPNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1YxSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlQWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZUHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlQNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWMXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlRNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1YySlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZUnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YyWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZU0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1YycFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlTWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZU3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlUSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjNKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlUcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlUNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWM3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbXBGaWVsZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlVNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1Y0SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlWWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZVnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlWNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1Y0cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlXWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZV3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlYSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWNUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWNVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlZSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlZcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlaSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWNkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWNlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlaNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1Y2cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlhWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZYXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZYkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFnVjdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlicFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZYjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFljSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFljcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFljNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWOEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWOFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29va2llIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZZUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1Y4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFllWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZZXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlmSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYW1jRUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jRVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGV4dFJlZiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlmNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jRXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZ1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jRTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlnNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jRkpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlocFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldElzU2VjdXJlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZaUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNGcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlpWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZaXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNGNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZakpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNHSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlqWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZanBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNHWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiB0eXBlPSJfLWFnVnBKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlqNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWtKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNHcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnBaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWtaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlrcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0c1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWs1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNISlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlsWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNIWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFltSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0hwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFltcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFluSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0lKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW5aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlucFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0laU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiB0eXBlPSJfLWFnVnhaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFluNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWW9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNJcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlvcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0k1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlwSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0pKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0paU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hbWNKcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlxWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZcXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNKNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlxNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hbWNLSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZcnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNLWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZc0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNLcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlzWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZc3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNLNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNMSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl0WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNMWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNMcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl1WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNMNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl2SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYW1jTUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc1NpbmdsZVRocmVhZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl2NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jTXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZd1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jTkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZeFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZeUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFtY05wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl5cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY041U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZekpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNPSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl6WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZenBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNPWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl6NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hbWNPcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFkwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNPNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIHR5cGU9Il8tYWdWekpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFtY1BKU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYWdWelpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jUFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIHR5cGU9Il8tYWdWcnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZMkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFtY1BwU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYWdWcjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jUDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiB0eXBlPSJfLWFnVnVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFkyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNRSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnVaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFkzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY1FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk0SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY1FwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk0cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY1E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZNUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hc2lzSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZNVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpc1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hc2lzcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZNnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2lzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlhNTEZpbGVQYXRoIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZN0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWThKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hc2l0cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk4WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZOHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYXNpdUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZOVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpdVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZOTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFktSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFzaXVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWS1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFktcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZLTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlfSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpdkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZX1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWV9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpdlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZXzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpBSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpdnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRaQVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWkFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpdjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRaQTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpCSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFzaXdKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpCWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaQnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaQ0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpDcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaREpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hc2l4SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpEWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaRHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaRUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXhwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpFcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYWdWakpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBY3Rvcl9IdHRwX1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYWdWalpTa0VkbWphdVNqRzhxTzJBIF8tYWdWajVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVVSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVVWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYWdWalpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kSHR0cF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFnVmpKU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVVcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFnVmpwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVWWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFnVmtKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ2xhc3NfSHR0cF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLWFnVmtaU2tFZG1qYXVTakc4cU8yQSBfLWFnVms1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplVnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplVjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFnVmtaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJEh0dHBfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hZ1ZrSlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplV0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVXWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hZ1ZrcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVXcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplVzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hZ1ZsSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVudW1lcmF0aW9uX0h0dHBfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hZ1ZsWlNrRWRtamF1U2pHOHFPMkEgXy1hZ1ZsNVNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hZ1ZsWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRIdHRwX1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLWFnVmhwU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYWdWbEpTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplWDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYWdWbHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplWUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYWdWbUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbnRlcmZhY2VfSHR0cF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLWFnVm1aU2tFZG1qYXVTakc4cU8yQSBfLWFnVm01U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplWXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplWTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFnVm1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJEh0dHBfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hZ1ZtSlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplWkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hZ1ZtcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVacFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplWjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hZ1ZuSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpZ25hbF9IdHRwX1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYWdWblpTa0VkbWphdVNqRzhxTzJBIF8tYWdWbjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVhSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYWdWblpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kSHR0cF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFnVm5KU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVhcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFnVm5wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamViWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFnVm9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWl0aXZlVHlwZV9IdHRwX1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYWdWb1pTa0VkbWphdVNqRzhxTzJBIF8tYWdWbzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVicFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamViNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYWdWb1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kSHR0cF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFnVm9KU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFnVm9wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVjNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYWdWcEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIdHRwX1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWcFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1ZwNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1ZxSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZxWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWcXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWcTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWZ1bCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWclpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYWdWcnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIdHRwX1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplZkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnI1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZzSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWc1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWc3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z0SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplZ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVnWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWdDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYWdWdUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z1cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWdTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplaHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVoNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByb3RlY3RlZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWdnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplaUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVpWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByaXZhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVndaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplaTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWd3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwYWNrYWdlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVqSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFnVnhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWeUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWtKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmpla1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWeVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMTIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmpla3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVrNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hZ1Z6SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikh0dHBfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVnpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z6NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVsNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1YwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1YwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWMHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjMxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZW1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1hc2l4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX01vZHVsZVNwZWMiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFzaXlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFzaXlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYXNpeXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFzaXk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYXNpekpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2kwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQ29tcG9uZW50IiBhc3NvY2lhdGlvbj0iXy1hc2l6WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVuSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSmpLODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2kwWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNtSWRlbnRpZmljYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplblpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVucFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpMHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZW9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpMDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb3B5cmlnaHROb3RpY2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplb1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVvcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpMUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplbzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZXBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hc2l6WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbXBvbmVudF9kZWZhdWx0X19Nb2R1bGVTcGVjIiBtZW1iZXJFbmQ9Il8tYXNpenBTa0VkbWphdVNqRzhxTzJBIF8tYXNpMEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYXNpenBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fTW9kdWxlU3BlYyIgdHlwZT0iXy1hc2l4NVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFzaXpaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZXFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFzaXo1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZXFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci08L3VtbDpQcm9maWxlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNiNWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL0phdmEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jTW9uIE1hciAxNCAxMToyMDoyNyBFU1QgMjAwNQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlJlZmVyZW5jZXM9RUpCUmVmZXJlbmNlcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY0RlZmF1bHRWZXJzaW9uPUphdmFkb2NEZWZhdWx0VmVyc2lvbgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyPUdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0RWRpdG9yVHlwZV9fV2luZG93c1NoZWxsPVdpbmRvd3NTaGVsbAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCU2Vzc2lvblN5bmM9RUpCU2Vzc2lvblN5bmMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RWTVR5cGVfX1N1bj1TdW4KLUphdmFfX2RlZmF1bHRfX1JvbGU9ZGVmYXVsdAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdFZNVHlwZV9fTWljcm9zb2Z0PU1pY3Jvc29mdAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnM9TWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1NDQ0NvbW1lbnQ9U0NDQ29tbWVudAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXM9TWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJQZXJzaXN0ZW5jZVR5cGU9RUpCUGVyc2lzdGVuY2VUeXBlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0lzU2luZ2xlVGhyZWFkPUlzU2luZ2xlVGhyZWFkCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXM9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXI9U2VydmxldEluaXRQYXJhbWV0ZXIKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlSFRNTD1HZW5lcmF0ZUhUTUwKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1N0b3BPbkVycm9yPVN0b3BPbkVycm9yCi1KYXZhX19kZWZhdWx0X19Sb2xlUmVhZFdyaXRlX1NldF9fUmVhZFwgT25seT1SZWFkIE9ubHkKLUphdmFfX2RlZmF1bHRfX0NsYXNzQ3Rvcl9TZXRfX3B1YmxpYz1wdWJsaWMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCQ21wRmllbGQ9RUpCQ21wRmllbGQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvckhlYWRlcnM9TWV0aG9kRm9ySGVhZGVycwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9ySGVhZGVycz1NZXRob2RGb3JIZWFkZXJzCi1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX1N0YXRpYz1TdGF0aWMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NDdG9yX1NldD1DdG9yX1NldAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJSZWZlcmVuY2VzPUVKQlJlZmVyZW5jZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldEludEhlYWRlcj1TZXJ2bGV0SW50SGVhZGVyCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRGlzcGF0Y2hlckZvcndhcmQ9RGlzcGF0Y2hlckZvcndhcmQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NDdG9yX1NldF9fcHJpdmF0ZT1wcml2YXRlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TQ0NQcm9qZWN0TmFtZT1TQ0NQcm9qZWN0TmFtZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldENvb2tpZT1TZXJ2bGV0Q29va2llCi1KYXZhX19kZWZhdWx0X19Sb2xlX19Qcm9wZXJ0eVR5cGU9UHJvcGVydHlUeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCTmFtZUluSkFSPUVKQk5hbWVJbkpBUgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19NZXRob2RGb3JDb29raWU9TWV0aG9kRm9yQ29va2llCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0Q29va2llPVNlcnZsZXRDb29raWUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJDbXBGaWVsZD1FSkJDbXBGaWVsZAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbj1kZWZhdWx0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VTcGFjZXM9VXNlU3BhY2VzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRGlzcGF0Y2hlckluY2x1ZGU9RGlzcGF0Y2hlckluY2x1ZGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0TmFtZT1TZXJ2bGV0TmFtZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldElzU2VjdXJlPVNlcnZsZXRJc1NlY3VyZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19EaXNwYXRjaGVyRm9yd2FyZD1EaXNwYXRjaGVyRm9yd2FyZAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCU2Vzc2lvblR5cGU9RUpCU2Vzc2lvblR5cGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJUcmFuc2FjdGlvblR5cGU9RUpCVHJhbnNhY3Rpb25UeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJWZXJzaW9uPUVKQlZlcnNpb24KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRYTUxGaWxlUGF0aD1TZXJ2bGV0WE1MRmlsZVBhdGgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldD1FSkJWZXJzaW9uX1NldAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19EaXNwYXRjaGVySW5jbHVkZT1EaXNwYXRjaGVySW5jbHVkZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fUHJpbWFyeUtleVN1ZmZpeD1QcmltYXJ5S2V5U3VmZml4Ci1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX0dlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm49R2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXI9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1JlbW90ZVN1ZmZpeD1SZW1vdGVTdWZmaXgKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZV9fVm9sYXRpbGU9Vm9sYXRpbGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyPVNlcnZsZXRJbml0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19Sb2xlUmVhZFdyaXRlX1NldF9fV3JpdGVcIE9ubHk9V3JpdGUgT25seQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVkFKYXZhV29ya2luZ0ZvbGRlcj1WQUphdmFXb3JraW5nRm9sZGVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3ByaXZhdGU9cHJpdmF0ZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzPUVKQkVudmlyb25tZW50UHJvcGVydGllcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJDbnhGYWN0b3J5PUVKQkNueEZhY3RvcnkKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXQ9UmVhZC9Xcml0ZV9TZXQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXM9U2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcwotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlUmVhZFdyaXRlX1NldF9fV3JpdGVcIE9ubHk9V3JpdGUgT25seQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQmVhblN1ZmZpeD1CZWFuU3VmZml4Ci1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldEhlYWRlcj1TZXJ2bGV0SGVhZGVyCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19Db25zdHJhaW5lZD1Db25zdHJhaW5lZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlZlcnNpb249RUpCVmVyc2lvbgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU3RhdGljPVN0YXRpYwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzPU1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fR2VuZXJhdGVGaW5hbGl6ZXI9R2VuZXJhdGVGaW5hbGl6ZXIKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fUmVwbGFjZUV4aXN0aW5nQ29kZT1SZXBsYWNlRXhpc3RpbmdDb2RlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQk5hbWVJbkpBUj1FSkJOYW1lSW5KQVIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0Q29va2llPVNlcnZsZXRDb29raWUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQ9RUpCU2Vzc2lvblR5cGVfU2V0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TQ0NQcm9qZWN0U291cmNlUm9vdD1TQ0NQcm9qZWN0U291cmNlUm9vdAotSmF2YV9fZGVmYXVsdF9fT3BlcmF0aW9uX19BYnN0cmFjdD1BYnN0cmFjdAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldD1FSkJTZXNzaW9uVHlwZV9TZXQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0lzU2luZ2xlVGhyZWFkPUlzU2luZ2xlVGhyZWFkCi1KYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldF9fQm91bmQ9Qm91bmQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fQk1QX0V4dGVuZF9DTVA9Qk1QX0V4dGVuZF9DTVAKLUphdmFfX2RlZmF1bHRfX1JvbGVfX1JlYWRXcml0ZT1SZWFkL1dyaXRlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19EZWZhdWx0U2VydmxldFZlcnNpb249RGVmYXVsdFNlcnZsZXRWZXJzaW9uCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0xvY2FsUHJlZml4PUxvY2FsUHJlZml4Ci1KYXZhX19kZWZhdWx0X19DbGFzc0N0b3JfU2V0X19wcml2YXRlPXByaXZhdGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0RGF0ZUhlYWRlcj1TZXJ2bGV0RGF0ZUhlYWRlcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0Q29va2llPVNlcnZsZXRDb29raWUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0RlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlPURlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3B1YmxpYz1wdWJsaWMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0N0b3JfU2V0X19wdWJsaWM9cHVibGljCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SGVhZGVyTmFtZXM9U2VydmxldEhlYWRlck5hbWVzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Sb290RGlyPVJvb3REaXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJSZWVudHJhbnQ9RUpCUmVlbnRyYW50Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Ob3RTaG93Um9zZUlERGxnPU5vdFNob3dSb3NlSUREbGcKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0hvbWVTdWZmaXg9SG9tZVN1ZmZpeAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJQZXJzaXN0ZW5jZVR5cGU9RUpCUGVyc2lzdGVuY2VUeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldElzU2VjdXJlPVNlcnZsZXRJc1NlY3VyZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzcz1EZWZhdWx0X1NlcnZsZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldERhdGVIZWFkZXI9U2VydmxldERhdGVIZWFkZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0xvY2FsSG9tZVByZWZpeD1Mb2NhbEhvbWVQcmVmaXgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0Rpc3BhdGNoZXJGb3J3YXJkPURpc3BhdGNoZXJGb3J3YXJkCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0dlbmVyYXRlX1hNTF9ERD1HZW5lcmF0ZV9YTUxfREQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlYz1kZWZhdWx0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lVGFnQXBwbHkzPVVzZXJEZWZpbmVUYWdBcHBseTMKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZV9fSW5kaXZpZHVhbENoYW5nZU1ndD1JbmRpdmlkdWFsQ2hhbmdlTWd0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdBcHBseTI9VXNlckRlZmluZVRhZ0FwcGx5MgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRGlzcGF0Y2hlckluY2x1ZGU9RGlzcGF0Y2hlckluY2x1ZGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdBcHBseTE9VXNlckRlZmluZVRhZ0FwcGx5MQotSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlY19fQ21JZGVudGlmaWNhdGlvbj1DbUlkZW50aWZpY2F0aW9uCi1KYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldD1CZWFuUHJvcGVydHlfU2V0Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19EaXNwYXRjaGVySW5jbHVkZT1EaXNwYXRjaGVySW5jbHVkZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fR2xvYmFsSW1wb3J0cz1HbG9iYWxJbXBvcnRzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fTWV0aG9kRm9ySGVhZGVycz1NZXRob2RGb3JIZWFkZXJzCi1KYXZhX19kZWZhdWx0X19Sb2xlX19Db250YWluZXJDbGFzcz1Db250YWluZXJDbGFzcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQmVhblByZWZpeD1CZWFuUHJlZml4Ci1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX1JlYWRXcml0ZT1SZWFkL1dyaXRlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3REaXNwYXRjaGVyPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlUHJlZml4ZXM9VXNlUHJlZml4ZXMKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXRfX1JlYWRcICZcIFdyaXRlPVJlYWQgJiBXcml0ZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fSXNTaW5nbGVUaHJlYWQ9SXNTaW5nbGVUaHJlYWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXI9R2VuZXJhdGVTdGF0aWNJbml0aWFsaXplcgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NDdG9yX1NldF9fcHJvdGVjdGVkPXByb3RlY3RlZAotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlUmVhZFdyaXRlX1NldF9fUmVhZFwgT25seT1SZWFkIE9ubHkKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzPU1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlJlZW50cmFudD1FSkJSZWVudHJhbnQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRmluYWw9RmluYWwKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fTmF0aXZlPU5hdGl2ZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlNlc3Npb25TeW5jPUVKQlNlc3Npb25TeW5jCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19NZXRob2RGb3JDb29raWU9TWV0aG9kRm9yQ29va2llCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQ9Q3Rvcl9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldE5hbWU9U2VydmxldE5hbWUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlBlcnNpc3RlbmNlVHlwZT1FSkJQZXJzaXN0ZW5jZVR5cGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlSFRNTD1HZW5lcmF0ZUhUTUwKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcj1TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIKLUphdmFfX2RlZmF1bHRfX1JvbGVfX0ZpbmFsPUZpbmFsCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGg9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzQ3Rvcl9TZXRfX3Byb3RlY3RlZD1wcm90ZWN0ZWQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzPUVKQkVudmlyb25tZW50UHJvcGVydGllcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXRfX0JlYW49QmVhbgotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlX19GaW5hbD1GaW5hbAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWZ1bD1TdGF0ZWZ1bAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVGaW5hbGl6ZXI9R2VuZXJhdGVGaW5hbGl6ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1NwYWNpbmdJdGVtcz1TcGFjaW5nSXRlbXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJDbnhGYWN0b3J5PUVKQkNueEZhY3RvcnkKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0VKQkRURExvY2F0aW9uPUVKQkRURExvY2F0aW9uCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldD1FSkJUcmFuc2FjdGlvblR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3B1YmxpYz1wdWJsaWMKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldD1FSkJUcmFuc2FjdGlvblR5cGVfU2V0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Tb3VyY2VDb250cm9sPVNvdXJjZUNvbnRyb2wKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fRmluYWw9RmluYWwKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlRyYW5zYWN0aW9uVHlwZT1FSkJUcmFuc2FjdGlvblR5cGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZUhUTUw9R2VuZXJhdGVIVE1MCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TZXJ2bGV0RFRETG9jYXRpb249U2VydmxldERURExvY2F0aW9uCi1KYXZhX19kZWZhdWx0X19Sb2xlX19Jbml0aWFsVmFsdWU9SW5pdGlhbFZhbHVlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQ9RUpCVmVyc2lvbl9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldEhlYWRlck5hbWVzPVNlcnZsZXRIZWFkZXJOYW1lcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlNlc3Npb25UeXBlPUVKQlNlc3Npb25UeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0RGF0ZUhlYWRlcj1TZXJ2bGV0RGF0ZUhlYWRlcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fRGVmYXVsdEVKQlZlcnNpb249RGVmYXVsdEVKQlZlcnNpb24KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRTZWN1cml0eVJvbGVzPVNlcnZsZXRTZWN1cml0eVJvbGVzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19BdXRvU3luYz1BdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQ2xhc3NQYXRoPUNsYXNzUGF0aAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRTZWN1cml0eVJvbGVzPVNlcnZsZXRTZWN1cml0eVJvbGVzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0RGF0ZUhlYWRlcj1TZXJ2bGV0RGF0ZUhlYWRlcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzPVNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0N0b3JfU2V0X19wYWNrYWdlPXBhY2thZ2UKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMi4wPTIuMAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQ9RUpCU2Vzc2lvblR5cGVfU2V0Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUNvZGU9R2VuZXJhdGVDb2RlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Ob0NsYXNzQ3VzdG9tRGxnPU5vQ2xhc3NDdXN0b21EbGcKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1N0YXRpYz1TdGF0aWMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGU9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVKYXZhRG9jVGFncz1Vc2VyRGVmaW5lSmF2YURvY1RhZ3MKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzcz1EZWZhdWx0X0VKQgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRYTUxGaWxlUGF0aD1TZXJ2bGV0WE1MRmlsZVBhdGgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0PWRlZmF1bHQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldENvbnRleHRSZWY9U2VydmxldENvbnRleHRSZWYKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlX1hNTF9ERD1HZW5lcmF0ZV9YTUxfREQKLUphdmFfX2RlZmF1bHRfX1JvbGVfX0lzTmF2aWdhYmxlPUlzTmF2aWdhYmxlCi1KYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldF9fTm90XCBBXCBQcm9wZXJ0eT1Ob3QgQSBQcm9wZXJ0eQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19GaW5hbD1GaW5hbAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZUZpbmFsaXplcj1HZW5lcmF0ZUZpbmFsaXplcgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19CTVBfRXh0ZW5kX0NNUD1CTVBfRXh0ZW5kX0NNUAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldENvbnRleHRSZWY9U2VydmxldENvbnRleHRSZWYKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldENvbnRlbnRUeXBlPVNlcnZsZXRDb250ZW50VHlwZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY0RlZmF1bHRTaW5jZT1KYXZhZG9jRGVmYXVsdFNpbmNlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19KYXZhZG9jU2luY2U9SmF2YWRvY1NpbmNlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGU9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGUKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFNlY3VyaXR5Um9sZXM9U2VydmxldFNlY3VyaXR5Um9sZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TQ0NTZWxlY3RlZD1TQ0NTZWxlY3RlZAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCVmVyc2lvbj1FSkJWZXJzaW9uCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0dlbmVyYXRlSFRNTD1HZW5lcmF0ZUhUTUwKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yPUdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0X18yLjA9Mi4wCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19JbnN0YW5jZVZhcmlhYmxlUHJlZml4PUluc3RhbmNlVmFyaWFibGVQcmVmaXgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXRfX1N0YXRlZnVsPVN0YXRlZnVsCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3Byb3RlY3RlZD1wcm90ZWN0ZWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRIZWFkZXJOYW1lcz1TZXJ2bGV0SGVhZGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnM9TWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0Z2V0SW5mbz1TZXJ2bGV0Z2V0SW5mbwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fQ29uc3RydWN0b3JJcz1Db25zdHJ1Y3RvcklzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZV9YTUxfREQ9R2VuZXJhdGVfWE1MX0RECi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX01ldGhvZEZvckhlYWRlcnM9TWV0aG9kRm9ySGVhZGVycwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXRfX0NvbnN0cmFpbmVkPUNvbnN0cmFpbmVkCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJSZWVudHJhbnQ9RUpCUmVlbnRyYW50Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3Byb3RlY3RlZD1wcm90ZWN0ZWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbnRIZWFkZXI9U2VydmxldEludEhlYWRlcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fQ29uc3RydWN0b3JJcz1Db25zdHJ1Y3RvcklzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMi4wPTIuMAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0SXNTZWN1cmU9U2VydmxldElzU2VjdXJlCi1KYXZhX19kZWZhdWx0X19Nb2R1bGVCb2R5X19DbUlkZW50aWZpY2F0aW9uPUNtSWRlbnRpZmljYXRpb24KLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX0dlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcz1HZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJSZWZlcmVuY2VzPUVKQlJlZmVyZW5jZXMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1Nob3dDb2RlZ2VuRGxnPVNob3dDb2RlZ2VuRGxnCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19QcmltYXJ5S2V5UHJlZml4PVByaW1hcnlLZXlQcmVmaXgKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJYTUxGaWxlUGF0aD1FSkJYTUxGaWxlUGF0aAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fUmVtb3RlUHJlZml4PVJlbW90ZVByZWZpeAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY051bUFzdGVyaXNrcz1KYXZhZG9jTnVtQXN0ZXJpc2tzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19NZXRob2RGb3JDb29raWU9TWV0aG9kRm9yQ29va2llCi1KYXZhX19kZWZhdWx0X19DbGFzc19fUmVhZE9ubHk9UmVhZE9ubHkKLUphdmFfX2RlZmF1bHRfX1JvbGVfX1RyYW5zaWVudD1UcmFuc2llbnQKLUphdmFfX2RlZmF1bHRfX1JvbGVCZWFuUHJvcGVydHlfU2V0X19TaW1wbGU9U2ltcGxlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1N0YXRpYz1TdGF0aWMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyPUdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1ZNPVZNCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0U2VjdXJpdHlSb2xlcz1TZXJ2bGV0U2VjdXJpdHlSb2xlcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0X18xLng9MS54Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VUYWJzPVVzZVRhYnMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU3RhdGljPVN0YXRpYwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJUcmFuc2FjdGlvblR5cGU9RUpCVHJhbnNhY3Rpb25UeXBlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19DbGFzc1ZhcmlhYmxlUHJlZml4PUNsYXNzVmFyaWFibGVQcmVmaXgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGg9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldENvbnRlbnRUeXBlPVNlcnZsZXRDb250ZW50VHlwZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlckRlZmluZVRhZ1RleHQzPVVzZXJEZWZpbmVUYWdUZXh0MwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlckRlZmluZVRhZ1RleHQyPVVzZXJEZWZpbmVUYWdUZXh0MgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlckRlZmluZVRhZ1RleHQxPVVzZXJEZWZpbmVUYWdUZXh0MQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyPUdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RWTVR5cGVfX0lCTT1JQk0KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0PUVKQlBlcnNpc3RlbmNlVHlwZV9TZXQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY0RlZmF1bHRBdXRob3I9SmF2YWRvY0RlZmF1bHRBdXRob3IKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldD1FSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19CTVBfRXh0ZW5kX0NNUD1CTVBfRXh0ZW5kX0NNUAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCUGVyc2lzdGVuY2VUeXBlPUVKQlBlcnNpc3RlbmNlVHlwZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0dlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yPUdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldF9fU3RhdGVmdWw9U3RhdGVmdWwKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUZpbmFsaXplcj1HZW5lcmF0ZUZpbmFsaXplcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wYWNrYWdlPXBhY2thZ2UKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXI9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1Jvc2VEZWZhdWx0Q29tbWVudFN0eWxlPVJvc2VEZWZhdWx0Q29tbWVudFN0eWxlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0dlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yPUdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXI9R2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlZlcnNpb249RUpCVmVyc2lvbgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0dlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplcj1HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQk5hbWVJbkpBUj1FSkJOYW1lSW5KQVIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRDb250ZXh0UmVmPVNlcnZsZXRDb250ZXh0UmVmCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQ9RUpCU2Vzc2lvblR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0X18xLng9MS54Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19SZWZlcmVuY2VDbGFzc3BhdGg9UmVmZXJlbmNlQ2xhc3NwYXRoCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXRfX0NvbnRhaW5lcj1Db250YWluZXIKLUphdmFfX2RlZmF1bHRfX1JvbGVfX0luZGl2aWR1YWxDaGFuZ2VNZ3Q9SW5kaXZpZHVhbENoYW5nZU1ndAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldENvbnRleHRSZWY9U2VydmxldENvbnRleHRSZWYKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQk5hbWVJbkpBUj1FSkJOYW1lSW5KQVIKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzPU1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19NYXhOdW1DaGFycz1NYXhOdW1DaGFycwotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlX19UcmFuc2llbnQ9VHJhbnNpZW50Ci1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXI9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19SZWFkT25seT1SZWFkT25seQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSG9tZVByZWZpeD1Ib21lUHJlZml4Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0NvbnN0cnVjdG9ySXM9Q29uc3RydWN0b3JJcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVmVyc2lvbl9TZXRfXzEueD0xLngKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJUcmFuc2FjdGlvblR5cGU9RUpCVHJhbnNhY3Rpb25UeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXI9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXM9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEhlYWRlcj1TZXJ2bGV0SGVhZGVyCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1JlYWRPbmx5PVJlYWRPbmx5Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3BhY2thZ2U9cGFja2FnZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0X18yLjA9Mi4wCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0PUVKQlBlcnNpc3RlbmNlVHlwZV9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXM9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJFbnZpcm9ubWVudFByb3BlcnRpZXM9RUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SGVhZGVyPVNlcnZsZXRIZWFkZXIKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRnZXRJbmZvPVNlcnZsZXRnZXRJbmZvCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRnZXRJbmZvPVNlcnZsZXRnZXRJbmZvCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Mb2NhbFN1ZmZpeD1Mb2NhbFN1ZmZpeAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fT3BlbkJyYWNlTWV0aG9kU3R5bGU9T3BlbkJyYWNlTWV0aG9kU3R5bGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQkNtcEZpZWxkPUVKQkNtcEZpZWxkCi1KYXZhX19kZWZhdWx0X19DbGFzc19fTWV0aG9kRm9yQ29va2llPU1ldGhvZEZvckNvb2tpZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXRfX0JlYW49QmVhbgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0TmFtZT1TZXJ2bGV0TmFtZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGU9RWRpdG9yVHlwZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXI9R2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUNvZGU9R2VuZXJhdGVDb2RlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19HZW5lcmF0ZVJvc2VJRD1HZW5lcmF0ZVJvc2VJRAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCWE1MRmlsZVBhdGg9RUpCWE1MRmlsZVBhdGgKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQ9RUpCVHJhbnNhY3Rpb25UeXBlX1NldAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJYTUxGaWxlUGF0aD1FSkJYTUxGaWxlUGF0aAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzPUVKQkVudmlyb25tZW50UHJvcGVydGllcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fTG9jYWxIb21lU3VmZml4PUxvY2FsSG9tZVN1ZmZpeAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXRfX0NvbnRhaW5lcj1Db250YWluZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdOYW1lMz1Vc2VyRGVmaW5lVGFnTmFtZTMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdOYW1lMj1Vc2VyRGVmaW5lVGFnTmFtZTIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdOYW1lMT1Vc2VyRGVmaW5lVGFnTmFtZTEKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVmVyc2lvbl9TZXQ9RUpCVmVyc2lvbl9TZXQKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3M9SHR0cF9TZXJ2bGV0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0WE1MRmlsZVBhdGg9U2VydmxldFhNTEZpbGVQYXRoCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldD1DdG9yX1NldAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fRWRpdG9yPUVkaXRvcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fT3BlbkJyYWNlQ2xhc3NTdHlsZT1PcGVuQnJhY2VDbGFzc1N0eWxlCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19Cb3VuZD1Cb3VuZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NDdG9yX1NldD1DdG9yX1NldAotSmF2YV9fZGVmYXVsdF9fTW9kdWxlU3BlY19fQ29weXJpZ2h0Tm90aWNlPUNvcHlyaWdodE5vdGljZQotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlPWRlZmF1bHQKLUphdmFfX2RlZmF1bHRfX1JvbGVSZWFkV3JpdGVfU2V0PVJlYWQvV3JpdGVfU2V0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19KYXZhZG9jVmVyc2lvbj1KYXZhZG9jVmVyc2lvbgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdFZNVHlwZT1WTVR5cGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0SW50SGVhZGVyPVNlcnZsZXRJbnRIZWFkZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0PUVKQlBlcnNpc3RlbmNlVHlwZV9TZXQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGg9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fUmVhZE9ubHk9UmVhZE9ubHkKLUphdmFfX2RlZmF1bHRfX1JvbGVSZWFkV3JpdGVfU2V0X19SZWFkXCAmXCBXcml0ZT1SZWFkICYgV3JpdGUKLUphdmFfX2RlZmF1bHRfX01vZHVsZUJvZHk9ZGVmYXVsdAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NDdG9yX1NldF9fcGFja2FnZT1wYWNrYWdlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fSXNTaW5nbGVUaHJlYWQ9SXNTaW5nbGVUaHJlYWQKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0dlbmVyYXRlRGVmYXVsdFJldHVybkxpbmU9R2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0dlbmVyYXRlQ29kZT1HZW5lcmF0ZUNvZGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19NZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycz1NZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycwotSmF2YV9fZGVmYXVsdF9fQ2xhc3M9ZGVmYXVsdAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzQ3Rvcl9TZXRfX3ByaXZhdGU9cHJpdmF0ZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3I9R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJc1NlY3VyZT1TZXJ2bGV0SXNTZWN1cmUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TdHJpY3RmcD1TdHJpY3RmcAotSmF2YV9fZGVmYXVsdF9fUm9sZV9fVm9sYXRpbGU9Vm9sYXRpbGUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlNlc3Npb25TeW5jPUVKQlNlc3Npb25TeW5jCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlNlY3VyaXR5Um9sZXM9RUpCU2VjdXJpdHlSb2xlcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJTZXNzaW9uU3luYz1FSkJTZXNzaW9uU3luYwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQXN0ZXJpc2tDb21tZW50U3R5bGU9QXN0ZXJpc2tDb21tZW50U3R5bGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXRfX1N0YXRlZnVsPVN0YXRlZnVsCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SW50SGVhZGVyPVNlcnZsZXRJbnRIZWFkZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0PUVKQlRyYW5zYWN0aW9uVHlwZV9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXM9TWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0ZpbmFsPUZpbmFsCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJSZWVudHJhbnQ9RUpCUmVlbnRyYW50Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXRfXzEueD0xLngKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFDb21tZW50U3R5bGU9SmF2YUNvbW1lbnRTdHlsZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCUmVmZXJlbmNlcz1FSkJSZWZlcmVuY2VzCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19TaW1wbGU9U2ltcGxlCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZT1TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplcj1HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRIZWFkZXI9U2VydmxldEhlYWRlcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVmVyc2lvbl9TZXQ9RUpCVmVyc2lvbl9TZXQKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0RlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZT1EZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRnZXRJbmZvPVNlcnZsZXRnZXRJbmZvCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJDbXBGaWVsZD1FSkJDbXBGaWVsZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRIZWFkZXJOYW1lcz1TZXJ2bGV0SGVhZGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXROYW1lPVNlcnZsZXROYW1lCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcz1TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcwotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlQmVhblByb3BlcnR5X1NldD1CZWFuUHJvcGVydHlfU2V0Ci1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX1N5bmNocm9uaXplZD1TeW5jaHJvbml6ZWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRDb250ZW50VHlwZT1TZXJ2bGV0Q29udGVudFR5cGUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlNlc3Npb25UeXBlPUVKQlNlc3Npb25UeXBlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQlNlc3Npb25UeXBlPUVKQlNlc3Npb25UeXBlCi1KYXZhX19kZWZhdWx0X19Nb2R1bGVCb2R5X19Db3B5cmlnaHROb3RpY2U9Q29weXJpZ2h0Tm90aWNlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRmluYWw9RmluYWwKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXM9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZUNvZGU9R2VuZXJhdGVDb2RlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJYTUxGaWxlUGF0aD1FSkJYTUxGaWxlUGF0aAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2M9R2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFJlcXVlc3REaXNwYXRjaGVyPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGVfX0J1aWx0SW49QnVpbHRJbgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXI9U2VydmxldEluaXRQYXJhbWV0ZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZV9YTUxfREQ9R2VuZXJhdGVfWE1MX0RECi1KYXZhX19kZWZhdWx0X19DbGFzc19fRGlzYWJsZUF1dG9TeW5jPURpc2FibGVBdXRvU3luYwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyPVNlcnZsZXRJbml0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0X19Ob3RcIEFcIFByb3BlcnR5PU5vdCBBIFByb3BlcnR5Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TdHJpY3RmcD1TdHJpY3RmcAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCQ254RmFjdG9yeT1FSkJDbnhGYWN0b3J5Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19DcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXM9Q3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fQ29uc3RydWN0b3JJcz1Db25zdHJ1Y3RvcklzCi1KYXZhX19kZWZhdWx0X19Sb2xlX19HZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXM9R2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19EaXNwYXRjaGVyRm9yd2FyZD1EaXNwYXRjaGVyRm9yd2FyZAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCQ254RmFjdG9yeT1FSkJDbnhGYWN0b3J5Ci1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX1Byb3BlcnR5VHlwZT1Qcm9wZXJ0eVR5cGUKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldFhNTEZpbGVQYXRoPVNlcnZsZXRYTUxGaWxlUGF0aAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXRfX0NvbnRhaW5lcj1Db250YWluZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0Q29udGVudFR5cGU9U2VydmxldENvbnRlbnRUeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWxlc3M9U3RhdGVsZXNzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fQk1QX0V4dGVuZF9DTVA9Qk1QX0V4dGVuZF9DTVAKLT0KLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFkb2NBdXRob3I9SmF2YWRvY0F1dGhvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvVmlydHVhbFBhdGhBUEkuZW14IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvVmlydHVhbFBhdGhBUEkuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2UwMjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL1ZpcnR1YWxQYXRoQVBJLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPHVtbDpNb2RlbCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL05vdGF0aW9uIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8xLjAuMC9VTUwiIHhtbG5zOnVtbG5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL1VtbG5vdGF0aW9uIiB4bWk6aWQ9Il9YUDJrY0xxdkVkbVR3TGNMa3BBSFB3IiBuYW1lPSJWaXJ0dWFsUGF0aEFQSSIgYXBwbGllZFByb2ZpbGU9Il9YU2lGQUxxdkVkbVR3TGNMa3BBSFB3IF9YVVA4UUxxdkVkbVR3TGNMa3BBSFB3IF9YVTBrQUxxdkVkbVR3TGNMa3BBSFB3IF9YV29oNExxdkVkbVR3TGNMa3BBSFB3IF9YWnNjOExxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YUDJrY2JxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il9YUDJrY3JxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX1hQMmtjcnF2RWRtVHdMY0xrcEFIUHciIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4UG1zTHNhRWRtcm1jaWwxQngwNHcgX3N4UG11THNhRWRtcm1jaWwxQngwNHciIHRhcmdldEVkZ2VzPSJfc3hiel9ic2FFZG1ybWNpbDFCeDA0dyBfc3hoNmtyc2FFZG1ybWNpbDFCeDA0dyBfc3hvQk9Mc2FFZG1ybWNpbDFCeDA0dyBfc3gwT2NMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTUdTUUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9zTUdTUWJzYUVkbXJtY2lsMUJ4MDR3IiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc01HU1Fyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NNR1NRN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTUdTUkxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc00zSFFMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zTTNIUWJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NNOU40THNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc005TjRic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTTlONHJzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zTTlONDdzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9zTG5LRWJzYUVkbXJtY2lsMUJ4MDR3IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9zTG5LRXJzYUVkbXJtY2lsMUJ4MDR3IiB4PSIzMTgiIHk9IjI1NDQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1VMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeFZ0VWJzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXRFZGdlcz0iX3N4dUgwTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1U3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9za0VHVkxzYUVkbXJtY2lsMUJ4MDR3IiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1Zic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1Zyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1Y3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1dMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9za0VHV2JzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tFR1dyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9za0VHVzdzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2tLTThMc2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2tLTThic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9za0VHVWJzYUVkbXJtY2lsMUJ4MDR3IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NrRUdVcnNhRWRtcm1jaWwxQngwNHciIHg9IjgyNjgiIHk9IjE0NjI4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTBzTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZUVkZ2VzPSJfc3hWdFdMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0RWRnZXM9Il9zeHVINExzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTBzN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc2t1MHRMc2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB0YnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB0cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB0N3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB1THNhRWRtcm1jaWwxQngwNHciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2t1MHVic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB1cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2t1MHU3c2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrdTB2THNhRWRtcm1jaWwxQngwNHciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NrdTB2YnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfc2t1MHNic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9za3Uwc3JzYUVkbXJtY2lsMUJ4MDR3IiB4PSIyMDAzNCIgeT0iMjU0NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbC1LMExzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NsLUswN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc2wtSzFMc2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2wtSzFic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc21FUmNMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc21FUmNic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zbUVSY3JzYUVkbXJtY2lsMUJ4MDR3IiBmaWx0ZXJpbmc9Ik1hbnVhbCI+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9bmFtZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgaHJlZj0idml6cmVmOi8vLyNqZmllbGRedmNvcmUudGFyZ2V0PXVtbDIuUHJvcGVydHlebmFtZT10b1N0cmluZ1tqc3JjdHlwZV5uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgaHJlZj0idml6cmVmOi8vLyNqZmllbGRedmNvcmUudGFyZ2V0PXVtbDIuUHJvcGVydHlebmFtZT1oYXNoQ29kZVtqc3JjdHlwZV5uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L3N0eWxlcz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbUVSYzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NtRVJkTHNhRWRtcm1jaWwxQngwNHciIGZpbHRlcmluZz0iTWFudWFsIj4KLSAgICAgICAgICAgIDxmaWx0ZXJlZE9iamVjdHMgeG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIGhyZWY9InZpenJlZjovLy8jam1ldGhvZF52Y29yZS50YXJnZXQ9dW1sMi5PcGVyYXRpb25ebmFtZT1Db21wb25lbnRIYW5kbGVec2lnbj0oUUlQcm9qZWN0JTNiUVN0cmluZyUzYilWW2pzcmN0eXBlXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvc3R5bGVzPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NtRVJkYnNhRWRtcm1jaWwxQngwNHciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NtRVJkcnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbk9JQUxzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc25PSUFic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfc2wtSzBic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc2wtSzByc2FFZG1ybWNpbDFCeDA0dyIgeD0iMTM2NzQiIHk9IjI1NDQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FMVllMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeGJ6X2JzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXRFZGdlcz0iX3N4b0JNTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FMVlk3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NxTFZaTHNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcUxWWmJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxTFZacnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FSY0FMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcVJjQWJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxUmNBcnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxUmNBN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3FSY0JMc2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FSY0Jic2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3FSY0Jyc2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3NxTFZZYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9zcUxWWXJzYUVkbXJtY2lsMUJ4MDR3IiB4PSIxNTkwIiB5PSIxNDYyOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4aDZrcnNhRWRtcm1jaWwxQngwNHcgX3N4b0JNTHNhRWRtcm1jaWwxQngwNHcgX3N4b0JPTHNhRWRtcm1jaWwxQngwNHcgX3N4dUgwTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldEVkZ2VzPSJfc3hQbXVMc2FFZG1ybWNpbDFCeDA0dyBfc3hWdFVic2FFZG1ybWNpbDFCeDA0dyBfc3gwT2VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEd0xzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NxMkR3YnNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEd3JzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEdzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeExzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxMkR4cnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxMkR5THNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcTJEeWJzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zcTJEeXJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3NxdjlJYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc3F2OUlyc2FFZG1ybWNpbDFCeDA0dyIgeD0iODU4NiIgeT0iMjU0NCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwWUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4dUgyTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMFk3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc3NkMFpMc2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NzZDBaYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwWnJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMFo3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NzZDBhTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3NkMGFic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwYXJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NzZDBhN3NhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMGJMc2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3NkMGJic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfc3NkMFlic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc3NkMFlyc2FFZG1ybWNpbDFCeDA0dyIgeD0iMjAwMzQiIHk9IjEwODEyIiB3aWR0aD0iNDg3MSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4dUg0THNhRWRtcm1jaWwxQngwNHcgX3N4ME9jTHNhRWRtcm1jaWwxQngwNHcgX3N4ME9lTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldEVkZ2VzPSJfc3hQbXNMc2FFZG1ybWNpbDFCeDA0dyBfc3hWdFdMc2FFZG1ybWNpbDFCeDA0dyBfc3h1SDJMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRYzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3N0UFFkTHNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZHJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFBRZUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3N0UFFlYnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFZYRUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3N0VlhFYnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zdFZYRXJzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zdFZYRTdzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3N0UFFjYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc3RQUWNyc2FFZG1ybWNpbDFCeDA0dyIgeD0iMTM2NzQiIHk9IjkyMjIiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX1hQMmtjN3F2RWRtVHdMY0xrcEFIUHciLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeFBtc0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG1zN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG10YnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFBtdDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hQbXRyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4UG10THNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4UG1zYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeFBtc3JzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlszMjU0LCA0NDQ1LCAtOTc2MywgMTAwNV0kWzY3NzMsIDQ0NDUsIC02MjQ0LCAxMDA1XSRbNjc3MywgNDM5MywgLTYyNDQsIDk1M10kWzEwNzE2LCA0MzkzLCAtMjMwMSwgOTUzXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeFBtdUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG11N3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG12YnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFZ0VUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hQbXZyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4UG12THNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4UG11YnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeFBtdXJzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlszMjU0LCAtMzE0OCwgLTM5OTYsIC01MjldJFs1MzE4LCAtMzE0OCwgLTE5MzIsIC01MjldIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4VnRVYnNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NrRUdVTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NxdjlJTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hWdFZMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hWdFZyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hWdFY3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeFZ0VmJzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeFZ0VXJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeFZ0VTdzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlsxMzIsIC0xMDg1LCAtMjY1LCAxMDc5NV0kWzEzMiwgLTg2NzgsIC0yNjUsIDMyMDJdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4VnRXTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NrdTBzTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejhMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejhyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejlMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiejg3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeGJ6OGJzYUVkbXJtY2lsMUJ4MDR3IiB4PSItOTgiIHk9IjMzOCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3hWdFdic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3hWdFdyc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbLTMxNzUsIDU4MywgMzc1OCwgLTYwMzJdJFstNDE4MSwgNTgzLCAyNzUyLCAtNjAzMl0kWy00MTgxLCA0NTUxLCAyNzUyLCAtMjA2NF0kWy00NjU3LCA0NTUxLCAyMjc2LCAtMjA2NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hiel9ic2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3FMVllMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGIwQUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2a0xzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2a2JzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4YjBBYnNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4YnpfcnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4YnpfN3NhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWzc0MSwgLTEwNTgsIC0yMTQzLCAxNTIxNF0kWzc0MSwgLTEwNDc4LCAtMjE0MywgNTc5NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hoNmtyc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2bGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2bDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hoNm1ic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4aDZtTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeGg2bHJzYUVkbXJtY2lsMUJ4MDR3IiB4PSI4MSIgeT0iLTEwNzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4aDZrN3NhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeGg2bExzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlsxNDgxLCAtMzE3NSwgMjM4MSwgNzQ4OF0kWzE0ODEsIC00ODY5LCAyMzgxLCA1Nzk0XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeG9CTUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zcUxWWUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JNN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JOYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hvQk43c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CTnJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeG9CTkxzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeG9CTWJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4b0JNcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0xNTg3LCAzMjAyLCA1MzcyLCAtNjc3M10kWy0xNTg3LCA0MTU0LCA1MzcyLCAtNTgyMV0kWy0yOTEwLCA0MTU0LCA0MDQ5LCAtNTgyMV0kWy0yOTEwLCA5OTQ4LCA0MDQ5LCAtMjddJFstNDk3NCwgOTk0OCwgMTk4NSwgLTI3XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeG9CT0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JPN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JQYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CUHJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3hvQlBMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3hvQk9ic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4b0JPcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy04MCwgLTMxNzUsIDgyMCwgNzQ4OF0kWy04MCwgLTQ4NjksIDgyMCwgNTc5NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3h1SDBMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc2tFR1VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMWJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMTdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMXJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4dUgxTHNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4dUgwYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4dUgwcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy05NzksIDMyMDIsIC05MDAsIC02NzczXSRbLTk3OSwgODg5MCwgLTkwMCwgLTEwODVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4dUgyTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NzZDBZTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDI3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDNic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUgzN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIM3JzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3h1SDNMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3h1SDJic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4dUgycnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0xLCAzMjAxLCAtNzY4LCAtNDE1NV0kWzc2NywgNDc4OSwgMCwgLTI1NjddIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4dUg0THNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NrdTBzTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDQ3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDVic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDU3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDVyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeHVINUxzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeHVINGJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeHVINHJzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlsyMjc2LCAtMTM0OSwgLTQ2NTcsIDUyNjZdJFszMTI1LCAtMTM0OSwgLTM4MDgsIDUyNjZdJFszMTI1LCAtNTUwMywgLTM4MDgsIDExMTJdJFszMTI1LCAtNTUzMCwgLTM4MDgsIDEwODVdJFszNzU4LCAtNTUzMCwgLTMxNzUsIDEwODVdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4ME9jTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3N0UFFjTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NMbktFTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3gwT2M3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3gwT2Ric2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9kN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeDBPZHJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3gwT2RMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3gwT2Nic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4ME9jcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0yMjc1LCAxNzk5LCAxMDc0MiwgNTIzOV0kWy05NzYzLCAxNzk5LCAzMjU0LCA1MjM5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeDBPZUxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9lN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9mYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4NlZFTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3gwT2ZMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3gwT2Vic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3gwT2Vyc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbLTIyNzUsIC0xMjE3LCAzNDkyLCA0ODQyXSRbLTQ3MDksIC0xMjE3LCAxMDU4LCA0ODQyXSRbLTQ3MDksIC0yODU3LCAxMDU4LCAzMjAyXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICA8L2NvbnRlbnRzPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX1hTaUZBTHF2RWRtVHdMY0xrcEFIUHciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFNpRkFicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX1hTaUZBcnF2RWRtVHdMY0xrcEFIUHciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9CYXNpYy5wcm9maWxlLnVtbDIjXzZtRlJnSzg2RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfWFVQOFFMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YVVA4UWJxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfWFVvV3dMcXZFZG1Ud0xjTGtwQUhQdyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9JbnRlcm1lZGlhdGUucHJvZmlsZS51bWwyI19Dejdjc0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX1hVMGtBTHF2RWRtVHdMY0xrcEFIUHciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFUwa0FicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX1hVMGtBcnF2RWRtVHdMY0xrcEFIUHciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gICAgPGltcG9ydGVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9Db21wbGV0ZS5wcm9maWxlLnVtbDIjX003cFRrSzg3RWRpaDktR0c1YWZRMGciLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfWFdvaDRMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YV29oNGJxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfWFdvaDRycXZFZG1Ud0xjTGtwQUhQdyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfWFpzYzhMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9YWnNjOGJxdkVkbVR3TGNMa3BBSFB3IiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfWFpzYzhycXZFZG1Ud0xjTGtwQUhQdyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudCIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9YaVNZUUxxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19FZlJab0s4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX1dadkhRTHNjRWRtcm1jaWwxQngwNHciIG5hbWU9IkVudW1lcmF0aW9uMSIvPgotPC91bWw6TW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmVjb3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMzhjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9jb21wb25lbnRDb3JlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iY29tcG9uZW50Y29yZSIKLSAgICBuc1VSST0iY29tcG9uZW50Y29yZS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtiZW5jaENvbXBvbmVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29tcG9uZW50UmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0NvbXBvbmVudFJlc291cmNlL2NvbXBvbmVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21wb25lbnRUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQ29tcG9uZW50VHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZENvbXBvbmVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVmZXJlbmNlZENvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9wZXJ0eSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRhZGF0YVJlc291cmNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JUGF0aCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb25lbnRSZXNvdXJjZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZVBhdGgiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JUGF0aCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJydW50aW1lUGF0aCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0lQYXRoIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1c2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tcG9uZW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV29ya2JlbmNoQ29tcG9uZW50IiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaENvbXBvbmVudC9yZXNvdXJjZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VUeXBlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFnIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IklQYXRoIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMga2V5PSJkYXRhdHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb25lbnRUeXBlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tcG9uZW50VHlwZUlkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnRpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJvcGVydHkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0YWRhdGFSZXNvdXJjZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVBhdGgiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWZlcmVuY2VkQ29tcG9uZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFuZGxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJ1bnRpbWVQYXRoIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vSVBhdGgiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwZW5kZW5jeVR5cGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXBlbmRlbmN5VHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXBlbmRlbnRPYmplY3QiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXJjaGl2ZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZGF0YXR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEZXBlbmRlbmN5VHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ1c2VzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb25zdW1lcyIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvamVjdENvbXBvbmVudHMiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbXBvbmVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya2JlbmNoQ29tcG9uZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL2NvbXBvbmVudENvcmUuZW14IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYzQ4YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTx1bWw6TW9kZWwgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpEZWZhdWx0XzA9Imh0dHA6Ly8vRGVmYXVsdF8wLnByb2ZpbGUudW1sMiIgeG1sbnM6RWNvcmVfMD0iaHR0cDovLy9FY29yZV8wLnByb2ZpbGUudW1sMiIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjAvTm90YXRpb24iIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzEuMC4wL1VNTCIgeG1sbnM6dW1sbm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjAvVW1sbm90YXRpb24iIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovLy9EZWZhdWx0XzAucHJvZmlsZS51bWwyIHBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYkE3UGM5V0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0LyUzQ0VQYWNrYWdlJTNFIGh0dHA6Ly8vRWNvcmVfMC5wcm9maWxlLnVtbDIgcGF0aG1hcDovL1VNTDJfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwyI192OVZVc0s4N0VkaTVRcFllWV95SXBnIiB4bWk6aWQ9IjNBMEIyNDc0MDI1RiIgbmFtZT0iY29tcG9uZW50Y29yZSIgYXBwbGllZFByb2ZpbGU9Il9rTURHNFpUWUVkbXkyb25IWUtsQUJnIF9rTURHNUpUWUVkbXkyb25IWUtsQUJnIF9rTURHNTVUWUVkbXkyb25IWUtsQUJnIF9rTURHNnBUWUVkbXkyb25IWUtsQUJnIF9rTURHN1pUWUVkbXkyb25IWUtsQUJnIF9rTUpOZzVUWUVkbXkyb25IWUtsQUJnIF9rTnEzZ1pUWUVkbXkyb25IWUtsQUJnIF9IMHllOEpUdkVkbUROWTZsbkdBZzVBIj4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTUpOaHBUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImFwcGxpZWRTdGVyZW90eXBlcyI+Ci0gICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJFY29yZV8wOkVjb3JlX19FUGFja2FnZSIgeG1pOmlkPSJfeERaTXdKVFlFZG15Mm9uSFlLbEFCZyIgbnNVUkk9ImNvbXBvbmVudGNvcmUueG1pIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbiIgcHJlZml4PSJDb21wb25lbnRDb3JlIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tOcTNoSlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXBwbGllZFN0ZXJlb3R5cGVzIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9IkVjb3JlXzA6RWNvcmVfX0VQYWNrYWdlIiB4bWk6aWQ9Il9rTnEzaFpUWUVkbXkyb25IWUtsQUJnIiBuc1VSST0ibW9kdWxlY29yZS54bWkiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIiBwcmVmaXg9Ik1vZHVsZUNvcmUiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa09WbDlKVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0EwQjI0NzQwMjVGNDFFM0RGMDYwMjEwIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRTNERjA2MDIxMCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkNvbXBvbmVudENvcmUiPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tQMzI4SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5vdGUiIHNvdXJjZUVkZ2VzPSJfa1FpbFlwVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUDk5a0pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJEaWFncmFtTmFtZSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1A5OWtaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfa1AzMjhaVFlFZG15Mm9uSFlLbEFCZyIgZGVzY3JpcHRpb249IlRoZSBSZWZlcmVuY2VkQ29tcG9uZW50IGhhbmRsZSBtdXN0IGJlIHJlc29sdmFibGUgdG8gYSBXb3JrYmVuY2hDb21wb25lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcnVudGltZVBhdGggc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgUmVmZXJlbmNlZENvbXBvbmVudCBpbiB0aGUgcnVudGltZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRhaW5pbmcgV29ya2JlbmNoQ29tcG9uZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlcGVuZGVuY3lUeXBlIHNwZWNpZmllcyBob3cgdGhlIFJlZmVyZW5jZWRDb21wb25lbnQgaXMgYXNzZW1ibGVkIHdpdGhpbiB0aGUgY29udGFpbmluZyBXb3JrYmVuY2hDb21wb25lbnQuIiBmaWxsQ29sb3I9IjEzMzY5MzQzIiBsaW5lQ29sb3I9IjY3MzcxNTEiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1AzMjhwVFlFZG15Mm9uSFlLbEFCZyIgeD0iMTkzOTgiIHk9IjYzNiIgd2lkdGg9IjY5MzQiIGhlaWdodD0iNDM0MyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFTlpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXRFZGdlcz0iX2JOaHY0SlRjRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRU9KVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRRUVPWlRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSI3OTQxIiBoZWlnaHQ9IjIwNDgiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVPcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVPNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVQSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVQWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVBwVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVA1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFUUpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRRUVOcFRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRRUVONVRZRWRteTJvbkhZS2xBQmciIHg9IjEyMjg1IiB5PSIxNTQ3MiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFUVpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXRFZGdlcz0iX2tRS0s3cFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVJKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRRUVSWlRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSI0ODU5IiBoZWlnaHQ9IjI0MjEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVScFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVSNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVTSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNjcwMDM5Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVNaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVNwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFUzVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVEpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFVFpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVHBUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVQ1VFlFZG15Mm9uSFlLbEFCZyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rUUVFUXBUWUVkbXkyb25IWUtsQUJnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dTdGVyZW90eXBlPSJJbWFnZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rUUVFUTVUWUVkbXkyb25IWUtsQUJnIiB4PSI1OTY5IiB5PSIxNjA5OSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVUpUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2VFZGdlcz0iX0I0YkkwSlRjRWRteTJvbkhZS2xBQmcgX2JOaHY0SlRjRWRteTJvbkhZS2xBQmciIHRhcmdldEVkZ2VzPSJfa1FXWUhwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVTVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfa1FFRVZKVFlFZG15Mm9uSFlLbEFCZyIgd2lkdGg9IjYwMjgiIGhlaWdodD0iMTk5OCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVZaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVZwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVY1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ1MTAzRTIiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFV0pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFV1pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVXcFRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVXNVRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVYSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVYWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFWHBUWUVkbXkyb25IWUtsQUJnIiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRRUVVWlRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRRUVVcFRZRWRteTJvbkhZS2xBQmciIHg9IjExNDQ4IiB5PSIxMTEzMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFWDVUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2VFZGdlcz0iX2tRV1lQcFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVlwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRRUVZNVRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSIzNzQyIiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVaSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVaWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVacFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY2REIwMjUxIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVo1VFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRWFKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFYVpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFYXBUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFYTVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFYkpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRWJaVFlFZG15Mm9uSFlLbEFCZyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rUUVFWUpUWUVkbXkyb25IWUtsQUJnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dTdGVyZW90eXBlPSJJbWFnZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rUUVFWVpUWUVkbXkyb25IWUtsQUJnIiB4PSIxNjUxIiB5PSI0ODcyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0swSlRZRWRteTJvbkhZS2xBQmciIHRhcmdldEVkZ2VzPSJfa1FjZXdwVFlFZG15Mm9uSFlLbEFCZyBfa1FpbFlwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLMDVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfa1FLSzFKVFlFZG15Mm9uSFlLbEFCZyIgd2lkdGg9IjYxNDYiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzFaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzFwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzE1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY2QzI0QjAyM0QiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUtLMkpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLMlpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0sycFRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0syNVRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0szSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0szWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUtLM3BUWUVkbXkyb25IWUtsQUJnIiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRS0swWlRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRS0swcFRZRWRteTJvbkhZS2xBQmciIHg9IjEyNDAyIiB5PSI0MTM0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0szNVRZRWRteTJvbkhZS2xBQmciIHNvdXJjZUVkZ2VzPSJfa1FLSzdwVFlFZG15Mm9uSFlLbEFCZyBfa1FXWUhwVFlFZG15Mm9uSFlLbEFCZyBfa1FjZXdwVFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0RWRnZXM9Il9rUVdZUHBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s0cFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rUUtLNDVUWUVkbXkyb25IWUtsQUJnIiB3aWR0aD0iNDA4MCIgaGVpZ2h0PSIxOTk4Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLNUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLNVpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLNXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjU4MDFGQSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0s1NVRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s2SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzZaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzZwVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzY1VFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzdKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0s3WlRZRWRteTJvbkhZS2xBQmciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfa1FLSzRKVFlFZG15Mm9uSFlLbEFCZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93U3RlcmVvdHlwZT0iSW1hZ2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1FLSzRaVFlFZG15Mm9uSFlLbEFCZyIgeD0iNTk1MiIgeT0iNzkxMSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsVkpUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxWNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rUWlsV0pUWUVkbXkyb25IWUtsQUJnIiB3aWR0aD0iMzA4MSIgaGVpZ2h0PSIyNDcyIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsV1pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsV3BUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJLaW5kIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsVzVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsWEpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJFbnVtZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FpbFhaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FpbFhwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUWlsWDVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsWUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDM5NEY1MDE4NSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRaWxZWlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfa1FpbFZaVFlFZG15Mm9uSFlLbEFCZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93U3RlcmVvdHlwZT0iSW1hZ2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1FpbFZwVFlFZG15Mm9uSFlLbEFCZyIgeD0iMTk3MTYiIHk9IjczMTQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFFKVGJFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0RWRnZXM9Il9CNGJJMEpUY0VkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsUTVUYkVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzVCVWxSSlRiRWRteTJvbkhZS2xBQmciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzVCVWxSWlRiRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsUnBUYkVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFI1VGJFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNUJVbFNKVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFNaVGJFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNUJVbFNwVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFM1VGJFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50IiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzVCVWxUSlRiRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzVCVWxUWlRiRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzVCQ1JZSlRiRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNUJVbFRwVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il81QlVsUVpUYkVkbXkyb25IWUtsQUJnIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNUJVbFFwVGJFZG15Mm9uSFlLbEFCZyIgeD0iMTkwODAiIHk9IjExMTMwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lRN1JrS1MzRWRtdFE0VGNrdjVTMlEiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllNS1MzRWRtdFE0VGNrdjVTMlEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSVJCWU1hUzNFZG10UTRUY2t2NVMyUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU1xUzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllNNlMzRWRtdFE0VGNrdjVTMlEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZTktTM0VkbXRRNFRja3Y1UzJRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU5hUzNFZG10UTRUY2t2NVMyUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0lSQllOcVMzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllONlMzRWRtdFE0VGNrdjVTMlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JUkJZT0tTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZT2FTM0VkbXRRNFRja3Y1UzJRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSVJCWU9xUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU82UzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iUmVxdWlyZWRJbnRlcmZhY2VMaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSVJCWVBLUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWVBhUzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSVJCWVBxUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWVA2UzNFZG10UTRUY2t2NVMyUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JUkJZUUtTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbXBvbmVudFN0eWxlIiB4bWk6aWQ9Il9JUTdSa2FTM0VkbXRRNFRja3Y1UzJRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVE3UmtxUzNFZG10UTRUY2t2NVMyUSIgeD0iMTkwNTAiIHk9IjE2MDA3Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9rT1ZsOXBUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfa1FLSzdwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTRCMDFFMyIgc291cmNlPSJfa1FLSzM1VFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0PSJfa1FFRVFaVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLOFpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0QjAxRTMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVFSY0pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRUVJjWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUUtLOHBUWUVkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVFSY3BUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FRUmRKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUYiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRUVJjNVRZRWRteTJvbkhZS2xBQmciIHg9Ii0yNTkiIHk9Ii0yNjQiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRUVJkWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FRUmQ1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVFSZHBUWUVkbXkyb25IWUtsQUJnIiB4PSIyMTgiIHk9Ii0xMTY0Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZRUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZRXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFEIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZRVpUWUVkbXkyb25IWUtsQUJnIiB4PSIzNDUiIHk9Ii0yNjMiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lFNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZRlpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUZKVFlFZG15Mm9uSFlLbEFCZyIgeD0iNjYzIiB5PSItMTAxNyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUZwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lHSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZR1pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lGNVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lHcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lISlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFEIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZSFpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lHNVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRS0s3NVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9rUUtLOEpUWUVkbXkyb25IWUtsQUJnIiBwb2ludHM9IlstMzMsIDk5OSwgLTQ0MCwgLTczOTldJFstMzMsIDcxODgsIC00NDAsIC0xMjEwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9rUVdZSHBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTgwMkMyIiBzb3VyY2U9Il9rUUtLMzVUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUVFVUpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lJWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lJNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5ODAyQzIiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUpKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5ODAyQzIiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lJcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lKWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUo1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDMiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lKcFRZRWRteTJvbkhZS2xBQmciIHk9IjM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUtKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUtwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZS1pUWUVkbXkyb25IWUtsQUJnIiB5PSItMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZSzVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZTFpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQxIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZTEpUWUVkbXkyb25IWUtsQUJnIiB4PSItMTAiIHk9Ii0zMDEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lMcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZTUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUw1VFlFZG15Mm9uSFlLbEFCZyIgeD0iNDk0IiB5PSItMTU3MSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWU1aVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lNNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZTkpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lNcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lOWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lONVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQxIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZT0pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lOcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRV1lINVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9rUVdZSUpUWUVkbXkyb25IWUtsQUJnIiBwb2ludHM9IlsyMDQwLCAzMzAsIC01NjgxLCAtMjkyMV0kWzc3MzAsIDMzMCwgOCwgLTI5MjFdJFs3NzMwLCAyMjUyLCA4LCAtOTk5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9rUVdZUHBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4IiBzb3VyY2U9Il9rUUVFWDVUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUtLMzVUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lRWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIwMDBFOCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lRNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWVJKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lRcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lSWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXNKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTMiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lScFRZRWRteTJvbkhZS2xBQmciIHk9IjM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXNaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXM1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWNlc3BUWUVkbXkyb25IWUtsQUJnIiB5PSItMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldEpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldHBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWNldFpUWUVkbXkyb25IWUtsQUJnIiB4PSItMTU2OCIgeT0iNTE2Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldDVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXVaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V1SlRZRWRteTJvbkhZS2xBQmciIHg9Ii02MDIiIHk9IjgzNCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXVwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V2SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUWNldlpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V1NVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V2cFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V3SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUWNld1pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V2NVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRV1lQNVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9rUVdZUUpUWUVkbXkyb25IWUtsQUJnIiBwb2ludHM9IlstNzcwLCA3ODcsIC01MjQwLCAtMjQ2M10kWy03NzAsIDI3MzQsIC01MjQwLCAtNTE2XSRbMjQyOSwgMjczNCwgLTIwNDAsIC01MTZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2tRY2V3cFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNTAyRTIiIHNvdXJjZT0iX2tRS0szNVRZRWRteTJvbkhZS2xBQmciIHRhcmdldD0iX2tRS0swSlRZRWRteTJvbkhZS2xBQmciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXhaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXg1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE1MDJFMiIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNleUpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE1MDJFMiIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXhwVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXlaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNleTVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI4MSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXlwVFlFZG15Mm9uSFlLbEFCZyIgeT0iMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlekpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlenBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1JvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V6WlRZRWRteTJvbkhZS2xBQmciIHk9Ii0zOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V6NVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2UwWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2UwSlRZRWRteTJvbkhZS2xBQmciIHg9IjQxNiIgeT0iNTkzIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlMHBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjdGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZTFKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2UwNVRZRWRteTJvbkhZS2xBQmciIHg9Ii02IiB5PSIyNDI2Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlMVpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjgxIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZTE1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRY2UySlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZTFwVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FpbFVKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjdGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FpbFVwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRaWxVNVRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FpbFVaVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfa1FjZXc1VFlFZG15Mm9uSFlLbEFCZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2tRY2V4SlRZRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWzI0MDgsIDI4LCAtNDc2MiwgMzU3M10kWzY0NTYsIDI4LCAtNzE0LCAzNTczXSRbNjQ1NiwgLTI0MzQsIC03MTQsIDExMTFdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2tRaWxZcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9rUDMyOEpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUtLMEpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRaWxZNVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2tRaWxaSlRZRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWy0zNDkzLCAtNzksIDM4NjMsIC0yNDg3XSRbLTUwODAsIC03OSwgMjI3NiwgLTI0ODddJFstNTA4MCwgMTI5NywgMjI3NiwgLTExMTFdIi8+Ci0gICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9rUWlsWlpUWUVkbXkyb25IWUtsQUJnIiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2tRaWxacFRZRWRteTJvbkhZS2xBQmciIGlkPSJhbmNob3I1MCIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9CNGJJMEpUY0VkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJfa1FFRVVKVFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0PSJfNUJVbFFKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJMDVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lTGFiZWwiIGVsZW1lbnQ9Il9CM3dhY0pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTFaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX0Izd2FjSlRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTFwVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iX0Izd2FjSlRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0YkkxSlRjRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkxNVRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9CM3dhY3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTJaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il9CM3dhY3BUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9CNGJJMkpUY0VkbXkyb25IWUtsQUJnIiB5PSIzOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkycFRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkzSlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUm9sZSIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0YkkyNVRjRWRteTJvbkhZS2xBQmciIHk9Ii0zOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkzWlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX0Izd2FjWlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJMzVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQjRiSTNwVGNFZG15Mm9uSFlLbEFCZyIgeD0iLTEyODAiIHk9IjU3NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTRKVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX0Izd2FjWlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJNHBUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iX0Izd2FjWlRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0Ykk0WlRjRWRteTJvbkhZS2xBQmciIHg9Ii00ODYiIHk9Ijg5MyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTQ1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJNVpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0I0Ykk1cFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQjRiSTVKVGNFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTU1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0Ykk2WlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQjRiSTZwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9CNGJJNkpUY0VkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9CNGJJMFpUY0VkbXkyb25IWUtsQUJnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQjRiSTBwVGNFZG15Mm9uSFlLbEFCZyIgcG9pbnRzPSJbMjA2NCwgMjcsIC00Mjg2LCAyN10kWzQ5NzQsIDI3LCAtMTM3NiwgMjddIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2JOaHY0SlRjRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il9iTkRPd0pUY0VkbXkyb25IWUtsQUJnIiBzb3VyY2U9Il9rUUVFVUpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUVFTlpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY0NVRjRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iX2JORE93SlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NVpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NXBUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odjVKVGNFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjU1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2JORE93cFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NlpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iX2JORE93cFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2JOaHY2SlRjRWRteTJvbkhZS2xBQmciIHk9IjM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjZwVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9iTkRPd3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjdKVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odjY1VGNFZG15Mm9uSFlLbEFCZyIgeT0iLTM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjdaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY3NVRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iTmh2N3BUY0VkbXkyb25IWUtsQUJnIiB4PSItMjU3IiB5PSItMzUzIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2OEpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY4cFRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlIiBlbGVtZW50PSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odjhaVGNFZG15Mm9uSFlLbEFCZyIgeD0iNjEiIHk9Ii0xNzgyIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2ODVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY5WlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfYk5odjlwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iTmh2OUpUY0VkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2OTVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odi1aVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9iTmh2LXBUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2JOaHYtSlRjRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2JOaHY0WlRjRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9iTmh2NHBUY0VkbXkyb25IWUtsQUJnIiBwb2ludHM9Ils1LCA0MiwgLTE4LCAtMTExXSRbNSwgMTIzLCAtMTgsIC0zMF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9rTURHNFpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tNREc0cFRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTURHNDVUWUVkbXkyb25IWUtsQUJnIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Jhc2ljLnByb2ZpbGUudW1sMiNfNm1GUmdLODZFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc1SlRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzVaVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc1cFRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9rTURHNTVUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tNREc2SlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTURHNlpUWUVkbXkyb25IWUtsQUJnIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0NvbXBsZXRlLnByb2ZpbGUudW1sMiNfTTdwVGtLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc2cFRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzY1VFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc3SlRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc3WlRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzdwVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc3NVRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfa01ERzhKVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfRWZSWm9LODZFZGllYVlneHRWV044USIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9rTUpOZzVUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tNSk5oSlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTUpOaFpUWUVkbXkyb25IWUtsQUJnIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9ST1NFX1BST0ZJTEVTL1Jvc2UuZXB4I184eVBtZ0VPNEVkbVpGWms3empaLWVBP1Jvc2UiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9ST1NFX1BST0ZJTEVTL1Jvc2UuZXB4I184eVBtZ0VPNEVkbVpGWms3empaLWVBP1Jvc2UiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfa05xM2daVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTnEzZ3BUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfa05xM2c1VFlFZG15Mm9uSFlLbEFCZyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbDIjX3NpUHQ0Szg3RWRpNVFwWWVZX3lJcGciLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sMiNfc2lQdDRLODdFZGk1UXBZZVlfeUlwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9IMHllOEpUdkVkbUROWTZsbkdBZzVBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0gweWU4WlR2RWRtRE5ZNmxuR0FnNUEiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9IMHllOHBUdkVkbUROWTZsbkdBZzVBIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9IkphdmEuZXB4I18tWm95d0pTa0VkbWphdVNqRzhxTzJBP0phdmEiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9IkphdmEuZXB4I18tWm95d0pTa0VkbWphdVNqRzhxTzJBP0phdmEiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBuYW1lPSJXb3JrYmVuY2hDb21wb25lbnQiPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDcxRDAyMDgiIG5hbWU9Im5hbWUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCIgbmFtZT0icmVzb3VyY2VzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNjcwMDM5IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw0WlRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDRKVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSIgbmFtZT0iY29tcG9uZW50VHlwZSIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiI+Ci0gICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9rT1ZsNkpUWUVkbXkyb25IWUtsQUJnIiB2YWx1ZT0iMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDU1VFlFZG15Mm9uSFlLbEFCZyIgdmFsdWU9IjEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiIG5hbWU9InJlZmVyZW5jZWRDb21wb25lbnRzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw4cFRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDhaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiIG5hbWU9IkNvbXBvbmVudFJlc291cmNlIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0RGOTcwMTI4IiBuYW1lPSJzb3VyY2VQYXRoIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUVDNjQwMDI1QiIgbmFtZT0icnVudGltZVBhdGgiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0RGOUUwMTFFIiBuYW1lPSJleGNsdXNpb25zIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tOM0V4cFRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa04zRXhaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRiIgbmFtZT0iY29tcG9uZW50IiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw1SlRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSIxIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9rT1ZsNDVUWUVkbXkyb25IWUtsQUJnIiB2YWx1ZT0iMSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2p3NUdRS1YtRWRtb1llTy1XUjlhRGciIG5hbWU9InJlc291cmNlVHlwZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIgbmFtZT0iQ29tcG9uZW50VHlwZSI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMyMTM0MDM1NyIgbmFtZT0iY29tcG9uZW50VHlwZUlkIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9VRGtnRUpUYkVkbXkyb25IWUtsQUJnIiBuYW1lPSJ2ZXJzaW9uIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9CM3dhY1pUY0VkbXkyb25IWUtsQUJnIiBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyIgYXNzb2NpYXRpb249Il9CM3dhY0pUY0VkbXkyb25IWUtsQUJnIiBhZ2dyZWdhdGlvbj0ic2hhcmVkIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0Izd2FkSlRjRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQjN3YWM1VGNFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2JORE93WlRjRWRteTJvbkhZS2xBQmciIG5hbWU9Im1ldGFkYXRhUmVzb3VyY2VzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIiBhc3NvY2lhdGlvbj0iX2JORE93SlRjRWRteTJvbkhZS2xBQmciIGFnZ3JlZ2F0aW9uPSJzaGFyZWQiPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYk5ET3hKVGNFZG15Mm9uSFlLbEFCZyIgdmFsdWU9Ii0xIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iTkRPdzVUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIiBuYW1lPSJJUGF0aCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTjlMWnBUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImFwcGxpZWRTdGVyZW90eXBlcyI+Ci0gICAgICA8Y29udGVudHMgeG1pOnR5cGU9IkVjb3JlXzA6RWNvcmVfX0VEYXRhVHlwZSIgeG1pOmlkPSJfa045TFo1VFlFZG15Mm9uSFlLbEFCZyIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa045TGFKVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTjlMYVpUWUVkbXkyb25IWUtsQUJnIiBrZXk9ImRhdGF0eXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiIG5hbWU9IlByb2plY3RDb21wb25lbnRzIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFGNTY3RkQwMjNBIiBuYW1lPSJwcm9qZWN0TmFtZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIiBuYW1lPSJjb21wb25lbnRzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw3WlRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDdKVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUY2QzI0QjAyM0QiIG5hbWU9IlJlZmVyZW5jZWRDb21wb25lbnQiPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDVGMDAxQzkiIG5hbWU9ImhhbmRsZSIgdHlwZT0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDIwMTQ1RkEwMDE1IiBuYW1lPSJydW50aW1lUGF0aCIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSIvPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTI0MzAxNkUiIG5hbWU9ImRlcGVuZGVuY3lUeXBlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiIG5hbWU9IkRlcGVuZGVuY3lUeXBlIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2tOOUxjWlRZRWRteTJvbkhZS2xBQmciIGJvZHk9InVzZXM9MCYjeEE7Y29uc3VtZXM9MSYjeEE7IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa09KWW9KVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhcHBsaWVkU3RlcmVvdHlwZXMiPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9IkRlZmF1bHRfMDpEZWZhdWx0X19Eb2N1bWVudGF0aW9uIiB4bWk6aWQ9Il9rT0pZb1pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDM5OTM4MDE4RCIgbmFtZT0idXNlcyIvPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDIwMzlBNkUwMTM5IiBuYW1lPSJjb25zdW1lcyIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIiBtZW1iZXJFbmQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQgXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRiIvPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzFEOTgwMkMyIiBtZW1iZXJFbmQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEgXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MyIgbmFtZT0iX3dvcmtiZW5jaE1vZHVsZSIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRTNERjU4MDFGQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4IiBtZW1iZXJFbmQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEgXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMyIgbmFtZT0iX3Byb2plY3RNb2R1bGVzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFGNTY2REIwMjUxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4Ii8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNTAyRTIiIG1lbWJlckVuZD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiBfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjgxIj4KLSAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjgxIiBuYW1lPSJfd29ya2JlbmNoTW9kdWxlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIi8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIiBuYW1lPSJQcm9wZXJ0eSI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzdYbzhZSlRiRWRteTJvbkhZS2xBQmciIG5hbWU9Im5hbWUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzhlT0o4SlRiRWRteTJvbkhZS2xBQmciIG5hbWU9InZhbHVlIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIgbWVtYmVyRW5kPSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyBfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ1MTAzRTIiIGFzc29jaWF0aW9uPSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIgbWVtYmVyRW5kPSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyBfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iX2JORE93cFRjRWRteTJvbkhZS2xBQmciIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ1MTAzRTIiIGFzc29jaWF0aW9uPSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIiBuYW1lPSJVUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa045TFpwVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhcHBsaWVkU3RlcmVvdHlwZXMiPgotICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJFY29yZV8wOkVjb3JlX19FRGF0YVR5cGUiIHhtaTppZD0iX2tOOUxaNVRZRWRteTJvbkhZS2xBQmciIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTjlMYUpUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tOOUxhWlRZRWRteTJvbkhZS2xBQmciIGtleT0iZGF0YXR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9vd25lZE1lbWJlcj4KLTwvdW1sOk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL2NvbXBvbmVudENvcmUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNTU1MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIHJ1bnRpbWVKYXI9InRydWUiIG1vZGVsTmFtZT0iQ29tcG9uZW50Q29yZSIKLSAgICBlZGl0UGx1Z2luQ2xhc3M9ImNvbXBvbmVudGNvcmUucHJvdmlkZXIuQ29tcG9uZW50Q29yZUVkaXRQbHVnaW4iIGVkaXRvclBsdWdpbkNsYXNzPSJjb21wb25lbnRjb3JlLnByZXNlbnRhdGlvbi5Db21wb25lbnRDb3JlRWRpdG9yUGx1Z2luIj4KLSAgPGZvcmVpZ25Nb2RlbD5jb21wb25lbnRDb3JlLmVjb3JlPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNvbXBvbmVudGNvcmUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwiIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiCi0gICAgICBlY29yZVBhY2thZ2U9ImNvbXBvbmVudENvcmUuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY29tcG9uZW50Q29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tcG9uZW50Q29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL3VzZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tcG9uZW50Q29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL2NvbnN1bWVzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9JUGF0aCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iY29tcG9uZW50Q29yZS5lY29yZSMvL1VSSSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vV29ya2JlbmNoQ29tcG9uZW50L3Jlc291cmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQvY29tcG9uZW50VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQvcmVmZXJlbmNlZENvbXBvbmVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFJlc291cmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50UmVzb3VyY2Uvc291cmNlUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9ydW50aW1lUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9leGNsdXNpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9jb21wb25lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50UmVzb3VyY2UvcmVzb3VyY2VUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50VHlwZS9jb21wb25lbnRUeXBlSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50VHlwZS92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFR5cGUvcHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRUeXBlL21ldGFkYXRhUmVzb3VyY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL1Byb3BlcnR5L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL1JlZmVyZW5jZWRDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9SZWZlcmVuY2VkQ29tcG9uZW50L2hhbmRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9SZWZlcmVuY2VkQ29tcG9uZW50L3J1bnRpbWVQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL1JlZmVyZW5jZWRDb21wb25lbnQvZGVwZW5kZW5jeVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUmVmZXJlbmNlZENvbXBvbmVudC9kZXBlbmRlbnRPYmplY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL1Byb2plY3RDb21wb25lbnRzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUHJvamVjdENvbXBvbmVudHMvcHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcG9uZW50Q29yZS5lY29yZSMvL1Byb2plY3RDb21wb25lbnRzL2NvbXBvbmVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZVBhY2thZ2UuZW14IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZVBhY2thZ2UuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTAzZGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL2NvbXBvbmVudENvcmVQYWNrYWdlLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPHVtbDpNb2RlbCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL05vdGF0aW9uIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8xLjAuMC9VTUwiIHhtbG5zOnVtbG5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL1VtbG5vdGF0aW9uIiB4bWk6aWQ9Il93VUNId01POEVkbW1FYktFQm5XMEFRIiBuYW1lPSJjb21wb25lbnRDb3JlUGFja2FnZSIgYXBwbGllZFByb2ZpbGU9Il93VUNIeE1POEVkbW1FYktFQm5XMEFRIF93VUNIeDhPOEVkbW1FYktFQm5XMEFRIF93VUNIeXNPOEVkbW1FYktFQm5XMEFRIF93VUlPWXNPOEVkbW1FYktFQm5XMEFRIF93VUlPWmNPOEVkbW1FYktFQm5XMEFRIj4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il93VUNId2NPOEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il93VUNId3NPOEVkbW1FYktFQm5XMEFRIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX3dVQ0h3c084RWRtbUViS0VCblcwQVEiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiBzb3VyY2VFZGdlcz0iXzNJWlhnTU84RWRtbUViS0VCblcwQVEgXzNJZmVJTU84RWRtbUViS0VCblcwQVEgXzNJZmVKOE84RWRtbUViS0VCblcwQVEiIHRhcmdldEVkZ2VzPSJfM0laWGdNTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmb01POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMnZGZm9jTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZm9zTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmbzhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJ2RmZwTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMnZGZnBjTzhFZG1tRWJLRUJuVzBBUSIgZmlsdGVyaW5nPSJNYW51YWwiPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJ2aXpyZWY6Ly8vI2pmaWVsZF52Y29yZS50YXJnZXQ9dW1sMi5Qcm9wZXJ0eV5uYW1lPWFydGlmYWN0RWRpdE1vZGVsW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9aXNSZWFkT25seVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJ2aXpyZWY6Ly8vI2pmaWVsZF52Y29yZS50YXJnZXQ9dW1sMi5Qcm9wZXJ0eV5uYW1lPWlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZFtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvc3R5bGVzPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZnBzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8ydkZmcDhPOEVkbW1FYktFQm5XMEFRIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHJpdmF0ZSxwYWNrYWdlLHByb3RlY3RlZCIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZnFNTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMnZGZnFjTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZnFzTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJ2RmZxOE84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfMnIxWFVjTzhFZG1tRWJLRUJuVzBBUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8ycjFYVXNPOEVkbW1FYktFQm5XMEFRIiB4PSIxNTU4MiIgeT0iMjE5NDIiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTGtNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlRWRnZXM9Il8zSWxrd01POEVkbW1FYktFQm5XMEFRIF8zSWxreU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXRFZGdlcz0iXzNJZmVKOE84RWRtbUViS0VCblcwQVEgXzNJbGt3TU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTGs4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMjVUTGxNTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTGxjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI1VExsc084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMbDhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI1VExtTU84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTG1jTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yNVRMbXNPOEVkbW1FYktFQm5XMEFRIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHJpdmF0ZSxwYWNrYWdlLHByb3RlY3RlZCIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMbThPOEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yNVRMbk1POEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI1VExuY084RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yNVRMbnNPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfMjVUTGtjTzhFZG1tRWJLRUJuVzBBUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzI1VExrc084RWRtbUViS0VCblcwQVEiIHg9IjcwMDkiIHk9IjE3NDg3Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFBTU84RWRtbUViS0VCblcwQVEiIHRhcmdldEVkZ2VzPSJfM0lmZUlNTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUIxQThPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMjlCMUJNTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFCY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjlCMUJzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUIxQjhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFDTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMjlCMUNjTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjlIN29NTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yOUg3b2NPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUg3b3NPOEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yOUg3bzhPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfMjlCMUFjTzhFZG1tRWJLRUJuVzBBUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzI5QjFBc084RWRtbUViS0VCblcwQVEiIHg9IjE2MjE4IiB5PSIxNzQ5MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3b01POEVkbW1FYktFQm5XMEFRIiB0YXJnZXRFZGdlcz0iXzNJbGt5TU84RWRtbUViS0VCblcwQVEgXzNJcnJZOE84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d284TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMjk0d3BNTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3BjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5NHdwc084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3cDhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5NHdxTU84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3FjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yOTR3cXNPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5NHdxOE84RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5NHdyTU84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3JjTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5NHdyc084RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8yOTR3b2NPOEVkbW1FYktFQm5XMEFRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMjk0d29zTzhFZG1tRWJLRUJuVzBBUSIgeD0iMzg5NCIgeT0iMjU2MTEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1STElNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlRWRnZXM9Il8zSXJyWThPOEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItUkxJOE84RWRtbUViS0VCblcwQVEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzItUkxKTU84RWRtbUViS0VCblcwQVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItUkxKY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yLVJMSnNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1STEo4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yLVJMS01POEVkbW1FYktFQm5XMEFRIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHJvdGVjdGVkLHByaXZhdGUscGFja2FnZSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yLVhSd01POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzItWFJ3Y084RWRtbUViS0VCblcwQVEiIGZpbHRlcmluZz0iQXV0b21hdGljIiBmaWx0ZXJpbmdLZXlzPSJwcm90ZWN0ZWQscHJpdmF0ZSxwYWNrYWdlIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItWFJ3c084RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzItWFJ3OE84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1YUnhNTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzItWFJ4Y084RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8yLVJMSWNPOEVkbW1FYktFQm5XMEFRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMi1STElzTzhFZG1tRWJLRUJuVzBBUSIgeD0iMTkwOCIgeT0iMTc0OTAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX3dVQ0h3OE84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSVpYZ01POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJWlhnOE84RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJWlhoY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0laWGg4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSVpYaHNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8zSVpYaE1POEVkbW1FYktFQm5XMEFRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8zSVpYZ2NPOEVkbW1FYktFQm5XMEFRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJWlhnc084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWzI2NzMsIDQzMTIsIDI2NzMsIDQzMTJdJFszMjI4LCA0MzEyLCAzMjI4LCA0MzEyXSRbMzIyOCwgNTU1NiwgMzIyOCwgNTU1Nl0kWzE5MzIsIDU1NTYsIDE5MzIsIDU1NTZdJFsxOTMyLCA0OTQ3LCAxOTMyLCA0OTQ3XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSWZlSU1POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8yOUIxQU1POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVJOE84RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVKY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbXBsZW1lbnRhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqaW1wbF52Y29yZS50YXJnZXQ9dW1sMi5JbXBsZW1lbnRhdGlvbltqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSWZlSnNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkltcGxlbWVudGF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ppbXBsXnZjb3JlLnRhcmdldD11bWwyLkltcGxlbWVudGF0aW9uW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM0lmZUpNTzhFZG1tRWJLRUJuVzBBUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfM0lmZUljTzhFZG1tRWJLRUJuVzBBUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJZmVJc084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWzI3LCAtNDk0OCwgNTMsIDMxNzVdJFsyNywgLTY4MjcsIDUzLCAxMjk2XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSWZlSjhPOEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVLc084RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVMTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSWZlTHNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lmZUxjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzNJZmVLOE84RWRtbUViS0VCblcwQVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzNJZmVLTU84RWRtbUViS0VCblcwQVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8zSWZlS2NPOEVkbW1FYktFQm5XMEFRIiBwb2ludHM9IlstMTMsIDcwNzcsIDI4MzEsIC01NjM2XSRbLTI4NDQsIDg2NjQsIDAsIC00MDQ5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSWxrd01POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt3OE84RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt4Y084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt4OE84RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt4c084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM0lsa3hNTzhFZG1tRWJLRUJuVzBBUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfM0lsa3djTzhFZG1tRWJLRUJuVzBBUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfM0lsa3dzTzhFZG1tRWJLRUJuVzBBUSIgcG9pbnRzPSJbMjgzMSwgMjk2NCwgMjgzMSwgMjk2NF0kWzI4MzEsIDM4MzcsIDI4MzEsIDM4MzddJFsxMzIyLCAzODM3LCAxMzIyLCAzODM3XSRbMTMyMiwgMjk2NCwgMTMyMiwgMjk2NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfM0lsa3lNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJfMjVUTGtNTzhFZG1tRWJLRUJuVzBBUSIgdGFyZ2V0PSJfMjk0d29NTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSWxreThPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyWU1POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyWXNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyWWNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzNJbGt6TU84RWRtbUViS0VCblcwQVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzNJbGt5Y084RWRtbUViS0VCblcwQVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJbGt5c084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWzAsIDQwNDgsIDMzMDcsIC0yNDYwXSRbLTMzMDcsIDU2MzUsIDAsIC04NzNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzNJcnJZOE84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iXzItUkxJTU84RWRtbUViS0VCblcwQVEiIHRhcmdldD0iXzI5NHdvTU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lyclpzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lycmFNTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lycmFzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lycmFjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8zSXJyWjhPOEVkbW1FYktFQm5XMEFRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8zSXJyWk1POEVkbW1FYktFQm5XMEFRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8zSXJyWmNPOEVkbW1FYktFQm5XMEFRIiBwb2ludHM9IlstMSwgNDA0OCwgLTMzMDgsIC0yNDYwXSRbMzMwNywgNTYzNSwgMCwgLTg3M10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il93VUNIeE1POEVkbW1FYktFQm5XMEFRIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3dVQ0h4Y084RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il93VUNIeHNPOEVkbW1FYktFQm5XMEFRIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Jhc2ljLnByb2ZpbGUudW1sMiNfNm1GUmdLODZFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVQ0h4OE84RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VDSHlNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVQ0h5Y084RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il93VUNIeXNPOEVkbW1FYktFQm5XMEFRIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3dVSU9ZTU84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il93VUlPWWNPOEVkbW1FYktFQm5XMEFRIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0NvbXBsZXRlLnByb2ZpbGUudW1sMiNfTTdwVGtLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVSU9Zc084RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VJT1k4TzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVSU9aTU84RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVSU9aY084RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VJT1pzTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVSU9aOE84RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfd1VJT2FNTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfRWZSWm9LODZFZGllYVlneHRWV044USIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci08L3VtbDpNb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwN2Y0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9tb2R1bGVjb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5FRURTTUlHUkFUSU5HPVRoaXMgcHJvamVjdCBuZWVkcyB0byBtaWdyYXRlIG1ldGFkYXRhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvbW9kdWxlY29yZU5MUy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvbW9kdWxlY29yZU5MUy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzZiMmRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmVOTFMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfUmVhZF9FeGNlcHRpb249RXhjZXB0aW9uIHdoaWxlIGFjcXVpcmluZyBhcnRpZmFjdCBlZGl0IGZvciByZWFkLgotQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfV3JpdGVfRXhjZXB0aW9uPUV4Y2VwdGlvbiB3aGlsZSBhY3F1aXJpbmcgYXJ0aWZhY3QgZWRpdCBmb3Igd3JpdGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0FydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0FydGlmYWN0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWU3YjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9BcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgRmFjYWRlIHBhdHRlcm4gZm9yIGFjY2Vzc2luZyBNb2R1bGUgQ29udGVudCBNZXRhbW9kZWxzIGZvciBXZWIgVG9vbHMgUGxhdGZvcm0gZmxleGlibGUKLSAqIG1vZHVsZXMuCi0gKiA8cD4KLSAqIEFydGlmYWN0RWRpdCBoaWRlcyB0aGUgbWFuYWdlbWVudCBvZiBhY2Nlc3NpbmcgZWRpdCBtb2RlbHMgKHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSkKLSAqIGNvcnJlY3RseS4gRWFjaCBwcm9qZWN0IG1heSBoYXZlIG11bHRpcGxlICh7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0pcyBkZXBlbmRpbmcgb24gdGhlIG51bWJlcgotICogb2YgbW9kdWxlcyBjb250YWluZWQgYnkgdGhlIHByb2plY3QuIENsaWVudHMgc2hvdWxkIHVzZSBBcnRpZmFjdEVkaXQgb3IgYW4gYXBwcm9wcmlhdGUgc3ViY2xhc3MKLSAqIHdoZW4gd29ya2luZyB3aXRoIHRoZSBjb250ZW50IG1vZGVscyBvZiBXVFAgbW9kdWxlcy4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBFYWNoIEFydGlmYWN0RWRpdCBmYWNhZGUgaXMgZGVzaWduZWQgdG8gbWFuYWdlIHRoZSBFZGl0TW9kZWwgbGlmZWN5Y2xlIGZvciBjbGllbnRzLiBIb3dldmVyLAotICogd2hpbGUgZWFjaCBBcnRpZmFjdEVkaXQgaXMgZGVzaWduZWQgdG8gYmUgcGFzc2VkIGFyb3VuZCBhcyBuZWVkZWQsIGNsaWVudHMgbXVzdCBlbmZvcmNlIHRoZQotICogQXJ0aWZhY3RFZGl0IGxpZmVjeWNsZS4gVGhlIG1vc3QgY29tbW9uIG1ldGhvZCBvZiBhY3F1aXJpbmcgYSBBcnRpZmFjdEVkaXQgaW5zdGFuY2UgZmFjYWRlIGlzIHRvCi0gKiB1c2Uge0BzZWUgI2dldEFydGlmYWN0RWRpdEZvclJlYWQoV29ya2JlbmNoQ29tcG9uZW50KX0mbmJzcDtvcgotICoge0BzZWUgI2dldEFydGlmYWN0RWRpdEZvcldyaXRlKFdvcmtiZW5jaENvbXBvbmVudCl9LgotICogPC9wPgotICogPHA+Ci0gKiBXaGVuIGNsaWVudHMgaGF2ZSBjb25jbHVkZWQgdGhlaXIgdXNlIG9mIHRoZSBpbnN0YW5jZSwgPGI+Y2xpZW50cyBtdXN0IGNhbGwge0BzZWUgI2Rpc3Bvc2UoKX0KLSAqIDwvYj4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgTW9kdWxlQ29yZU5hdHVyZQotICogQHNlZSBBcnRpZmFjdEVkaXRNb2RlbAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXQgaW1wbGVtZW50cyBJRWRpdE1vZGVsSGFuZGxlciwgSUFkYXB0YWJsZXsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQXJ0aWZhY3RFZGl0LmNsYXNzOwotCXByaXZhdGUgZmluYWwgQXJ0aWZhY3RFZGl0TW9kZWwgYXJ0aWZhY3RFZGl0TW9kZWw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0JpbmFyeTsKLQlwcml2YXRlIEJpbmFyeUNvbXBvbmVudEhlbHBlciBiaW5hcnlDb21wb25lbnRIZWxwZXI7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdE1vZGVsID0gbnVsbDsKLQkJcHJvamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYoYU1vZHVsZS5pc0JpbmFyeSgpKXsKLQkJCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0KGFNb2R1bGUpOwotCQl9Ci0JCWlmIChpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQkJfSAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCWlmICghYU1vZHVsZS5pc0JpbmFyeSgpICYmIGlzVmFsaWRFZGl0YWJsZU1vZHVsZShhTW9kdWxlKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogICAgICAgICAgICBBIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBoYXMgYSBtb2R1bGVUeXBlSWQgd2hpY2ggaGFzIGEgZGVmaW5lZAotCSAqICAgICAgICAge0BzZWUgSUVkaXRNb2RlbEZhY3Rvcnl9Jm5ic3A7YW5kIGlzIGNvbnRhaW5lZCBieSBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFNb2R1bGUuZ2V0UHJvamVjdCgpKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8qIGFuZCB0aGUgY29udGFpbmluZyBwcm9qZWN0IG11c3QgYmUgcmVzb2x2ZWFibGUgYW5kIGFjY2Vzc2libGUgKi8KLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgYW5BcnRpZmFjdEVkaXRNb2RlbCkgewotCQlhcnRpZmFjdEVkaXRNb2RlbCA9IGFuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0JCWlzUmVhZE9ubHkgPSBhcnRpZmFjdEVkaXRNb2RlbC5pc1JlYWRPbmx5KCk7Ci0JCWlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZCA9IGZhbHNlOwotCQkKLQkJcHJvamVjdCA9IGFuQXJ0aWZhY3RFZGl0TW9kZWwuZ2V0UHJvamVjdCgpOwotCX0KLQotCQotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQoSVZpcnR1YWxDb21wb25lbnQgYUJpbmFyeU1vZHVsZSl7Ci0JCWlmKCFhQmluYXJ5TW9kdWxlLmlzQmluYXJ5KCkpewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgY29uc3RydWN0b3IgaXMgb25seSBmb3IgYmluYXJ5IGNvbXBvbmVudHMuIik7Ci0JCX0KLQkJYmluYXJ5Q29tcG9uZW50SGVscGVyID0gaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihhQmluYXJ5TW9kdWxlKTsKLQkJYXJ0aWZhY3RFZGl0TW9kZWwgPSBudWxsOwotCQlpc1JlYWRPbmx5ID0gdHJ1ZTsKLQkJaXNCaW5hcnkgPSB0cnVlOwotCQlpc0FydGlmYWN0RWRpdE1vZGVsU2VsZk1hbmFnZWQgPSB0cnVlOwotCQlwcm9qZWN0ID0gbnVsbDsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LgotCSAqIDwvcD4KLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfSZuYnNwO2ZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCQotCQlpc1JlYWRPbmx5ID0gdG9BY2Nlc3NBc1JlYWRPbmx5OwotCQlpc0FydGlmYWN0RWRpdE1vZGVsU2VsZk1hbmFnZWQgPSB0cnVlOwotCQlwcm9qZWN0ID0gYU5hdHVyZS5nZXRQcm9qZWN0KCk7Ci0JCUlQcm9qZWN0IGFQcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCVVSSSBjb21wb25lbnRVUkkgPSBNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShhUHJvamVjdCk7Ci0JCU1hcCBlZGl0TW9kZWxQYXJhbXMgPSBudWxsOwotCQlpZiAoZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSAhPSBudWxsKSB7Ci0JCQllZGl0TW9kZWxQYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZWRpdE1vZGVsUGFyYW1zLnB1dChBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuUEFSQU1fUk9PVF9VUkksIGdldFJvb3RVUkkoKSk7Ci0JCQllZGl0TW9kZWxQYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9ST09UX0NPTlRFTlRfVFlQRSwgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSk7Ci0JCX0KLQkJaWYgKHRvQWNjZXNzQXNSZWFkT25seSkgCi0JCQlhcnRpZmFjdEVkaXRNb2RlbCA9IGFOYXR1cmUuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKGNvbXBvbmVudFVSSSwgdGhpcywgbnVsbCwgZWRpdE1vZGVsUGFyYW1zKTsKLQkJZWxzZSAKLQkJCWFydGlmYWN0RWRpdE1vZGVsID0gYU5hdHVyZS5nZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKGNvbXBvbmVudFVSSSwgdGhpcywgbnVsbCwgZWRpdE1vZGVsUGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Jm5ic3A7Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtwb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRoaXMoYVByb2plY3QsdG9BY2Nlc3NBc1JlYWRPbmx5LGZhbHNlLG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAcGFyYW0gZm9yQ3JlYXRlCi0JICogQHBhcmFtIHByb2plY3RUeXBlCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSwgYm9vbGVhbiBmb3JDcmVhdGUsIFN0cmluZyBwcm9qZWN0VHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQotCQl0aGlzKGFQcm9qZWN0LHRvQWNjZXNzQXNSZWFkT25seSxmb3JDcmVhdGUscHJvamVjdFR5cGUsbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpIHsKLQkJaWYoIXZhbGlkQXJ0aWZhY3RFZGl0KXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIEFydGlmYWN0IEVkaXQgYWNjZXNzIChtb2RlbCB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQpIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkQXJ0aWZhY3RFZGl0ID0gdHJ1ZTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWRBcnRpZmFjdEVkaXQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1hcmtJbnZhbGlkKCl7Ci0JCUxvZ2dlci5nbG9iYWwubG9nKExldmVsLldBUk5JTkcsICJJbnZhbGlkIEFydGlmYWN0IEVkaXQgYWNjZXNzIChtb2RlbCB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQpIik7Ci0JCXZhbGlkQXJ0aWZhY3RFZGl0ID0gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEBwYXJhbSBmb3JDcmVhdGUKLQkgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBVc2VkIHRvIHBhc3Mgc3BlY2lmaWMgZWRpdE1vZGVsIGVkaXQgKFVzZWQgdG8gbG9va3VwIGZhY3RvcnkpCi0JICogQHBhcmFtIGVkaXRNb2RlbFBhcmFtcyAtIFByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgY2FjaGVLZXkgb24gZWRpdE1vZGVsRmFjdG9yeQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHksIGJvb2xlYW4gZm9yQ3JlYXRlLCBTdHJpbmcgcHJvamVjdFR5cGUsIE1hcCBlZGl0TW9kZWxQYXJhbXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0JCWlmIChhUHJvamVjdCA9PSBudWxsIHx8ICFhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcHJvamVjdDogIiArIGFQcm9qZWN0KTsKLQotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShhUHJvamVjdCk7Ci0KLQkJaWYgKG5hdHVyZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCBkb2VzIG5vdCBoYXZlIE1vZHVsZUNvcmVOYXR1cmU6ICIgKyBhUHJvamVjdCk7Ci0JCWlmICghdmFsaWRQcm9qZWN0VmVyc2lvbihhUHJvamVjdCkpewotCQkJbWFya0ludmFsaWQoKTsKLQkJfQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY29tcG9uZW50IGhhbmRsZTogIiArIGFQcm9qZWN0KTsKLQkJaWYgKCFmb3JDcmVhdGUgJiYgIWlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjb21wb25lbnQgaGFuZGxlOiAiICsgYVByb2plY3QpOwotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JCVVSSSBjb21wb25lbnRVUkkgPSBNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShhUHJvamVjdCk7Ci0JCWlmIChnZXRDb250ZW50VHlwZURlc2NyaWJlcigpICE9IG51bGwpIHsKLQkJCWlmIChlZGl0TW9kZWxQYXJhbXMgPT0gbnVsbCkKLQkJCQllZGl0TW9kZWxQYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZWRpdE1vZGVsUGFyYW1zLnB1dChBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuUEFSQU1fUk9PVF9VUkksIGdldFJvb3RVUkkoKSk7Ci0JCQllZGl0TW9kZWxQYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9ST09UX0NPTlRFTlRfVFlQRSwgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSk7Ci0JCX0KLQkJaWYgKHRvQWNjZXNzQXNSZWFkT25seSkgCi0JCQlhcnRpZmFjdEVkaXRNb2RlbCA9IG5hdHVyZS5nZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoY29tcG9uZW50VVJJLCB0aGlzLCBwcm9qZWN0VHlwZSwgZWRpdE1vZGVsUGFyYW1zKTsKLQkJZWxzZSAKLQkJCWFydGlmYWN0RWRpdE1vZGVsID0gbmF0dXJlLmdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoY29tcG9uZW50VVJJLCB0aGlzLCBwcm9qZWN0VHlwZSwgZWRpdE1vZGVsUGFyYW1zKTsKLQkJCi0JCQkKLQkJaXNSZWFkT25seSA9IHRvQWNjZXNzQXNSZWFkT25seTsKLQkJaXNBcnRpZmFjdEVkaXRNb2RlbFNlbGZNYW5hZ2VkID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCXJldHVybiBwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFVzZWQgdG8gb3B0aW9uYWxseSBkZWZpbmUgYW4gYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgZm9yIFhNTCBmaWxlIGNyZWF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCQotCQlpZiAoaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamJERCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSkKLQkJCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViREQiOyAvLyROT04tTkxTLTEkCi0JCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkpCi0JCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVhckREIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBjbGllbnRERCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgdG8gb3B0aW9uYWxseSBkZWZpbmUgYW4gcm9vdCBVUkkgZm9yIHRoZSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBVUkkgZ2V0Um9vdFVSSSgpIHsKLQkJCi0JCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSkpCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvZWpiLWphci54bWwiKTsKLQkJaWYgKGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSkKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKCJXRUItSU5GL3dlYi54bWwiKTsKLQkJaWYgKGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKSkKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiKTsKLQkJaWYgKGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKSkKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkUHJvamVjdFZlcnNpb24oSVByb2plY3QgcHJvamVjdDIpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRm9yY2UgYSBzYXZlIG9mIHRoZSB1bmRlcmx5aW5nIG1vZGVsLiBUaGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aXRoIGNhcmUuIFVubGVzcwotCSAqIHJlcXVpcmVkLCB1c2Uge0BzZWUgI3NhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yKX0mbmJzcDsgaW5zdGVhZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuSUVkaXRNb2RlbEhhbmRsZXIjc2F2ZSgpCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgTW9kdWxlQ29yZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYXMgcmVhZC1vbmx5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHZhbGlkYXRlRWRpdCgpLmlzT0soKSkKLQkJCWFydGlmYWN0RWRpdE1vZGVsLnNhdmUoYU1vbml0b3IsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNhdmUgdGhlIHVuZGVybHlpbmcgbW9kZWwgb25seSBpZiBubyBvdGhlciBjbGllbnRzIGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIG1vZGVsLiBJZiB0aGUKLQkgKiBtb2RlbCBpcyBub3Qgc2hhcmVkLCBpdCB3aWxsIGJlIHNhdmVkLiBJZiBpdCBpcyBzaGFyZWQsIHRoZSBzYXZlIHdpbGwgYmUgZGVmZXJyZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyI3NhdmVJZk5lY2Vzc2FyeSgpCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgTW9kdWxlQ29yZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYXMgcmVhZC1vbmx5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJaWYgKGlzUmVhZE9ubHkoKSkKLQkJCXRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKTsKLQkJZWxzZSBpZiAoYXJ0aWZhY3RFZGl0TW9kZWwuaXNEaXJ0eSgpICYmIHZhbGlkYXRlRWRpdCgpLmlzT0soKSkKLQkJCWFydGlmYWN0RWRpdE1vZGVsLnNhdmVJZk5lY2Vzc2FyeShhTW9uaXRvciwgdGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIGVkaXQgZm9yIHJlc291cmNlIHN0YXRlCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KCkgewotCQlJVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0ZVN0YXRlKGdldEFydGlmYWN0RWRpdE1vZGVsKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgb25seSBpZiBuZWNlc3NhcnkuIElmIHR5cGljYWxseSBhIHNhdmUgd291bGQgbm90IG9jY3VyIGJlY2F1c2UgdGhpcyBlZGl0IG1vZGVsIGlzCi0JICogc2hhcmVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHVzaW5nIHRoZSBAb3BlcmF0aW9uSGFuZGxlci4gCi0JICogSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIGFuZCB0aGUgbW9kZWwgaXMgbm90IHNoYXJlZCwgCi0JICogdGhlIGVudGlyZSBlZGl0IG1vZGVsIHdpbGwgYmUgc2F2ZWQuIFlvdSBtYXkgcGFzcyBpbiBhIGJvb2xlYW4gPGNvZGU+d2FzRGlydHk8L2NvZGU+IHRvCi0JICogaW5kaWNhdGUgd2hldGhlciB0aGlzIGVkaXQgbW9kZWwgd2FzIGRpcnR5IHByaW9yIHRvIG1ha2luZyBhbnkgY2hhbmdlcyBhbmQKLQkgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLiB7QGxpbmsgRWRpdE1vZGVsI2lzRGlydHkoKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgYm9vbGVhbiB3YXNEaXJ0eSkgewotCi0JCWlmIChzaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIsIHdhc0RpcnR5KSkKLQkJCXNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJZWxzZQotCQkJaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIHNhdmVJZk5lY2Vzc2FyeSBvcgotCSAqIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQgZGV0ZXJtaW5lcyBub3QgdG8gc2F2ZS4gVGhpcyBwcm92aWRlcyBzdWJjbGFzc2VzIHdpdGggYW4KLQkgKiBvcHBvcnR1bml0eSB0byBkbyBzb21lIG90aGVyIGFjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgcmVzb3VyY2VzIGJlIHNhdmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHkpIHsKLQkJcmV0dXJuICF3YXNEaXJ0eSA/IHNob3VsZFNhdmUoKSA6IHNob3VsZFNhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IGZvciBhIHNhdmUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByb21wdFRvU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7Ci0JCWlmIChvcGVyYXRpb25IYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvcGVyYXRpb25IYW5kbGVyLmNhbkNvbnRpbnVlKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9mb2xsb3dpbmdfcmVzb3VyY2VzX25lX1VJXyIpLCBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlVVJJcyh0cnVlKSk7IC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZvbGxvd2luZyByZXNvdXJjZXMgbmVlZCB0byBiZSBzYXZlZCBidXQgYXJlIGN1cnJlbnRseSBzaGFyZWQsIGRvIHlvdSB3YW50IHRvIHNhdmUgbm93PyIKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIHJlc291cmNlcyBiZSBzYXZlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7Ci0JCXJldHVybiBzaG91bGRTYXZlKCkgfHwgcHJvbXB0VG9TYXZlKG9wZXJhdGlvbkhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgcmVzb3VyY2VzIGJlIHNhdmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRTYXZlKCkgewotCQlyZXR1cm4gIWlzUmVhZE9ubHkoKSAmJiBpc0FydGlmYWN0RWRpdE1vZGVsU2VsZk1hbmFnZWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyBtdXN0IGNhbGwgdGhlIGZvbGxvd2luZyBtZXRob2Qgd2hlbiB0aGV5IGhhdmUgZmluaXNoZWQgdXNpbmcgdGhlIG1vZGVsLCBldmVuIGlmIHRoZQotCSAqIEFydGlmYWN0RWRpdCBpbnN0YW5jZSBmYWNhZGUgd2FzIGNyZWF0ZWQgYXMgcmVhZC1vbmx5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCWJpbmFyeUNvbXBvbmVudEhlbHBlci5kaXNwb3NlKCk7Ci0JCX0gZWxzZSBpZiAoaXNBcnRpZmFjdEVkaXRNb2RlbFNlbGZNYW5hZ2VkICYmIGFydGlmYWN0RWRpdE1vZGVsICE9IG51bGwpCi0JCQlhcnRpZmFjdEVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHJvb3Qgb2JqZWN0IGZvciByZWFkIG9yIHdyaXRlIGFjY2VzcyAoZGVwZW5kaW5nIG9uIGhvdyB0aGUgY3VycmVudCBBcnRpZmFjdEVkaXQKLQkgKiB3YXMgbG9hZGVkKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb250ZW50TW9kZWxSb290KCkgewotCQlpZihpc0JpbmFyeSgpKQotCQkgICByZXR1cm4gYmluYXJ5Q29tcG9uZW50SGVscGVyLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCWlmIChhcnRpZmFjdEVkaXRNb2RlbCE9bnVsbCkKLQkJCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGQgYSBsaXN0ZW5lciB0byB0cmFjayBsaWZlY3lsY2UgZXZlbnRzIGZyb20gdGhlIHVuZGVybHlpbmcgRWRpdE1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgRWRpdE1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCQotCQl9IGVsc2UgewotCQkJaWYgKGFydGlmYWN0RWRpdE1vZGVsIT1udWxsICYmIGxpc3RlbmVyIT1udWxsKQotCQkJCWFydGlmYWN0RWRpdE1vZGVsLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3VwcGxpZWQgbGlzdGVuZXIKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIEVkaXRNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEVkaXRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQl9IGVsc2UgaWYgKGFydGlmYWN0RWRpdE1vZGVsIT1udWxsICYmICFhcnRpZmFjdEVkaXRNb2RlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWFydGlmYWN0RWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSBiZSByZW1vdmVkIHNvb24uIEF2b2lkIGFkZGluZyBkZXBlbmRlbmNpZXMgdG8gaXQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyZWQgaW50ZXJuYWwgYW5kIG5vdCBwdWJsaXNoZWQgYXMgQVBJLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbCA9PSBlZGl0TW9kZWw7Ci0JfQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gSVByb2plY3QgLSByZXR1cm5zIHRoZSBwcm9qZWN0IG9mIHRoZSB1bmRlcmx5aW5nIHdvcmtiZW5jaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gSVZpcnR1YWxDb21wb25lbnQgLSByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHdvcmtiZW5jaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQlyZXR1cm4gYmluYXJ5Q29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCgpOwotCQl9Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB1bmRlcmx5aW5nIG1hbmFnZWQgZWRpdCBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpIHsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJpbmFyeUNvbXBvbmVudEhlbHBlciBnZXRCaW5hcnlDb21wb25lbnRIZWxwZXIoKSB7Ci0JCXJldHVybiBiaW5hcnlDb21wb25lbnRIZWxwZXI7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gVGhlIEVNRiBjb21tYW5kIHN0YWNrIG1hbmFnZWQgYnkgdGhlIHVuZGVybHlpbmcgZWRpdG1vZGVsCi0JICovCi0JcHVibGljIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0JLyoqCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlICgoQXJ0aWZhY3RFZGl0TW9kZWwpZ2V0QWRhcHRlcihBcnRpZmFjdEVkaXRNb2RlbC5BREFQVEVSX1RZUEUpKS5kZWxldGVSZXNvdXJjZShhUmVzb3VyY2UpOwotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJYXJ0aWZhY3RFZGl0TW9kZWwuZGVsZXRlUmVzb3VyY2UoYVJlc291cmNlKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBUaGUgaXNEaXJ0eSBmbGFnIGJhc2VkIHRoZSB1bmRlcmx5aW5nIGVkaXRtb2RlbCdzIGxpc3Qgb2YgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5pc0RpcnR5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHQgdG8gbW9kaWZ5IGFuIEFydGlmYWN0RWRpdCBpbnN0YW5jZSBmYWNhZGUgdGhhdCB3YXMgbG9hZGVkIGFzIHJlYWQtb25seS4iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBtb2RpZnkgYW4gQXJ0aWZhY3RFZGl0IGluc3RhbmNlIGZhY2FkZSB0aGF0IHdhcyBsb2FkZWQgYXMgYmluYXJ5LiIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKLQkJcmV0dXJuIGlzQmluYXJ5OwotCX0KLQkKLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYmUgbG9hZGVkCi0JICogaWYgdGhleSBhcmUgbm90IGFscmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VMb2FkS25vd25SZXNvdXJjZXMoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkKLQkJfSBlbHNlIHsKLQkJCUxpc3QgdXJpcyA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJCVVSSSB1cmkgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLnNpemUoKTsgaSsrKSB7Ci0JCQkJdXJpID0gKFVSSSkgdXJpcy5nZXQoaSk7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZSh1cmkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvciBAYVVyaS4KLQkgKiBAZGVwcmVjYXRlZCBVc2UgKChBcnRpZmFjdEVkaXRNb2RlbClnZXRBZGFwdGVyKEFydGlmYWN0RWRpdE1vZGVsLkFEQVBURVJfVFlQRSkpLmdldFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRSZXNvdXJjZShhVXJpKTsKLQkJfQotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShhVXJpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzKQotCQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCk7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5jb21tYW5kU3RhY2tDaGFuZ2VkKGV2ZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvQ29tcG9uZW50Q29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0NvbXBvbmVudENvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlNGE1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvQ29tcG9uZW50Q29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudEltcGxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhIGhhbmRsZSBjcmVhdGlvbiBmYWN0b3J5IGZvciB0aGUgVmlydHVhbCBQYXRoIEFQSS4gQ2xpZW50cyBtYXkgdXNlCi0gKiB0aGlzIGNsYXNzIHRvIGNvbnZlcnQgUGxhdGZvcm0gSVJlc291cmNlIG1vZGVsIGVsZW1lbnRzIHRvIElWaXJ0dWFsUmVzb3VyY2UKLSAqIG1vZGVsIGVsZW1lbnRzLgotICogPHA+Ci0gKiBDb21wb25lbnRDb3JlIHByb3ZpZGVzIGEgY29uc2lzdGVudCBlbnRyeSBwb2ludCB0byB0aGUgSVZpcnR1YWwgUGF0aCBtb2RlbAotICogdGhhdCBhbGxvd3MgY2xpZW50cyB0byBncm91cCByZXNvdXJjZXMgdG9nZXRoZXIgaW4gbG9naWNhbCBjb2xsZWN0aW9ucyB3aXRoIGEKLSAqIHBhdGggc3RydWN0dXJlIHRoYXQgdmFyaWVzIGZyb20gdGhlaXIgYWN0dWFsIHNvdXJjZSBsb2NhdGlvbiBzdHJ1Y3R1cmVzLgotICogPC9wPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudENvcmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVZpcnR1YWxSZXNvdXJjZVtdIE5PX1JFU09VUkNFUyA9IG5ldyBWaXJ0dWFsUmVzb3VyY2VbMF07Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYUNvbXBvbmVudE5hbWUpCi0JICogY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBwcm9qZWN0IChhUHJvamVjdCkuIENvbXBvbmVudCBuYW1lcyBzaG91bGQgYmUKLQkgKiB1bmlxdWUgYWNyb3NzIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGFjY2Vzc2libGUgcHJvamVjdCB0byBjb250YWluIHRoZSBjb21wb25lbnQKLQkgKiBAcmV0dXJuIEEgaGFuZGxlIHRvIGFuIElWaXJ0dWFsQ29tcG9uZW50IHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3Qgb3IKLQkgKiAgICAgICAgIG51bGwgaWYgcGFzc2VkIHByb2plY3QgZG9lcyBub3QgY29udGFpbiBNb2R1bGVDb3JlTmF0dXJlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgIWFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIElWaXJ0dWFsQ29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgKGFDb21wb25lbnROYW1lKQotCSAqIGNvbnRhaW5lZCBieSB0aGUgZ2l2ZW4gcHJvamVjdCAoYVByb2plY3QpLiBDb21wb25lbnQgbmFtZXMgc2hvdWxkIGJlCi0JICogdW5pcXVlIGFjcm9zcyBhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBhY2Nlc3NpYmxlIHByb2plY3QgdG8gY29udGFpbiB0aGUgY29tcG9uZW50Ci0JICogQHBhcmFtIGNoZWNrRm9yQ29tcG9uZW50RmlsZQotCSAqICAgICAgICAgICAgQSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSBwcmVzZW5jZSBvZiB0aGUgY29tcG9uZW50IGZpbGUgc2hvdWxkIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIEEgaGFuZGxlIHRvIGFuIElWaXJ0dWFsQ29tcG9uZW50IHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3Qgb3IKLQkgKiAgICAgICAgIG51bGwgaWYgcGFzc2VkIHByb2plY3QgZG9lcyBub3QgY29udGFpbiBNb2R1bGVDb3JlTmF0dXJlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gY2hlY2tGb3JDb21wb25lbnRGaWxlKSB7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsIHx8ICFhUHJvamVjdC5pc0FjY2Vzc2libGUoKSl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gQ29tcG9uZW50SW1wbE1hbmFnZXIuaW5zdGFuY2UoKS5jcmVhdGVDb21wb25lbnQoYVByb2plY3QsIGNoZWNrRm9yQ29tcG9uZW50RmlsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIElWaXJ0dWFsQ29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgKGFDb21wb25lbnROYW1lKQotCSAqIGNvbnRhaW5lZCBieSB0aGUgZ2l2ZW4gcHJvamVjdCAoYVByb2plY3QpLiBDb21wb25lbnQgbmFtZXMgc2hvdWxkIGJlCi0JICogdW5pcXVlIGFjcm9zcyBhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBhY2Nlc3NpYmxlIHByb2plY3QgdG8gY29udGFpbiB0aGUgY29tcG9uZW50Ci0JICogQHJldHVybiBBIGhhbmRsZSB0byBhbiBJVmlydHVhbENvbXBvbmVudCB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9yCi0JICogICAgICAgICBudWxsIGlmIHBhc3NlZCBwcm9qZWN0IGRvZXMgbm90IGNvbnRhaW4gTW9kdWxlQ29yZU5hdHVyZS4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBhTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYUNvbXBvbmVudE5hbWUpCi0JICogCi0JICogQHBhcmFtIGFDb21wb25lbnROYW1lCi0JICogICAgICAgICAgICBBIG5hbWUgdG8gaWRlbnRpZnkgdGhlIGNvbXBvbmVudCwgdGhlIG5hbWUgY2FuIGJlCi0JICogICAgICAgICAgICBsaWIvJmx0O0Fic29sdXRlIHBhdGggb2YgYSBqYXImZ3Q7IG9yCi0JICogICAgICAgICAgICB2YXIvJmx0O0NMQVNTUEFUSF9WQVJJQUJMRS9saWJyYXJ5IG5hbWVyJmd0OwotCSAqIEByZXR1cm4gQSBoYW5kbGUgdG8gYW4gSVZpcnR1YWxDb21wb25lbnQgdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2NyZWF0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoYVByb2plY3QsIGFDb21wb25lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYUNvbXBvbmVudE5hbWUpCi0JICogYW5kIHRoZSBnaXZlbiBydW50aW1lIHBhdGggKHBhdGgpCi0JICogCi0JICogQHBhcmFtIGFDb21wb25lbnROYW1lCi0JICogICAgICAgICAgICBBIG5hbWUgdG8gaWRlbnRpZnkgdGhlIGNvbXBvbmVudCwgdGhlIG5hbWUgY2FuIGJlCi0JICogICAgICAgICAgICBsaWIvJmx0O0Fic29sdXRlIHBhdGggb2YgYSBqYXImZ3Q7IG9yCi0JICogICAgICAgICAgICB2YXIvJmx0O0NMQVNTUEFUSF9WQVJJQUJMRS9saWJyYXJ5IG5hbWVyJmd0OwotCSAqIEByZXR1cm4gQSBoYW5kbGUgdG8gYW4gSVZpcnR1YWxDb21wb25lbnQgdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2NyZWF0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIGFDb21wb25lbnROYW1lLCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlyZXR1cm4gQ29tcG9uZW50SW1wbE1hbmFnZXIuaW5zdGFuY2UoKS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KGFQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSwgcnVudGltZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBJVmlydHVhbEZvbGRlciB3aXRoIGEgcnVudGltZSBwYXRoIHNwZWNpZmllZCBieSBhUnVudGltZVBhdGgKLQkgKiBjb250YWluZWQgYnkgYVByb2plY3QsIGluIGEgY29tcG9uZW50IG5hbWVkIGFDb21wb25lbnROYW1lLiBUaGUgcmVzdWx0YW50Ci0JICogSVZpcnR1YWxGb2xkZXIgbWF5IG9yIG1heSBub3QgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBhY2Nlc3NpYmxlIHByb2plY3QgdG8gY29udGFpbiB0aGUgY29tcG9uZW50Ci0JICogQHBhcmFtIGFSdW50aW1lUGF0aAotCSAqICAgICAgICAgICAgVGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgSVZpcnR1YWxGb2xkZXIgdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gQW4gSVZpcnR1YWxGb2xkZXIgY29udGFpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IHdpdGggdGhlCi0JICogICAgICAgICBnaXZlbiBydW50aW1lIHBhdGgKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2NyZWF0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNjcmVhdGVMaW5rKElQYXRoLCBpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxGb2xkZXIgY3JlYXRlRm9sZGVyKElQcm9qZWN0IGFQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIENvbXBvbmVudEltcGxNYW5hZ2VyLmluc3RhbmNlKCkuY3JlYXRlRm9sZGVyKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBJVmlydHVhbEZpbGUgd2l0aCBhIHJ1bnRpbWUgcGF0aCBzcGVjaWZpZWQgYnkgYVJ1bnRpbWVQYXRoCi0JICogY29udGFpbmVkIGJ5IGFQcm9qZWN0LCBpbiBhIGNvbXBvbmVudCBuYW1lZCBhQ29tcG9uZW50TmFtZS4gSVZpcnR1YWxGaWxlcwotCSAqIGNhbiBvbmx5IGJlIGNyZWF0ZWQgYXMgbGlua3MuIFVzZQotCSAqIHtAbGluayBJVmlydHVhbFJlc291cmNlI2dldFVuZGVybHlpbmdSZXNvdXJjZSgpfSBvcgotCSAqIHtAbGluayBJVmlydHVhbEZpbGUjZ2V0VW5kZXJseWluZ0ZpbGUoKX0gdG8gY3JlYXRlIGEgcmVzb3VyY2Ugd2l0aCByZWFsCi0JICogY29udGVudHMuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBhY2Nlc3NpYmxlIHByb2plY3QgdG8gY29udGFpbiB0aGUgY29tcG9uZW50Ci0JICogQHBhcmFtIGFSdW50aW1lUGF0aAotCSAqICAgICAgICAgICAgVGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgSVZpcnR1YWxGb2xkZXIgdG8gcmV0dXJuLgotCSAqIEByZXR1cm4gQW4gSVZpcnR1YWxGaWxlIGNvbnRhaW5lZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB3aXRoIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gcnVudGltZSBwYXRoCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2NyZWF0ZUxpbmsoSVBhdGgsIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbEZpbGUgY3JlYXRlRmlsZShJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEZpbGUoYVByb2plY3QsIGFSdW50aW1lUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIElWaXJ0dWFsUmVmZXJlbmNlIHRoYXQgY2FwdHVyZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbgotCSAqIGFDb21wb25lbnQgYW5kIGFSZWZlcmVuY2VkQ29tcG9uZW50LiBUaGUgSVZpcnR1YWxSZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQKLQkgKiB3aXRoIGFDb21wb25lbnQgYW5kIHRhcmdldCBhUmVmZXJlbmNlZENvbXBvbmVudC4gSVZpcnR1YWxSZWZlcmVuY2VzIG1heQotCSAqIHNwYW4gcHJvamVjdHMuCi0JICogCi0JICogQHBhcmFtIGFDb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGV4aXN0aW5nIElWaXJ0dWFsQ29tcG9uZW50Ci0JICogQHBhcmFtIGFSZWZlcmVuY2VkQ29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBleGlzdGluZyBJVmlydHVhbENvbXBvbmVudAotCSAqIEByZXR1cm4gQW4gSVZpcnR1YWxSZWZlcmVuY2UgdGhhdCBjYXB0dXJlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4KLQkgKiAgICAgICAgIGFDb21wb25lbnQgYW5kIGFSZWZlcmVuY2VkQ29tcG9uZW50LgotCSAqIEBzZWUgSVZpcnR1YWxSZWZlcmVuY2UjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgYVJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsUmVmZXJlbmNlKGFDb21wb25lbnQsIGFSZWZlcmVuY2VkQ29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlIGNyZWF0ZVJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCBhUmVmZXJlbmNlZENvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsUmVmZXJlbmNlKGFDb21wb25lbnQsIGFSZWZlcmVuY2VkQ29tcG9uZW50LCBydW50aW1lUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIElWaXJ0dWFsUmVzb3VyY2VzIHRoYXQgcmVwcmVzZW50IHRoZSBnaXZlbiBJUmVzb3VyY2UuCi0JICogRWFjaCBJUmVzb3VyY2UgY291bGQgYmUgbWFwcGVkIHRvIG11bHRpcGxlIGNvbXBvbmVudHMsIGFuZCB0aHVzIGFuIGFycmF5Ci0JICogb2YgZWFjaCBJVmlydHVhbFJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgSVJlc291cmNlIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogRWFjaCBJVmlydHVhbFJlc291cmNlIG1heSBhbHNvIG1hcCB0byBvdGhlciBleGlzdGluZyBJUmVzb3VyY2VzLCBzbyB0aGUKLQkgKiBtYXBwaW5nIGlzIG5vdCAxOjEuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqICAgICAgICAgICAgQW4gYWNjZXNzaWJsZSBJUmVzb3VyY2UKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIElWaXJ0dWFsUmVzb3VyY2VzIGZyb20gdGhlIG1vZGVsIHRoYXQgcmVwcmVzZW50IHRoZQotCSAqICAgICAgICAgSVJlc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZXNvdXJjZVtdIGNyZWF0ZVJlc291cmNlcyhJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBhUmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlTdHJ1Y3R1cmVFZGl0IHNlID0gbnVsbDsKLQkJTGlzdCBmb3VuZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCXNlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qKTsKLQkJCWlmIChzZSAhPSBudWxsKSB7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBzZS5maW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKGFSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIGFSZXNvdXJjZS5leGlzdHMoKSA/IFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUgOiBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9SRVNPVVJDRV9BTFdBWVMpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChhUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJCQkJZm91bmRSZXNvdXJjZXMuYWRkKG5ldyBWaXJ0dWFsRmlsZShwcm9qLCByZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKSkpOwotCQkJCQllbHNlCi0JCQkJCQlmb3VuZFJlc291cmNlcy5hZGQoQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIocHJvaiwgcmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzZSAhPSBudWxsKSB7Ci0JCQkJc2UuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZFJlc291cmNlcy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChJVmlydHVhbFJlc291cmNlW10pIGZvdW5kUmVzb3VyY2VzLnRvQXJyYXkobmV3IFZpcnR1YWxSZXNvdXJjZVtmb3VuZFJlc291cmNlcy5zaXplKCldKTsKLQkJcmV0dXJuIE5PX1JFU09VUkNFUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvSUVkaXRNb2RlbEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9JRWRpdE1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg5YjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9JRWRpdE1vZGVsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIDxwPgotICogUHJvdmlkZXMgYSBzdGFuZGFyZCBpbnRlcmZhY2UgZm9yIG1hbmFnaW5nIHRoZSBsaWZlY3ljbGUgb2YgYW4gRWRpdCBNb2RlbC4gQ2xpZW50cyB3aGljaCB1c2UKLSAqIGluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSBhcmUgPGI+cmVxdWlyZWQgdG8gaW52b2tlIHtAc2VlICNkaXNwb3NlKCl9PC9iPiB3aGVuIHRoZXkgaGF2ZQotICogY29tcGxldGVkIHRoZWlyIHVzYWdlLiBPbmNlIGNsaWVudHMgaGF2ZSBkaXNwb3NlZCB0aGF0IGluc3RhbmNlLCB0aGV5IHdpbGwgbm90IGJlIGFibGUgdG8gaW52b2tlCi0gKiB7QHNlZSAjc2F2ZShJUHJvZ3Jlc3NNb25pdG9yKX1vciB7QHNlZSAjc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IpfSZuYnNwO2FuZCBzaG91bGQgYmUgd2FyeSBvZgotICogdXNpbmcgYW55IG1vZGVsIG9iamVjdHMgYWNxdWlyZWQgZnJvbSB0aGUgaGFuZGxlciwgYXMgdGhleSBtYXkgYmUgb3IgYmVjb21lIHN0YWxlLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdE1vZGVsSGFuZGxlciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBGb3JjZSBhIHNhdmUgb2YgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBhbmQga2VlcCB0cmFjayBvZiBwcm9ncmVzcyB1c2luZyB0aGUgc3VwcGxpZWQKLQkgKiBwcm9ncmVzcyBtb25pdG9yLiBDbGllbnRzIHNob3VsZCBhdm9pZCBjYWxsaW5nIHRoaXMgdmVyc2lvbiBvZiBzYXZlIHVubGVzcyB0aGV5IGFyZSBjZXJ0YWluCi0JICogdGhleSByZXF1aXJlIHRoZSBtb2RlbCB0byBiZSBzYXZlZC4gQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2UKLQkgKiB7QHNlZSAjc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IpfSZuYnNwO2luc3RlYWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9uaXRvcgotCSAqICAgICAgICAgICAgQSB2YWxpZCBwcm9ncmVzcyBtb25pdG9yIG9yIG51bGwKLQkgKi8KLQl2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTYXZlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwsIGlmIG5vIG90aGVyIGNvbnN1bWVycyBhcmUgdXNpbmcgdGhlIGVkaXQgbW9kZWwsIGFuZCBrZWVwCi0JICogdHJhY2sgb2YgcHJvZ3Jlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHByb2dyZXNzIG1vbml0b3IuIFRoaXMgdmVyc2lvbiBvZiBzYXZlIHdpbGwgb25seSBzYXZlIGlmCi0JICogdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBpcyBub3Qgc2hhcmVkIHdpdGggb3RoZXIgY29uc3VtZXJzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICovCi0Jdm9pZCBzYXZlSWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbGllbnRzIG11c3QgaW52b2tlIHRoaXMgbWV0aG9kIHdoZW4gdGhleSBoYXZlIGZpbmlzaGVkIHVzaW5nIHRoZSBoYW5kbGVyLgotCSAqIDwvcD4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9Nb2R1bGVDb3JlTmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvTW9kdWxlQ29yZU5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk2ODUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9Nb2R1bGVDb3JlTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5JU3luY2hyb25pemVyRXh0ZW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlU3RydWN0dXJhbE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRDb3JlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLk1vZHVsZUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVkaXRNb2RlbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogPHA+Ci0gKiBBbGxvd3MgcHJvamVjdHMgdG8gc3VwcG9ydCBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZXMuIFRoZSBNb2R1bGVDb3JlTmF0dXJlIG1hbmFnZXMgdGhlCi0gKiBjb25maWd1cmF0aW9uIG9mIGEgbW9kdWxlIHN0cnVjdHVyYWwgYnVpbGRlciB0aGF0IHByZXBhcmVzIFdvcmtiZW5jaE1vZHVsZXMgZm9yIGRlcGxveW1lbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRvIGRldGVybWluZSBpZiBhIHByb2plY3Qgc3VwcG9ydHMgZmxleGlibGUgcHJvamVjdCBzdHJ1Y3R1cmVzLCBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUKLSAqIE1vZHVsZUNvcmVOYXR1cmU6Ci0gKiA8cD4KLSAqIDxjb2RlPihNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCkgIT0gbnVsbCk8L2NvZGU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIElmIHRoZSBwcm9qZWN0IGhhcyBhIE1vZHVsZUNvcmVOYXR1cmUsIHRoZW4gdGhlIHByb2plY3Qgc3VwcG9ydHMgZmxleGlibGUgbW9kdWxlIHN0cnVjdHVyZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEluIGdlbmVyYWwsIGNsaWVudHMgYXJlIGV4cGVjdGVkIHRvIHVzZSB0aGUgdXRpbGl0eSBtZXRob2RzIGF2YWlsYWJsZSBvbiB0aGlzIGNsYXNzIHRvIGFjcXVpcmUKLSAqIHRoZSBNb2R1bGVDb3JlTmF0dXJlIGluc3RhbmNlIGZyb20gYSBnaXZlbiBwcm9qZWN0ICh7QHNlZSAjZ2V0TW9kdWxlQ29yZU5hdHVyZShJUHJvamVjdCl9Ci0gKiAmbmJzcDtvciB0byBtYWtlIGEgZmxleGlibGUgcHJvamVjdCBmbGV4aWJsZSBieSBhZGRpbmcgYSBNb2R1bGVDb3JlTmF0dXJlICgKLSAqIHtAc2VlICNhZGRNb2R1bGVDb3JlTmF0dXJlSWZOZWNlc3NhcnkoSVByb2plY3QsIElQcm9ncmVzc01vbml0b3IpfSkuCi0gKiA8L3A+IAotICogPGEgbmFtZT0ibW9kZWwtZGlzY3Vzc2lvbiIvPgotKiA8YSBuYW1lPSJtb2R1bGUtc3RydWN0dXJhbC1tb2RlbCIvPgotKiA8cD4KLSogRWFjaCBNb2R1bGVDb3JlTmF0dXJlIGZyb20gYSBnaXZlbiBwcm9qZWN0IGNhbiBwcm92aWRlIGFjY2VzcyB0byB0aGUKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgb2YgdGhlIHByb2plY3QuCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IGlzIGEgc3ViY2xhc3Mgb2YKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsfSZuYnNwO3RoYXQgbWFuYWdlcwotKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWwuIEFzIGFuIEVkaXRNb2RlbCwgdGhlCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IHJlZmVyZW5jZXMgRU1GIHJlc291cmNlcywKLSogdGhhdCBjb250YWluIEVNRiBtb2RlbHMgLS0gaW4gdGhpcyBjYXNlLCB0aGUgRU1GIG1vZGVsIG9mIDxpPi5jb21wb25lbnQgPC9pPiBmaWxlLgotKiA8L3A+Ci0qIDxwPgotKiBDbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUgRWRpdCBGYWNhZGUgcGF0dGVybiAodmlhCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXR9Jm5ic3A7IG9yIG9uZSBpZiBpdHMgcmVsZXZhbnQgc3ViY2xhc3NlcykKLSogdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWwuCi0qIDwvcD4KLSogPGEgbmFtZT0iYXJ0aWZhY3QtZWRpdG1vZGVsIi8+Ci0qIDxwPgotKiBFYWNoIE1vZHVsZUNvcmVOYXR1cmUgZnJvbSBhIGdpdmVuIHByb2plY3QgY2FuIGFsc28gcHJvdmlkZSBhY2Nlc3MgdG8gdGhlCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgZm9yIGVhY2gKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgY29udGFpbmVkIGJ5IHRoZSBwcm9qZWN0LiBMaWtlCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9LAotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7IGlzIGEgc3ViY2xhc3Mgb2YKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsfSZuYnNwOyB0aGF0IGNvbnRhaW5zCi0qIEVNRiByZXNvdXJjZXMsIHdoaWNoIGluIHR1cm4gY29udGFpbiB0aGUgRU1GIG1vZGVscyBvZiBtb2R1bGUgbWV0YWRhdGEgZmlsZXMgKHN1Y2ggYXMgSjJFRQotKiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzKS4KLSogPC9wPgotKiA8cD4KLSogVGhlIGZvbGxvd2luZyBkaWFncmFtIGhpZ2hsaWdodHMgdGhlIHJlbGF0aW9uc2hpcHMgb2YgdGhlc2Ugc3ViY2xhc3NlcyBvZiBFZGl0TW9kZWwsIGFuZCB0aGUKLSogcmVsYXRpb25zaGlwIG9mIHRoZSBFZGl0TW9kZWwgdG8gdGhlIEVNRiByZXNvdXJjZXMuIEluIHRoZSBkaWFncmFtLCAiTWV0YW1vZGVsUmVzb3VyY2UiIGFuZAotKiAiTWV0YW1vZGVsT2JqZWN0IiBhcmUgdXNlZCBhcyBwbGFjZWhvbGRlcnMgZm9yIHRoZSBzcGVjaWZpYyBzdWJjbGFzc2VzIG9mCi0qIHtAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZX0mbmJzcDthbmQge0BzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3R9Jm5ic3A7Ci0qIHJlc3BlY3RpdmVseS4KLSogPC9wPgotKiA8dGFibGUgY2VsbHNwYWNpbmc9IjEwIiBjZWxscGFkZGluZz0iMTAiPgotKiA8dHI+Ci0qIDx0ZD4KLSogPHA+Ci0qIDxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy9tZXRhbW9kZWxfY29tcG9uZW50cy5qcGciIC8+Ci0qIDwvcD4KLSogPC90ZD4KLSogPC90cj4KLSogPHRyPgotKiA8dGQ+Ci0qIDxwPgotKiA8aT5GaWd1cmUgMTogQSBjb21wb25lbnQgZGlhZ3JhbSBvZiB0aGUgTW9kdWxlIEVkaXQgTW9kZWxzLiA8L2k+Ci0qIDwvcD4KLSogPC90ZD4KLSogPC90cj4KLSogPC90YWJsZT4KLSogPHA+Ci0qIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBFZGl0IEZhY2FkZSBwYXR0ZXJuICh2aWEKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdH0mbmJzcDsgb3Igd2hhdCBpZiBpdHMgcmVsZXZhbnQgc3ViY2xhc3NlcykKLSogdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWwuCi0qIDwvcD4KLSogPGEgbmFtZT0iYWNjZXNzb3Ita2V5Ii8+Ci0qIDxwPgotKiBBbGwgRWRpdE1vZGVscyBoYXZlIGEgbGlmZWN5Y2xlIHRoYXQgbXVzdCBiZSBlbmZvcmNlZCB0byBrZWVwIHRoZSByZXNvdXJjZXMgbG9hZGVkIHRoYXQgYXJlIGluCi0qIHVzZSwgYW5kIHRvIHVubG9hZCByZXNvdXJjZXMgdGhhdCBhcmUgbm90IGluIHVzZS4gVG8gYWNjZXNzIGFuIEVkaXRNb2RlbCwgY2xpZW50cyBhcmUgcmVxdWlyZWQgdG8KLSogc3VwcGx5IGFuIG9iamVjdCB0b2tlbiByZWZlcnJlZCB0byBhcyBhbiBhY2Nlc3NvciBrZXkuIFRoZSBhY2Nlc3NvciBrZXkgYWxsb3dzIHRoZSBmcmFtZXdvcmsgdG8KLSogYmV0dGVyIHRyYWNrIHdoaWNoIGNsaWVudHMgYXJlIHVzaW5nIHRoZSBFZGl0TW9kZWwsIGFuZCB0byBlbnN1cmUgdGhhdCBvbmx5IGEgY2xpZW50IHdoaWNoIGhhcwotKiBhY2Nlc3NlZCB0aGUgRWRpdE1vZGVsIHdpdGggYW4gYWNjZXNzb3Iga2V5IG1heSBpbnZva2Ugc2F2ZSooKXMgb24gdGhhdCBFZGl0TW9kZWwuCi0qIDwvcD4gCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0I2dldFN0cnVjdHVyZUVkaXRGb3JSZWFkKElQcm9qZWN0KQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdCNnZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoSVByb2plY3QpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdCNnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQjZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCkKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQ29yZU5hdHVyZSBleHRlbmRzIEVkaXRNb2RlbE5hdHVyZSBpbXBsZW1lbnRzIElQcm9qZWN0TmF0dXJlLCBJTW9kdWxlQ29uc3RhbnRzLCBJU3luY2hyb25pemVyRXh0ZW5kZXIgewotCQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fQlVJTERFUl9JRCA9IFZhbGlkYXRpb25QbHVnaW4uVkFMSURBVElPTl9CVUlMREVSX0lEOwotICAgIHByaXZhdGUgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGNhY2hlZFdyaXRlSGFuZGxlOwotICAgIHByaXZhdGUgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGNhY2hlZFJlYWRIYW5kbGU7Ci0JLyoqCi0JICogPHA+Ci0JICogRmluZCBhbmQgcmV0dXJuIHRoZSBNb2R1bGVDb3JlTmF0dXJlIG9mIGFQcm9qZWN0LCBpZiBhdmFpbGFibGUuCi0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqICAgICAgICAgICAgQW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHJldHVybiBUaGUgTW9kdWxlQ29yZU5hdHVyZSBvZiBhUHJvamVjdCwgaWYgaXQgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVDb3JlTmF0dXJlIGdldE1vZHVsZUNvcmVOYXR1cmUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChhUHJvamVjdCAhPSBudWxsICYmIGFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJCXJldHVybiAoTW9kdWxlQ29yZU5hdHVyZSkgYVByb2plY3QuZ2V0TmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLy8gVGhlIGV4aXN0ZW5jZSBvZiB0aGlzIE5hdHVyZSBwbHVzIHRoZSBjb21wb25lbnQgZmlsZSBvbiBkaXNrIG1ha2VzIGEgZmxleGlibGUgcHJvamVjdAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZsZXhpYmxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gZm91bmROYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCkgIT0gbnVsbDsKLQkJaWYgKGZvdW5kTmF0dXJlKSB7Ci0JCQlyZXR1cm4gY29tcG9uZW50UmVzb3VyY2VFeGlzdHMocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcG9uZW50UmVzb3VyY2VFeGlzdHMoSVByb2plY3QgcHJvamVjdCkgewotCQkKLQkJSUZpbGUgY29tcEZpbGUgPSBwcm9qZWN0LmdldEZpbGUoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCQlpZiAoY29tcEZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSB7IC8vTmVlZCB0byBjaGVjayBmb3IgbGVnYWN5IGZpbGUgbG9jYXRpb25zIGFsc28uLi4uCi0JCQljb21wRmlsZSA9IHByb2plY3QuZ2V0RmlsZShNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuUjFfTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJCWlmIChjb21wRmlsZS5pc0FjY2Vzc2libGUoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UgewotCQkJCWNvbXBGaWxlID0gcHJvamVjdC5nZXRGaWxlKE1vZHVsZVN0cnVjdHVyYWxNb2RlbC5SMF83X01PRFVMRV9NRVRBX0ZJTEVfTkFNRSk7Ci0JCQkJaWYgKGNvbXBGaWxlLmlzQWNjZXNzaWJsZSgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIHsKLQkJCQkJY29tcEZpbGUgPSBwcm9qZWN0LmdldEZpbGUoV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5GSVJTVF9XVFBfTU9EVUxFU19TSE9SVF9OQU1FKTsKLQkJCQkJcmV0dXJuIGNvbXBGaWxlLmlzQWNjZXNzaWJsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgYSBNb2R1bGVDb3JlTmF0dXJlIHRvIHRoZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIGFjY2Vzc2libGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0cmFjayB0aGUgdGltZSB0byBjb21wbGV0aW9uCi0JICogQHJldHVybiBUaGUgTW9kdWxlQ29yZU5hdHVyZSBvZiBhUHJvamVjdCwgaWYgaXQgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVDb3JlTmF0dXJlIGFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShmaW5hbCBJUHJvamVjdCBhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKGFQcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKQotCQkJCXJldHVybiBnZXRNb2R1bGVDb3JlTmF0dXJlKGFQcm9qZWN0KTsKLQotCQkJSUpvYk1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwkKLQkJCWlmIChhTW9uaXRvciAhPSBudWxsKQotCQkJCWFNb25pdG9yLmJlZ2luVGFzaygiQWRkIE1vZHVsZUNvcmUgTmF0dXJlIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1hbmFnZXIuYmVnaW5SdWxlKHJvb3QsIGFNb25pdG9yKTsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGFQcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJU3RyaW5nW10gY3VycmVudE5hdHVyZUlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJCVN0cmluZ1tdIG5ld05hdHVyZUlkcyA9IG5ldyBTdHJpbmdbY3VycmVudE5hdHVyZUlkcy5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnROYXR1cmVJZHMsIDAsIG5ld05hdHVyZUlkcywgMCwgY3VycmVudE5hdHVyZUlkcy5sZW5ndGgpOwotCQkJCW5ld05hdHVyZUlkc1tjdXJyZW50TmF0dXJlSWRzLmxlbmd0aF0gPSBJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQ7Ci0JCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZUlkcyk7Ci0JCQkJYVByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIGFNb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1hbmFnZXIuZW5kUnVsZShyb290KTsKLQkJCX0gCQkJCi0JCQlpZiAoYU1vbml0b3IgIT0gbnVsbCkKLQkJCQlhTW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQkvKiBSZXR1cm4gdGhlIG5ldyBuYXR1cmUgKi8KLQkJcmV0dXJuIGdldE1vZHVsZUNvcmVOYXR1cmUoYVByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybiBhIHtAc2VlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDtmb3IgcmVhZC1vbmx5IGFjY2Vzcy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2Uge0BzZWUgTW9kdWxlQ29yZSNnZXRNb2R1bGVDb3JlRm9yUmVhZChJUHJvamVjdCl9Jm5ic3A7dG8gd29yawotCSAqIHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbHMgb2YgZmxleGlibGUgcHJvamVjdHMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFNlZSB0aGUgZGlzY3Vzc2lvbiB3aGF0IGEge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyBpcyBhbmQgPGEKLQkgKiBocmVmPSIjbW9kdWxlLXN0cnVjdHVyYWwtbW9kZWwiPmhvdyBpdCByZWxhdGVzIHRvIHRoZSBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWwgPC9hPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQWxzbyBzZWUgdGhlIGRpc2N1c3Npb24gb2YgPGEgaHJlZj0iI2FjY2Vzc29yLWtleSI+dGhlIHB1cnBvc2Ugb2YgYW4gYWNjZXNzb3Iga2V5IDwvYT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFjY2Vzc29yS2V5Ci0JICogICAgICAgICAgICBUeXBpY2FsbHkgY2xpZW50IHN1cHBsaWVzIHRoZSBvYmplY3QgdGhhdCBpbnZva2VkIHRoaXMgbWV0aG9kLCBvciBhIHByb3h5ICgKLQkgKiAgICAgICAgICAgIDxjb2RlPm5ldyBPYmplY3QoKTwvY29kZT4pIGluIHRoZSBjYXNlIG9mIG90aGVyIHN0YXRpYyBtZXRob2RzIHJlcXVlc3RpbmcgYQotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfS4KLQkgKiBAcmV0dXJuIEEge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfWZvciB0aGUgcHJvamVjdCBvZiB0aGUgY3VycmVudCBuYXR1cmUuCi0JICovCi0JcHVibGljIE1vZHVsZVN0cnVjdHVyYWxNb2RlbCBnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKE9iamVjdCBhbkFjY2Vzc29yS2V5KSB7Ci0JCS8vIFJldHVybiBzZWxmIG1hbmFnZWQgZWRpdCBtb2RlbCAtIHdpbGwgYWx3YXlzIGNhY2hlIGxvY2FsbHkKLQkJTW9kdWxlU3RydWN0dXJhbE1vZGVsIGVkaXRNb2RlbCA9IChNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwpZ2V0RW1mQ29udGV4dCgpLmdldEV4aXN0aW5nRWRpdE1vZGVsKE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3RvcnkuTU9EVUxFX1NUUlVDVFVSQUxfTU9ERUxfSUQsIG51bGwsdHJ1ZSk7Ci0JCWlmIChlZGl0TW9kZWwgPT0gbnVsbCkgewotCQkJZWRpdE1vZGVsID0gKE1vZHVsZVN0cnVjdHVyYWxNb2RlbClFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5NT0RVTEVfU1RSVUNUVVJBTF9NT0RFTF9JRCwgZ2V0RW1mQ29udGV4dCgpLCBudWxsKTsKLQkJCWdldEVtZkNvbnRleHQoKS5jYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIG51bGwpOwotCQkJZWRpdE1vZGVsLmFjY2VzcyhhbkFjY2Vzc29yS2V5KTsKLQkJfSBlbHNlIAotCQkJZWRpdE1vZGVsLmFjY2VzcyhhbkFjY2Vzc29yS2V5KTsKLQkJcmV0dXJuIGVkaXRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm4gYSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7Zm9yIHdyaXRlIGFjY2Vzcy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2Uge0BzZWUgTW9kdWxlQ29yZSNnZXRNb2R1bGVDb3JlRm9yV3JpdGUoSVByb2plY3QpfSZuYnNwO3RvIHdvcmsKLQkgKiB3aXRoIHRoZSBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWxzIG9mIGZsZXhpYmxlIHByb2plY3RzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBTZWUgdGhlIGRpc2N1c3Npb24gd2hhdCBhIHtAc2VlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgaXMgYW5kIDxhCi0JICogaHJlZj0iI21vZHVsZS1zdHJ1Y3R1cmFsLW1vZGVsIj5ob3cgaXQgcmVsYXRlcyB0byB0aGUgTW9kdWxlIFN0cnVjdHVyYWwgTWV0YW1vZGVsIDwvYT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFsc28gc2VlIHRoZSBkaXNjdXNzaW9uIG9mIDxhIGhyZWY9IiNhY2Nlc3Nvci1rZXkiPnRoZSBwdXJwb3NlIG9mIGFuIGFjY2Vzc29yIGtleSA8L2E+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BY2Nlc3NvcktleQotCSAqICAgICAgICAgICAgVHlwaWNhbGx5IGNsaWVudCBzdXBwbGllcyB0aGUgb2JqZWN0IHRoYXQgaW52b2tlZCB0aGlzIG1ldGhvZCwgb3IgYSBwcm94eSAoCi0JICogICAgICAgICAgICA8Y29kZT5uZXcgT2JqZWN0KCk8L2NvZGU+KSBpbiB0aGUgY2FzZSBvZiBvdGhlciBzdGF0aWMgbWV0aG9kcyByZXF1ZXN0aW5nIGEKLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbH0uCi0JICogQHJldHVybiBBIHtAc2VlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbH1mb3IgdGhlIHByb2plY3Qgb2YgdGhlIGN1cnJlbnQgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yV3JpdGUoT2JqZWN0IGFuQWNjZXNzb3JLZXkpIHsKLQkJLy8gUmV0dXJuIHNlbGYgbWFuYWdlZCBlZGl0IG1vZGVsIC0gd2lsbCBhbHdheXMgY2FjaGUgbG9jYWxseQotCQlNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgZWRpdE1vZGVsID0gKE1vZHVsZVN0cnVjdHVyYWxNb2RlbClnZXRFbWZDb250ZXh0KCkuZ2V0RXhpc3RpbmdFZGl0TW9kZWwoTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5NT0RVTEVfU1RSVUNUVVJBTF9NT0RFTF9JRCwgbnVsbCxmYWxzZSk7Ci0JCWlmIChlZGl0TW9kZWwgPT0gbnVsbCkgewotCQkJZWRpdE1vZGVsID0gKE1vZHVsZVN0cnVjdHVyYWxNb2RlbClFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3RvcnkuTU9EVUxFX1NUUlVDVFVSQUxfTU9ERUxfSUQsIGdldEVtZkNvbnRleHQoKSwgbnVsbCk7Ci0JCQlnZXRFbWZDb250ZXh0KCkuY2FjaGVFZGl0TW9kZWwoZWRpdE1vZGVsLCBudWxsKTsKLQkJCWVkaXRNb2RlbC5hY2Nlc3MoYW5BY2Nlc3NvcktleSk7Ci0JCQkKLQkJfSBlbHNlIAotCQkJZWRpdE1vZGVsLmFjY2VzcyhhbkFjY2Vzc29yS2V5KTsKLQkJCi0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgdG8gd29yayB3aXRoIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgb2YgYW4KLQkgKiBpbmRpdmlkdWFsIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7IGNvbnRhaW5lZCBpbiB0aGUgcHJvamVjdC4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9cwotCSAqIGFyZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQgbW9kZWxzIGZvciBpbmRpdmlkdWFsIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9cy4gSW4KLQkgKiBnZW5lcmFsLCBhIGNvbnRlbnQgbW9kZWwgd2lsbCBjb250YWluIGFuIEVNRiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kdWxlJ3MgcmVsZXZhbnQKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCBwb3NzaWJseSBvdGhlciBFTUYgcmVzb3VyY2VzIGFzIHdlbGwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfXMgdGhhdCBhcmUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBtYXkgbm90IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZAotCSAqIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBNb2R1bGUgQ29udGVudCBNZXRhbW9kZWwuIENsaWVudHMgdGhhdCBuZWVkIHRvIG1ha2UgY2hhbmdlcwotCSAqIHRvIHRoZSB1bmRlcmx5aW5nIE1vZHVsZSBDb250ZW50IE1vZHVsZSwgYW5kIHRoYXQgY2hvb3NlIHRvIHdvcmsgZGlyZWN0bHkgd2l0aCB0aGUKLQkgKiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgc2hvdWxkIHVzZSB7QHNlZSAjZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZShVUkksIE9iamVjdCl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QHNlZSBBcnRpZmFjdEVkaXR9Jm5ic3A7b3Igb25lIG9mIGl0cyByZWxldmFudCBzdWJjbGFzc2VzIHRvCi0JICogd29yayB3aXRoIHRoZSBtb2R1bGUgY29udGVudCBtb2RlbCwgaW5zdGVhZCBvZiB3b3JraW5nIHdpdGggZGlyZWN0bHkgd2l0aCB0aGUgRWRpdE1vZGVsOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnRpZmFjdEVkaXQgZWRpdEZhY2FkZSA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGFXb3JrYmVuY2hNb2R1bGUpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBhIGNsaWVudCBpcyBhd2FyZSBvZiB0aGUgdW5kZXJseWluZyB0eXBlIG9mIG1vZHVsZSwgbW9yZSBzcGVjaWZpYyBFZGl0IEZhY2FkZXMgbWF5IGJlCi0JICogYWNxdWlyZWQ6Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPldlYkVkaXQgZWRpdEZhY2FkZSA9IFdlYkVkaXQuZ2V0V2ViRWRpdEZvclJlYWQoYVdvcmtiZW5jaE1vZHVsZSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiBhIHBhcnRpY3VsYXIgRWRpdCBGYWNhZGUgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhlIHN1cHBsaWVkIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9LCB0aGVuCi0JICogPGI+bnVsbCA8L2I+IHdpbGwgYmUgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIFNlZSB0aGUgZGlzY3Vzc2lvbiB3aGF0IGEge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7IGlzIGFuZCA8YQotCSAqIGhyZWY9IiNhcnRpZmFjdC1lZGl0bW9kZWwiPmhvdyBpdCByZWxhdGVzIHRvIHRoZSBNb2R1bGUgQ29udGVudCBNZXRhbW9kZWwgPC9hPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQWxzbyBzZWUgdGhlIGRpc2N1c3Npb24gb2YgPGEgaHJlZj0iI2FjY2Vzc29yLWtleSI+dGhlIHB1cnBvc2Ugb2YgYW4gYWNjZXNzb3Iga2V5IDwvYT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBVUkkgb2YgdGhlIGZvcm0gIm1vZHVsZTovcmVzb3VyY2UvIDxwcm9qZWN0LW5hbWU+LwotCSAqICAgICAgICAgICAgPG1vZHVsZS1kZXBsb3llZC1uYW1lPiIKLQkgKiBAcGFyYW0gYW5BY2Nlc3NvcktleQotCSAqICAgICAgICAgICAgVHlwaWNhbGx5IGNsaWVudCBzdXBwbGllcyB0aGUgb2JqZWN0IHRoYXQgaW52b2tlZCB0aGlzIG1ldGhvZCwgb3IgYSBwcm94eSAoCi0JICogICAgICAgICAgICA8Y29kZT5uZXcgT2JqZWN0KCk8L2NvZGU+KSBpbiB0aGUgY2FzZSBvZiBvdGhlciBzdGF0aWMgbWV0aG9kcyByZXF1ZXN0aW5nIGEKLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbH0uCi0JICogQHJldHVybgotCSAqIEBzZWUgQXJ0aWZhY3RFZGl0Ci0JICogQHNlZSBBcnRpZmFjdEVkaXQjZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50KQotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoVVJJIGFNb2R1bGVVUkksIE9iamVjdCBhbkFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoYU1vZHVsZVVSSSwgYW5BY2Nlc3NvcktleSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhTW9kdWxlVVJJIC0gdXNlZCB0byBsb29rdXAgcHJvamVjdAotCSAqIEBwYXJhbSBhbkFjY2Vzc29yS2V5IC0gdXNlZCB0byBzZXQgY2xpZW50IGFjY2Vzc29yCi0JICogQHBhcmFtIHByb2plY3RUeXBlIC0gdXNlZCB0byBkZXRlcm1pbmUgZWRpdG1vZGVsIGZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyYW1zIC0gcGFzc2VkIGZvciBzcGVjaWFsaXplZCBwcm9jZXNzaW5nIGluIGZhY3RvcnkKLQkgKiBAcmV0dXJuIEFydGlmYWN0RWRpdE1vZGVsIGluc3RhbmNlCi0JICovCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChVUkkgYU1vZHVsZVVSSSwgT2JqZWN0IGFuQWNjZXNzb3JLZXksIFN0cmluZyBwcm9qZWN0VHlwZSwgTWFwIHBhcmFtcykgewotCQkKLQkJaWYgKHBhcmFtcyA9PSBudWxsKQotCQkJcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJcGFyYW1zLnB1dChBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuUEFSQU1fTU9EVUxFX1VSSSwgYU1vZHVsZVVSSSk7Ci0JCWlmIChwcm9qZWN0VHlwZSAhPW51bGwpCi0JCQlyZXR1cm4gKEFydGlmYWN0RWRpdE1vZGVsKSBnZXRFZGl0TW9kZWxGb3JSZWFkKHByb2plY3RUeXBlLCBhbkFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQl0cnkgewotCQkJSVByb2plY3QgYVByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGFQcm9qZWN0KTsKLQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gZWRpdE1vZGVsSURzID0gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSZWdpc3RlcmVkRWRpdE1vZGVsSURzKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGVkaXRNb2RlbElEcy5sZW5ndGg7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChlZGl0TW9kZWxJRHNbaV0pOwotCQkJCQkJaWYgKGZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSkgewotCQkJCQkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgZ2V0RWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRHNbaV0sIGFuQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCQkJCQkJaWYgKGVkaXRNb2RlbCAhPW51bGwpCi0JCQkJCQkJCXJldHVybiBlZGl0TW9kZWw7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJZ25vcmUgZXhjZXB0aW9ucyB0aGF0IGNvbWUgZnJvbSBQcm9qZWN0RmFjZXRzTWFuYWdlcgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKFN0YXR1cy5FUlJPUiwgTW9kdWxlQ29yZU1lc3NhZ2VzLkFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1JlYWRfRXhjZXB0aW9uLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihTdGF0dXMuRVJST1IsIE1vZHVsZUNvcmVNZXNzYWdlcy5BY3F1aXJpbmdfQXJ0aWZhY3RFZGl0X0Zvcl9SZWFkX0V4Y2VwdGlvbiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoVVJJIGFNb2R1bGVVUkksIE9iamVjdCBhbkFjY2Vzc29yS2V5LCBTdHJpbmcgcHJvamVjdFR5cGUpIHsKLQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoYU1vZHVsZVVSSSwgYW5BY2Nlc3NvcktleSwgcHJvamVjdFR5cGUsIHBhcmFtcyk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgdG8gd29yayB3aXRoIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgb2YgYW4KLQkgKiBpbmRpdmlkdWFsIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7IGNvbnRhaW5lZCBpbiB0aGUgcHJvamVjdC4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9cwotCSAqIGFyZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQgbW9kZWxzIGZvciBpbmRpdmlkdWFsIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9cy4gSW4KLQkgKiBnZW5lcmFsLCBhIGNvbnRlbnQgbW9kZWwgd2lsbCBjb250YWluIGFuIEVNRiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kdWxlJ3MgcmVsZXZhbnQKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCBwb3NzaWJseSBvdGhlciBFTUYgcmVzb3VyY2VzIGFzIHdlbGwuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfXMgdGhhdCBhcmUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIE1vZHVsZSBDb250ZW50IE1ldGFtb2RlbC4gRm9yIGNsaWVudHMgdGhhdCBkbyBub3QgZXhwZWN0IHRvCi0JICogbWFrZSBtb2RpZmljYXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QHNlZSAjZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKFVSSSwgT2JqZWN0KX0KLQkgKiAmbmJzcDsgaW5zdGVhZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2Uge0BzZWUgQXJ0aWZhY3RFZGl0fSZuYnNwO29yIG9uZSBvZiBpdHMgcmVsZXZhbnQgc3ViY2xhc3NlcyB0bwotCSAqIHdvcmsgd2l0aCB0aGUgbW9kdWxlIGNvbnRlbnQgbW9kZWwsIGluc3RlYWQgb2Ygd29ya2luZyB3aXRoIGRpcmVjdGx5IHdpdGggdGhlIEVkaXRNb2RlbDoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+QXJ0aWZhY3RFZGl0IGVkaXRGYWNhZGUgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYVdvcmtiZW5jaE1vZHVsZSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBXaGVuIGEgY2xpZW50IGlzIGF3YXJlIG9mIHRoZSB1bmRlcmx5aW5nIHR5cGUgb2YgbW9kdWxlLCBtb3JlIHNwZWNpZmljIEVkaXQgRmFjYWRlcyBtYXkgYmUKLQkgKiBhY3F1aXJlZDoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+V2ViRWRpdCBlZGl0RmFjYWRlID0gV2ViRWRpdC5nZXRXZWJFZGl0Rm9yV3JpdGUoYVdvcmtiZW5jaE1vZHVsZSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiBhIHBhcnRpY3VsYXIgRWRpdCBGYWNhZGUgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhlIHN1cHBsaWVkIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9LCB0aGVuCi0JICogPGI+bnVsbCA8L2I+IHdpbGwgYmUgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIFNlZSB0aGUgZGlzY3Vzc2lvbiB3aGF0IGEge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7IGlzIGFuZCA8YQotCSAqIGhyZWY9IiNhcnRpZmFjdC1lZGl0bW9kZWwiPmhvdyBpdCByZWxhdGVzIHRvIHRoZSBNb2R1bGUgQ29udGVudCBNZXRhbW9kZWwgPC9hPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQWxzbyBzZWUgdGhlIGRpc2N1c3Npb24gb2YgPGEgaHJlZj0iI2FjY2Vzc29yLWtleSI+dGhlIHB1cnBvc2Ugb2YgYW4gYWNjZXNzb3Iga2V5IDwvYT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBVUkkgb2YgdGhlIGZvcm0gIm1vZHVsZTovcmVzb3VyY2UvIDxwcm9qZWN0LW5hbWU+LwotCSAqICAgICAgICAgICAgPG1vZHVsZS1kZXBsb3llZC1uYW1lPiIKLQkgKiBAcGFyYW0gYW5BY2Nlc3NvcktleQotCSAqICAgICAgICAgICAgVHlwaWNhbGx5IGNsaWVudCBzdXBwbGllcyB0aGUgb2JqZWN0IHRoYXQgaW52b2tlZCB0aGlzIG1ldGhvZCwgb3IgYSBwcm94eSAoCi0JICogICAgICAgICAgICA8Y29kZT5uZXcgT2JqZWN0KCk8L2NvZGU+KSBpbiB0aGUgY2FzZSBvZiBvdGhlciBzdGF0aWMgbWV0aG9kcyByZXF1ZXN0aW5nIGEKLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZVN0cnVjdHVyYWxNb2RlbH0uCi0JICogQHJldHVybgotCSAqIEBzZWUgQXJ0aWZhY3RFZGl0Ci0JICogQHNlZSBBcnRpZmFjdEVkaXQjZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50KQotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKFVSSSBhTW9kdWxlVVJJLCBPYmplY3QgYW5BY2Nlc3NvcktleSkgewotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZShhTW9kdWxlVVJJLCBhbkFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGFNb2R1bGVVUkkgLSB1c2VkIHRvIGxvb2t1cCBwcm9qZWN0Ci0JICogQHBhcmFtIGFuQWNjZXNzb3JLZXkgLSB1c2VkIHRvIHNldCBjbGllbnQgYWNjZXNzb3IKLQkgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSB1c2VkIHRvIGRldGVybWluZSBlZGl0bW9kZWwgZmFjdG9yeQotCSAqIEBwYXJhbSBwYXJhbXMgLSBwYXNzZWQgZm9yIHNwZWNpYWxpemVkIHByb2Nlc3NpbmcgaW4gZmFjdG9yeQotCSAqIEByZXR1cm4gQXJ0aWZhY3RFZGl0TW9kZWwgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZShVUkkgYU1vZHVsZVVSSSwgT2JqZWN0IGFuQWNjZXNzb3JLZXksIFN0cmluZyBwcm9qZWN0VHlwZSwgTWFwIHBhcmFtcykgewotCQkKLQkJaWYgKHBhcmFtcyA9PSBudWxsKQotCQkJcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJcGFyYW1zLnB1dChBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuUEFSQU1fTU9EVUxFX1VSSSwgYU1vZHVsZVVSSSk7Ci0JCWlmIChwcm9qZWN0VHlwZSAhPSBudWxsKQotCQkJcmV0dXJuICAoQXJ0aWZhY3RFZGl0TW9kZWwpIGdldEVkaXRNb2RlbEZvcldyaXRlKHByb2plY3RUeXBlLCBhbkFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQl0cnkgewotCQkJSVByb2plY3QgYVByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGFQcm9qZWN0KTsKLQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gZWRpdE1vZGVsSURzID0gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSZWdpc3RlcmVkRWRpdE1vZGVsSURzKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGVkaXRNb2RlbElEcy5sZW5ndGg7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChlZGl0TW9kZWxJRHNbaV0pOwotCQkJCQkJaWYgKGZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSkgewotCQkJCQkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSURzW2ldLCBhbkFjY2Vzc29yS2V5LCBwYXJhbXMpOwotCQkJCQkJCWlmIChlZGl0TW9kZWwgIT1udWxsKQotCQkJCQkJCQlyZXR1cm4gZWRpdE1vZGVsOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gSWdub3JlIGV4Y2VwdGlvbnMgdGhhdCBjb21lIGZyb20gUHJvamVjdEZhY2V0c01hbmFnZXIKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihTdGF0dXMuRVJST1IsIE1vZHVsZUNvcmVNZXNzYWdlcy5BY3F1aXJpbmdfQXJ0aWZhY3RFZGl0X0Zvcl9Xcml0ZV9FeGNlcHRpb24sIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKFN0YXR1cy5FUlJPUiwgTW9kdWxlQ29yZU1lc3NhZ2VzLkFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1dyaXRlX0V4Y2VwdGlvbiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKFVSSSBhTW9kdWxlVVJJLCBPYmplY3QgYW5BY2Nlc3NvcktleSwgU3RyaW5nIHByb2plY3RUeXBlKSB7Ci0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZShhTW9kdWxlVVJJLCBhbkFjY2Vzc29yS2V5LCBwcm9qZWN0VHlwZSwgcGFyYW1zKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hdHVyZUlEKCkgewotCQlyZXR1cm4gTU9EVUxFX05BVFVSRV9JRDsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSUVNRkNvbnRleHRDb250cmlidXRvciNwcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpIHsKLQkJaWYgKGVtZkNvbnRleHQgPT0gYU5hdHVyZSkKLQkJCXJldHVybjsKLQkJZW1mQ29udGV4dCA9IGFOYXR1cmU7Ci0JCWdldEVtZkNvbnRleHQoKS5zZXREZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSh0cnVlKTsKLQkJLy8gT3ZlcnJpZGluZyBzdXBlcmNsYXNzIHRvIHVzZSBvdXIgb3duIFVSSSBjb252ZXJ0ZXIsIHdoaWNoIGtub3dzIGFib3V0IGJpbmFyeSBwcm9qZWN0cwotCQlQcm9qZWN0UmVzb3VyY2VTZXQgcHJvamVjdFJlc291cmNlU2V0ID0gYU5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCQlwcm9qZWN0UmVzb3VyY2VTZXQuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UpOwotCQlwcm9qZWN0UmVzb3VyY2VTZXQuc2V0VVJJQ29udmVydGVyKGNyZWF0ZVVSSUNvbnZlcnRlcihnZXRQcm9qZWN0KCksIHByb2plY3RSZXNvdXJjZVNldCkpOwotCQkKLQkJLy8gaW5pdGlhbGl6ZUNhY2hlRWRpdE1vZGVsKCk7Ci0JCS8vIGFkZEFkYXB0ZXJGYWN0b3JpZXMoc2V0KTsKLQkJLy8gc2V0LmdldFN5bmNocm9uaXplcigpLmFkZEV4dGVuZGVyKHRoaXMpOyAvLyBhZGRlZCBzbyB3ZSBjYW4gYmUgaW5mb3JtZWQgb2YgY2xvc2VzIHRvIHRoZQotCQkvLyBuZXcgSjJFRVJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyKHNldCk7IC8vIFRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBVUklDb252ZXJ0ZXIgaXMKLQkJaWYocHJvamVjdFJlc291cmNlU2V0LmdldFN5bmNocm9uaXplcigpICE9IG51bGwpCi0JCQlwcm9qZWN0UmVzb3VyY2VTZXQuZ2V0U3luY2hyb25pemVyKCkuYWRkRXh0ZW5kZXIodGhpcyk7IC8vIGFkZGVkIHNvIHdlIGNhbiBiZSBpbmZvcm1lZCBvZiBjbG9zZXMKLQkJY2FjaGVNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxzKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlLnByaW1Db25maWd1cmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltQ29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5wcmltQ29uZmlndXJlKCk7Ci0JCS8vIGFkZCBWYWxpZGF0aW9uIEJ1aWxkZXIgdG8gYWxsIGZsZXggUHJvamVjdCdzIGJ1aWxkZXIgbGlzdAotCQlQcm9qZWN0VXRpbGl0aWVzLmFkZFRvQnVpbGRTcGVjKFZBTElEQVRJT05fQlVJTERFUl9JRCxwcm9qZWN0KTsKLQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVSSUNvbnZlcnRlciBjcmVhdGVVUklDb252ZXJ0ZXIoSVByb2plY3QgYVByb2plY3QsIFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQgKSB7Ci0JCUNvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gbmV3IENvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIoYVByb2plY3QsIGFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKSk7IAotCQl1cmlDb252ZXJ0ZXIuYWRkSW5wdXRDb250YWluZXIoZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0JCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gZ2V0RW1mQ29udGV4dEJhc2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSUVNRkNvbnRleHRDb250cmlidXRvciNzZWNvbmRhcnlDb250cmlidXRlVG9Db250ZXh0KG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2UpCi0JICovCi0JcHVibGljIHZvaWQgc2Vjb25kYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZSNjb25maWd1cmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIuY29uZmlndXJlKCk7Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZU1vZHVsZVN0cnVjdHVyYWxNb2RlbHMoKSB7Ci0JCWlmIChjYWNoZWRXcml0ZUhhbmRsZSA9PSBudWxsKQotCQkJY2FjaGVkV3JpdGVIYW5kbGUgPSBnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JXcml0ZSh0aGlzKTsKLQkJLy9pZiAoY2FjaGVkUmVhZEhhbmRsZSA9PSBudWxsKQotCQkvLwljYWNoZWRSZWFkSGFuZGxlID0gZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yUmVhZCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gTU9EVUxFX1BMVUdfSU5fSUQ7Ci0JfQotCi0JcHVibGljIEVkaXRNb2RlbCBnZXRFeGlzdGluZ0VkaXRNb2RlbChTdHJpbmcgYXJ0aWZhY3RFZGl0TW9kZWxJZCxNYXAgcGFyYW1zLCBib29sZWFuIGlzUmVhZE9ubHkpIHsKLQkJcmV0dXJuIGdldEVtZkNvbnRleHQoKS5nZXRFeGlzdGluZ0VkaXRNb2RlbChhcnRpZmFjdEVkaXRNb2RlbElkLHBhcmFtcyxpc1JlYWRPbmx5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJc3VwZXIuc2h1dGRvd24oKTsKLQkJaWYgKGNhY2hlZFdyaXRlSGFuZGxlICE9IG51bGwpIHsKLQkJCWlmIChjYWNoZWRXcml0ZUhhbmRsZS5pc0RpcnR5KCkpCi0JCQkJY2FjaGVkV3JpdGVIYW5kbGUuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQkJY2FjaGVkV3JpdGVIYW5kbGUuZGlzcG9zZSgpOwotCQkJY2FjaGVkV3JpdGVIYW5kbGUgPSBudWxsOwotCQl9Ci0JCWlmIChjYWNoZWRSZWFkSGFuZGxlICE9IG51bGwpIHsKLQkJCWlmIChjYWNoZWRSZWFkSGFuZGxlLmlzRGlydHkoKSkKLQkJCQljYWNoZWRSZWFkSGFuZGxlLnNhdmVJZk5lY2Vzc2FyeSh0aGlzKTsKLQkJCWNhY2hlZFJlYWRIYW5kbGUuZGlzcG9zZSgpOwotCQkJY2FjaGVkUmVhZEhhbmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlciNwcm9qZWN0Q2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLk9QRU4pIHsKLQkJCWlmIChjYWNoZWRXcml0ZUhhbmRsZSA9PSBudWxsKQotCQkJCWNhY2hlZFdyaXRlSGFuZGxlID0gZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yV3JpdGUodGhpcyk7Ci0JCQkvL2lmIChjYWNoZWRSZWFkSGFuZGxlID09IG51bGwpCi0JCQkvLwljYWNoZWRSZWFkSGFuZGxlID0gZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yUmVhZCh0aGlzKTsKLQkJfQotCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyI3Byb2plY3RDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoKSB7Ci0vLwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkRpc3Bvc2luZyBNb2R1bGUgbW9kZWxzIGZvciBwcm9qZWN0OiAiKTsKLS8vCQlidWZmZXIuYXBwZW5kKHRoaXMuZ2V0UHJvamVjdCgpKTsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl0aGlzLmVtZkNvbnRleHQgPSBudWxsOwotCQlpZiAoY2FjaGVkV3JpdGVIYW5kbGUgIT0gbnVsbCkgewotLy8JCQlpZiAoY2FjaGVkV3JpdGVIYW5kbGUuaXNEaXJ0eSgpKQotLy8JCQkJY2FjaGVkV3JpdGVIYW5kbGUuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOwotCQkJY2FjaGVkV3JpdGVIYW5kbGUuZGlzcG9zZSgpOwotCQkJY2FjaGVkV3JpdGVIYW5kbGUgPSBudWxsOwotCQl9Ci0JCWlmIChjYWNoZWRSZWFkSGFuZGxlICE9IG51bGwpIHsKLQkJCWNhY2hlZFJlYWRIYW5kbGUuZGlzcG9zZSgpOwotCQkJY2FjaGVkUmVhZEhhbmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL1VucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTdjMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL1VucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaHJvd24gd2hlbmV2ZXIgYSBVUkkgY2Fubm90IGJlIGFwcHJvcHJpYXRlbHkgcmVzb2x2ZWQuCi0gKiA8L3A+Ci0gKiAgCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihVUkkgYW5VbnJlc29sdmVhYmxlVVJJKSB7Ci0JCXN1cGVyKCJDb3VsZCBub3QgcmVzb2x2ZTogIiArIGFuVW5yZXNvbHZlYWJsZVVSSSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxDb25maWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjODY3NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQWN0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEZhY2V0RGF0YU1vZGVsQ29uZmlnQWRhcHRlcgotCi0gICAgZXh0ZW5kcyBBY3Rpb25Db25maWcKLSAgICAKLXsKLSAgICBwcml2YXRlIGZpbmFsIElEYXRhTW9kZWwgZG07Ci0gICAgCi0gICAgcHVibGljIEZhY2V0RGF0YU1vZGVsQ29uZmlnQWRhcHRlciggZmluYWwgSURhdGFNb2RlbCBkbSApCi0gICAgewotICAgICAgICB0aGlzLmRtID0gZG07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RGYWNldFZlcnNpb24oIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICB7Ci0gICAgICAgIGRtLnNldFByb3BlcnR5KCBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sIGZ2ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjICkKLSAgICB7Ci0gICAgICAgIGRtLnNldFByb3BlcnR5KCBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFksIGZwandjICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBuYW1lQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRtLnNldFN0cmluZ1Byb3BlcnR5KCBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgZnBqd2MuZ2V0UHJvamVjdE5hbWUoKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZnBqd2MuYWRkTGlzdGVuZXIoIG5hbWVDaGFuZ2VMaXN0ZW5lciwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX05BTUVfQ0hBTkdFRCApOwotICAgICAgICBuYW1lQ2hhbmdlTGlzdGVuZXIuaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZG0udmFsaWRhdGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGRtLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IEFjdGlvbkNvbmZpZy5jbGFzcyB9OwotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBBY3Rpb25Db25maWcuY2xhc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmFjZXREYXRhTW9kZWxDb25maWdBZGFwdGVyKCAoSURhdGFNb2RlbCkgYWRhcHRhYmxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL0ZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWEzYjJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotCi1wdWJsaWMgY2xhc3MgRmFjZXREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9PUEVSQVRJT04gPSAiRmFjZXREYXRhTW9kZWxQcm92aWRlci5OT1RJRklDQVRJT05fT1BFUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCW5hbWVzLmFkZChGQUNFVF9JRCk7Ci0JCW5hbWVzLmFkZChGQUNFVF9WRVJTSU9OX1NUUik7Ci0JCW5hbWVzLmFkZChGQUNFVF9UWVBFKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1ZFUlNJT04pOwotCQluYW1lcy5hZGQoRkFDRVRfQUNUSU9OKTsKLQkJbmFtZXMuYWRkKFNIT1VMRF9FWEVDVVRFKTsKLQkJbmFtZXMuYWRkKE5PVElGSUNBVElPTl9PUEVSQVRJT04pOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9JRCkpLmdldFZlcnNpb24oZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfVkVSU0lPTl9TVFIpKTsKLQkJfSBlbHNlIGlmIChGQUNFVF9BQ1RJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbigoVHlwZSkgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVFlQRSksIChJUHJvamVjdEZhY2V0VmVyc2lvbikgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVkVSU0lPTiksIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChTSE9VTERfRVhFQ1VURS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChOT1RJRklDQVRJT05fT1BFUkFUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZ2V0RmFjZXROb3RpZmljYXRpb25PcGVyYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEZBQ0VUX0FDVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRGYWNldE5vdGlmaWNhdGlvbk9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwobmV3IEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uKHRoaXMubW9kZWwpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQkJcmV0dXJuICJGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5vdGlmaWNhdGlvbi4iICsgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVFlQRSkgKyAiLiIgKyBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9JRCk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIAotCQkJfQotCi0JCQlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCXJldHVybiBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDIyMzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSX1BST0pFQ1RfRE0gPSAiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuTUFTVEVSX1BST0pFQ1RfRE0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChNQVNURVJfUFJPSkVDVF9ETSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHVibGljIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1RZUEUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBGQUNFVF9UWVBFX0lOU1RBTEw7Ci0JCX0gZWxzZSBpZiAoRkFDRVRfVkVSU0lPTl9TVFIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGdldFByb3BlcnR5KEZBQ0VUX1ZFUlNJT04pOwotCQkJcmV0dXJuIHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOwotCQl9IGVsc2UgaWYgKEZBQ0VUX1ZFUlNJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfSUQpKS5nZXREZWZhdWx0VmVyc2lvbigpOwotCQkJcmV0dXJuIHZlcnNpb247Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChGQUNFVF9UWVBFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKEZBQ0VUX1ZFUlNJT05fU1RSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhGQUNFVF9WRVJTSU9OKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLmVxdWFscyhwcm9wZXJ0eVZhbHVlKSkgewotCQkJCQlzZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobnVsbCAhPSBwcm9wZXJ0eVZhbHVlICYmIEZBQ0VUX1ZFUlNJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIHByb3BlcnR5VmFsdWU7Ci0JCQlzZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBjYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnM7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGNhY2hlZFZlcnNpb25TdHJpbmdEZXNjcmlwdG9yczsKLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaWYgKG51bGwgPT0gY2FjaGVkVmVyc2lvbkRlc2NyaXB0b3JzKSB7Ci0JCQkJU2V0IHZlcnNpb25zID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX0lEKSkuZ2V0VmVyc2lvbnMoKTsKLQkJCQlMaXN0IGxpc3QgPSBDb2xsZWN0aW9ucy5saXN0KENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHZlcnNpb25zKSk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ29tcGFyYXRvcigpewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJCXJldHVybiAoKElQcm9qZWN0RmFjZXRWZXJzaW9uKW8xKS5nZXRWZXJzaW9uU3RyaW5nKCkuY29tcGFyZVRvKCgoSVByb2plY3RGYWNldFZlcnNpb24pbzIpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQljYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZFZlcnNpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWNhY2hlZFZlcnNpb25EZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IodmVyc2lvbiwgdmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnM7Ci0JCX0KLQkJaWYgKEZBQ0VUX1ZFUlNJT05fU1RSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlpZiAobnVsbCA9PSBjYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnMpIHsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSB2ZXJzaW9uRGVzY3JpcHRvcnMgPSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRkFDRVRfVkVSU0lPTik7Ci0JCQkJY2FjaGVkVmVyc2lvblN0cmluZ0Rlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2ZXJzaW9uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZFZlcnNpb25TdHJpbmdEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQljYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZlcnNpb25EZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY3JlYXRlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL0ZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWNkZTM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdC5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBUeXBlIGphdmEudXRpbC5Db2xsZWN0aW9uLiBUaGlzIGlzIGEgc21hbGxlc3QgQ29sbGVjdGlvbiBvZgotCSAqIElQcm9qZWN0RmFjZXRzIHRoYXQgYXJlIGFic29sdXRlbHkgcmVxdWlyZWQgYnkgdGhpcyBwcm9qZWN0IHR5cGUuIFRoaXMKLQkgKiBDb2xsZWN0aW9uIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgcnVudGltZXMuIFRoaXMgcHJvcGVydHkgaXMgbm90IG1lYW50IHRvCi0JICogYmUgZXhwb3NlZCB0byBjbGllbnRzLiBTdWJjbGFzc2VzIHNob3VsZCBpbml0aWFsaXplIHRoaXMgQ29sbGVjdGlvbiBpbgotCSAqIHRoZWlyIGluaXQoKSBtZXRob2RzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04gPSAiRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5SRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SQ0VfVkVSU0lPTl9DT01QTElBTkNFID0gIkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuRk9SQ0VfVkVSU0lPTl9DT01QTElBTkNFIjsKLQkKLQlwdWJsaWMgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJbmFtZXMuYWRkKEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkpOwotCQluYW1lcy5hZGQoRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX0RNX01BUCk7Ci0JCW5hbWVzLmFkZChGQUNFVF9BQ1RJT05fTUFQKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1JVTlRJTUUpOwotCQluYW1lcy5hZGQoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04pOwotCQluYW1lcy5hZGQoRk9SQ0VfVkVSU0lPTl9DT01QTElBTkNFKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBGYWNldGVkUHJvamVjdEZyYW1ld29yay5jcmVhdGVOZXdQcm9qZWN0KCk7Ci0JCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkKLQkJbW9kZWwuc2V0UHJvcGVydHkoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSwgZnBqd2MpOwotCQkKLQkJZnBqd2MuYWRkTGlzdGVuZXIKLQkJKAotCQkgICAgbmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkKLQkJICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbiA6IGZwandjLmdldFByb2plY3RGYWNldEFjdGlvbnMoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcgPSBhY3Rpb24uZ2V0Q29uZmlnKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb25maWcgIT0gbnVsbCAmJiBjb25maWcgaW5zdGFuY2VvZiBJRGF0YU1vZGVsICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIGNvbmZpZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZG0uZ2V0QWxsUHJvcGVydGllcygpLmNvbnRhaW5zKCBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5NQVNURVJfUFJPSkVDVF9ETSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtLnNldFByb3BlcnR5KCBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5NQVNURVJfUFJPSkVDVF9ETSwgbW9kZWwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCSAgICB9LAotCQkgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX0ZBQ0VUU19DSEFOR0VECi0JCSk7Ci0KLSAgICAgICAgZnBqd2MuYWRkTGlzdGVuZXIKLSAgICAgICAgKAotICAgICAgICAgICAgbmV3IElGYWNldGVkUHJvamVjdExpc3RlbmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5BVkFJTEFCTEVfUlVOVElNRVNfQ0hBTkdFRAotICAgICAgICApOwotCQkKLQkJSURhdGFNb2RlbCBwcm9qZWN0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3KCkpOwotCQlwcm9qZWN0RGF0YU1vZGVsLmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIAotCQkJewotCQkJICAgIGZpbmFsIFN0cmluZyBwcm9wID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgaWYoIGV2ZW50LmdldEZsYWcoKSA9PSBJRGF0YU1vZGVsLlZBTFVFX0NIRyAmJgotICAgICAgICAgICAgICAgICAgICBwcm9wLmVxdWFscyggSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQU1FICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gZ2V0RGF0YU1vZGVsKCkudmFsaWRhdGVQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBpZiggc3RhdHVzLmlzT0soKSApewotICAgICAgICAgICAgICAgICAgICAJZnBqd2Muc2V0UHJvamVjdE5hbWUoIHByb2plY3ROYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQl9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcHJvcC5lcXVhbHMoIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04gKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSAoU3RyaW5nKSBldmVudC5nZXRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgICAgICBmcGp3Yy5zZXRQcm9qZWN0TG9jYXRpb24oIGxvY2F0aW9uID09IG51bGwgPyBudWxsIDogbmV3IFBhdGgoIGxvY2F0aW9uICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX0pOwotCQltb2RlbC5hZGROZXN0ZWRNb2RlbChORVNURURfUFJPSkVDVF9ETSwgcHJvamVjdERhdGFNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZnBqd2MgIT0gbnVsbCl7Ci0JCQlmcGp3Yy5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgRmFjZXRBY3Rpb25NYXBJbXBsIGV4dGVuZHMgSGFzaE1hcCBpbXBsZW1lbnRzIEZhY2V0QWN0aW9uTWFwIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgYm9vbGVhbiBzdXByZXNzTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0KLQkJcHVibGljIHZvaWQgYWRkKEFjdGlvbiBhY3Rpb24pIHsKLQkJCXB1dChhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFByb2plY3RGYWNldCgpLmdldElkKCksIGFjdGlvbik7Ci0JCX0KLQotCQlwdWJsaWMgQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgZmFjZXRJRCkgewotCQkJcmV0dXJuIChBY3Rpb24pIGdldChmYWNldElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJdHJ5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfQUNUSU9OX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gc3VwZXIucmVtb3ZlKGtleSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICghc3VwcmVzc05vdGlmaWNhdGlvbikgewotCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9BQ1RJT05fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICghc3VwcmVzc05vdGlmaWNhdGlvbikgewotCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9BQ1RJT05fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtKSB7Ci0JCQl0cnkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSB0cnVlOwotCQkJCXN1cGVyLnB1dEFsbChtKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0FDVElPTl9NQVAsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBGYWNldERhdGFNb2RlbE1hcEltcGwgZXh0ZW5kcyBIYXNoTWFwIGltcGxlbWVudHMgRmFjZXREYXRhTW9kZWxNYXAsIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIGJvb2xlYW4gc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JCXB1YmxpYyB2b2lkIGFkZChJRGF0YU1vZGVsIGZhY2V0RGF0YU1vZGVsKSB7Ci0JCQlwdXQoZmFjZXREYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCksIGZhY2V0RGF0YU1vZGVsKTsKLQkJfQotCi0JCXB1YmxpYyBJRGF0YU1vZGVsIGdldEZhY2V0RGF0YU1vZGVsKFN0cmluZyBmYWNldElEKSB7Ci0JCQlyZXR1cm4gKElEYXRhTW9kZWwpIGdldChmYWNldElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJdHJ5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkoKElEYXRhTW9kZWwpIGl0ZXJhdG9yLm5leHQoKSkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJCXN1cGVyLmNsZWFyKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9ETV9NQVAsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIHZhbHVlOwotCQkJCU9iamVjdCBsYXN0VmFsdWUgPSBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JCQkJaWYgKGxhc3RWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCSgoSURhdGFNb2RlbCkgbGFzdFZhbHVlKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJKChJRGF0YU1vZGVsKSBsYXN0VmFsdWUpLnNldFByb3BlcnR5KEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLk1BU1RFUl9QUk9KRUNUX0RNLCBudWxsKTsKLQkJCQl9Ci0JCQkJZG0uc2V0UHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FLCBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpKTsKLQkJCQlkbS5zZXRQcm9wZXJ0eShGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5NQVNURVJfUFJPSkVDVF9ETSwgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci50aGlzLm1vZGVsKTsKLQkJCQlkbS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQlyZXR1cm4gbGFzdFZhbHVlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoIXN1cHJlc3NOb3RpZmljYXRpb24pIHsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfRE1fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtKSB7Ci0JCQl0cnkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSB0cnVlOwotCQkJCXN1cGVyLnB1dEFsbChtKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0RNX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotCQkJdHJ5IHsKLQkJCQlJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIHN1cGVyLnJlbW92ZShrZXkpOwotCQkJCWRtLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCXJldHVybiBkbTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKCFzdXByZXNzTm90aWZpY2F0aW9uKSB7Ci0JCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0RNX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhGQUNFVF9QUk9KRUNUX05BTUUpKSB7Ci0JCQkJaWYgKGNvbnRhaW5zVmFsdWUoZXZlbnQuZ2V0RGF0YU1vZGVsKCkpKSB7Ci0JCQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXZlbnQuZ2V0RGF0YU1vZGVsKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoRkFDRVRfUlVOVElNRSkpIHsKLQkJCQlpZiAoY29udGFpbnNWYWx1ZShldmVudC5nZXREYXRhTW9kZWwoKSkpIHsKLQkJCQkJaWYgKGV2ZW50LmdldEZsYWcoKSA9PSBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpIHsKLQkJCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX1JVTlRJTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQkJCX0gZWxzZSBpZihldmVudC5nZXRGbGFnKCkgPT0gSURhdGFNb2RlbC5FTkFCTEVfQ0hHKSB7Ci0JCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9SVU5USU1FLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlldmVudC5nZXREYXRhTW9kZWwoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChGQUNFVF9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKE1hcCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKSkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCSgoSURhdGFNb2RlbCkgaXRlcmF0b3IubmV4dCgpKS5zZXRQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQkJfQotCQkJSURhdGFNb2RlbCBwcm9qTW9kZWwgPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfUFJPSkVDVF9ETSk7Ci0JCQlwcm9qTW9kZWwuc2V0UHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJfSBlbHNlIGlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBwcm9wZXJ0eVZhbHVlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoTWFwKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSURhdGFNb2RlbCBkbSA9IChJRGF0YU1vZGVsKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGRtLmlzUHJvcGVydHkoRkFDRVRfUlVOVElNRSkpIHsKLQkJCQkJZG0uc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgcnVudGltZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCWlmKGdldEJvb2xlYW5Qcm9wZXJ0eShGT1JDRV9WRVJTSU9OX0NPTVBMSUFOQ0UpKXsKLQkJCQkJTWFwIGZhY2V0RE1zID0gKE1hcCkgZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKTsKLQkKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZhY2V0RE1zLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUlEYXRhTW9kZWwgZmFjZXREYXRhTW9kZWwgPSAoSURhdGFNb2RlbCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgoU3RyaW5nKSBmYWNldERhdGFNb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0lEKSk7Ci0JCi0JCQkJCQl0cnkgewotCQkJCQkJCUlEYXRhTW9kZWwgZmFjZXRNb2RlbCA9ICgoRmFjZXREYXRhTW9kZWxNYXApIGZhY2V0RE1zKS5nZXRGYWNldERhdGFNb2RlbChmYWNldC5nZXRJZCgpKTsKLQkJCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBvbGRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBmYWNldE1vZGVsLmdldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTik7Ci0JCQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gbmV3VmVyc2lvbiA9IGZhY2V0LmdldExhdGVzdFN1cHBvcnRlZFZlcnNpb24ocnVudGltZSk7Ci0JCQkJCQkJaWYgKG5ld1ZlcnNpb24gIT0gbnVsbCAmJiAob2xkVmVyc2lvbiA9PSBudWxsIHx8IG9sZFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpLmNvbXBhcmVUbyhuZXdWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSkgPiAwIHx8ICFydW50aW1lLnN1cHBvcnRzKG9sZFZlcnNpb24pKSkgewotCQkJCQkJCQlmYWNldE1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTiwgbmV3VmVyc2lvbik7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKCBSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSApCi0JCXsKLQkJICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjIAotCQkgICAgICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICk7Ci0JCSAgICAKLQkgICAgICAgIGZpbmFsIENvbGxlY3Rpb248SVByb2plY3RGYWNldD4gZml4ZWRGYWNldHMgPSAoQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PikgcHJvcGVydHlWYWx1ZTsKLQkgICAgICAgIAotCSAgICAgICAgZnBqd2Muc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0PiggZml4ZWRGYWNldHMgKSApOwotCSAgICAgICAgCi0JICAgICAgICBmaW5hbCBGYWNldERhdGFNb2RlbE1hcCBmYWNldERtTWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eSggRkFDRVRfRE1fTUFQICk7Ci0JICAgICAgICAKLQkgICAgICAgIGZvciggSVByb2plY3RGYWNldCBmYWNldCA6IGZpeGVkRmFjZXRzICkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbiA9IGZwandjLmdldFByb2plY3RGYWNldEFjdGlvbiggZmFjZXQgKTsKLQkgICAgICAgICAgICBPYmplY3QgY29uZmlnID0gYWN0aW9uLmdldENvbmZpZygpOwotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIGlmKCAhICggY29uZmlnIGluc3RhbmNlb2YgSURhdGFNb2RlbCApICkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGNvbmZpZyA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoIGNvbmZpZywgSURhdGFNb2RlbC5jbGFzcy5nZXROYW1lKCkgKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbCBkbSA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgZmFjZXREbU1hcC5wdXQoIGZhY2V0LmdldElkKCksIGRtICk7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgZm9yKCBTdHJpbmcgYWxpYXMgOiBmYWNldC5nZXRBbGlhc2VzKCkgKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgZmFjZXREbU1hcC5wdXQoIGFsaWFzLCBkbSApOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChGQUNFVF9ETV9NQVAuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCU9iamVjdCBvYmogPSBuZXcgRmFjZXREYXRhTW9kZWxNYXBJbXBsKCk7Ci0JCQlzZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVAsIG9iaik7Ci0JCQlyZXR1cm4gb2JqOwotCQl9IGVsc2UgaWYgKEZBQ0VUX0FDVElPTl9NQVAuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCU9iamVjdCBvYmogPSBuZXcgRmFjZXRBY3Rpb25NYXBJbXBsKCk7Ci0JCQlzZXRQcm9wZXJ0eShGQUNFVF9BQ1RJT05fTUFQLCBvYmopOwotCQkJcmV0dXJuIG9iajsKLQkJfSBlbHNlIGlmKFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCUNvbGxlY3Rpb24gYyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXNldFByb3BlcnR5KFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OLCBjKTsKLQkJCXJldHVybiBjOwotCQl9IGVsc2UgaWYoRk9SQ0VfVkVSU0lPTl9DT01QTElBTkNFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAobnVsbCAhPSBydW50aW1lKSB7Ci0JCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocnVudGltZSwgcnVudGltZS5nZXRMb2NhbGl6ZWROYW1lKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobnVsbCwgV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlJVTlRJTUVfTk9ORSwgbnVsbCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIAotCQl7Ci0gICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyAKLSAgICAgICAgICAgICAgICA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldD4gZml4ZWRGYWNldHMgPSBmcGp3Yy5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLSAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBmb3IoIElSdW50aW1lIHJ0IDogUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZXMoKSApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIHJ1bnRpbWUgaW4gdGhlIGxpc3Qgb25seSBpZiBpdCBzdXBwb3J0cyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZhY2V0cwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0IGZhY2V0IDogZml4ZWRGYWNldHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgcnQuc3VwcG9ydHMoIGZhY2V0ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIHN1cHBvcnRzICkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbbGlzdC5zaXplKCkgKyAxXTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGggLSAxOyBpKyspIHsKLQkJCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHJ1bnRpbWUsIHJ1bnRpbWUuZ2V0TG9jYWxpemVkTmFtZSgpKTsKLQkJCX0KLQkJCWlmKGRlc2NyaXB0b3JzLmxlbmd0aCA+IDIpewotCQkJCUFycmF5cy5zb3J0KGRlc2NyaXB0b3JzLCAwLCBkZXNjcmlwdG9ycy5sZW5ndGggLSAxLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGQxID0gKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcilhcmcwOwotCQkJCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGQyID0gKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcilhcmcxOwotCQkJCQkJcmV0dXJuIGQxLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5jb21wYXJlVG8oZDIuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJCi0JCQlkZXNjcmlwdG9yc1tkZXNjcmlwdG9ycy5sZW5ndGggLSAxXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobnVsbCwgV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlJVTlRJTUVfTk9ORSwgbnVsbCkpOwotCQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSAKLQl7Ci0JCWlmIChGQUNFVF9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIAotCQl7Ci0JCQlJRGF0YU1vZGVsIHByb2pNb2RlbCA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9QUk9KRUNUX0RNKTsKLQkJCXJldHVybiBwcm9qTW9kZWwudmFsaWRhdGVQcm9wZXJ0eShJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX05BTUUpOwotCQl9Ci0JCWVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgKSApCi0JCXsKLSAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjIAotICAgICAgICAgICAgICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBmcGp3Yy52YWxpZGF0ZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhZGNhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL1Byb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5Qcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgV1RQIDMuMS4yIGFuZCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLgotICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI5MzQKLSAqIEBkZXByZWNhdGVkIAotICogQGF1dGhvciBqc2hvbGwKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMGEyZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqICAgIENhcmwgQW5kZXJzb24gKElCTSkgLSBTWU5DX1BSSU1BUllfUlVOVElNRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi0KLS8qKgotICogVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMKLSAqIEl0IGlzIG1lYW50IHRvIGJlIGEgc2ltcGxlciB0eXBlIG9mIG9wZXJhdGlvbiB3aGVyZSB5b3UgY2FuIHBhc3MgaW4KLSAqIGFuIGFscmVhZHktZm9ybWVkIElWaXJ0dWFsUmVmZXJlbmNlIHJhdGhlciB0aGFuIHRoZSBpbmRpdmlkdWFsIHByb3BlcnRpZXMKLSAqIHRvIGJlIHNldC4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fSB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudH1zIHNwZWNpZmllZCBieSB7QGxpbmsgI1RBUkdFVF9DT01QT05FTlRfTElTVH0uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBpZiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudH1zIEEsIEIsIGFuZCBDIGV4aXN0IGFuZCByZWZlcmVuY2VzIGFyZSByZXF1aXJlZAotCSAqIGZyb20gQSB0byBCIGFuZCBBIHRvIEMsIHRoZW4ge0BsaW5rICNTT1VSQ0VfQ09NUE9ORU5UfSBzaG91bGQgYmUgc2V0IHRvIEEsIGFuZAotCSAqIHtAbGluayAjVEFSR0VUX0NPTVBPTkVOVF9MSVNUfSBzaG91bGQgYmUgc2V0IHRvIGEge0BsaW5rIGphdmEudXRpbC5MaXN0fSBjb250YWluaW5nIEIgYW5kIEMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9DT01QT05FTlQgPSAiSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhlIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gY29udGFpbmluZyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2V9cyB0aGF0Ci0JICogd2lsbCBiZSByZWZlcmVuY2VkIGZyb20gdGhlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fSBzcGVjaWZpZWQgYnkge0BsaW5rICNTT1VSQ0VfQ09NUE9ORU5UfS4KLQkgKiBJdCBtYXkgYWxzbyBiZSBhIHNpbmdsZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZX0gaWYgZGVzaXJlZAotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfUkVGRVJFTkNFX0xJU1QgPSAiSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX1JFRkVSRU5DRV9MSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyByZXF1aXJlZCBwcm9wZXJ0eSBpcyBhIHtAbGluayBqYXZhLnV0aWwuQm9vbGVhbn0gdGhhdCBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2hpbGQgcHJvamVjdCdzIHByaW1hcnkgcnVudGltZSBzaG91bGQgYmUgc2V0IAotCSAqIHRvIHRoZSBzYW1lIHByaW1hcnkgcnVudGltZSBhcyB0aGUgcGFyZW50LiAgVGhlIGRlZmF1bHQgaXMgVFJVRS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19QUklNQVJZX1JVTlRJTUUgPSAiSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU1lOQ19QUklNQVJZX1JVTlRJTUUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWMwODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyByZXF1aXJlZCBwcm9wZXJ0eSBpcyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9IHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgc3BlY2lmaWVkIGJ5IHtAbGluayAjVEFSR0VUX0NPTVBPTkVOVF9MSVNUfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGlmIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgQSwgQiwgYW5kIEMgZXhpc3QgYW5kIHJlZmVyZW5jZXMgYXJlIHJlcXVpcmVkCi0JICogZnJvbSBBIHRvIEIgYW5kIEEgdG8gQywgdGhlbiB7QGxpbmsgI1NPVVJDRV9DT01QT05FTlR9IHNob3VsZCBiZSBzZXQgdG8gQSwgYW5kCi0JICoge0BsaW5rICNUQVJHRVRfQ09NUE9ORU5UX0xJU1R9IHNob3VsZCBiZSBzZXQgdG8gYSB7QGxpbmsgamF2YS51dGlsLkxpc3R9IGNvbnRhaW5pbmcgQiBhbmQgQy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0NPTVBPTkVOVCA9ICJJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhlIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gY29udGFpbmluZyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9cyB0aGF0Ci0JICogd2lsbCBiZSByZWZlcmVuY2VkIGZyb20gdGhlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fSBzcGVjaWZpZWQgYnkge0BsaW5rICNTT1VSQ0VfQ09NUE9ORU5UfS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NPTVBPTkVOVF9MSVNUID0gIklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIGRlcGxveSBwYXRoIGZvciB0aGUgZGVwZW5kZW50IGNvbXBvbmVudCwgZGVmYXVsdCBpcyAiLyIKLQkgKiBOb3RlOiB0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciB0aGUgZW50aXJlIGFyY2hpdmUuICBTZWUge0BsaW5rICNUQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVB9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEggPSAiSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfREVQTE9ZX1BBVEgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG9wdGlvbmFsIHByb3BlcnR5IGlzIHRoZSB7QGxpbmsgTWFwfSBjb250YWluaW5nIGtleXMgb2Yge0BsaW5rIElWaXJ0dWFsQ29tcG9uZW50fXMgYW5kCi0JICogdmFsdWVzIG9mIHtAbGluayBTdHJpbmd9cy4gVGhpcyBtYXAgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBTdHJpbmcgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkKLQkgKiB0aGUge0BsaW5rIElWaXJ0dWFsQ29tcG9uZW50fSBzcGVjaWZpZWQgYnkgdGhlIHtAbGluayAjU09VUkNFX0NPTVBPTkVOVH0gcHJvcGVydHkgdG8gbG9va3VwCi0JICogdGhlIGRlcGxveSBwYXRoLiBUaGUge0BsaW5rIFNldH0gb2Yge0BsaW5rIElWaXJ0dWFsQ29tcG9uZW50fXMgaW4gdGhlCi0JICoga2V5cyBvZiB0aGlzIHtAbGluayBNYXB9IHNob3VsZCBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSB7QGxpbmsgTGlzdH0uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIX01BUCA9ICJJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9ERVBMT1lfUEFUSF9NQVAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG9wdGlvbmFsIHByb3BlcnR5IGlzIHRoZSB7QGxpbmsgamF2YS51dGlsLk1hcH0gY29udGFpbmluZyBrZXlzIG9mIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgYW5kCi0JICogdmFsdWVzIG9mIHtAbGluayBTdHJpbmd9cy4gVGhpcyBtYXAgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBTdHJpbmcgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkKLQkgKiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9IHNwZWNpZmllZCBieSB0aGUge0BsaW5rICNTT1VSQ0VfQ09NUE9ORU5UfSBwcm9wZXJ0eSB0byBsb29rdXAKLQkgKiB0aGUga2V5ZWQge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9LiBUaGUge0BsaW5rIGphdmEudXRpbC5TZXR9IG9mIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgaW4gdGhlCi0JICoga2V5cyBvZiB0aGlzIHtAbGluayBqYXZhLnV0aWwuTWFwfSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUge0BsaW5rIGphdmEudXRpbC5MaXN0fS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCA9ICJJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYzY5NGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRkFDRVRfVFlQRV9JTlNUQUxMID0gQWN0aW9uLlR5cGUuSU5TVEFMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBGQUNFVF9UWVBFX1VOSU5TVEFMTCA9IEFjdGlvbi5UeXBlLlVOSU5TVEFMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBGQUNFVF9UWVBFX1ZFUlNJT05fQ0hBTkdFID0gQWN0aW9uLlR5cGUuVkVSU0lPTl9DSEFOR0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9QUk9KRUNUX05BTUUgPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9UWVBFID0gIklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX0lEID0gIklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfSUQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9WRVJTSU9OX1NUUiA9ICJJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYW4gSVByb2plY3RGYWNldFZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9WRVJTSU9OID0gIklGYWNldERhdGFNb2RlbFByb3BldGllcy5GQUNFVF9WRVJTSU9OIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIGFuIElGYWNldGVkUHJvamVjdC5BY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9BQ1RJT04gPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9BQ1RJT04iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfRVhFQ1VURSA9ICJJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlNIT1VMRF9FWEVDVVRFIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlM2ZhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzZhMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZIAotICAgICAgICA9ICJJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkiOyAvLyROT04tTkxTLTEkIjsKLQotCS8qKgotCSAqIEEgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfUFJPSkVDVF9OQU1FID0gSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUU7Ci0KLQkvKioKLQkgKiBBIE5lc3RlZCBJRGF0YU1vZGVsIG9mIHR5cGUgSVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfUFJPSkVDVF9ETSA9ICJJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9QUk9KRUNUX0RNIjsgLy8kTk9OLU5MUy0xJCI7Ci0KLQkvKioKLQkgKiBBbiBpbnN0YW5jZW9mIEZhY2V0RGF0YU1vZGVsTWFwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX0RNX01BUCA9ICJJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGluc3RhbmNlIG9mIEZhY2V0QWN0aW9uTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfQUNUSU9OX01BUCA9ICJJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0FDVElPTl9NQVAiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBBbiBpbnN0YW5jZW9mIG9mIElSdW50aW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfUlVOVElNRSA9ICJJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBUaGlzIG1hcCBpcyB1c2VkIGZvciB0cmFja2luZyBpbmRpdmlkdWFsIElEYXRhTW9kZWxzIGltcGxlbWVudGluZyBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLgotCSAqIFRoZSBmYWNldCBpZHMgYXJlIHRoZSBrZXlzIGZvciByZXRpZXZpbmcgdGhlIHNwZWNpZmljIElGYWNldGF0YU1vZGVsUHJvcGVydGllcyBJRGF0YU1vZGVscwotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRmFjZXREYXRhTW9kZWxNYXAgZXh0ZW5kcyBNYXAgewotCQlwdWJsaWMgdm9pZCBhZGQoSURhdGFNb2RlbCBmYWNldERhdGFNb2RlbCk7Ci0JCXB1YmxpYyBJRGF0YU1vZGVsIGdldEZhY2V0RGF0YU1vZGVsKFN0cmluZyBmYWNldElEKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1hcCBpcyB1c2VkIGZvciB0cmFjaW5nIGluZGl2ZHVhbCBJRmFjZXRlZFByb2plY3QuQWN0aW9ucyBmb3IgZmFjZXRzIHRoYXQgZWl0aGVyIGRvIG5vdAotCSAqIGhhdmUgYW55IGNvbmZpZyBkYXRhLCBvciBmYWNldHMgd2hvc2UgY29uZmlnIGRhdGEgaXMgbm90IGFuIElEYXRhTW9kZWwuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBGYWNldEFjdGlvbk1hcCBleHRlbmRzIE1hcCB7Ci0JCXB1YmxpYyB2b2lkIGFkZChJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbik7Ci0JCXB1YmxpYyBJRmFjZXRlZFByb2plY3QuQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgZmFjZXRJRCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyYjQ5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBXVFAgMy4xLjIgYW5kIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAzLjIuCi0gKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjkzNAotICogQGRlcHJlY2F0ZWQgCi0gKiBAYXV0aG9yIGpzaG9sbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzOTEzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSVNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm92aWRlci5jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1QgPSAiSVNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JPT1QgPSAiSVNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvcGVydGllcy5DT05URVhUX1JPT1QiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1OTM3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Q29tcG9uZW50IGNyZWF0aW9uIGFuZCBSZWZlcmVuY2VkIENvbXBvbmVudCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIEFQSSAgZm9yIGNyZWF0aW5nIGNvbXBvbmVudHMgaW4gYSBGbGV4aWJsZSBwcm9qZWN0IGFuZCAKLSAgICAgICAgYWRkaW5nIHJlZmVyZW5jZWQgY29tcG9uZW50cyB0byBleGlzdGluZyBjb21wb25lbnRzLihzZWUgPGEgaHJlZj0iQ29tcG9uZW50Q29yZS5odG1sIj5Db21wb25lbnRDb3JlPC9hPikuIAotICAgICAgICBDbGllbnRzIHNob3VsZCBhbHNvIHJldmlldyB0aGUgPGI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczwvYj4KLSAgICAgICAgcGFja2FnZS4KLQkJPC9hYnN0cmFjdD4KLQotCTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9BcnRpZmFjdEVkaXRNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0FydGlmYWN0RWRpdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWZhZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0FydGlmYWN0RWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci0KLS8qKgotICogCi0gKiBQcm92aWRlcyByZXNvdXJjZSBsaWZlIGN5Y2xlIG1hbmFnZW1lbnQgYmV0d2VlbiBhbiBFZGl0TW9kZWwgYW5kIGEgV1RQIGZsZXhpYmxlIG1vZHVsZSBwYXR0ZXJuLgotICogPHA+Ci0gKiBBcnRpZmFjdEVkaXRNb2RlbCBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgbWFuYWdpbmcgYSBzZXQgb2YgRU1GIHJlc291cmNlcyB3aXRoaW4gYSB1bml0IG9mIHdvcmsuCi0gKiBNYW5hZ2VtZW50IG9mIHRoZXNlIHJlc291cmNlcyBpbmNsdWRlcyBiYXNpYyBzZXJ2aWNlcyBzdWNoIGFzIGxvYWRzLCBzYXZlcywgYW5kIHN5bmNocm9uaXphdGlvbgotICogZm9yIHRoZSBtYW5hZ2VkIHJlc291cmNlcy4gQXJ0aWZhY3RFZGl0TW9kZWxzIGFyZSByZWZlcmVuY2UgY291bnRlZCBzbyB0aGF0IGEgc2luZ2xlIGluc3RhbmNlIGNhbgotICogYmUgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgb3BlcmF0aW9uIG9yIGVkaXRvci4KLSAqIDwvcD4KLSAqIDxwPgotICogQXJpdGZhY3RFZGl0TW9kZWwgdXRpbGl6ZXMKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHR9Jm5ic3A7IHRvIG1hbmFnZSB0aGUgbGlmZQotICogY3ljbGUgb2YgYW4gRU1GIHtAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZX0mbmJzcDsgaW4gYSBnaXZlbiBFTUYKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldH0uIFRoZXJlIGlzIG9uZSBBcnRpZmFjdEVkaXRNb2RlbCBwZXIKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7aW4gZWFjaCBwcm9qZWN0LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZQotICovCi0KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXRNb2RlbCBleHRlbmRzIEVkaXRNb2RlbCBpbXBsZW1lbnRzIElBZGFwdGFibGUsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQXJ0aWZhY3RFZGl0TW9kZWwuY2xhc3M7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0OyAKLQlwcml2YXRlIGZpbmFsIElQYXRoIG1vZHVsZVBhdGg7Ci0JcHJpdmF0ZSBVUkkgcm9vdFVSSTsKLQlwcml2YXRlIFN0cmluZyByb290Q29udGVudFR5cGU7Ci0JcHJpdmF0ZSBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50OwotCXByaXZhdGUgZmluYWwgVVJJIGNvbXBvbmVudFVSSTsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBBcnRpZmFjdEVkaXRNb2RlbCBpbnN0YW5jZSB0aGF0IHVzZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUKLQkgKiA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uIHBvaW50Ci0JICogYXNzb2NpYXRlZCB3aXRoIGFuRWRpdE1vZGVsSWQgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgbWFuYWdlZCBieSBhQ29udGV4dCBmb3IgYSBzcGVjaWZpYwotCSAqIG1vZHVsZSByZWZlcmVuY2VkIGJ5IGFNb2R1bGVVUkkuIFJlc291cmVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkIGFzIGRlZmluZWQgUmVzb3VyY2VzIHZpYQotCSAqIHRoZSBhcHByb3ByaWF0ZSBFZGl0TW9kZWwgZXh0ZW5zaW9uIHBvaW50cyB3aWxsIGJlIGFjY2Vzc2VkIGFzIHJlYWQtb25seS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPkFydGlmYWN0RWRpdE1vZGVsKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwgdHJ1ZSwgYU1vZHVsZVVSSSk8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWRpdE1vZGVsIGRlZmluZWQgYnkgdGhlIGFwcHJvcHJpYXRlCi0JICogICAgICAgICAgICA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uCi0JICogICAgICAgICAgICBwb2ludC4KLQkgKiBAcGFyYW0gYUNvbnRleHQKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgRU1GV29ya2JlbmNoQ29udGV4dCB3aGljaCBoZWxwcyBtYW5hZ2UgdGhlIGxpZmVjeWNsZSBvZiBFTUYgcmVzb3VyY2VzIGZvcgotCSAqICAgICAgICAgICAgYSBnaXZlbiBwcm9qZWN0LgotCSAqIEBwYXJhbSB0b01ha2VSZWFkT25seQotCSAqICAgICAgICAgICAgVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBSZXNvdXJjZXMgbG9hZGVkIGJ5IHRoZSBFZGl0TW9kZWwgd2lsbCBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMuCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgZnVsbHktcXVhbGlmaWVkIFVSSSB0aGF0IGNvbmZvcm1zIHRvIHRoZSAibW9kdWxlOiIgZm9ybWF0LgotCSAqLwotCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBib29sZWFuIHRvTWFrZVJlYWRPbmx5LCBVUkkgYU1vZHVsZVVSSSkgewotCQl0aGlzKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwgdHJ1ZSwgYU1vZHVsZVVSSSk7Ci0JfQotCQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgYW5FZGl0TW9kZWxJZCwgRU1GV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgYm9vbGVhbiB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LCBVUkkgYU1vZHVsZVVSSSxVUkkgcm9vdFVSSSwKLQkJCVN0cmluZyByb290Q29udGVudFR5cGUpIHsKLQkJdGhpcyhhbkVkaXRNb2RlbElkLCBhQ29udGV4dCwgdG9NYWtlUmVhZE9ubHksIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIGFNb2R1bGVVUkkpOwotCQl0aGlzLnJvb3RVUkkgPSByb290VVJJOwotCQl0aGlzLnJvb3RDb250ZW50VHlwZSA9IHJvb3RDb250ZW50VHlwZTsKLQkJCi0JfQotCQotCQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBBcnRpZmFjdEVkaXRNb2RlbCBpbnN0YW5jZSB0aGF0IHVzZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUKLQkgKiA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uIHBvaW50Ci0JICogYXNzb2NpYXRlZCB3aXRoIGFuRWRpdE1vZGVsSWQgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgbWFuYWdlZCBieSBhQ29udGV4dCBmb3IgYSBzcGVjaWZpYwotCSAqIG1vZHVsZSByZWZlcmVuY2VkIGJ5IGFNb2R1bGVVUkkuIFJlc291cmVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkIGFzIGRlZmluZWQKLQkgKiA8L3A+KgotCSAqIAotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWRpdE1vZGVsIGRlZmluZWQgYnkgdGhlIGFwcHJvcHJpYXRlCi0JICogICAgICAgICAgICA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWxGYWN0b3J5IDwvYj4gZXh0ZW5zaW9uCi0JICogICAgICAgICAgICBwb2ludC4KLQkgKiBAcGFyYW0gYUNvbnRleHQKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgRU1GV29ya2JlbmNoQ29udGV4dCB3aGljaCBoZWxwcyBtYW5hZ2UgdGhlIGxpZmVjeWNsZSBvZiBFTUYgcmVzb3VyY2VzIGZvcgotCSAqICAgICAgICAgICAgYSBnaXZlbiBwcm9qZWN0LgotCSAqIEBwYXJhbSB0b01ha2VSZWFkT25seQotCSAqICAgICAgICAgICAgVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBSZXNvdXJjZXMgbG9hZGVkIGJ5IHRoZSBFZGl0TW9kZWwgd2lsbCBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMuCi0JICogQHBhcmFtIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkKLQkgKiAgICAgICAgICAgIFRydWUgaW5kaWNhdGVzIHRoYXQgUmVzb3VyY2VzIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBFZGl0TW9kZWwgYmUgbG9hZGVkIGFzCi0JICogICAgICAgICAgICByZWFkLW9ubHkgLSBzdWNoIHRob3NlIGxvYWRlZCB2aWEge0BzZWUgI2dldFJlc291cmNlKFVSSSl9LgotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIGZ1bGx5LXF1YWxpZmllZCBVUkkgdGhhdCBjb25mb3JtcyB0byB0aGUgIm1vZHVsZToiIGZvcm1hdC4KLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIGJvb2xlYW4gdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSwgVVJJIGFNb2R1bGVVUkkpIHsKLQkJc3VwZXIoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KTsKLQkJSVByb2plY3QgYVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJYVByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0UHJvajsKLQkJCWZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChmYWNldFByb2ogIT0gbnVsbCkKLQkJCQlmYWNldFByb2ouYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSl7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX1maW5hbGx5IHsKLQkJCWNvbXBvbmVudFByb2plY3QgPSBhUHJvamVjdDsKLQkJfQotCQkKLQkJdmlydHVhbENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFByb2plY3QpOwotCQljb21wb25lbnRVUkkgPSBhTW9kdWxlVVJJOwotCQltb2R1bGVQYXRoID0gbmV3IFBhdGgoYU1vZHVsZVVSSS5wYXRoKCkpOwotCQlwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKGNvbXBvbmVudFByb2plY3QpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgVVJJIG1vZHVsZVVSSSwgVVJJIHJvb3RVUkksCi0JCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlKSB7Ci0JCXRoaXMoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCB0cnVlLCBtb2R1bGVVUkkpOwotCQl0aGlzLnJvb3RVUkkgPSByb290VVJJOwotCQl0aGlzLnJvb3RDb250ZW50VHlwZSA9IHJvb3RDb250ZW50VHlwZTsKLQkJCi0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWNjZXNzZXMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzZXQuIFRha2VzIGEgc3RhbmRhcmQgVVJJIGF0dGFjaGVzIG1vZHVsZQotCSAqIHByb3RvY29sIGFuZCBpbmZvcm1hdGlvbi4gVGhpcyBkYXRhIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgcmVzb3VyY2UgaXMgcGFydCBvZiBhCi0JICogZmxleGlibGUgbW9kdWxlIHN0cnVjdHVyZS4gSWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGluIHRoZSByZXNvdXJjZSBzZXQgaXQgd2lsbCB0cnkgYW5kCi0JICogbG9hZCB0aGUgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhVXJpIC0KLQkgKiAgICAgICAgICAgIGxvY2F0aW9uIG9mIHJlc291cmNlCi0JICogCi0JICogQHJldHVybiBSZXNvdXJjZSAoQHNlZSBSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJSVBhdGggcmVxdWVzdFBhdGg7Ci0JCS8vSWYgcmVxdWVzdGluZyByb290VVJJLCB1c2UgY29udGVudCB0eXBlIGRlc2NyaWJlciBpZiBhdmFpbGFibGUKLQkJaWYgKHJvb3RVUkkgIT0gbnVsbCAmJiByb290VVJJLmVxdWFscyhhVXJpKSAmJiByb290Q29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJcmVxdWVzdFBhdGggPSBtb2R1bGVQYXRoLmFwcGVuZChuZXcgUGF0aChyb290Q29udGVudFR5cGUpKTsKLQkJCXJlcXVlc3RQYXRoID0gcmVxdWVzdFBhdGguYXBwZW5kKG5ldyBQYXRoKGFVcmkucGF0aCgpKSk7Ci0JCX0KLQkJZWxzZSB7Ly8gRmlyc3QgY2hlY2sgaWYgcGFzc2VkIFVSSSBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQuLi4KLQkJCXJlcXVlc3RQYXRoID0gbW9kdWxlUGF0aC5hcHBlbmQobmV3IFBhdGgoYVVyaS5wYXRoKCkpKTsKLQkJfQotCQlVUkkgcmVzb3VyY2VVUkkgPSBVUkkuY3JlYXRlVVJJKFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wgKyByZXF1ZXN0UGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlKHJlc291cmNlVVJJKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0Q29tcG9uZW50UHJvamVjdCgpIHsgCi0JCXJldHVybiBjb21wb25lbnRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TW9kdWxlVVJJKCkgewotCQlyZXR1cm4gY29tcG9uZW50VVJJOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFjY2Vzc2VzIHJlc291cmVjZXMgd2l0aGluIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNldC4gVGFrZXMgYSBzdGFybmRhcmQgVVJJIGF0dGFjaGVzIG1vZHVsZQotCSAqIGluZm9ybWF0aW9uLiBUaGlzIGRhdGEgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXNvdXJjZSBpcyBwYXJ0IG9mIGEgZmxleGlibGUgbW9kdWxlCi0JICogc3RydWN0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVVyaSAtCi0JICogICAgICAgICAgICBsb2NhdGlvbiBvZiByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UgKEBzZWUgUmVzb3VyY2UpCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0T3JDcmVhdGVSZXNvdXJjZShVUkkgYVVyaSkgewotCi0JCXJldHVybiBzdXBlci5nZXRPckNyZWF0ZVJlc291cmNlKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE92ZXJyaWRkZW4gdG8gcHJldmVudCBzdXBlcigpIGltcGxlbWVudGF0aW9uLCBwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKGFNb2R1bGVVUkkpIHVzZWQKLQkgKiBpbnN0ZWFkLiAoQGxpbmsgcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhVUkkgYU1vZHVsZVVSSSkKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFVcmkgLQotCSAqICAgICAgICAgICAgbG9jYXRpb24gb2YgcmVzb3VyY2UKLQkgKi8KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKCkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEdhdGhlcnMgcmVzb3VyY2VzIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2V0LCBkZXRlcm1pbmVzIGlmIGludGVyZXN0ZWQgKEBsaW5rCi0JICogcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhVUkkgYU1vZHVsZVVSSSkpYW5kIHJlcXVlc3QgYWNjZXNzIChAbGluayBhY2Nlc3MoUmVmZXJlbmNlZFJlc291cmNlCi0JICogYVJlc291cmNlKSl0byBlYWNoIHJlc291cmNlIGluY3JlbWVudGluZyB0aGUgd3JpdGUvcmVhZCBjb3VudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFVcmkgLQotCSAqICAgICAgICAgICAgbG9jYXRpb24gb2YgcmVzb3VyY2UKLQkgKi8KLQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCkgewotCQlMaXN0IGxvYWRlZFJlc291cmNlcyA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmICghbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJcHJvY2Vzc1Jlc291cmNlc0lmSW50ZXJyZXN0ZWQobG9hZGVkUmVzb3VyY2VzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENoZWNrcyB0byBtYWtlIHN1cmUgYSBmbGV4aWJsZSBtb2R1bGUgc3RydWN0dXJlIGV4aXN0IGZvciB0aGUgcmVzb3VyY2VzIGluIHRoZSByZXNvdXJjZSBzZXQuCi0JICogVGhpcyBpcyBhY2hpZXZlZCBieSBxdWVyeWluZyBNb2R1bGVDb3JlKEBzZWUgTW9kdWxlQ29yZSkgZm9yIGV4aXN0aW5nCi0JICogV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIChAc2VlIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcykuIElmIHRoZSByZXNvdXJjZSBleGlzdCBpdCBwcm9jZXNzZXMKLQkgKiB0aGUgcmVzb3VyY2UgKEBsaW5rIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpKS4gUHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UgaW5jcmVtZW50cwotCSAqIHRoZSByZWFkL3dyaXRlIGNvdW50LgotCSAqIDwvcD4qCi0JICogCi0JICogQHBhcmFtIHRoZVJlc291cmNlcyAtCi0JICogICAgICAgICAgICBsaXN0IG9mIHJlc291cmNlcyB0byB2ZXJpZnkgZmxleGlibGUgbW9kdWxlIHN0YXR1cywgYW5kIHByb2Nlc3MKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBjb3VsZCBub3QgV29ya2JlbmNoUmVzb3VyY2Ugd2l0aCB0aGUgY29ycmVzcG9uZGluZyBVUkkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1Jlc291cmNlc0lmSW50ZXJyZXN0ZWQoTGlzdCBhVGhlUmVzb3VyY2VzKSB7Ci0JCUxpc3QgdGhlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChhVGhlUmVzb3VyY2VzKTsKLQkJaW50IHNpemUgPSB0aGVSZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXNvdXJjZVRvUHJvY2VzczsKLQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsgCi0gCi0JCUlSZXNvdXJjZSByZXNvdXJjZVJlc291cmNlOwotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsgCi0JCQlyZXNvdXJjZVRvUHJvY2VzcyA9IChSZXNvdXJjZSkgdGhlUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChyZXNvdXJjZVRvUHJvY2VzcyA9PSBudWxsKSBjb250aW51ZTsKLQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHJlc291cmNlVG9Qcm9jZXNzLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7Ci0JCQlpZiAobnVsbCAhPSBsYXN0U2VnbWVudCAmJiBsYXN0U2VnbWVudC5lbmRzV2l0aChJTW9kdWxlQ29uc3RhbnRzLkNPTVBPTkVOVF9GSUxFX05BTUUpKSBjb250aW51ZTsKLQkJCXJlc291cmNlUmVzb3VyY2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlVG9Qcm9jZXNzKTsKLQkJCWlmIChyZXNvdXJjZVJlc291cmNlICE9IG51bGwpIHsKLQkJCQl2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMocmVzb3VyY2VSZXNvdXJjZSk7IAotCQkJCWZvciAoaW50IHJlc291cmNlc0luZGV4ID0gMDsgcmVzb3VyY2VzSW5kZXggPCB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aDsgcmVzb3VyY2VzSW5kZXgrKykgewotCQkJCQlpZiAodmlydHVhbENvbXBvbmVudC5lcXVhbHModmlydHVhbFJlc291cmNlc1tyZXNvdXJjZXNJbmRleF0uZ2V0Q29tcG9uZW50KCkpKSB7Ci0JCQkJCQlpZiAocmVzb3VyY2VUb1Byb2Nlc3MgIT1udWxsICYmIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlKHJlc291cmNlVG9Qcm9jZXNzKSkgewotCQkJCQkJCXByb2Nlc3NSZXNvdXJjZShyZXNvdXJjZVRvUHJvY2Vzcyk7Ci0JCQkJCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAgCi0JCXJldHVybiBwcm9jZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogPHA+Ci0JICogR2VuZXJpYyB3YXkgdG8gcmV0cmlldmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiwgd2l0aGluIHRoZSBwbGF0Zm9ybS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlclR5cGUgZm9yIHRoaXMgYWRhcHRlciBjbGFzcyBmcm9tIGFkYXB0ZXIgZmFjdG9yeSBzdG9yZWQgaW4gdGhlCi0JICogICAgICAgICBhZGFwdGVyIG1hbmFnZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogIAotCSAqLwotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRWaXJ0dWFsQ29tcG9uZW50KCkgewotCQlyZXR1cm4gdmlydHVhbENvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZCgpIHsKLQkJdHJ5IHsKLQkJCUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLm5vdGlmeUZ1bmN0aW9uR3JvdXBDaGFuZ2VkKG51bGwsZ2V0Q29tcG9uZW50UHJvamVjdCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0Rpc3Bvc2UoKSB7Ci0JCS8vUmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBmYWNldGVkIHByb2plY3QKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldFByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZ2V0Q29tcG9uZW50UHJvamVjdCgpKTsKLQkJCWlmIChmYWNldFByb2ogIT0gbnVsbCkKLQkJCQlmYWNldFByb2oucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXN1cGVyLmRvRGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9CaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9CaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3MWI0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5Q29tcG9uZW50SGVscGVyIHsKLQotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCi0JcHJvdGVjdGVkIEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCi0JcHVibGljIGFic3RyYWN0IFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzcxNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PjwvY29weXJpZ2h0PgotICogCi0gKiAkSWQ6IENvbXBvbmVudFJlc291cmNlLmphdmEsdiAxLjYuMjQuMSAyMDExLzA4LzAzIDE5OjQxOjU5IHJzYW5jaGV6IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBQcm92aWRlcyBhbiBhYnN0cmFjdCBtYXBwaW5nIG9mIHdvcmtiZW5jaCByZXNvdXJjZXMgdG8gZGVwbG95YWJsZQotICogcmVzb3VyY2VzLgotICogPHA+Ci0gKiBUaGUgdW5kZXJseWluZyBlY2xpcHNlIHJlc291cmNlIGNvdWxkIGJlIGEgY29udGFpbmVyIG9yIGEgZmlsZS4gSG93ZXZlciwgaWYgdGhlCi0gKiB7QHNlZSAjZ2V0U291cmNlUGF0aCgpfSZuYnNwOyBpcyBhIGNvbnRhaW5lciwgdGhlbiB0aGUge0BzZWUgI2dldERlcGxveWVkUGF0aCgpfSZuYnNwOyB3aWxsIGJlCi0gKiBhIGNvbnRhaW5lciBhcyB3ZWxsLgotICogPC9wPkNsaWVudHMgdGhhdCByZXF1aXJlIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBFY2xpcHNlIFJlc291cmNlIGZvciBhIGdpdmVuCi0gKiBDb21wb25lbnRSZXNvdXJjZSBzaG91bGQgdXNlIAotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmUjZ2V0RWNsaXBzZVJlc291cmNlKENvbXBvbmVudFJlc291cmNlKX0mbmJzcDsKLSAqIDxwPgotICogU2VlIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IGZvciBhbiA8YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3ZlcnZpZXcgb2YgdGhlIG1vZGVsIGNvbXBvbmVudHMgPC9hPi4KLSAqIDwvcD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRTb3VyY2VQYXRoIDxlbT5Tb3VyY2UgUGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFJ1bnRpbWVQYXRoIDxlbT5SdW50aW1lIFBhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRFeGNsdXNpb25zIDxlbT5FeGNsdXNpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0Q29tcG9uZW50IDxlbT5Db21wb25lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSZXNvdXJjZVR5cGUgPGVtPlJlc291cmNlIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRUYWcgPGVtPlRhZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFJlc291cmNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudFJlc291cmNlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U291cmNlIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U291cmNlIFBhdGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkCi0JICogYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlIFBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNvdXJjZVBhdGgoSVBhdGgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSVBhdGgiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJUGF0aCBnZXRTb3VyY2VQYXRoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0U291cmNlUGF0aCA8ZW0+U291cmNlIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZSBQYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTb3VyY2VQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTb3VyY2VQYXRoKElQYXRoIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJ1bnRpbWUgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UnVudGltZSBQYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UnVudGltZVBhdGgoSVBhdGgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLklQYXRoIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSVBhdGggZ2V0UnVudGltZVBhdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSdW50aW1lUGF0aCA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SdW50aW1lIFBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJ1bnRpbWVQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSdW50aW1lUGF0aChJUGF0aCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdXNpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdXNpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkKLQkgKiBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVzaW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9FeGNsdXNpb25zKCkKLQkgKiBAbW9kZWwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgZGVmYXVsdD0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFeGNsdXNpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb25lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21wb25lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50UmVzb3VyY2VfQ29tcG9uZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVzb3VyY2VzCi0JICogQG1vZGVsIG9wcG9zaXRlPSJyZXNvdXJjZXMiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrYmVuY2hDb21wb25lbnQgZ2V0Q29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0Q29tcG9uZW50IDxlbT5Db21wb25lbnQ8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc291cmNlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9SZXNvdXJjZVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0UmVzb3VyY2VUeXBlIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFnPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFJlc291cmNlX1RhZygpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRUYWcgPGVtPlRhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFnPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhZyhTdHJpbmcgdmFsdWUpOwotCi0JSVByb2plY3QgZ2V0T3duaW5nUHJvamVjdCgpOwotCXZvaWQgc2V0T3duaW5nUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCk7Ci0KLX0gLy8gQ29tcG9uZW50UmVzb3VyY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvQ29tcG9uZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEwNzAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAqIEluZGljYXRlcyBob3cgdGhlIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7c2hvdWxkIGJlIGhhbmRsZWQgYnkKLSAqIHRoZSB0b29saW5nLiAgCi0gKiA8cD4KLSAqIEluIHBhcnRpY3VsYXIsIHRoZSB7QHNlZSAjZ2V0TW9kdWxlVHlwZUlkKCl9Jm5ic3A7IGlzIHVzZWQgdG8gY29vcmRpbmF0ZSBvdGhlcgotICogZXh0ZW5zaW9ucyBzdWNoIGFzIEVkaXRNb2RlbHMgYW5kIHRoZSBtb2R1bGUgc3RydWN0dXJlIHByZXBhcmF0aW9uIGJ1aWxkZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogU2VlIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IGZvciBhbiA8YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3ZlcnZpZXcgb2YgdGhlIG1vZGVsIGNvbXBvbmVudHMgPC9hPi4KLSAqIDwvcD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldENvbXBvbmVudFR5cGVJZCA8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldE1ldGFkYXRhUmVzb3VyY2VzIDxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudFR5cGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21wb25lbnQgVHlwZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbXBvbmVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGVJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50VHlwZUlkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRhZGF0YSBSZXNvdXJjZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGh9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGVfTWV0YWRhdGFSZXNvdXJjZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSVBhdGgiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRUeXBlX1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFByb3BlcnRpZXMoKTsKLQotfSAvLyBDb21wb25lbnRUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvQ29tcG9uZW50Y29yZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWRlNGY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDYvMDQvMjcgMDQ6MTc6NDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudGNvcmVGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9uZW50Y29yZUZhY3RvcnkgZUlOU1RBTkNFID0gQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya2JlbmNoQ29tcG9uZW50IGNyZWF0ZVdvcmtiZW5jaENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb25lbnQgUmVzb3VyY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9uZW50UmVzb3VyY2UgY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRUeXBlIGNyZWF0ZUNvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlZmVyZW5jZWRDb21wb25lbnQgY3JlYXRlUmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9qZWN0IENvbXBvbmVudHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvamVjdENvbXBvbmVudHMgY3JlYXRlUHJvamVjdENvbXBvbmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9uZW50Y29yZVBhY2thZ2UgZ2V0Q29tcG9uZW50Y29yZVBhY2thZ2UoKTsKLQotfSAvL0NvbXBvbmVudGNvcmVGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvQ29tcG9uZW50Y29yZVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZlZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvbmVudGNvcmVQYWNrYWdlLmphdmEsdiAxLjkuNC4xIDIwMTEvMDgvMDMgMTk6NDE6NTkgcnNhbmNoZXogRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRjb3JlUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJjb21wb25lbnRjb3JlIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiY29tcG9uZW50Y29yZS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudGNvcmVQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwgPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0V29ya2JlbmNoQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCA8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9ORU5UX1JFU09VUkNFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEggPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJ1bnRpbWUgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdXNpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9ORU5UX1JFU09VUkNFX19UQUcgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfUkVTT1VSQ0VfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFR5cGUgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9fQ09NUE9ORU5UX1RZUEVfSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9fVkVSU0lPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9ORU5UX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9QRVJUWSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVwZW5kZW50IE9iamVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNUID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcmNoaXZlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fQVJDSElWRV9OQU1FID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvamVjdENvbXBvbmVudHNJbXBsIDxlbT5Qcm9qZWN0IENvbXBvbmVudHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9KRUNUX0NPTVBPTkVOVFMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFMgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX0NPTVBPTkVOVFNfX1ZFUlNJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX0NPTVBPTkVOVFNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZSA8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXREZXBlbmRlbmN5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVBFTkRFTkNZX1RZUEUgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5JUGF0aDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldElQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElQQVRIID0gNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VVJJPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVUkkgPSA4OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50IDxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrYmVuY2hDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0V29ya2JlbmNoQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRDb21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9Db21wb25lbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZWZlcmVuY2VkQ29tcG9uZW50cyA8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldFJlZmVyZW5jZWRDb21wb25lbnRzKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9SZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0V29ya2JlbmNoQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0TWV0YWRhdGFSZXNvdXJjZXMgPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRNZXRhZGF0YVJlc291cmNlcygpCi0JICogQHNlZSAjZ2V0V29ya2JlbmNoQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfTWV0YWRhdGFSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSA8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29tcG9uZW50UmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFNvdXJjZVBhdGggPGVtPlNvdXJjZSBQYXRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U291cmNlIFBhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0U291cmNlUGF0aCgpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1NvdXJjZVBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFJ1bnRpbWVQYXRoIDxlbT5SdW50aW1lIFBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SdW50aW1lIFBhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRFeGNsdXNpb25zIDxlbT5FeGNsdXNpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FeGNsdXNpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldEV4Y2x1c2lvbnMoKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRSZXNvdXJjZV9FeGNsdXNpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0Q29tcG9uZW50IDxlbT5Db21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+Q29tcG9uZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldENvbXBvbmVudCgpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbXBvbmVudFJlc291cmNlX0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0UmVzb3VyY2VUeXBlIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSZXNvdXJjZVR5cGUoKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRSZXNvdXJjZV9SZXNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFRhZyA8ZW0+VGFnPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFRhZygpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1RhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRUeXBlX0NvbXBvbmVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFR5cGVfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRNZXRhZGF0YVJlc291cmNlcyA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRNZXRhZGF0YVJlc291cmNlcygpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50VHlwZV9NZXRhZGF0YVJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCA8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRIYW5kbGUgPGVtPkhhbmRsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhbmRsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldEhhbmRsZSgpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldFJ1bnRpbWVQYXRoKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldERlcGVuZGVuY3lUeXBlIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbmN5VHlwZSgpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbnRPYmplY3QgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0RGVwZW5kZW50T2JqZWN0KCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRBcmNoaXZlTmFtZSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXJjaGl2ZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0QXJjaGl2ZU5hbWUoKQotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyA8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvamVjdENvbXBvbmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMjZ2V0UHJvamVjdE5hbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRDb21wb25lbnRzIDxlbT5Db21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db21wb25lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldENvbXBvbmVudHMoKQotCSAqIEBzZWUgI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREZXBlbmRlbmN5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCA8ZW0+SVBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPklQYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIKLQkgKiAgICAgICAgYW5ub3RhdGlvbj0ia2V5d29yZHMgZGF0YXR5cGU9J251bGwnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SVBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIDxlbT5VUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlVSSTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIKLQkgKiAgICAgICAgYW5ub3RhdGlvbj0ia2V5d29yZHMgZGF0YXR5cGU9J251bGwnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRjb3JlRmFjdG9yeSBnZXRDb21wb25lbnRjb3JlRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsIDxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS0JFTkNIX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRXb3JrYmVuY2hDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUyA9IGVJTlNUQU5DRS5nZXRXb3JrYmVuY2hDb21wb25lbnRfUmVzb3VyY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9Db21wb25lbnRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUyA9IGVJTlNUQU5DRS5nZXRXb3JrYmVuY2hDb21wb25lbnRfUmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9NZXRhZGF0YVJlc291cmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsIDxlbT5Db21wb25lbnQgUmVzb3VyY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRSZXNvdXJjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09NUE9ORU5UX1JFU09VUkNFID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEggPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1JFU09VUkNFX19SVU5USU1FX1BBVEggPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1c2lvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTVBPTkVOVF9SRVNPVVJDRV9fRVhDTFVTSU9OUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9FeGNsdXNpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1JFU09VUkNFX19SRVNPVVJDRV9UWVBFID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1JFU09VUkNFX19UQUcgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfVGFnKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbCA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPTkVOVF9UWVBFID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50VHlwZV9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT05FTlRfVFlQRV9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRUeXBlX01ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST1BFUlRZID0gZUlOU1RBTkNFLmdldFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFJlZmVyZW5jZWRDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVGRVJFTkNFRF9DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0hhbmRsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFID0gZUlOU1RBTkNFLmdldFJlZmVyZW5jZWRDb21wb25lbnRfRGVwZW5kZW5jeVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGVuZGVudCBPYmplY3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5UX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJjaGl2ZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwgPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9KRUNUX0NPTVBPTkVOVFMgPSBlSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FID0gZUlOU1RBTkNFLmdldFByb2plY3RDb21wb25lbnRzX1Byb2plY3ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFMgPSBlSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRQcm9qZWN0Q29tcG9uZW50c19WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldERlcGVuZGVuY3lUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gREVQRU5ERU5DWV9UWVBFID0gZUlOU1RBTkNFLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JUGF0aDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRJUGF0aCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBJUEFUSCA9IGVJTlNUQU5DRS5nZXRJUGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VVJJPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRVUkkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVVJJID0gZUlOU1RBTkNFLmdldFVSSSgpOwotCi0JfQotCi19IC8vQ29tcG9uZW50Y29yZVBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9EZWZhdWx0TW9kdWxlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0RlZmF1bHRNb2R1bGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWIwNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0RlZmF1bHRNb2R1bGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIERlZmF1bHRNb2R1bGVIYW5kbGVyIGltcGxlbWVudHMgSU1vZHVsZUhhbmRsZXIgewotCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJUHJvamVjdCBwcm9qLElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJaWYgKGNvbXAgIT0gbnVsbCkKLQkJCXJldHVybiBjb21wLmdldE5hbWUoKSArICIuamFyIjsKLQkJcmV0dXJuIHByb2ouZ2V0TmFtZSgpICsgIi5qYXIiOwotCX0KLQotCXB1YmxpYyBMaXN0PElQcm9qZWN0PiBnZXRGaWx0ZXJlZFByb2plY3RMaXN0Rm9yQWRkKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgTGlzdDxJUHJvamVjdD4gYXZhaWxhYmxlUHJvamVjdHMpIHsKLQkJSXRlcmF0b3I8SVByb2plY3Q+IGkgPSBhdmFpbGFibGVQcm9qZWN0cy5pdGVyYXRvcigpOwotCQlJUHJvamVjdCBwOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJcCA9IGkubmV4dCgpOwotCQkJaWYoICFwLmlzT3BlbigpKQotCQkJCWkucmVtb3ZlKCk7Ci0JCQllbHNlIGlmKCBwLmVxdWFscyhzb3VyY2VDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkKLQkJCQlpLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBhdmFpbGFibGVQcm9qZWN0czsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRDb21wb25lbnRBdHRyaWJ1dGVzKElQcm9qZWN0IHByb2opIHsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0RlcGVuZGVuY3lUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvRGVwZW5kZW5jeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MTRhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvRGVwZW5kZW5jeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIAotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gKiBJbmRpY2F0ZXMgaG93IGEgcGFydGljdWxhciB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuUmVmZXJlbmNlZENvbXBvbmVudH0mbmJzcDtzaG91bGQgYmUKLSAqIGFic29yYmVkIGJ5IGEge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0uIAotICogPHA+Ci0gKiBQcm92aWRlcyB0d28gdHlwZXMgKCJ1c2VzIiwgImNvbnN1bWVzIikgd2hpY2ggYXJlIHVzZWQgYnkKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5SZWZlcmVuY2VkQ29tcG9uZW50fXMgdG8gc3BlY2lmeSBob3cgdGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuUmVmZXJlbmNlZENvbXBvbmVudH0mbmJzcDsgc2hvdWxkIGJlIGFic29yYmVkIGJ5IHRoZQotICogY29udGFpbmluZyB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50fS4KLSAqIDwvcD4KLSAqIEZvciBjbGllbnRzIHRoYXQgbmVlZCB0byBjcmVhdGUgb25lIG9mIHRoZXNlIG9iamVjdHMgZnJvbSBzY3JhdGNoLAotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVGYWN0b3J5fS4KLSAqIDxwPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JywgYW5kCi0gKiB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPC9wPgotICogPHA+IAotICogU2VlIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IGZvciBhbiA8YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3ZlcnZpZXcgb2YgdGhlIG1vZGVsIGNvbXBvbmVudHM8L2E+LgotICogPC9wPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4gdXNlcz0wIGNvbnN1bWVzPTEgPCEtLQotICogZW5kLW1vZGVsLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlQ29yZVBhY2thZ2UjZ2V0RGVwZW5kZW5jeVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBlbmRlbmN5VHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+VXNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VXNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQKLQkgKiBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVU0VTX0xJVEVSQUwKLQkgKiBAbW9kZWwgbmFtZT0idXNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseQotCSAqIHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05TVU1FU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9ImNvbnN1bWVzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNVTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVzZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VTRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlcGVuZGVuY3lUeXBlIFVTRVNfTElURVJBTCA9IG5ldyBEZXBlbmRlbmN5VHlwZShVU0VTLCAidXNlcyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBzZWUgI0NPTlNVTUVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZXBlbmRlbmN5VHlwZSBDT05TVU1FU19MSVRFUkFMID0gbmV3IERlcGVuZGVuY3lUeXBlKENPTlNVTUVTLCAiY29uc3VtZXMiKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlcGVuZGVuY3lUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IERlcGVuZGVuY3lUeXBlW10gewotCQkJVVNFU19MSVRFUkFMLAotCQkJQ09OU1VNRVNfTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0JICogQHBhcmFtIG5hbWUgcGFzc2VzIGxpdGVyYWwgbmFtZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlcGVuZGVuY3lUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRGVwZW5kZW5jeVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqICA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSBwYXNzZXMgbGl0ZXJhbCB2YWx1ZQotCSAqIEByZXR1cm4gbGl0ZXJhbCBpbnN0YW5jZQotCSAqICA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXBlbmRlbmN5VHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgVVNFUzogcmV0dXJuIFVTRVNfTElURVJBTDsKLQkJCWNhc2UgQ09OU1VNRVM6IHJldHVybiBDT05TVU1FU19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGVwZW5kZW5jeVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vRGVwZW5kZW5jeVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9JQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvSUNvbXBvbmVudFByb2plY3RNaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGMzYjkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9JQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIFdUUCAzLjEuMiBhbmQgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4KLSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyOTM0Ci0gKiBAZGVwcmVjYXRlZCAKLSAqIEBhdXRob3IganNob2xsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudFByb2plY3RNaWdyYXRvciB7Ci0JcHVibGljIHZvaWQgbWlncmF0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9JTW9kdWxlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0lNb2R1bGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDM5M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0lNb2R1bGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgaW50ZW5kZWQgdG8gcmVmbGVjdCBiZWhhdmlvciBvZiBjdXN0b21pemVkIGNvbXBvbmVudHMKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZUhhbmRsZXIgewotCQotCQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byByZXR1cm4gYSBwcm9wZXIgYXJjaGl2ZSBuYW1lIGJhc2VkIG9uIHRoZSBjb21wb25lbnQgdHlwZQotCSAqIEBwYXJhbSBwcm9qIAotCSAqIEBwYXJhbSBjb21wCi0JICogQHJldHVybiBTdHJpbmcgYXJjaGl2ZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJUHJvamVjdCBwcm9qLCBJVmlydHVhbENvbXBvbmVudCBjb21wKTsKLQkKLQkvKioKLQkgKiBVc2VkIHRvIGZpbHRlciBpdGVtcyBkaXNwbGF5ZWQgaW4gQWRkIGRpYWxvZwotCSAqIEBwYXJhbSBzb3VyY2VDb21wb25lbnQKLQkgKiBAcGFyYW0gYXZhaWxhYmxlQ29tcG9uZW50cwotCSAqIEByZXR1cm4gTGlzdCBvZiBpdGVtcyB0aGF0IHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBhZGQgcmVmIGRpYWxvZ3MKLQkgKi8KLQlwdWJsaWMgTGlzdDxJUHJvamVjdD4gZ2V0RmlsdGVyZWRQcm9qZWN0TGlzdEZvckFkZChJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wb25lbnQsIExpc3Q8SVByb2plY3Q+IGF2YWlsYWJsZUNvbXBvbmVudHMpOwotCi0JLyoqCi0JICogVGhpcyBjYWxsIGlzIG1lYW50IHRvIGFkZCBJVmlydHVhbENvbXBvb25lbnQgaW5mcmFzdHJ1Y3R1cmUgdG8gYW55IHByb2plY3QgcGFzc2VkIGlmIG5lZWRlZAotCSAqIE1lYW50IGJlIG92ZXJyaWRkZW4gdG8gaW5jbHVkZSB0ZWNobm9sb2d5IHNwZWNpZmljIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gcHJvagotCSAqIEByZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIG9wZXJhdGlvbiBzdWNjZXNzCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0Q29tcG9uZW50QXR0cmlidXRlcyhJUHJvamVjdCBwcm9qKTsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVDb3JlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmQwMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0KLS8qKgotICogVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIFdUUCAzLjEuMiBhbmQgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4KLSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyOTM0Ci0gKiBAZGVwcmVjYXRlZCAKLSAqIEBhdXRob3IganNob2xsCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiB7Ci0JCXByb3RlY3RlZCBJUmVwb3J0ZXIgX3JlcG9ydGVyOwotCi0JCXB1YmxpYyBNb2R1bGVDb3JlVmFsaWRhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCQl9Ci0JCQotCQlwdWJsaWMgUmVzb3VyY2UgZ2V0UHJpbWFyeVJlc291cmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMzM0OyBDaGFuZ2luZyB0aGlzIG1ldGhvZCB0byBjYWxsIE1vZHVsZVN0cnVjdHVyYWxNb2RlbC5nZXRQcmltYXJ5UmVzb3VyY2UoKSBtZXRob2QgaW5zdGVhZC4KLQkJCS8vIFRoaXMgZG9lcyB0d28gdGhpbmdzOgotCQkJLy8gMS4gUmVvcmRlcnMgdGhlIGxvY2tzIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBsb2NraW5nIHRoZSByZXNvdXJjZSAoQnVnemlsbGEgMTgxMzM0KSwKLQkJCS8vCSAgdGhlbiB0aGUgZWRpdCBtb2RlbCBhbmQKLQkJCS8vIDIuIFJldXNlcyBjb2RlLiAoVGhlIGNvZGUgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQgTVNNLmdldFByaW1hcnlSZXNvdXJjZSgpIGlzIGlkZW50aWNhbC4KLQkJCVN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlpZiAoc3RydWN0dXJlRWRpdCAhPSBudWxsKSB7Ci0JCQkJTW9kdWxlU3RydWN0dXJhbE1vZGVsIHN0cnVjdHVyYWxNb2RlbCA9IHN0cnVjdHVyZUVkaXQuZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsKCk7Ci0JCQkJaWYgKHN0cnVjdHVyYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCS8vIEZpcnN0IHRvdWNoIHRoZSBtb2RlbCBGaWxlIHRvIG1ha2Ugc3VyZSBpcyBzeW5jaGVkIGJlZm9yZSBnZXR0aW5nIHRoZSBsb2NrCi0JCQkJCXN0cnVjdHVyYWxNb2RlbC5nZXRDb21wb25lbnRGaWxlKCk7Ci0JCQkJCS8vIGFjcXVpcmluZyB0aGUgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGxvY2sgaGVyZSBmaXJzdCBiZWNhdXNlIHRoZSBjYWxsIHRvIGdldFByaW1hcnlSZXNvdXJjZSgpCi0JCQkJCS8vIHdpbGwgY2F1c2UgdGhpcyBsb2NrIHRvIGJlIGFjcXVpcmVkIGxhdGVyIHJlc3VsdGluZyBpbiBhIHBvdGVudGlhbCBkZWFkbG9jawotCQkJCQlJTG9jayBsb2NrID0gRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmdldFByb2plY3RMb2NrT2JqZWN0KHN0cnVjdHVyYWxNb2RlbC5nZXRQcm9qZWN0KCkpOwotCQkJCQl0cnl7Ci0JCQkJCQlpZihudWxsICE9IGxvY2spewotCQkJCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCQkJfQotCQkJCQkJc3luY2hyb25pemVkKHN0cnVjdHVyYWxNb2RlbCl7Ci0JCQkJCQkJcmV0dXJuIHN0cnVjdHVyYWxNb2RlbC5nZXRQcmltYXJ5UmVzb3VyY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5ewotCQkJCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLS8qIGJ1ZzE5NzUzMSAtIHN0YW5kYXJkaXplIGNvbXBpbGVyIHNldHRpbmdzCi0JCXByaXZhdGUgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoSVByb2plY3QgcHJvaikgewotCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvaik7Ci0JCQlyZXR1cm4gbmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JCX0KLSovCi0KLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0JCQkJdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJX3JlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCQkvL1JlbW92ZSBhbGwgbWFya2VycyByZWxhdGVkIHRvIHRoaXMgdmFsaWRhdG9yCi0JCQlfcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0JCQkvL1VzaW5nIHRoZSBoZWxwZXIgY2xhc3MsIGxvYWQgdGhlIG1vZHVsZSBtb2RlbAotCQkJSVByb2plY3QgcHJvaiA9IChJUHJvamVjdCkgaGVscGVyCi0JCQkJCS5sb2FkTW9kZWwoTW9kdWxlQ29yZVZhbGlkYXRvckhlbHBlci5NT0RVTEVDT1JFLCBudWxsKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHByb2ouaXNBY2Nlc3NpYmxlKCkgJiYgcHJvai5oYXNOYXR1cmUoTW9kdWxlQ29yZU5hdHVyZS5NT0RVTEVfTkFUVVJFX0lEKSkgewotCQkJCQlpZiAobmVlZHNNaWdyYXRpbmcocHJvaikpCi0JCQkJCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBuZXcgTWVzc2FnZSgibW9kdWxlY29yZSIsCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCSJORUVEU01JR1JBVElORyIsIG51bGwsIHByb2opKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCQlfcmVwb3J0ZXIgPSBudWxsOwotCi0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIG5lZWRzTWlncmF0aW5nKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSlnZXRQcmltYXJ5UmVzb3VyY2UocHJvamVjdCk7Ci0JCQlib29sZWFuIG11bHRpQ29tcHMgPSBmYWxzZTsKLQkJCWlmIChwcm9qZWN0PT1udWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWJvb2xlYW4gbmVlZHNNaWdyYXRpbmcgPSAoIXByb2plY3QuaGFzTmF0dXJlKEZhY2V0ZWRQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCkpIHx8IHJlcyA9PSBudWxsIHx8ICgocmVzICE9IG51bGwpICYmICgoV1RQTW9kdWxlc1Jlc291cmNlKXJlcykuZ2V0Um9vdE9iamVjdCgpID09IG51bGwpOyAvL3x8IChyZXMhPW51bGwgJiYgIXJlcy5pc0xvYWRlZCgpICYmICgoV1RQTW9kdWxlc1Jlc291cmNlKXJlcykuZ2V0Um9vdE9iamVjdCgpICE9IG51bGwpOwotCQkJaWYgKCFuZWVkc01pZ3JhdGluZykgewotCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UgJiYgKChUcmFuc2xhdG9yUmVzb3VyY2UpcmVzKS5nZXRSb290T2JqZWN0KCkgaW5zdGFuY2VvZiBQcm9qZWN0Q29tcG9uZW50cykgewotCQkJCQlQcm9qZWN0Q29tcG9uZW50cyBjb21wb25lbnRzID0gKFByb2plY3RDb21wb25lbnRzKSAoKFdUUE1vZHVsZXNSZXNvdXJjZSlyZXMpLmdldFJvb3RPYmplY3QoKTsKLQkJCQkJaWYgKGNvbXBvbmVudHMuZ2V0Q29tcG9uZW50cygpICE9IG51bGwpIHsKLQkJCQkJCW11bHRpQ29tcHMgPSBjb21wb25lbnRzLmdldENvbXBvbmVudHMoKS5zaXplKCkgPiAxOwotCQkJCQkJcmV0dXJuIG11bHRpQ29tcHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmVlZHNNaWdyYXRpbmc7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0JCQkJdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJLy8gRm9yd2FyZGluZyB0byBqb2IgbWV0aG9kCi0JCQl2YWxpZGF0ZUluSm9iKGhlbHBlciwgcmVwb3J0ZXIpOwotCQl9Ci0JfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3JIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVDb3JlVmFsaWRhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMmMzMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotCi0KLS8qKgotICogVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIFdUUCAzLjEuMiBhbmQgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4KLSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyOTM0Ci0gKiBAZGVwcmVjYXRlZCAKLSAqIEBhdXRob3IganNob2xsCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlVmFsaWRhdG9ySGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dCB7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFQ09SRSA9ICJNT0RVTEVDT1JFIjsKLQkJcHVibGljIE1vZHVsZUNvcmVWYWxpZGF0b3JIZWxwZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJLy8JdGhlIGZvbGxvd2luZyB3aWxsIHJlZ2lzdGVyIHRoZSBoZWxwZXIncyBzeW1ib2xpYyBtZXRob2RzCi0JCSAgICBDbGFzcyBbXSBhcmdzID0gbmV3IENsYXNzWzBdIDsKLQkJICAgIHJlZ2lzdGVyTW9kZWwoTU9EVUxFQ09SRSwgImxvYWRNb2RlbCIsIGFyZ3MpOwotCQl9Ci0JCS8qKgotCQkgKiBMb2FkIHRoZSBUcmFkaW5nIFNlc3Npb24gZm9yIHZhbGlkYXRpb24KLQkJICovCi0JCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCi0JfQkJCi0JCS8qKgotCQkgKiBHaXZlbiBhIHJlc291cmNlLCByZXR1cm4gaXRzIG5vbi1lY2xpcHNlLXNwZWNpZmljIGxvY2F0aW9uLiBJZiB0aGlzCi0JCSAqIHJlc291cmNlLCBvciB0eXBlIG9mIHJlc291cmNlLCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgaGVscGVyLCByZXR1cm4KLQkJICogbnVsbC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCi0JCQlyZXR1cm4gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQl9Ci0JfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZU1pZ3JhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZU1pZ3JhdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWYyMWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVNaWdyYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLlByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgV1RQIDMuMS4yIGFuZCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLgotICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI5MzQKLSAqIEBkZXByZWNhdGVkIAotICogQGF1dGhvciBqc2hvbGwKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZU1pZ3JhdG9yTWFuYWdlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIG1hbmFnZXJDYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBtaWdyYXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIG1pZ3JhdGluZzsKLQlwdWJsaWMgTW9kdWxlTWlncmF0b3JNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgc3RhdGljIE1vZHVsZU1pZ3JhdG9yTWFuYWdlciBnZXRNYW5hZ2VyKElQcm9qZWN0IHByb2opIHsKLQkJTW9kdWxlTWlncmF0b3JNYW5hZ2VyIG1hbmFnZXIgPSAoTW9kdWxlTWlncmF0b3JNYW5hZ2VyKW1hbmFnZXJDYWNoZS5nZXQocHJvaik7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCW1hbmFnZXIgPSBuZXcgTW9kdWxlTWlncmF0b3JNYW5hZ2VyKCk7Ci0JCQltYW5hZ2VyQ2FjaGUucHV0KHByb2osbWFuYWdlcik7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCXByaXZhdGUgdm9pZCBtaWdyYXRlQ29tcG9uZW50c0lmTmVjZXNzYXJ5KElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gbXVsdGlDb21wcykgewotCQkKLQkJc2V0dXBBbmRNaWdyYXRlQ29tcG9uZW50UHJvamVjdChwcm9qZWN0KTsKLQkJCi0JfQotCXByaXZhdGUgdm9pZCBzZXR1cEFuZE1pZ3JhdGVDb21wb25lbnRQcm9qZWN0KElQcm9qZWN0IHByb2opIHsKLQkJbWlncmF0ZWQuYWRkKHByb2opOwotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQlkbS5zZXRTdHJpbmdQcm9wZXJ0eShJUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUscHJvai5nZXROYW1lKCkpOwotCQl0cnkgewotCQkJZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCxudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1pZ3JhdGVPbGRNZXRhRGF0YShJUHJvamVjdCBhUHJvamVjdCwgZmluYWwgYm9vbGVhbiBtdWx0aUNvbXBzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1pZ3JhdGluZyA9IHRydWU7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMgd29ya3NwYWNlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyhhUHJvamVjdCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlJUHJvamVjdCBhUHJvaiA9IChJUHJvamVjdCl0aGlzLmdldEluZm8oKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoYVByb2ouaXNBY2Nlc3NpYmxlKCkgJiYgTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChhUHJvaikpIHsKLQkJCQkJCWlmIChhUHJvai5maW5kTWVtYmVyKCIud3RwbW9kdWxlcyIpICE9IG51bGwpIHsKLQkJCQkJCQltb3ZlT2xkTWV0YURhdGFGaWxlKGFQcm9qKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChuZWVkc0NvbXBvbmVudE1pZ3JhdGlvbihhUHJvaixtdWx0aUNvbXBzKSkKLQkJCQkJCQltaWdyYXRlQ29tcG9uZW50c0lmTmVjZXNzYXJ5KGFQcm9qLG11bHRpQ29tcHMpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbWlncmF0aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIGJvb2xlYW4gbmVlZHNDb21wb25lbnRNaWdyYXRpb24oSVByb2plY3QgYVByb2osYm9vbGVhbiBtdWx0aUNvbXBzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCi0JCQlib29sZWFuIG5lZWRzID0gdHJ1ZTsKLQkJCWlmIChtdWx0aUNvbXBzKQotCQkJCXJldHVybiAobmVlZHMgJiYgbXVsdGlDb21wcyk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuICgoYVByb2ouZmluZE1lbWJlcihTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSkgPT0gbnVsbCkgJiYgKGFQcm9qLmZpbmRNZW1iZXIoIi5zZXR0aW5ncy8uY29tcG9uZW50IikgPT0gbnVsbCkpIHx8IAotCQkJCQkJKFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShhUHJvaikgPT0gbnVsbCkgJiYgbmVlZHM7Ci0JCQl9Ci0JCX07Ci0JCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHdvcmtzcGFjZVJ1bm5hYmxlLCBudWxsLElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLG51bGwpOwotCQkKLQkJCi0JCQotCQkKLQl9Ci0JcHJpdmF0ZSB2b2lkIG1vdmVNZXRhRGF0YUZpbGUoSVByb2plY3QgcHJvamVjdCkgewotCQlJUmVzb3VyY2Ugb2xkZmlsZSA9IHByb2plY3QuZmluZE1lbWJlcigiLnd0cG1vZHVsZXMiKTsKLQkJaWYgKG9sZGZpbGUgIT0gbnVsbCAmJiBvbGRmaWxlLmV4aXN0cygpKSB7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJCUlGb2xkZXIgc2V0dGluZ3NGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcigiLnNldHRpbmdzIik7Ci0JCQkJCWlmICghc2V0dGluZ3NGb2xkZXIuZXhpc3RzKCkpCi0JCQkJCQlzZXR0aW5nc0ZvbGRlci5jcmVhdGUodHJ1ZSx0cnVlLG51bGwpOwotCQkJCQlvbGRmaWxlLm1vdmUobmV3IFBhdGgoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpLHRydWUsbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQbGF0Zm9ybS5nZXRMb2coTW9kdWxlY29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJfQotCQl9IAotCX0KLQlwcml2YXRlIHZvaWQgbW92ZU9sZE1ldGFEYXRhRmlsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJdHJ5IHsKLQkJCQltb3ZlTWV0YURhdGFGaWxlKHByb2plY3QpOwotCQkJCUlGb2xkZXIgZGVwRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIi5kZXBsb3lhYmxlcyIpOwotCQkJCWlmIChkZXBGb2xkZXIuZXhpc3RzKCkpCi0JCQkJCWRlcEZvbGRlci5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzTWlncmF0aW5nKCkgewotCQlyZXR1cm4gbWlncmF0aW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZVN0cnVjdHVyYWxNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZVN0cnVjdHVyYWxNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTIwYTgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLldvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBNb2R1bGVzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0TmF0dXJlOwotLyoqCi0gKiBNYW5hZ2VzIHRoZSB1bmRlcmx5aW5nIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPGEgbmFtZT0ibW9kdWxlLXN0cnVjdHVyYWwtbW9kZWwiLz4KLSogPHA+Ci0qIEVhY2ggTW9kdWxlQ29yZU5hdHVyZSBmcm9tIGEgZ2l2ZW4gcHJvamVjdCBjYW4gcHJvdmlkZSBhY2Nlc3MgdG8gdGhlCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IG9mIHRoZSBwcm9qZWN0LgotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyBpcyBhIHN1YmNsYXNzIG9mCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbH0mbmJzcDt0aGF0IG1hbmFnZXMKLSogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTW9kdWxlIFN0cnVjdHVyYWwgTWV0YW1vZGVsLiBBcyBhbiBFZGl0TW9kZWwsIHRoZQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyByZWZlcmVuY2VzIEVNRiByZXNvdXJjZXMsCi0qIHRoYXQgY29udGFpbiBFTUYgbW9kZWxzIC0tIGluIHRoaXMgY2FzZSwgdGhlIEVNRiBtb2RlbCBvZiA8aT4uY29tcG9uZW50IDwvaT4gZmlsZS4KLSogPC9wPgotKiA8cD4KLSogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIEVkaXQgRmFjYWRlIHBhdHRlcm4gKHZpYQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZX0mbmJzcDsgb3Igb25lIGlmIGl0cyByZWxldmFudCBzdWJjbGFzc2VzKQotKiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPC9wPiAKLSogPHA+Ci0qIDxhIGhyZWY9Ik1vZHVsZUNvcmVOYXR1cmUuaHRtbCNtb2RlbC1kaXNjdXNzaW9uIj5TZWUgdGhlIGRpc2N1c3Npb248L2E+IG9mIGhvdyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgcmVsYXRlcyB0byB0aGUgQXJ0aWZhY3RFZGl0TW9kZWwgYW5kIE1vZHVsZUNvcmVOYXR1cmUuCi0qIDxhIG5hbWU9ImFjY2Vzc29yLWtleSIvPgotKiA8cD4KLSogQWxsIEVkaXRNb2RlbHMgaGF2ZSBhIGxpZmVjeWNsZSB0aGF0IG11c3QgYmUgZW5mb3JjZWQgdG8ga2VlcCB0aGUgcmVzb3VyY2VzIGxvYWRlZCB0aGF0IGFyZSBpbgotKiB1c2UsIGFuZCB0byB1bmxvYWQgcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiB1c2UuIFRvIGFjY2VzcyBhbiBFZGl0TW9kZWwsIGNsaWVudHMgYXJlIHJlcXVpcmVkIHRvCi0qIHN1cHBseSBhbiBvYmplY3QgdG9rZW4gcmVmZXJyZWQgdG8gYXMgYW4gYWNjZXNzb3Iga2V5LiBUaGUgYWNjZXNzb3Iga2V5IGFsbG93cyB0aGUgZnJhbWV3b3JrIHRvCi0qIGJldHRlciB0cmFjayB3aGljaCBjbGllbnRzIGFyZSB1c2luZyB0aGUgRWRpdE1vZGVsLCBhbmQgdG8gZW5zdXJlIHRoYXQgb25seSBhIGNsaWVudCB3aGljaCBoYXMKLSogYWNjZXNzZWQgdGhlIEVkaXRNb2RlbCB3aXRoIGFuIGFjY2Vzc29yIGtleSBtYXkgaW52b2tlIHNhdmUqKClzIG9uIHRoYXQgRWRpdE1vZGVsLgotKiA8L3A+Ci0qLyAKLXB1YmxpYyBjbGFzcyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgZXh0ZW5kcyBFZGl0TW9kZWwgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSMF83X01PRFVMRV9NRVRBX0ZJTEVfTkFNRSA9ICIuY29tcG9uZW50IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSMV9NT0RVTEVfTUVUQV9GSUxFX05BTUUgPSAiLnNldHRpbmdzLy5jb21wb25lbnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9DT1JFX0lEID0gIm1vZHVsZUNvcmVJZCI7IC8vJE5PTi1OTFMtMSQgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfVkVSU0lPTl8xXzUgPSAiMS41LjAiOwotCXByaXZhdGUgYm9vbGVhbiB1c2VPbGRGb3JtYXQgPSBmYWxzZTsKLQlwcml2YXRlIEJvb2xlYW4gbmVlZHNTeW5jID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JcHVibGljIE1vZHVsZVN0cnVjdHVyYWxNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiByZWFkT25seSkgewotICAgICAgICBzdXBlcihlZGl0TW9kZWxJRCwgY29udGV4dCwgcmVhZE9ubHkpOwotICAgIH0KLSAgICAvKioKLQkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVmZXJlbmNlZFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoaXNSZWFkT25seSgpICYmIGFSZXNvdXJjZS5nZXRSZWFkQ291bnQoKSAhPSAwKQotCQkJYVJlc291cmNlLnJlbGVhc2VGcm9tUmVhZCgpOwotCQllbHNlCi0JCQlhUmVzb3VyY2UucmVsZWFzZUZyb21Xcml0ZSgpOwotCi0JfQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCS8vRmlyc3QgY2hlY2tpbmcgaWYgcmVzb3VyY2UgaXMgbG9hZGVkIChXaGljaCB3aWxsIHByZXZlbnQgcmVtb3ZpbmcgaW4gbWlkZGxlIG9mIGxvYWRpbmcgYnkgY2hlY2tpbmcgcmVzb3VyY2UgYWRhcHRlciBsb2NrKQotCQkJYVJlc291cmNlLmlzTG9hZGVkKCk7Ci0JCQlzeW5jaHJvbml6ZWQgKGFSZXNvdXJjZSkgewotCQkJCWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VBZGFwdGVyKTsKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWwjZ2V0UHJpbWFyeVJvb3RPYmplY3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFByaW1hcnlSb290T2JqZWN0KCkgewotCQkKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlcyA9IHByZXBhcmVQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQlFT2JqZWN0IG1vZGVsUm9vdCA9IG51bGw7Ci0JCW1vZGVsUm9vdCA9IHN1cGVyLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCWlmIChtb2RlbFJvb3QgIT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIHdvcmtzcGFjZSB0cmVlIGlzIGxvY2tlZCB3ZSBjYW5ub3QgdHJ5IHRvIGNoYW5nZSB0aGUgLmNvbXBvbmVudCByZXNvdXJjZQotCQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc1RyZWVMb2NrZWQoKSkKLQkJCQlyZXR1cm4gbW9kZWxSb290OwotCQkJTGlzdCBjb21wb25lbnRzID0gKChQcm9qZWN0Q29tcG9uZW50cyltb2RlbFJvb3QpLmdldENvbXBvbmVudHMoKTsKLQkJCWlmIChjb21wb25lbnRzLnNpemUoKT4wKSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcCA9IChXb3JrYmVuY2hDb21wb25lbnQpY29tcG9uZW50cy5nZXQoMCk7Ci0JCQkJLy8gQ2hlY2sgYW5kIHNlZSBpZiB3ZSBuZWVkIHRvIGNsZWFuIHVwIHNwdXJyaW91cyByZWR1bmRhbnQgbWFwIGVudHJpZXMKLQkJCQlpZiAoIWlzVmVyc2lvbjE1KG1vZGVsUm9vdCkpIHsKLQkJCQkJKChQcm9qZWN0Q29tcG9uZW50cyltb2RlbFJvb3QpLnNldFZlcnNpb24oUFJPSkVDVF9WRVJTSU9OXzFfNSk7Ci0JCQkJCWNsZWFudXBXVFBNb2R1bGVzKHdiQ29tcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFJvb3Q7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1ZlcnNpb24xNShFT2JqZWN0IG1vZGVsUm9vdCl7Ci0JCXJldHVybiAoKFByb2plY3RDb21wb25lbnRzKW1vZGVsUm9vdCkuZ2V0VmVyc2lvbigpLmVxdWFscyhQUk9KRUNUX1ZFUlNJT05fMV81KTsKLQl9Ci0gICAgCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZW1vdmUgc3B1cnJpb3VzIHJlZHVuZGFudCBlbnRyaWVzIGZyb20gdGhlIC5jb21wb25lbnQgZmlsZQotCSAqIAotCSAqIEBwYXJhbSB3YkNvbXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwV1RQTW9kdWxlcyhXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wKSB7Ci0JCWlmICh3YkNvbXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJUmVzb3VyY2VUcmVlUm9vdCByb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXRTb3VyY2VSZXNvdXJjZVRyZWVSb290KHdiQ29tcCk7Ci0JCUxpc3Qgcm9vdFJlc291cmNlcyA9IGdldE1vZHVsZVJlc291cmNlcyhyb290KTsKLQkJLy8gT25seSBpZiB3ZSBuZWVkIHRvIGRvIGEgY2xlYW4sIGRvIHdlIGNsZWFyLCBhZGQgYWxsIHJlcXVpcmVkIHJvb3QgcmVzb3VyY2UgbWFwcGluZ3MsIGFuZCBzYXZlCi0JCWlmICghKHdiQ29tcC5nZXRSZXNvdXJjZXMoKS5jb250YWluc0FsbChyb290UmVzb3VyY2VzKSAmJiB3YkNvbXAuZ2V0UmVzb3VyY2VzKCkuc2l6ZSgpPT1yb290UmVzb3VyY2VzLnNpemUoKSkpIHsKLQkJCWZpbmFsIE1vZHVsZVN0cnVjdHVyYWxNb2RlbCBtb2RlbCA9IG5ldyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoZ2V0RWRpdE1vZGVsSUQoKSxnZXRFbWZDb250ZXh0KCksZmFsc2UpOwotCQkJaWYobW9kZWwgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYm9vbGVhbiBqb2JTY2hlZHVsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgT2JqZWN0IGtleSA9IG5ldyBPYmplY3QoKTsKLQkJCQltb2RlbC5hY2Nlc3Moa2V5KTsKLQkJCQkKLQkJCQl3YkNvbXAuZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQl3YkNvbXAuZ2V0UmVzb3VyY2VzKCkuYWRkQWxsKHJvb3RSZXNvdXJjZXMpOwotCQkJCVVSSSB1cmkgPSB3YkNvbXAuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJLy9uZWVkIHRvIGdldCB0aGlzIHJlc291cmNlIGludG8gdGhlIG1vZGVsCi0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtb2RlbC5nZXRSZXNvdXJjZSh1cmkpOwotCQkJCS8vbmVlZCB0byBtYW51YWxseSBkaXJ0eSB0aGlzIHJlc291cmNlIGluIG9yZGVyIGZvciBpdCB0byBzYXZlLgotCQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCS8vdGhpcyBqb2IgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIHRoZSBkZWFkbG9jayBpbiAKLQkJCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEyNTMKLQkJCQljbGFzcyBTYXZlSm9iIGV4dGVuZHMgSm9iIHsKLQkJCQkJCi0JCQkJCXB1YmxpYyBTYXZlSm9iKCkgewotCQkJCQkJc3VwZXIoIlNhdmUgTW9kdWxlU3RydWN0dXJhbE1vZGVsIEpvYiIpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1vZGVsLnNhdmUoa2V5KTsKLQkJCQkJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlkaXNwb3NlT25jZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWRBbHJlYWR5ID0gZmFsc2U7Ci0JCQkJCQotCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlT25jZSgpewotCQkJCQkJaWYoIWRpc3Bvc2VkQWxyZWFkeSl7Ci0JCQkJCQkJZGlzcG9zZWRBbHJlYWR5ID0gdHJ1ZTsKLQkJCQkJCQltb2RlbC5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWZpbmFsIFNhdmVKb2Igc2F2ZUpvYiA9IG5ldyBTYXZlSm9iKCk7Ci0JCQkJc2F2ZUpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpewotCQkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJc2F2ZUpvYi5kaXNwb3NlT25jZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJc2F2ZUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCQkJc2F2ZUpvYi5zY2hlZHVsZSgpOwotCQkJCWpvYlNjaGVkdWxlZCA9IHRydWU7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICgham9iU2NoZWR1bGVkICYmIG1vZGVsICE9IG51bGwpCi0JCQkJCW1vZGVsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSAKLQl9Ci0gICAgCi0JLyoqCi0JICogVGhpcyBpcyBhIHJlY3Vyc2l2ZSBtZXRob2QgdG8gZmluZCBhbGwgdGhlIHJvb3QgbGV2ZWwgcmVzb3VyY2VzIGluIHRoZSBjaGlsZHJlbidzIHJlc291cmNlIHRyZWUgcm9vdHMKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gTGlzdCBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlUmVzb3VyY2VzKFJlc291cmNlVHJlZU5vZGUgbm9kZSkgewotCQkvLyBJZiB0aGUgcmVzb3VyY2Ugbm9kZSBoYXMgbW9kdWxlIHJlc291cmNlcyBqdXN0IHJldHVybiB0aGVtCi0JCWlmIChub2RlLmdldE1vZHVsZVJlc291cmNlcygpLmxlbmd0aD4wKQotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3Qobm9kZS5nZXRNb2R1bGVSZXNvdXJjZXMoKSk7Ci0JCS8vIE90aGVyd2lzZSwgdGhlIHJvb3QgcmVzb3VyY2UgbWFwcyBhcmUgcmVhbGx5IGF0IHRoZSBuZXh0IGxldmVsIG9yIGxvd2VyCi0JCUxpc3Qgcm9vdFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWFwIGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZHJlbigpOwotCQlJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZVRyZWVOb2RlIHN1Yk5vZGUgPSAoUmVzb3VyY2VUcmVlTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkvLyByZWN1cnNpdmVseSBjYWxsIG1ldGhvZCB0byBvYnRhaW4gbW9kdWxlIHJlc291cmNlcwotCQkJcm9vdFJlc291cmNlcy5hZGRBbGwoZ2V0TW9kdWxlUmVzb3VyY2VzKHN1Yk5vZGUpKTsKLQkJfQotCQlyZXR1cm4gcm9vdFJlc291cmNlczsKLQl9Ci0JcHVibGljIFJlc291cmNlIHByZXBhcmVQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlYTUlSZXNvdXJjZSByZXM7Ci0JCXJlcyA9IChYTUlSZXNvdXJjZSkgZ2V0UHJpbWFyeVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXNOZWVkc01pZ3JhdGluZyhyZXMpICYmICF1c2VPbGRGb3JtYXQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYocmVzID09IG51bGwpCi0JCQlyZXMgPSBtYWtlV1RQTW9kdWxlc1Jlc291cmNlKCk7CQkKLQkJdHJ5IHsKLQkJCWFkZFByb2plY3RNb2R1bGVzSWZOZWNlc3NhcnkocmVzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewkJCi0JCQlQbGF0Zm9ybS5nZXRMb2coTW9kdWxlY29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9IAotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQkKLQlwdWJsaWMgSUZpbGUgZ2V0Q29tcG9uZW50RmlsZSgpIHsKLQkJCi0JCUlGaWxlIGNvbXBGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCQlpZiAoY29tcEZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCWNoZWNrU3luYyhjb21wRmlsZSk7CQotCQkJcmV0dXJuIGNvbXBGaWxlOwotCQl9Ci0JCWVsc2UgeyAvL05lZWQgdG8gY2hlY2sgZm9yIGxlZ2FjeSBmaWxlIGxvY2F0aW9ucyBhbHNvLi4uLgotCQkJY29tcEZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuUjFfTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJCWlmIChjb21wRmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCWNoZWNrU3luYyhjb21wRmlsZSk7CQotCQkJCXJldHVybiBjb21wRmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbXBGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoTW9kdWxlU3RydWN0dXJhbE1vZGVsLlIwXzdfTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJCQlpZiAoY29tcEZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJY2hlY2tTeW5jKGNvbXBGaWxlKTsJCi0JCQkJCXJldHVybiBjb21wRmlsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRGaWxlKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3luYyhJRmlsZSBjb21wRmlsZSkgewotCQlib29sZWFuIGxvY2FsTmVlZHNTeW5jID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAobmVlZHNTeW5jKSB7Ci0JCQlsb2NhbE5lZWRzU3luYyA9IG5lZWRzU3luYzsKLQkJfQotCQlpZiAobG9jYWxOZWVkc1N5bmMpIHsgLy8gT25seSBjaGVjayBzeW5jIG9uY2UgZm9yIGxpZmUgb2YgdGhpcyBtb2RlbAotCQkJaWYgKCFjb21wRmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfT05FKSkgewotCQkJCUZpbGUgaW9maWxlID0gY29tcEZpbGUuZ2V0RnVsbFBhdGgoKS50b0ZpbGUoKTsKLQkJCQlpZiAoaW9maWxlLmV4aXN0cygpIHx8IGNvbXBGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gKFdvcmtzcGFjZSljb21wRmlsZS5nZXRXb3Jrc3BhY2UoKTsKLQkJCQkJCWlmICh3b3Jrc3BhY2UuZ2V0RWxlbWVudFRyZWUoKS5pc0ltbXV0YWJsZSgpKQotCQkJCQkJewotCQkJCQkJCXdvcmtzcGFjZS5uZXdXb3JraW5nVHJlZSgpOwotCQkJCQkJfQotCQkJCQkJKChvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZSljb21wRmlsZSkuZ2V0TG9jYWxNYW5hZ2VyKCkucmVmcmVzaChjb21wRmlsZS5nZXRQcm9qZWN0KCksIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3luY2hyb25pemVkIChuZWVkc1N5bmMpIHsKLQkJCQluZWVkc1N5bmMgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFdUUE1vZHVsZXNSZXNvdXJjZSAgbWFrZVdUUE1vZHVsZXNSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChXVFBNb2R1bGVzUmVzb3VyY2UpIGNyZWF0ZVJlc291cmNlKFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkuV1RQX01PRFVMRVNfVVJJX09CSik7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJ1blNhdmVPcGVyYXRpb24oSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBTYXZlRmFpbGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIGdldENvbXBvbmVudEZpbGUoKSxJV29ya3NwYWNlLkFWT0lEX1VQREFURSxtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jaGVja0FjdGl2YXRpb24ocHJlc2VudGVyKTsKLQl9Ci0JLyoqCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgLSBieSBkZWZhdWx0IHRoaXMgd2lsbCByZXR1cm4gdGhlIGZpcnN0IHJlc291cmNlIHJlZmVyZW5jZWQgYnkgdGhlCi0JICoga25vd24gcmVzb3VyY2UgVVJJcyBmb3IgdGhpcyBFZGl0TW9kZWwKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFByaW1hcnlSZXNvdXJjZSgpIHsKLQkJLy8gV2lsbCBhbHdheXMgZ28gdGhyb3VnaCB0aGUgZ2V0RmlsZSBtZXRob2QgdGhhdCBzZWFyY2hlcyBmb3IgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucy4KLQkJSUZpbGUgY29tcEZpbGUgPSBnZXRDb21wb25lbnRGaWxlKCk7Ci0JCQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShjb21wRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJV1RQTW9kdWxlc1Jlc291cmNlIHJlcyA9IChXVFBNb2R1bGVzUmVzb3VyY2UpZ2V0UmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlcyA9PSBudWxsIHx8ICFyZXMuaXNMb2FkZWQoKSB8fCByZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCXJlbW92ZVJlc291cmNlKHJlcyk7Ci0JCQlyZXMgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhbkFkYXB0ZXIpOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE1vZHVsZXNJZk5lY2Vzc2FyeShYTUlSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsgCi0JCQlpZihhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0TW9kdWxlcyA9IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRjb3JlRmFjdG9yeSgpLmNyZWF0ZVByb2plY3RDb21wb25lbnRzKCk7Ci0JCQkJcHJvamVjdE1vZHVsZXMuc2V0UHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChwcm9qZWN0TW9kdWxlcyk7IAotCQkJCWFSZXNvdXJjZS5zZXRJRChwcm9qZWN0TW9kdWxlcywgTU9EVUxFX0NPUkVfSUQpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgYm9vbGVhbiByZXNOZWVkc01pZ3JhdGluZyhYTUlSZXNvdXJjZSByZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBtdWx0aUNvbXBzID0gZmFsc2U7Ci0JCWlmIChwcm9qZWN0PT1udWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlib29sZWFuIG5lZWRzTWlncmF0aW5nID0gKCFwcm9qZWN0Lmhhc05hdHVyZShGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB8fCByZXMgPT0gbnVsbCB8fCAoKHJlcyAhPSBudWxsKSAmJiAoKFdUUE1vZHVsZXNSZXNvdXJjZSlyZXMpLmdldFJvb3RPYmplY3QoKSA9PSBudWxsKTsgCi0JCWlmICghbmVlZHNNaWdyYXRpbmcpIHsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UgJiYgKChUcmFuc2xhdG9yUmVzb3VyY2UpcmVzKS5nZXRSb290T2JqZWN0KCkgaW5zdGFuY2VvZiBQcm9qZWN0Q29tcG9uZW50cykgewotCQkJCVByb2plY3RDb21wb25lbnRzIGNvbXBvbmVudHMgPSAoUHJvamVjdENvbXBvbmVudHMpICgoV1RQTW9kdWxlc1Jlc291cmNlKXJlcykuZ2V0Um9vdE9iamVjdCgpOwotCQkJCWlmIChjb21wb25lbnRzLmdldENvbXBvbmVudHMoKSAhPSBudWxsKSB7Ci0JCQkJCW11bHRpQ29tcHMgPSBjb21wb25lbnRzLmdldENvbXBvbmVudHMoKS5zaXplKCkgPiAxOwotCQkJCQlyZXR1cm4gbXVsdGlDb21wczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5lZWRzTWlncmF0aW5nOwotCX0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJCi0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExvY2FsUmVzb3VyY2UoYVVyaSk7Ci0JCQlpZiAobnVsbCAhPSByZXNvdXJjZSkgewotCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOyAvLyByZWxvYWQgaXQKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gSWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZU9sZEZvcm1hdChib29sZWFuIHVzZU9sZEZvcm1hdCkgewotCQl0aGlzLnVzZU9sZEZvcm1hdCA9IHVzZU9sZEZvcm1hdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCS8vIEFsd2F5cyBmb3JjZSBzYXZlCi0JCXN1cGVyLnNhdmUobW9uaXRvciwgYWNjZXNzb3JLZXkpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7Ci0JCS8vTm90IGJvdGhlcmluZyB3aXRoIHJlZiBjb3VudGluZyBtb2RlbCBhY2Nlc3MgLSBhbHdheXMgYWxsb3cgc2F2ZS9hY2Nlc3MKLQkJCQkKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVsZWFzZUFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJCi0JCS8vTm90IGJvdGhlcmluZyB3aXRoIHJlZiBjb3VudGluZyBtb2RlbCBhY2Nlc3MgLSBhbHdheXMgYWxsb3cgc2F2ZS9hY2Nlc3MKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UGVybWlzc2lvblRvU2F2ZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKLQkJLy9Ob3QgYm90aGVyaW5nIHdpdGggcmVmIGNvdW50aW5nIG1vZGVsIGFjY2VzcyAtIGFsd2F5cyBhbGxvdyBzYXZlL2FjY2VzcwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJLy9Ob3QgYm90aGVyaW5nIHdpdGggcmVmIGNvdW50aW5nIG1vZGVsIGFjY2VzcyAtIGFsd2F5cyBhbGxvdyBzYXZlL2FjY2VzcwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZWNvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVjb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjU1ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZWNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUE1vZHVsZXNJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkFydGlmYWN0RWRpdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLk1vZHVsZUNvcmVFY2xpcHNlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLmxhbmcuVGhyb3dhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlY29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE1vZHVsZWNvcmVQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JLy9wbHVnaW4gaWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlY29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlJQWRhcHRlck1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCk7Ci0JCQotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IE1vZHVsZUNvcmVFY2xpcHNlQWRhcHRlckZhY3RvcnkoKSwgTW9kdWxlU3RydWN0dXJhbE1vZGVsLmNsYXNzKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKG5ldyBBcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeSgpLCBBcnRpZmFjdEVkaXRNb2RlbC5jbGFzcyk7Ci0JCW1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhuZXcgQXJ0aWZhY3RFZGl0QWRhcHRlckZhY3RvcnkoKSwgQXJ0aWZhY3RFZGl0LmNsYXNzKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKG5ldyBBcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeSgpLCBJVmlydHVhbENvbXBvbmVudC5jbGFzcyk7Ci0JCW1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhuZXcgTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeSgpLCBJUmVzb3VyY2UuY2xhc3MpOwotCQkKLQkJUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLnN0YXJ0dXAoKTsKLQkJV1RQTW9kdWxlc0luaXQuaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVjb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBNb2R1bGVjb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJtb2R1bGVjb3JlIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCi0JLyoqCi0JICogUmVjb3JkIGFuIGVycm9yIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBhbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCWNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBtZXNzYWdlIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmVjb3JkIGEgc3RhdHVzIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhhU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBleGNlcHRpb24uZ2V0U3RhdHVzKCkgKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvamVjdENvbXBvbmVudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9qZWN0Q29tcG9uZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE4YTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9qZWN0Q29tcG9uZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gKiBQcm92aWRlcyBhIHJvb3Qgb2JqZWN0IHRvIHN0b3JlIGFuZCBtYW5hZ2UgdGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50fXMuICogCi0gKiA8cD4KLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzIDwvYT4uCi0gKiA8L3A+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldENvbXBvbmVudHMgPGVtPkNvbXBvbmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvamVjdENvbXBvbmVudHMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdENvbXBvbmVudHMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQKLQkgKiBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2plY3ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tcG9uZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFByb2plY3RDb21wb25lbnRzX1ZlcnNpb24oKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGZpbmRXb3JrYmVuY2hNb2R1bGUoU3RyaW5nIGFEZXBsb3lOYW1lKTsKLQotfSAvLyBQcm9qZWN0Q29tcG9uZW50cwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1Byb2plY3RNaWdyYXRvclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0ODQ1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgV1RQIDMuMS4yIGFuZCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLgotICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI5MzQKLSAqIEBkZXByZWNhdGVkIAotICogQGF1dGhvciBqc2hvbGwKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RNaWdyYXRvclJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTkFNRSA9ICJDb21wb25lbnRQcm9qZWN0TWlncmF0b3IiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX01JR1JBVE9SX0VYVEVOU0lPTiA9ICJtaWdyYXRvckV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1JR1JBVE9SX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBwcm9qZWN0TWlncmF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgc3RhdGljIFByb2plY3RNaWdyYXRvclJlZ2lzdHJ5IElOU1RBTkNFID0gbnVsbDsKLQotCXB1YmxpYyBQcm9qZWN0TWlncmF0b3JSZWdpc3RyeSgpIHsKLQkJc3VwZXIoTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb2plY3RNaWdyYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkoKTsKLQkJCUlOU1RBTkNFLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgdy8gYW4gZXh0ZW5zaW9uIGxpa2U6IDxlYXJNb2R1bGVFeHRlbnNpb24gZXh0ZW5zaW9uQ2xhc3MgPQotCSAqICJjb20uaWJtLmV0b29scy53ZWIucGx1Z2luLldlYk1vZHVsZUV4dGVuc2lvbkltcGwiLz4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNRU5UX01JR1JBVE9SX0VYVEVOU0lPTikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSUNvbXBvbmVudFByb2plY3RNaWdyYXRvciBtaWdyYXRvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltaWdyYXRvciA9IChJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTUlHUkFUT1JfQ0xBU1MpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaWYgKG1pZ3JhdG9yICE9IG51bGwpCi0JCQlhZGRNb2R1bGVFeHRlbnNpb24obWlncmF0b3IpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBvbmVudFByb2plY3RNaWdyYXRvcltdIGdldFByb2plY3RNaWdyYXRvcnMoKXsKLQkJcmV0dXJuIChJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yW10pcHJvamVjdE1pZ3JhdG9ycy50b0FycmF5KG5ldyBJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yW3Byb2plY3RNaWdyYXRvcnMuc2l6ZSgpXSk7Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRNb2R1bGVFeHRlbnNpb24oSUNvbXBvbmVudFByb2plY3RNaWdyYXRvciBleHQpIHsKLQkJcHJvamVjdE1pZ3JhdG9ycy5hZGQoZXh0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MGYxMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb3BlcnR5LmphdmEsdiAxLjIgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFByb3BlcnR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvcGVydHlfTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFByb3BlcnR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvcGVydHkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9SZWZlcmVuY2VkQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUmVmZXJlbmNlZENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWE1Y2YwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9SZWZlcmVuY2VkQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICogVXNlZCB0byByZWZlcmVuY2Uge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH1zIGVpdGhlciBjb250YWluZWQgaW4KLSAqIHRoZSBzYW1lIHByb2plY3Qgb3IgcmVtb3RlbHkuIAotICogPHA+Ci0gKiBFYWNoIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7IGNvbnRhaW5zIGEgbGlzdCBvZiBpdHMKLSAqIERlcGVuZGVudE1vZHVsZXMuCi0gKiA8L3A+IAotICogPHA+Ci0gKiBUaGUgcmVmZXJlbmNlZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7IG1heSBiZSBpbiB0aGUgc2FtZSBwcm9qZWN0IGFzIHRoZQotICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwOyB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IFJlZmVyZW5jZWRDb21wb25lbnQuIFVzZQotICoge0BzZWUgTW9kdWxlQ29yZSNpc0xvY2FsRGVwZW5kZW5jeShSZWZlcmVuY2VkQ29tcG9uZW50KX0mbmJzcDsgdG8gbWFrZSB0aGUgZGV0ZXJtaW5hdGlvbi4KLSAqIDwvcD4gCi0gKiA8cD4KLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzIDwvYT4uCi0gKiA8L3A+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRIYW5kbGUgPGVtPkhhbmRsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0RGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0RGVwZW5kZW50T2JqZWN0IDxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRBcmNoaXZlTmFtZSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2VkQ29tcG9uZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgZnVsbHktcXVhbGlmaWVkIFVSSSB0aGF0IGNvbmZvcm1zIHRvIHRoZSBzdGFuZGFyZCAibW9kdWxlOiIgVVJJIGZvcm1hdC4gVGhlIGhhbmRsZQotCSAqIHJlZmVyZW5jZXMgdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1yZXByZXNlbnRlZCBieSB0aGUgY3VycmVudCBSZWZlcmVuY2VkQ29tcG9uZW50LgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEhhbmRsZShVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlVSSSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVSSSBnZXRIYW5kbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldEhhbmRsZSA8ZW0+SGFuZGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFuZGxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYW5kbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhbmRsZShVUkkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SdW50aW1lIFBhdGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UnVudGltZSBQYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSdW50aW1lUGF0aChJUGF0aCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JUGF0aCIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUlQYXRoIGdldFJ1bnRpbWVQYXRoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRSdW50aW1lUGF0aCA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SdW50aW1lIFBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJ1bnRpbWVQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSdW50aW1lUGF0aChJUGF0aCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gVGhlIGxpdGVyYWxzIGFyZQotCSAqIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogU2VlIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIHtAc2VlIERlcGVuZGVuY3lUeXBlfWZvciBpbmZvcm1hdGlvbiBvbiB0aGUgcHVycG9zZSBvZiB0aGlzCi0JICogZmllbGQuCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUKLQkgKiBAc2VlICNzZXREZXBlbmRlbmN5VHlwZShEZXBlbmRlbmN5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVDb3JlUGFja2FnZSNnZXREZXBlbmRlbnRNb2R1bGVfRGVwZW5kZW5jeVR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXBlbmRlbmN5VHlwZSBnZXREZXBlbmRlbmN5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0RGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUKLQkgKiBAc2VlICNnZXREZXBlbmRlbmN5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVwZW5kZW5jeVR5cGUoRGVwZW5kZW5jeVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVwZW5kZW50IE9iamVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVwZW5kZW50IE9iamVjdDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZXBlbmRlbnRPYmplY3QoRU9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVPYmplY3QgZ2V0RGVwZW5kZW50T2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbnRPYmplY3QgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERlcGVuZGVudE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVwZW5kZW50T2JqZWN0KEVPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJjaGl2ZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BcmNoaXZlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJjaGl2ZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBcmNoaXZlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9BcmNoaXZlTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBcmNoaXZlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0QXJjaGl2ZU5hbWUgPGVtPkFyY2hpdmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXJjaGl2ZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBcmNoaXZlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXJjaGl2ZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSZWZlcmVuY2VkQ29tcG9uZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvU3RydWN0dXJlRWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1N0cnVjdHVyZUVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxOTYxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvU3RydWN0dXJlRWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuSUVkaXRNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkVjbGlwc2VSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVycy5JUmVmZXJlbmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVycy5SZWZlcmVuY2VSZXNvbHZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQ7Ci0KLS8qKgotICogPHA+Ci0gKiBQcm92aWRlcyBhIEZhY2FkZSBwYXR0ZXJuIGZvciBhY2Nlc3NpbmcgdGhlIFdlYiBUb29scyBQbGF0Zm9ybSBFTUYgTW9kdWxlIE1vZGVsLiBNb2R1bGVDb3JlIGNhbgotICogYmUgdXNlZCBhcyBhIHN0YXRpYyB1dGlsaXR5IG9yIGFuIGluc3RhbmNlIGFkYXB0ZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1vZHVsZUNvcmUgaGlkZXMgdGhlIG1hbmFnZW1lbnQgb2YgYWNjZXNzaW5nIEVkaXRNb2RlbHMgKAotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0pIGNvcnJlY3RseS4gRWFjaCBwcm9qZWN0IGhhcwotICogZXhhY3RseSBvbmUgKHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9KSBmb3IgcmVhZCBhbmQKLSAqIGV4YWN0bHkgb25lIGZvciB3cml0ZS4gRWFjaCBvZiB0aGVzZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGNsaWVudHMgYW5kIHJlZmVyZW5jZSBjb3VudGVkIGFzCi0gKiBuZWNlc3NhcnkuIENsaWVudHMgc2hvdWxkIHVzZSBNb2R1bGVDb3JlIHdoZW4gd29ya2luZyB3aXRoIHRoZSBXVFAgTW9kdWxlcyBTdHJ1Y3R1cmFsIE1vZGVsLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIEVhY2ggTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSBpcyBkZXNpZ25lZCB0byBtYW5hZ2UgdGhlIEVkaXRNb2RlbCBsaWZlY3ljbGUgZm9yIGNsaWVudHMuIEhvd2V2ZXIsCi0gKiB3aGlsZSBlYWNoIE1vZHVsZUNvcmUgaXMgZGVzaWduZWQgdG8gYmUgcGFzc2VkIGFyb3VuZCBhcyBuZWVkZWQsIGNsaWVudHMgbXVzdCBlbmZvcmNlIHRoZQotICogTW9kdWxlQ29yZSBsaWZlY3ljbGUuIFRoZSBtb3N0IGNvbW1vbiBtZXRob2Qgb2YgYWNxdWlyaW5nIGEgTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSBpcyB0byB1c2UKLSAqIHtAc2VlICNnZXRNb2R1bGVDb3JlRm9yUmVhZChJUHJvamVjdCl9Jm5ic3A7b3Ige0BzZWUgI2dldE1vZHVsZUNvcmVGb3JXcml0ZShJUHJvamVjdCl9LgotICogPC9wPgotICogPHA+Ci0gKiBXaGVuIGNsaWVudHMgaGF2ZSBjb25jbHVkZWQgdGhlaXIgdXNlIG9mIHRoZWlyIE1vZHVsZUNvcmUgaW5zdGFuY2UgYWRhcHRlciAsIDxiPmNsaWVudHMgbXVzdCBjYWxsCi0gKiB7QHNlZSAjZGlzcG9zZSgpfTwvYj4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1bmRlcmx5aW5nIEVkaXRNb2RlbCwgc2VlIDxhCi0gKiBocmVmPSJNb2R1bGVDb3JlTmF0dXJlLmh0bWwjbW9kdWxlLXN0cnVjdHVyYWwtbW9kZWwiPnRoZSBkaXNjdXNzaW9uIG9mIHRoZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwKLSAqIDwvYT4uCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmUKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRWRpdCBpbXBsZW1lbnRzIElFZGl0TW9kZWxIYW5kbGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gU3RydWN0dXJlRWRpdC5jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PRFVMRV9NRVRBX0ZJTEVfTkFNRSA9ICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDb21wb25lbnRjb3JlRmFjdG9yeSBDT01QT05FTlRfRkFDVE9SWSA9IENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRSZXNvdXJjZVtdIE5PX1JFU09VUkNFUyA9IG5ldyBDb21wb25lbnRSZXNvdXJjZVswXTsKLQkKLQlwcml2YXRlIGZpbmFsIE1vZHVsZVN0cnVjdHVyYWxNb2RlbCBzdHJ1Y3R1cmFsTW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgZGVwZW5kZW50Q29yZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSVByb2plY3QgYVByb2plY3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU3RydWN0dXJhbE1vZGVsU2VsZk1hbmFnZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JrYmVuY2hDb21wb25lbnRbXSBOT19DT01QT05FTlRTID0gbmV3IFdvcmtiZW5jaENvbXBvbmVudFswXTsKLQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIEVhY2ggTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSBpcyB0aWVkIHRvIGEgc3BlY2lmaWMgcHJvamVjdC4gQSBwcm9qZWN0Ci0JICogbWF5IGhhdmUgbXVsdGlwbGUgTW9kdWxlQ29yZSBlZGl0IGZhY2FkZXMgbGl2ZSBhdCBhbnkgZ2l2ZW4gdGltZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYSBNb2R1bGVDb3JlIGZhY2FkZSBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0IHRoYXQgd2lsbCBub3QKLQkgKiBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UKLQkgKiByZXR1cm5lZCBmcm9tIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgSVByb2plY3QgdGhhdCBjb250YWlucyB0aGUgV1RQIE1vZHVsZXMgbW9kZWwgdG8gbG9hZAotCSAqIEByZXR1cm4gQSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHRvIGFjY2VzcyB0aGUgV1RQIE1vZHVsZXMgTW9kZWwsIG51bGwKLQkgKiAgICAgICAgIGZvciBub24tZmxleGlibGUgcHJvamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZUVkaXQgZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUoYVByb2plY3QpOwotCQlyZXR1cm4gbmF0dXJlICE9IG51bGwgPyBuZXcgU3RydWN0dXJlRWRpdChuYXR1cmUsIHRydWUpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiA8cD4KLQkgKiBFYWNoIE1vZHVsZUNvcmUgZWRpdCBmYWNhZGUgaXMgdGllZCB0byBhIHNwZWNpZmljIHByb2plY3QuIEEgcHJvamVjdCBtYXkgaGF2ZSBtdWx0aXBsZQotCSAqIE1vZHVsZUNvcmUgZWRpdCBmYWNhZGVzIGxpdmUgYXQgYW55IGdpdmVuIHRpbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGEgTW9kdWxlQ29yZSBmYWNhZGUgZm9yIGEgc3BlY2lmaWMgcHJvamVjdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSB0aGUKLQkgKiBtb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgSVByb2plY3QgdGhhdCBjb250YWlucyB0aGUgV1RQIE1vZHVsZXMgbW9kZWwgdG8gbG9hZAotCSAqIEByZXR1cm4gQSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHRvIGFjY2VzcyB0aGUgV1RQIE1vZHVsZXMgTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZUVkaXQgZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKGFQcm9qZWN0KTsKLQkJcmV0dXJuIG5hdHVyZSAhPSBudWxsID8gbmV3IFN0cnVjdHVyZUVkaXQobmF0dXJlLCBmYWxzZSkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgQVBJIHRvIGZldGNoIHRoZSB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfSZuYnNwO2ZvciBhIHBhcnRpY3VsYXIgbW9kdWxlIFVSSS4gVGhlCi0JICogbW9kdWxlIFVSSSBtdXN0IGJlIG9mIHRoZSB2YWxpZCBmb3JtLCBvciBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIFRoZSBtb2R1bGUgVVJJIG11c3QgYmUKLQkgKiBjb250YWluZWQgYnkgYSBwcm9qZWN0IHRoYXQgaGFzIGEge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0mbmJzcDtvciBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBNb2R1bGVDb3JlTmF0dXJlIG9mIHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCBhTW9kdWxlVVJJCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlQ29yZU5hdHVyZSBnZXRNb2R1bGVDb3JlTmF0dXJlKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpCi0JCQlyZXR1cm4gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKGNvbnRhaW5lcik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEZvciB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIGEgcHJvamVjdCwgdGhlIGNvbnRhaW5pbmcgcHJvamVjdAotCSAqIGNhbiBiZSBkZXRlcm1pbmVkIHdpdGggdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0ncyBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgZm9yIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJLAotCSAqIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIHdpbGwgbm90IHJldHVybiBhbiBpbmFjY2Vzc2libGUgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIHZhbGlkLCBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSQotCSAqIEByZXR1cm4gVGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlIHJlZmVyZW5jZWQgYnkgdGhlIG1vZHVsZSBVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRDb250YWluaW5nUHJvamVjdChXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCkgewkKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhQ29tcG9uZW50KTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBGb3Ige0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMgdGhhdCBhcmUgY29udGFpbmVkIHdpdGhpbiBhIHByb2plY3QsIHRoZSBjb250YWluaW5nIHByb2plY3QKLQkgKiBjYW4gYmUgZGV0ZXJtaW5lZCB3aXRoIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9J3MgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgZm9yIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJLAotCSAqIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIG1heSByZXR1cm4gYW4gaW5hY2Nlc3NpYmxlIHByb2plY3QuCQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHBhcmFtIG9ubHlBY2Nlc3NpYmxlUHJvamVjdHMKLQkgKiAgICAgICAgICAgIFRydWUgaWYgdGhlIG1ldGhvZCBzaG91bGQgcmV0dXJuIG9ubHkgYWNjZXNzaWJsZSBwcm9qZWN0cy4gCi0JICogQHJldHVybiBUaGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUgcmVmZXJlbmNlZCBieSB0aGUgbW9kdWxlIFVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldENvbnRhaW5pbmdQcm9qZWN0KFVSSSBhTW9kdWxlVVJJLCBib29sZWFuIG9ubHlBY2Nlc3NpYmxlUHJvamVjdHMpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJTW9kdWxlVVJJVXRpbC5lbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhTW9kdWxlVVJJLnNlZ21lbnQoTW9kdWxlVVJJVXRpbC5Nb2R1bGVVUkkuUFJPSkVDVF9OQU1FX0lORFgpOwotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJdGhyb3cgbmV3IFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24oYU1vZHVsZVVSSSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAoIW9ubHlBY2Nlc3NpYmxlUHJvamVjdHMpCi0JCQlyZXR1cm4gcHJvamVjdDsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gcHJvamVjdDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIEZvciB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIGEgcHJvamVjdCwgdGhlIGNvbnRhaW5pbmcgcHJvamVjdAotCSAqIGNhbiBiZSBkZXRlcm1pbmVkIHdpdGggdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0ncyBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgZm9yIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJLAotCSAqIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIHdpbGwgbm90IHJldHVybiBhbiBpbmFjY2Vzc2libGUgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIHZhbGlkLCBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSQotCSAqIEByZXR1cm4gVGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlIHJlZmVyZW5jZWQgYnkgdGhlIG1vZHVsZSBVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRDb250YWluaW5nUHJvamVjdChVUkkgYU1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29udGFpbmluZ1Byb2plY3QoYU1vZHVsZVVSSSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBFY2xpcHNlIElSZXNvdXJjZSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX0uIFRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZSNnZXRTb3VyY2VQYXRoKCl9ICZuYnNwO211c3QgcmV0dXJuIGEKLQkgKiB2YWxpZCByZXNvdXJjZSBwYXRoIGZvciBUaGlzIG1ldGhvZCB0byByZXR1cm4gYSB2YWxpZCB2YWx1ZS4gVGhlIHJldHVybmVkIHZhbHVlIG1heSBiZSBlaXRoZXIKLQkgKiBhbiB7QHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZX0mbmJzcDtvciB7QHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyfS4KLQkgKiBBIGNsaWVudCBtYXkgdXNlIHRoZSByZXR1cm4gdmFsdWUgb2Yge0BzZWUgSVJlc291cmNlI2dldFR5cGUoKX0mbmJzcDt0byBkZXRlcm1pbmUgd2hhdCB0eXBlCi0JICogb2YgcmVzb3VyY2Ugd2FzIHJldHVybmVkLiAoQHNlZSBJUmVzb3VyY2UjRklMRX0gb3Ige0BzZWUgSVJlc291cmNlI0ZPTERFUn0pLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVSZXNvdXJjZQotCSAqICAgICAgICAgICAgQSBDb21wb25lbnRSZXNvdXJjZSB3aXRoIGEgdmFsaWQgc291cmNlUGF0aAotCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgRWNsaXBzZSBJUmVzb3VyY2UsIGlmIGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRFY2xpcHNlUmVzb3VyY2UoQ29tcG9uZW50UmVzb3VyY2UgYU1vZHVsZVJlc291cmNlKSB7Ci0JCUVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIgZWNsaXBzZVJlc291cmNlQWRhcHRlciA9IChFY2xpcHNlUmVzb3VyY2VBZGFwdGVyKSBFeHRlbmRlZEVjb3JlVXRpbC5nZXRBZGFwdGVyKGFNb2R1bGVSZXNvdXJjZSxhTW9kdWxlUmVzb3VyY2UuZUFkYXB0ZXJzKCksIEVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuQURBUFRFUl9UWVBFKTsKLQkJaWYgKGVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBlY2xpcHNlUmVzb3VyY2VBZGFwdGVyLmdldEVjbGlwc2VSZXNvdXJjZSgpOwotCQllY2xpcHNlUmVzb3VyY2VBZGFwdGVyID0gbmV3IEVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJZWNsaXBzZVJlc291cmNlQWRhcHRlci5zZXRUYXJnZXQoYU1vZHVsZVJlc291cmNlKTsKLQkJYU1vZHVsZVJlc291cmNlLmVBZGFwdGVycygpLmFkZChlY2xpcHNlUmVzb3VyY2VBZGFwdGVyKTsKLQkJcmV0dXJuIGVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuZ2V0RWNsaXBzZVJlc291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUGFyc2VzIHRoZSBzdXBwbGllZCBVUkkgZm9yIHRoZSBkZXBsb3llZCBuYW1lIG5hbWUgb2YgdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtyZWZlcmVuY2VkCi0JICogYnkgdGhlIFVSSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFGdWxseVF1YWxpZmllZE1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBkZXBsb3llZCBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0KLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlcGxveWVkTmFtZShVUkkgYUZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBNb2R1bGVVUklVdGlsLmdldERlcGxveWVkTmFtZShhRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkpOwotCX0KLQotCS8vcHVibGljIHN0YXRpYyBDb21wb25lbnRUeXBlIGdldENvbXBvbmVudFR5cGUoSVZpcnR1YWxDb250YWluZXIgYUNvbXBvbmVudCkgewotCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50VHlwZSBnZXRDb21wb25lbnRUeXBlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJU3RydWN0dXJlRWRpdCBjb21wb25lbnRDb3JlID0gbnVsbDsKLQkJQ29tcG9uZW50VHlwZSBjb21wb25lbnRUeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbXBvbmVudENvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IGNvbXBvbmVudENvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQljb21wb25lbnRUeXBlID0gd2JDb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNvbXBvbmVudENvcmUgIT0gbnVsbCkKLQkJCQljb21wb25lbnRDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlIGNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgY29udGV4dCwgUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2UpIHsKLQkJSVJlZmVyZW5jZVJlc29sdmVyIHJlc29sdmVyID0gUmVmZXJlbmNlUmVzb2x2ZXJVdGlsLmdldERlZmF1bHQoKS5nZXRSZXNvbHZlcihjb250ZXh0LCByZWZlcmVuY2UpOwotCQlyZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZShjb250ZXh0LCByZWZlcmVuY2UpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJLy8gYWx3YXlzIGdldCB0aGUgd3JpdGUgZWRpdG1vZGVsIC0gb25lIGluc3RhbmNlIG9ubHkKLQkJc3RydWN0dXJhbE1vZGVsID0gYU5hdHVyZS5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JXcml0ZSh0aGlzKTsKLQkJYVByb2plY3QgPSBhTmF0dXJlLmdldFByb2plY3QoKTsKLQkJaXNSZWFkT25seSA9IHRvQWNjZXNzQXNSZWFkT25seTsKLQkJaXNTdHJ1Y3R1cmFsTW9kZWxTZWxmTWFuYWdlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIG1hbmFnZSBhbiBhbHJlYWR5IGxvYWRlZCBtb2RlbC4gQ2xpZW50cyBzaG91bGQgdXNlIHRoZQotCSAqIGZvbGxvd2luZyBsaW5lIGlmIHRoZXkgaW50ZW5kIHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yOiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPk1vZHVsZUNvcmUgY29tcG9uZW50Q29yZSA9IChNb2R1bGVDb3JlKSBhU3RydWN0dXJhbE1vZGVsLmdldEFkYXB0ZXIoTW9kdWxlQ29yZS5BREFQVEVSX1RZUEUpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFTdHJ1Y3R1cmFsTW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBlZGl0IG1vZGVsIHRvIGJlIG1hbmFnZWQgYnkgdGhpcyBNb2R1bGVDb3JlCi0JICovCi0JcHVibGljIFN0cnVjdHVyZUVkaXQoTW9kdWxlU3RydWN0dXJhbE1vZGVsIGFTdHJ1Y3R1cmFsTW9kZWwpIHsKLQkJc3RydWN0dXJhbE1vZGVsID0gYVN0cnVjdHVyYWxNb2RlbDsKLQkJYVByb2plY3QgPSBhU3RydWN0dXJhbE1vZGVsLmdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBGb3JjZSBhIHNhdmUgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwuIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gVW5sZXNzCi0JICogcmVxdWlyZWQsIHVzZSB7QHNlZSAjc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IpIGluc3RlYWQuCi0JICogPC9wPgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlciNzYXZlKCkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBNb2R1bGVDb3JlIG9iamVjdCB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJaWYgKGlzUmVhZE9ubHkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHZhbGlkYXRlRWRpdCgpLmlzT0soKSkgeyAKLQkJCS8vIE1ha2Ugc3VyZSB3ZSBvYnRhaW4gd29ya3NwYWNlIHJ1bGUgYmVmb3JlIHNhdmluZwotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQl0cnkgewotCQkJLy9PSyB3YWl0IHRvIGdldCB3b3Jrc3BhY2Ugcm9vdCBiZWZvcmUgcmVmcmVzaGluZwotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5iZWdpblJ1bGUocm9vdCwgbnVsbCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHN0cnVjdHVyYWxNb2RlbCkgewotCQkJCWlmICghc3RydWN0dXJhbE1vZGVsLmlzRGlzcG9zZWQoKSkKLQkJCQkJc3RydWN0dXJhbE1vZGVsLnNhdmUoYU1vbml0b3IsIHRoaXMpOwotCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmVuZFJ1bGUocm9vdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTYXZlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIG9ubHkgaWYgbm8gb3RoZXIgY2xpZW50cyBhcmUgY3VycmVudGx5IHVzaW5nIHRoZSBtb2RlbC4gSWYgdGhlCi0JICogbW9kZWwgaXMgbm90IHNoYXJlZCwgaXQgd2lsbCBiZSBzYXZlZC4gSWYgaXQgaXMgc2hhcmVkLCB0aGUgc2F2ZSB3aWxsIGJlIGRlZmVycmVkLgotCSAqIDwvcD4KLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuSUVkaXRNb2RlbEhhbmRsZXIjc2F2ZUlmTmVjZXNzYXJ5KCkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBNb2R1bGVDb3JlIG9iamVjdCB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQlpZiAoaXNSZWFkT25seSkKLQkJCXRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKTsKLQkJZWxzZSBpZiAoc3RydWN0dXJhbE1vZGVsLmlzRGlydHkoKSAmJiB2YWxpZGF0ZUVkaXQoKS5pc09LKCkpIHsgCi0JCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKQotCQkJCQlzdHJ1Y3R1cmFsTW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KGFNb25pdG9yLCB0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENsaWVudHMgbXVzdCBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kIHdoZW4gdGhleSBoYXZlIGZpbmlzaGVkIHVzaW5nIHRoZSBtb2RlbCwgZXZlbiBpZiB0aGUKLQkgKiBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seS4KLQkgKiA8L3A+Ci0JICoge0Bpbmhlcml0RG9jfQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CQotCQlpZiAoaXNTdHJ1Y3R1cmFsTW9kZWxTZWxmTWFuYWdlZCAmJiBzdHJ1Y3R1cmFsTW9kZWwhPW51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoc3RydWN0dXJhbE1vZGVsKSB7Ci0JCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKQotCQkJCQlzdHJ1Y3R1cmFsTW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLQkJCX0JCi0JCX0KLQkJaWYgKGRlcGVuZGVudENvcmVzIT1udWxsICYmIGRlcGVuZGVudENvcmVzLnNpemUoKSA+IDApIHsKLQkJCXN5bmNocm9uaXplZCAoZGVwZW5kZW50Q29yZXMpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGNvcmVzID0gZGVwZW5kZW50Q29yZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgY29yZXMuaGFzTmV4dCgpOykgewotCQkJCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSAoU3RydWN0dXJlRWRpdCkgY29yZXMubmV4dCgpOwotCQkJCQlpZiAoY29yZSAhPSBudWxsKQotCQkJCQkJY29yZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlZmF1bHQgV1RQIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbCBmaWxlIGlmIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcHJlcGFyZVByb2plY3RDb21wb25lbnRzSWZOZWNlc3NhcnkoKSB7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHN0cnVjdHVyYWxNb2RlbCkgewotCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RydWN0dXJhbE1vZGVsLnByZXBhcmVQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogV2hlbiBsb2FkZWQgZm9yIHdyaXRlLCB0aGUgY3VycmVudCBNb2R1bGVDb3JlIG1heSByZXR1cm4gdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZAotCSAqIHRvIGFkZCBvciByZW1vdmUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMuIElmIGEgY2xpZW50IG5lZWRzIHRvIGp1c3QgcmVhZCB0aGUgZXhpc3RpbmcKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cywgdXNlIHtAc2VlICNnZXRXb3JrYmVuY2hNb2R1bGVzKCl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBEZWFkbG9jayBXYXJuaW5nOiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJlcXVpcmVzIHR3byBsb2Nrcy4gIEZpcnN0IHRoZSBjb21wb25lbnQgZmlsZSdzIGZpbGUgbG9jawotCSAqIGlzIHJlcXVpcmVkIGFuZCB0aGVuIHRoZSBFTUZXb3JrYmVuY2hFZGl0Q29udGV4dEZhY3RvcnkncyBwcm9qZWN0SUxvY2sgaXMgcmVxdWlyZWQuICBJZiBhbm90aGVyCi0JICogdGhyZWFkIGFjcXVpcmVzIHRoZXNlIHNhbWUgdHdvIGxvY2tzIGluIHRoZSBvcHBvc2l0ZSBvcmRlciwgZGVhZGxvY2sgY291bGQgb2NjdXIuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0JICovCi0JcHVibGljIFByb2plY3RDb21wb25lbnRzIGdldENvbXBvbmVudE1vZGVsUm9vdCgpIHsKLQkJSUZpbGUgZmlsZSA9IHN0cnVjdHVyYWxNb2RlbC5nZXRDb21wb25lbnRGaWxlKCk7Ci0JCWlmIChmaWxlID09IG51bGwpIHJldHVybiBudWxsOwotCQlQcm9qZWN0Q29tcG9uZW50cyBjb21wcyA9IG51bGw7Ci0JCUlMb2NrIGxvY2sgPSBFTUZXb3JrYmVuY2hFZGl0Q29udGV4dEZhY3RvcnkuZ2V0UHJvamVjdExvY2tPYmplY3Qoc3RydWN0dXJhbE1vZGVsLmdldFByb2plY3QoKSk7Ci0JCXRyeXsKLQkJCWlmKG51bGwgIT0gbG9jayl7Ci0JCQkJbG9jay5hY3F1aXJlKCk7Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQoc3RydWN0dXJhbE1vZGVsKXsKLQkJCQlpZiAoIXN0cnVjdHVyYWxNb2RlbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJCWNvbXBzID0gKFByb2plY3RDb21wb25lbnRzKSBzdHJ1Y3R1cmFsTW9kZWwuZ2V0UHJpbWFyeVJvb3RPYmplY3QoKTsKLQkJCX0KLQkJfSBmaW5hbGx5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcHM7CQkKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm4gdGhlIGFuIGFycmF5IG9mIENvbXBvbmVudFJlc291cmNlIHdoaWNoIGJhc2ljYWxseSByZXByZXNlbnQgdGhlIHNvdXJjZSBjb250YWluZXJzIG9mIGEKLQkgKiBXb3JrYmVuY2hSZXNvdXJjZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGdldFNvdXJjZUNvbnRhaW5lcnMoV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQkvLyBUT0RPIEFwaSBpbiBwcm9ncmVzczogTmVlZCB0byByZXR1cm4gdGhlIEphdmEgU291cmNlIGNvbnRhaW5lcnMgb2YgdGhlIHByb2plY3QKLQkJLy8gVE9ETyBNREU6IEkgZG9uJ3Qga25vdyBpZiBJIGFncmVlIHdpdGggdGhlIHBsYWNlbWVudCBvZiB0aGlzIG1ldGhvZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyB0aGF0IHdpc2ggdG8gbW9kaWZ5IHRoZSBpbmRpdmlkdWFsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtpbnN0YW5jZXMgbWF5IHVzZQotCSAqIHRoaXMgbWV0aG9kLiBJZiBjbGllbnRzIG5lZWQgdG8gYWRkIG9yIHJlbW92ZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7aW5zdGFuY2VzLCB1c2UKLQkgKiB7QHNlZSAjZ2V0UHJvamVjdE1vZHVsZXMoKX0mbmJzcDt0byBnZXQgdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGVuIGFjY2VzcyB0aGUgY29udGFpbmVkCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMgdGhyb3VnaCB7QHNlZSBQcm9qZWN0Q29tcG9uZW50cyNnZXRXb3JrYmVuY2hNb2R1bGVzKCl9LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFdvcmtiZW5jaE1vZHVsZXMgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwsIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50W10gZ2V0V29ya2JlbmNoTW9kdWxlcygpIHsKLQkJUHJvamVjdENvbXBvbmVudHMgcGMgPSBnZXRDb21wb25lbnRNb2RlbFJvb3QoKTsKLQkJaWYocGMgIT0gbnVsbCkgewotCQkJTGlzdCB3Yk1vZHVsZXMgPSBwYy5nZXRDb21wb25lbnRzKCk7Ci0JCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudFtdKSB3Yk1vZHVsZXMudG9BcnJheShuZXcgV29ya2JlbmNoQ29tcG9uZW50W3diTW9kdWxlcy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gTk9fQ09NUE9ORU5UUzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCB0aGUgZ2l2ZW4gZGVwbG95ZWQgbmFtZS4gVGhlIHJldHVybmVkIG1vZHVsZQotCSAqIHdpbGwgYmUgY29udGFpbmVkIGJ5IHRoZSByb290IG9iamVjdCBvZiB0aGUgY3VycmVudCBNb2R1bGVDb3JlIChzbyBubyBuZWVkIHRvIHJlLWFkZCBpdCB0bwotCSAqIHRoZSBNb2R1bGUgTW9kdWxlIHJvb3Qgb2JqZWN0KS4gVGhlIGN1cnJlbnQgTW9kdWxlQ29yZSBtdXN0IG5vdCBiZSByZWFkLW9ubHkgdG8gaW52b2tlIFRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhRGVwbG95TmFtZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBTdHJpbmcgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIGFzIHRoZSBkZXBsb3llZC1uYW1lCi0JICogQHJldHVybiBBIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1hc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3aXRoIHRoZSBzdXBwbGllZAotCSAqICAgICAgICAgZGVwbG95ZWQgbmFtZQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGNyZWF0ZVdvcmtiZW5jaE1vZHVsZShTdHJpbmcgYURlcGxveU5hbWUpIHsKLQkJaWYgKGlzUmVhZE9ubHkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBDT01QT05FTlRfRkFDVE9SWS5jcmVhdGVXb3JrYmVuY2hDb21wb25lbnQoKTsKLQkJbW9kdWxlLnNldE5hbWUoYURlcGxveU5hbWUpOwotCQlnZXRDb21wb25lbnRNb2RlbFJvb3QoKS5nZXRDb21wb25lbnRzKCkuYWRkKG1vZHVsZSk7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGEge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7d2l0aCB0aGUgc291cmNlUGF0aCBvZiBhUmVzb3VyY2UuIFRoZSBjdXJyZW50Ci0JICogTW9kdWxlQ29yZSBtdXN0IG5vdCBiZSByZWFkLW9ubHkgdG8gaW52b2tlIFRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9dG8gY29udGFpbiB0aGUgY3JlYXRlZAotCSAqICAgICAgICAgICAge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Ci0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBJUmVzb3VyY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBzb3VyY2VQYXRoCi0JICogQHJldHVybiBBIHtAc2VlIENvbXBvbmVudFJlc291cmNlfWFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdpdGggaXRzIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGVxdWl2YWxlbnQgdG8gYVJlc291cmNlCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZShJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChpc1JlYWRPbmx5KQotCQkJdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpOwotCi0JCUNvbXBvbmVudFJlc291cmNlIG1vZHVsZVJlc291cmNlID0gQ09NUE9ORU5UX0ZBQ1RPUlkuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsgCi0JCW1vZHVsZVJlc291cmNlLnNldFNvdXJjZVBhdGgoYVJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCXJldHVybiBtb2R1bGVSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGUgYSB7QHNlZSBDb21wb25lbnRUeXBlfSZuYnNwO3dpdGggdGhlIHNvdXJjZVBhdGggb2YgYVJlc291cmNlLiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UKLQkgKiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBNb2R1bGVDb3JlLiBUaGUgY3VycmVudCBNb2R1bGVDb3JlIG11c3Qgbm90IGJlIHJlYWQtb25seQotCSAqIHRvIGludm9rZSBUaGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBJUmVzb3VyY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBzb3VyY2VQYXRoCi0JICogQHJldHVybiBBIHtAc2VlIENvbXBvbmVudFJlc291cmNlfWFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdpdGggaXRzIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGVxdWl2YWxlbnQgdG8gYVJlc291cmNlCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdhcyBjcmVhdGVkIGFzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyBDb21wb25lbnRUeXBlIGNyZWF0ZU1vZHVsZVR5cGUoU3RyaW5nIGFNb2R1bGVUeXBlSWQpIHsKLQkJaWYgKGlzUmVhZE9ubHkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0KLQkJQ29tcG9uZW50VHlwZSBtb2R1bGVUeXBlID0gQ09NUE9ORU5UX0ZBQ1RPUlkuY3JlYXRlQ29tcG9uZW50VHlwZSgpOwotCQltb2R1bGVUeXBlLnNldENvbXBvbmVudFR5cGVJZChhTW9kdWxlVHlwZUlkKTsKLQkJcmV0dXJuIG1vZHVsZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoIHRoZSBnaXZlbiBtb2R1bGUgKGluZGljYXRlZCBieSBhTW9kdWxlVVJJKSBmb3IgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBtb2R1bGUtcmVsYXRpdmUgcGF0aCAoaW5kaWNhdGVkIGJ5IGFEZXBsb3llZFJlc291cmNlUGF0aCkuCi0JICogPC9wPgotCSAqIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgYXQgbmV4dCBJbnRlZ3JhdGlvbiBCdWlsZCAwNC8xNC8wNSBNREUuIE5vIHN1YnN0aXR1dGUuIChObyBjbGllbnRzKS4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcGFyYW0gYURlcGxveWVkUmVzb3VyY2VQYXRoCi0JICogICAgICAgICAgICBBIG1vZHVsZS1yZWxhdGl2ZSBwYXRoIHRvIGEgZGVwbG95ZWQgZmlsZQotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHRoYXQgY29udGFpbiB0aGUgVVJJIHNwZWNpZmllZCBieSB0aGUKLQkgKiAgICAgICAgIG1vZHVsZS1yZWxhdGl2ZSBhRGVwbG95ZWRSZXNvdXJjZVBhdGgKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoVVJJIGFNb2R1bGVVUkksIFVSSSBhRGVwbG95ZWRSZXNvdXJjZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IGdldENvbXBvbmVudCgpOwotCQlyZXR1cm4gbW9kdWxlLmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKGFEZXBsb3llZFJlc291cmNlUGF0aC5wYXRoKCkpKTsKLQl9IAotCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoIHRoZSB0aGUgbW9kdWxlIChpbmRpY2F0ZWQgYnkgdGhlIHJvb3Qgb2YgYU1vZHVsZVJlc291cmNlUGF0aCkgZm9yIHRoZQotCSAqIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMgaWRlbnRpZmllZCBieSB0aGUgbW9kdWxlLXF1YWxpZmllZCBwYXRoIChpbmRpY2F0ZWQgYnkKLQkgKiBhRGVwbG95ZWRSZXNvdXJjZVBhdGgpLgotCSAqIDwvcD4KLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGF0IG5leHQgSW50ZWdyYXRpb24gQnVpbGQgMDQvMTQvMDUgTURFIFVzZSBJUGF0aCBTaWduYXR1cmUgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgVVJJIG9mIGEgZGVwbG95ZWQgcmVzb3VyY2Ugd2l0aGluIGEgc3BlY2lmaWMKLQkgKiAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHRoYXQgY29udGFpbiB0aGUgVVJJIHNwZWNpZmllZCBieQotCSAqICAgICAgICAgYU1vZHVsZVJlc291cmNlUGF0aAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChVUkkgYU1vZHVsZVJlc291cmNlUGF0aCkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCi0JCVVSSSBkZXBsb3llZFVSSSA9IE1vZHVsZVVSSVV0aWwudHJpbVRvRGVwbG95UGF0aFNlZ21lbnQoYU1vZHVsZVJlc291cmNlUGF0aCk7Ci0JCUlQYXRoIGRlcGxveWVkUGF0aCA9IG5ldyBQYXRoKGRlcGxveWVkVVJJLnBhdGgoKSk7Ci0JCXJldHVybiBmaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChNb2R1bGVVUklVdGlsLmdldERlcGxveWVkTmFtZShhTW9kdWxlUmVzb3VyY2VQYXRoKSwgZGVwbG95ZWRQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoIHRoZSB0aGUgbW9kdWxlIChpbmRpY2F0ZWQgYnkgdGhlIHJvb3Qgb2YgYU1vZHVsZVJlc291cmNlUGF0aCkgZm9yIHRoZQotCSAqIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMgaWRlbnRpZmllZCBieSB0aGUgbW9kdWxlLXF1YWxpZmllZCBwYXRoIChpbmRpY2F0ZWQgYnkKLQkgKiBhRGVwbG95ZWRSZXNvdXJjZVBhdGgpLgotCSAqIDwvcD4gCi0JICogCi0JICogQHBhcmFtIGFNb2R1bGVSZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgZnVsbHktcXVhbGlmaWVkIFVSSSBvZiBhIGRlcGxveWVkIHJlc291cmNlIHdpdGhpbiBhIHNwZWNpZmljCi0JICogICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcyB0aGF0IGNvbnRhaW4gdGhlIFVSSSBzcGVjaWZpZWQgYnkKLQkgKiAgICAgICAgIGFNb2R1bGVSZXNvdXJjZVBhdGgKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoU3RyaW5nIGFNb2R1bGVOYW1lLCBJUGF0aCBhTW9kdWxlUmVzb3VyY2VQYXRoKSB7ICAgCi0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBnZXRDb21wb25lbnQoKTsKLQkJcmV0dXJuIG1vZHVsZS5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChhTW9kdWxlUmVzb3VyY2VQYXRoKTsKLQl9Ci0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChVUkkgYVdvcmtzcGFjZVJlbGF0aXZlUGF0aCkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlyZXR1cm4gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhV29ya3NwYWNlUmVsYXRpdmVQYXRoLFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCX0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb2NhdGVzIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zIHRoYXQgY29udGFpbiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgaW4gdGhlaXIgc291cmNlCi0JICogcGF0aC4gVGhlcmUgYXJlIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgY29udGFpbm1lbnQgb2YgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMKLQkgKiB3aGljaCBhcmUgcmV0dXJuZWQuIFRoZSBvbmx5IGd1YXJhbnRlZSBpcyB0aGF0IHRoZSByZXR1cm5lZCBlbGVtZW50cyBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUKLQkgKiBzYW1lIHByb2plY3QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBzb3VyY2VQYXRoIG9mIGVhY2gge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7d2lsbCBiZSBtYXBwZWQgdG8gZWl0aGVyIGFuIElGaWxlIG9yIGFuCi0JICogSUZvbGRlci4gQXMgYSByZXN1bHQsIGlmIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX0mbmJzcDtpcyBhIGNvbnRhaW5lciBtYXBwaW5nLCB0aGUgcGF0aAotCSAqIG9mIHRoZSBzdXBwbGllZCByZXNvdXJjZSBtYXkgbm90IGJlIGlkZW50aWNhbCB0aGUgc291cmNlUGF0aCBvZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9LgotCSAqIDwvcD4KLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGF0IG5leHQgSW50ZWdyYXRpb24gQnVpbGQgMDQvMTQvMDUgTURFIFVzZSBJUGF0aCBTaWduYXR1cmUgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gYVdvcmtzcGFjZVJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBmdWxseS1xdWFsaWZpZWQgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGggb2YgYSBnaXZlbiByZXNvdXJjZQotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHdoaWNoIGhhdmUgc291cmNlUGF0aHMgdGhhdCBjb250YWluIHRoZSBnaXZlbgotCSAqICAgICAgICAgcmVzb3VyY2UKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChVUkkgYVdvcmtzcGFjZVJlbGF0aXZlUGF0aCwgaW50IHJlc291cmNlRmxhZykgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlyZXR1cm4gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChuZXcgUGF0aChhV29ya3NwYWNlUmVsYXRpdmVQYXRoLnBhdGgoKSkscmVzb3VyY2VGbGFnKTsKLQl9CQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoSVBhdGggYVByb2plY3RSZWxhdGl2ZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVByb2plY3RSZWxhdGl2ZVBhdGgsUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIExvY2F0ZXMgdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zIHRoYXQgY29udGFpbnMgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIHNvdXJjZQotCSAqIHBhdGguIFRoZXJlIGFyZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIGNvbnRhaW5tZW50IG9mIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zCi0JICogd2hpY2ggYXJlIHJldHVybmVkLiBUaGUgb25seSBndWFyYW50ZWUgaXMgdGhhdCB0aGUgcmV0dXJuZWQgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogc2FtZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc291cmNlUGF0aCBvZiBlYWNoIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO3dpbGwgYmUgbWFwcGVkIHRvIGVpdGhlciBhbiBJRmlsZSBvciBhbgotCSAqIElGb2xkZXIuIEFzIGEgcmVzdWx0LCBpZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7aXMgYSBjb250YWluZXIgbWFwcGluZywgdGhlIHBhdGgKLQkgKiBvZiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgbWF5IG5vdCBiZSBpZGVudGljYWwgdGhlIHNvdXJjZVBhdGggb2YgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgYSBnaXZlbiByZXNvdXJjZQotCSAqICAgICAgICByZXNvdXJjZUZsYWcKLQkgKiAgICAgICAgCSAgQSBiaXQgZmxhZyB0aGF0IGRldGVybWluZXMgaWYgUmVzb3VyY2VzIHNob3VsZCBiZSBjcmVhdGVkIGR1cmluZyB0aGUgc2VhcmNoCi0JICogICAgICAgIAkJQ1JFQVRFX05PTkUgCi0JICogCQkJCUNSRUFURV9SRVNPVVJDRV9BTFdBWVMKLQkgKiAJCQkJQ1JFQVRFX1RSRUVOT0RFX0lGTkVDCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZXMgd2hpY2ggaGF2ZSBzb3VyY2VQYXRocyB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuCi0JICogICAgICAgICByZXNvdXJjZQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGZpbmRDb21wb25lbnQoSVBhdGggYVByb2plY3RSZWxhdGl2ZVJlc291cmNlUGF0aCwgaW50IHJlc291cmNlRmxhZykgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0TW9kdWxlcyA9IGdldENvbXBvbmVudE1vZGVsUm9vdCgpOwotCQlpZiAocHJvamVjdE1vZHVsZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUVMaXN0IG1vZHVsZXMgPSBwcm9qZWN0TW9kdWxlcy5nZXRDb21wb25lbnRzKCk7Ci0KLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IG51bGw7Ci0JCWJvb2xlYW4gcmVzb3VyY2VFeGlzdHMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQltb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBtb2R1bGVzLmdldChpKTsKLQkJCXJlc291cmNlRXhpc3RzID0gbW9kdWxlLmV4aXN0cyhhUHJvamVjdFJlbGF0aXZlUmVzb3VyY2VQYXRoLHJlc291cmNlRmxhZyk7Ci0JCQlpZiAoIXJlc291cmNlRXhpc3RzICYmIGFQcm9qZWN0UmVsYXRpdmVSZXNvdXJjZVBhdGguc2VnbWVudHMoKS5sZW5ndGggPiAxKSB7IAotCQkJCXJlc291cmNlRXhpc3RzID0gbW9kdWxlLmV4aXN0cyhhUHJvamVjdFJlbGF0aXZlUmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkscmVzb3VyY2VGbGFnKTsKLQkJCX0KLQkJaWYgKHJlc291cmNlRXhpc3RzKQotCQkJcmV0dXJuIG1vZHVsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogPHA+Ci0JICogTG9jYXRlcyB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9cyB0aGF0IGNvbnRhaW4gdGhlIHN1cHBsaWVkIHJlc291cmNlIGluIHRoZWlyIHNvdXJjZQotCSAqIHBhdGguIFRoZXJlIGFyZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIGNvbnRhaW5tZW50IG9mIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zCi0JICogd2hpY2ggYXJlIHJldHVybmVkLiBUaGUgb25seSBndWFyYW50ZWUgaXMgdGhhdCB0aGUgcmV0dXJuZWQgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogc2FtZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc291cmNlUGF0aCBvZiBlYWNoIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO3dpbGwgYmUgbWFwcGVkIHRvIGVpdGhlciBhbiBJRmlsZSBvciBhbgotCSAqIElGb2xkZXIuIEFzIGEgcmVzdWx0LCBpZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7aXMgYSBjb250YWluZXIgbWFwcGluZywgdGhlIHBhdGgKLQkgKiBvZiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgbWF5IG5vdCBiZSBpZGVudGljYWwgdGhlIHNvdXJjZVBhdGggb2YgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlUGF0aAotCSAqICAgICAgICAgICAgQSB2YWxpZCBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgYSBnaXZlbiByZXNvdXJjZQotCSAqICAgICAgICAgcmVzb3VyY2VGbGFnCi0JICogICAgICAgIAkgIEEgYml0IGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIFJlc291cmNlcyBzaG91bGQgYmUgY3JlYXRlZCBkdXJpbmcgdGhlIHNlYXJjaAotCSAqICAgICAgICAJCUNSRUFURV9OT05FIAotCSAqIAkJCQlDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTCi0JICogCQkJCUNSRUFURV9UUkVFTk9ERV9JRk5FQwotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHdoaWNoIGhhdmUgc291cmNlUGF0aHMgdGhhdCBjb250YWluIHRoZSBnaXZlbgotCSAqICAgICAgICAgcmVzb3VyY2UKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChJUGF0aCBhUHJvamVjdFJlbGF0aXZlUGF0aCwgaW50IHJlc291cmNlRmxhZykgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0TW9kdWxlcyA9IGdldENvbXBvbmVudE1vZGVsUm9vdCgpOwotCQlpZiAocHJvamVjdE1vZHVsZXM9PW51bGwpCi0JCQlyZXR1cm4gTk9fUkVTT1VSQ0VTOwotCQlFTGlzdCBtb2R1bGVzID0gcHJvamVjdE1vZHVsZXMuZ2V0Q29tcG9uZW50cygpOwotCi0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlyZXNvdXJjZXMgPSBtb2R1bGUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhUHJvamVjdFJlbGF0aXZlUGF0aCxyZXNvdXJjZUZsYWcpOwotCQkJaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggIT0gMCkKLQkJCQlmb3VuZFJlc291cmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKLQkJCWVsc2UgaWYgKGFQcm9qZWN0UmVsYXRpdmVQYXRoLnNlZ21lbnRzKCkubGVuZ3RoID4gMSkgeyAKLQkJCQlyZXNvdXJjZXMgPSBtb2R1bGUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhUHJvamVjdFJlbGF0aXZlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLHJlc291cmNlRmxhZyk7Ci0JCQkJaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggIT0gMCkKLQkJCQkJZm91bmRSZXNvdXJjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzb3VyY2VzKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kUmVzb3VyY2VzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gKENvbXBvbmVudFJlc291cmNlW10pIGZvdW5kUmVzb3VyY2VzLnRvQXJyYXkobmV3IENvbXBvbmVudFJlc291cmNlW2ZvdW5kUmVzb3VyY2VzLnNpemUoKV0pOwotCQlyZXR1cm4gTk9fUkVTT1VSQ0VTOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtjb250YWluZWQgYnkgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3aXRoIHRoZQotCSAqIGRlcGxveSBuYW1lIGFNb2R1bGVOYW1lLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVOYW1lCi0JICogQHJldHVybiBUaGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fWNvbnRhaW5lZCBieSB0aGUgY3VycmVudCBNb2R1bGVDb3JlIHdpdGggdGhlIGRlcGxveQotCSAqICAgICAgICAgbmFtZSBhTW9kdWxlTmFtZQotCSAqIEBzZWUgV29ya2JlbmNoQ29tcG9uZW50I2dldERlcGxveWVkTmFtZSgpCi0JICogQGRlcHJlY2F0ZWQgLSBVc2UgZ2V0Q29tcG9uZW50KCkgLSBPbmx5IG9uZSBjb21wb25lbnQgcGVyIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGZpbmRDb21wb25lbnRCeU5hbWUoU3RyaW5nIGFNb2R1bGVOYW1lKSB7Ci0JCXJldHVybiBnZXRDb21wb25lbnRNb2RlbFJvb3QoKSAhPSBudWxsID8gZ2V0Q29tcG9uZW50TW9kZWxSb290KCkuZmluZFdvcmtiZW5jaE1vZHVsZShhTW9kdWxlTmFtZSkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIExvY2F0ZSBhbmQgcmV0dXJuIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7cmVmZXJlbmNlZCBieSB0aGUgZnVsbHktcXVhbGlmaWVkCi0JICogYU1vZHVsZVVSSS4gVGhlIG1ldGhvZCB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gaWYgdGhlIHJlcXVlc3RlZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Ci0JICogJm5ic3A7aXMgY29udGFpbmVkIGJ5IGFub3RoZXIgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHJldHVybiBUaGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXJlZmVyZW5jZWQgYnkgYU1vZHVsZVVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKiBAc2VlIFdvcmtiZW5jaENvbXBvbmVudCNnZXRIYW5kbGUoKQotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZmluZENvbXBvbmVudEJ5VVJJKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWlmIChhTW9kdWxlVVJJID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYoYU1vZHVsZVVSSS5zY2hlbWUoKSA9PSBudWxsICYmIGFNb2R1bGVVUkkuc2VnbWVudENvdW50KCkgPT0gMSkKLQkJCXJldHVybiBnZXRDb21wb25lbnQoKTsKLQkJTW9kdWxlVVJJVXRpbC5lbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhTW9kdWxlVVJJLnNlZ21lbnQoTW9kdWxlVVJJVXRpbC5Nb2R1bGVVUkkuUFJPSkVDVF9OQU1FX0lORFgpOwotCQkvKiBBY2Nlc3NpbmcgYSBsb2NhbCBtb2R1bGUgKi8KLQkJaWYgKGdldFByb2plY3QoKSE9bnVsbCAmJiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpCi0JCQlyZXR1cm4gZ2V0Q29tcG9uZW50KCk7Ci0JCVN0cnVjdHVyZUVkaXQgZGVwZW5kZW50Q29yZSA9IGdldERlcGVuZGVudE1vZHVsZUNvcmUoYU1vZHVsZVVSSSk7Ci0JCWlmIChkZXBlbmRlbnRDb3JlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVwZW5kZW50Q29yZS5nZXRDb21wb25lbnQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogU2VhcmNoZXMgdGhlIGF2YWlsYWJsZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyBhcyBhdmFpbGFibGUgdGhyb3VnaAotCSAqIHtAc2VlICNnZXRXb3JrYmVuY2hNb2R1bGVzKCl9Jm5ic3A7Zm9yIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zIHRoYXQgaGF2ZSBhCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50I2dldE1vZHVsZVR5cGUoKX13aXRoIGEgYSBtb2R1bGUgdHlwZSBJZCBhcyBzcGVjaWZpZWQgYnkKLQkgKiBhTW9kdWxlVHlwZUlkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVR5cGVJZAotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBtb2R1bGUgdHlwZSBpZCAoe0BzZWUgQ29tcG9uZW50VHlwZSNnZXRNb2R1bGVUeXBlSWQoKX0pCi0JICogQHJldHVybiBBIG5vbi1udWxsIGFycmF5IG9mIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBtb2R1bGUgdHlwZQotCSAqICAgICAgICAgaWQKLQkgKi8KLS8vCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnRbXSBmaW5kQ29tcG9uZW50c0J5VHlwZShTdHJpbmcgYU1vZHVsZVR5cGVJZCkgewotLy8JCVdvcmtiZW5jaENvbXBvbmVudFtdIGF2YWlsYWJsZU1vZHVsZXMgPSBnZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0vLwkJQ29tcG9uZW50VHlwZSBtb2R1bGVUeXBlOwotLy8JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZU1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJbW9kdWxlVHlwZSA9IGF2YWlsYWJsZU1vZHVsZXNbaV0uZ2V0Q29tcG9uZW50VHlwZSgpOwotLy8JCQlpZiAobW9kdWxlVHlwZSAhPSBudWxsICYmIGFNb2R1bGVUeXBlSWQuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0Q29tcG9uZW50VHlwZUlkKCkpKQotLy8JCQkJcmVzdWx0cy5hZGQoYXZhaWxhYmxlTW9kdWxlc1tpXSk7Ci0vLwkJfQotLy8JCWlmIChyZXN1bHRzLnNpemUoKSA9PSAwKQotLy8JCQlyZXR1cm4gTk9fTU9EVUxFUzsKLS8vCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IFdvcmtiZW5jaENvbXBvbmVudFtyZXN1bHRzLnNpemUoKV0pOwotLy8JfQotCQotCS8qKgotCSAqIEZpbmQgYW5kIHJldHVybiB0aGUgUmVmZXJlbmNlZENvbXBvbmVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGRlcGVkZW5jeSBmcm9tIGFDb21wb25lbnQgdG8gYVJlZmVyZW5jZWRDb21wb25lbnQuCi0JICogPHA+VGhpcyBtZXRob2QgY291bGQgcmV0dXJuIG51bGwuPC9wPgotCSAqIEBwYXJhbSBhQ29tcG9uZW50Ci0JICogQHBhcmFtIGFSZWZlcmVuY2VkQ29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50IGZpbmRSZWZlcmVuY2VkQ29tcG9uZW50KFdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50LCBXb3JrYmVuY2hDb21wb25lbnQgYVJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJaWYoYUNvbXBvbmVudCA9PSBudWxsIHx8IGFSZWZlcmVuY2VkQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlQcm9qZWN0IHJlZmVyZW5jZWRQcm9qZWN0ID0gZ2V0Q29udGFpbmluZ1Byb2plY3QoYVJlZmVyZW5jZWRDb21wb25lbnQpOwotCQlFTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGFDb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJU3RyaW5nIGRlcGVuZGVudFByb2plY3ROYW1lID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZENvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0JCQlkZXBlbmRlbnRQcm9qZWN0TmFtZSA9IHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCkuc2VnbWVudChNb2R1bGVVUklVdGlsLk1vZHVsZVVSSS5QUk9KRUNUX05BTUVfSU5EWCk7Ci0JCQlpZihyZWZlcmVuY2VkUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKGRlcGVuZGVudFByb2plY3ROYW1lKSkgCi0JCQkJcmV0dXJuIHJlZmVyZW5jZWRDb21wb25lbnQ7CQkJCi0JCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAc2VlIFJlZmVyZW5jZWRDb21wb25lbnR9Jm5ic3A7cmVmZXJlbmNlcyBhIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0oCi0JICoge0BzZWUgUmVmZXJlbmNlZENvbXBvbmVudCNnZXRIYW5kbGUoKX0pIHdoaWNoIGlzIGNvbnRhaW5lZCBieSB0aGUgcHJvamVjdCB0aGF0IHRoZSBjdXJyZW50Ci0JICogTW9kdWxlQ29yZSBpcyBtYW5hZ2luZy4gVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCBkZXRlcm1pbmUgaWYgdGhlIGRlcGVuZGVuY3kgY2FuIGJlCi0JICogc2F0aXNmaWVkIGJ5IHRoZSBjdXJyZW50IHByb2plY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhRGVwZW5kZW50TW9kdWxlCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSB7QHNlZSBSZWZlcmVuY2VkQ29tcG9uZW50fXJlZmVyZW5jZXMgYSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9bWFuYWdlZAotCSAqICAgICAgICAgZGlyZWN0bHkgYnkgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9jYWxEZXBlbmRlbmN5KFJlZmVyZW5jZWRDb21wb25lbnQgYURlcGVuZGVudE1vZHVsZSkgewotCQlpZiAoYURlcGVuZGVudE1vZHVsZSA9PSBudWxsIHx8IGFEZXBlbmRlbnRNb2R1bGUuZ2V0SGFuZGxlKCk9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVVSSSBkZXBlbmRlbnRIYW5kbGUgPSBhRGVwZW5kZW50TW9kdWxlLmdldEhhbmRsZSgpOwotCQkvLyB3aXRoIG5vIHNjaGVtZSBhbmQgYSBzaW1wbGUgbmFtZSwgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IG11c3QgYmUgbG9jYWwKLQkJaWYoZGVwZW5kZW50SGFuZGxlLnNjaGVtZSgpID09IG51bGwgJiYgZGVwZW5kZW50SGFuZGxlLnNlZ21lbnRDb3VudCgpID09IDEpICAKLQkJCXJldHVybiB0cnVlOyAKLQkJdHJ5IHsKLQotCQkJU3RyaW5nIGxvY2FsUHJvamVjdE5hbWUgPSBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJaWYoTW9kdWxlVVJJVXRpbC5lbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGRlcGVuZGVudEhhbmRsZSwgZmFsc2UpKSB7Ci0JCQkJU3RyaW5nIGRlcGVuZGVudFByb2plY3ROYW1lID0gYURlcGVuZGVudE1vZHVsZS5nZXRIYW5kbGUoKS5zZWdtZW50KE1vZHVsZVVSSVV0aWwuTW9kdWxlVVJJLlBST0pFQ1RfTkFNRV9JTkRYKTsKLQkJCQlyZXR1cm4gbG9jYWxQcm9qZWN0TmFtZS5lcXVhbHMoZGVwZW5kZW50UHJvamVjdE5hbWUpOwotCQkJfQotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBNb2R1bGVDb3JlIGZhY2FkZSBmb3IgdGhlIHN1cHBsaWVkIFVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZUVkaXQgZ2V0RGVwZW5kZW50TW9kdWxlQ29yZShVUkkgYU1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlTdHJ1Y3R1cmVFZGl0IGRlcGVuZGVudENvcmUgPSAoU3RydWN0dXJlRWRpdCkgZGVwZW5kZW50Q29yZXMuZ2V0KGFNb2R1bGVVUkkpOwotCQlpZiAoZGVwZW5kZW50Q29yZSAhPSBudWxsKQotCQkJcmV0dXJuIGRlcGVuZGVudENvcmU7Ci0JCXN5bmNocm9uaXplZCAoZGVwZW5kZW50Q29yZXMpIHsKLQkJCWRlcGVuZGVudENvcmUgPSAoU3RydWN0dXJlRWRpdCkgZGVwZW5kZW50Q29yZXMuZ2V0KGFNb2R1bGVVUkkpOwotCQkJaWYgKGRlcGVuZGVudENvcmUgPT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlkZXBlbmRlbnRDb3JlID0gZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoY29udGFpbmVyKTsKLQkJCQkJZGVwZW5kZW50Q29yZXMucHV0KGFNb2R1bGVVUkksIGRlcGVuZGVudENvcmUpOwotCQkJCX0gZWxzZQotCQkJCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhTW9kdWxlVVJJKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVwZW5kZW50Q29yZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBtb2RpZnkgYSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHRoYXQgd2FzIGxvYWRlZCBhcyByZWFkLW9ubHkuIik7Ci0JfQotCi0JLyoqCi0JICogdGVtcG9yYXJ5IG1ldGhvZCB0byByZXR1cm4gZmlyc3QgbW9kdWxlIGluIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQHJldHVybiBmaXJzdCBtb2R1bGUgaW4gdGhlIHByb2plY3QKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZ2V0Rmlyc3RNb2R1bGUoKSB7Ci0JCXJldHVybiBnZXRDb21wb25lbnQoKTsKLQl9Ci0JLyoqCi0JICogcmV0dXJucyB0aGUgb25lIGFuZCBvbmx5IGNvbXBvbmVudCBpbiB0aGUgcHJvamVjdAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBpbiB0aGUgcHJvamVjdCBpZiBleGlzdHMgb3IgbnVsbAotCSAqIAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlXb3JrYmVuY2hDb21wb25lbnRbXSBjb21wcyA9IGdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJaWYgKGNvbXBzLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gY29tcHNbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUNvbXBvbmVudFVSSShJUHJvamVjdCBhQ29udGFpbmluZ1Byb2plY3QsIFN0cmluZyBhQ29tcG9uZW50TmFtZSkgewotCQlyZXR1cm4gTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkoYUNvbnRhaW5pbmdQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gYVByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsKCkgewotCQlyZXR1cm4gc3RydWN0dXJhbE1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBlZGl0IGZvciByZXNvdXJjZSBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRWRpdCgpIHsKLQkJSVZhbGlkYXRlRWRpdENvbnRleHQgdmFsaWRhdG9yID0gKElWYWxpZGF0ZUVkaXRDb250ZXh0KSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKElWYWxpZGF0ZUVkaXRDb250ZXh0LkNMQVNTX0tFWSk7Ci0JCXJldHVybiB2YWxpZGF0b3IudmFsaWRhdGVTdGF0ZShnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1dvcmtiZW5jaENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1dvcmtiZW5jaENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI2ODk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Xb3JrYmVuY2hDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICogQW4gRU1GIHJlcHJlc2VudGF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQtdGltZSBtb2R1bGUgY29udGFpbmVkIGJ5IGFuIEVjbGlwc2UgcHJvamVjdC4gCi0gKiA8cD4gCi0gKiBTZWUgdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgZm9yIGFuIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj5vdmVydmlldyBvZiB0aGUgbW9kZWwgY29tcG9uZW50czwvYT4uCi0gKiA8L3A+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0Q29tcG9uZW50VHlwZSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMgPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE1ldGFkYXRhUmVzb3VyY2VzIDxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2JlbmNoQ29tcG9uZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X05hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2V9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0Q29tcG9uZW50Ci0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSIgb3Bwb3NpdGU9ImNvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb21wb25lbnRUeXBlKENvbXBvbmVudFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudFR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRDb21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X1JlZmVyZW5jZWRDb21wb25lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0YWRhdGEgUmVzb3VyY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRofS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfTWV0YWRhdGFSZXNvdXJjZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSVBhdGgiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQlVUkkgZ2V0SGFuZGxlKCk7Ci0KLQlDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKElQYXRoIGFEZXBsb3lQYXRoKTsKLQkKLQlDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoSVBhdGggYVNvdXJjZVBhdGgsIGludCByZXNvdXJjZUZsYWcpOwotCQotCWJvb2xlYW4gZXhpc3RzKElQYXRoIGFTb3VyY2VQYXRoLCBpbnQgcmVzb3VyY2VGbGFnKTsKLQkKLQlmaW5hbCBTdHJpbmcgREVGQVVMVF9ST09UX1NPVVJDRV9UQUcgPSAiZGVmYXVsdFJvb3RTb3VyY2UiOwotCi19IC8vIFdvcmtiZW5jaENvbXBvbmVudApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxOTcwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElEZXBlbmRlbmN5R3JhcGh9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5R3JhcGggewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeUdyYXBoIElOU1RBTkNFID0gbmV3IERlcGVuZGVuY3lHcmFwaCgpOwotCi0JcHVibGljIHN0YXRpYyBEZXBlbmRlbmN5R3JhcGggZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3RbXSBnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoSVByb2plY3QgdGFyZ2V0KSB7Ci0JCVNldDxJUHJvamVjdD4gcmVmZXJlbmNpbmdDb21wb25lbnRzID0gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHModGFyZ2V0KTsKLQkJcmV0dXJuIHJlZmVyZW5jaW5nQ29tcG9uZW50cy50b0FycmF5KG5ldyBJUHJvamVjdFtyZWZlcmVuY2luZ0NvbXBvbmVudHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKElQcm9qZWN0IHRhcmdldCwgSVByb2plY3QgcmVmZXJlbmNpbmdDb21wb25lbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZShJUHJvamVjdCB0YXJnZXQsIElQcm9qZWN0IHJlZmVyZW5jaW5nQ29tcG9uZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgU2V0IGludGVybmFsR2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0IHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjNjNGQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUdyYXBoRXZlbnQgaW1wbGVtZW50cyBJRGVwZW5kZW5jeUdyYXBoVXBkYXRlRXZlbnQgewotCi0JcHJpdmF0ZSBpbnQgdHlwZSA9IDA7Ci0JcHJpdmF0ZSBsb25nIG1vZFN0YW1wID0gMDsKLQotCS8qKgotCSAqIEJvdGggdGhlc2UgbWFwcyBhcmUgcmV2ZXJzZSByZWZlcmVuY2UgbWFwcyBhcyB0aGUgb25lcyBhcmUgaW4KLQkgKiB7QGxpbmsgSURlcGVuZGVuY3lHcmFwaH0KLQkgKi8KLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElQcm9qZWN0Pj4gYWRkZWRSZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElQcm9qZWN0Pj4gcmVtb3ZlZFJlZmVyZW5jZXMgPSBudWxsOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLgotCSAqIElEZXBlbmRlbmN5R3JhcGhVcGRhdGVFdmVudCNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlKGludCBuZXdUeXBlKXsKLQkJdGhpcy50eXBlID0gbmV3VHlwZTsKLQl9Ci0JCi0Jdm9pZCBzZXRNb2RTdGFtcChsb25nIG1vZFN0YW1wKSB7Ci0JCXRoaXMubW9kU3RhbXAgPSBtb2RTdGFtcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2Vlb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXIuCi0JICogSURlcGVuZGVuY3lHcmFwaFVwZGF0ZUV2ZW50I2dldE1vZFN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RTdGFtcCgpIHsKLQkJcmV0dXJuIG1vZFN0YW1wOwotCX0KLQotCXZvaWQgYWRkUmVmZXJlcmVuY2UoSVByb2plY3Qgc291cmNlUHJvamVjdCwgSVByb2plY3QgdGFyZ2V0UHJvamVjdCkgewotCQlpZiAoc291cmNlUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlNvdXJjZSBwcm9qZWN0IG11c3Qgbm90IGJlIG51bGwuIik7Ci0JCX0KLQkJaWYgKHRhcmdldFByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUYXJnZXQgcHJvamVjdCBtdXN0IG5vdCBiZSBudWxsLiIpOwotCQl9Ci0JCS8vdXBkYXRlIHJlbW92ZWQgcmVmZXJlbmNlcyBhY2NvcmRpbmdseQotCQlpZihyZW1vdmVkUmVmZXJlbmNlcyAhPSBudWxsKXsKLQkJCVNldCByZWZlcmVuY2VzID0gcmVtb3ZlZFJlZmVyZW5jZXMuZ2V0KHRhcmdldFByb2plY3QpOwotCQkJaWYocmVmZXJlbmNlcyAhPSBudWxsKXsKLQkJCQlpZihyZWZlcmVuY2VzLnJlbW92ZShzb3VyY2VQcm9qZWN0KSkgewotCQkJCQlpZihyZWZlcmVuY2VzLmlzRW1wdHkoKSl7Ci0JCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5yZW1vdmUodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCQlpZihyZW1vdmVkUmVmZXJlbmNlcy5pc0VtcHR5KCkpewotCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzID0gbnVsbDsKLQkJCQkJCQlpZigoZ2V0VHlwZSgpICYgQURERUQpID09IEFEREVEKXsKLQkJCQkJCQkJc2V0VHlwZShBRERFRCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0VHlwZSgwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy90aGVyZSBpcyBubyBuZXQgY2hhbmdlLCBzbyByZXR1cm4uCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChhZGRlZFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc2V0VHlwZShnZXRUeXBlKCkgfCBBRERFRCk7Ci0JCQlhZGRlZFJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgU2V0PElQcm9qZWN0Pj4oKTsKLQkJfQotCQlTZXQgcmVmZXJlbmNlcyA9IGFkZGVkUmVmZXJlbmNlcy5nZXQodGFyZ2V0UHJvamVjdCk7Ci0JCWlmIChyZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZXMgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oKTsKLQkJCWFkZGVkUmVmZXJlbmNlcy5wdXQodGFyZ2V0UHJvamVjdCwgcmVmZXJlbmNlcyk7Ci0JCX0KLQkJcmVmZXJlbmNlcy5hZGQoc291cmNlUHJvamVjdCk7Ci0JCQotCQkKLQl9Ci0KLQl2b2lkIHJlbW92ZVJlZmVyZW5jZShJUHJvamVjdCBzb3VyY2VQcm9qZWN0LCBJUHJvamVjdCB0YXJnZXRQcm9qZWN0KSB7Ci0JCWlmIChzb3VyY2VQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiU291cmNlIHByb2plY3QgbXVzdCBub3QgYmUgbnVsbC4iKTsKLQkJfQotCQlpZiAodGFyZ2V0UHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRhcmdldCBwcm9qZWN0IG11c3Qgbm90IGJlIG51bGwuIik7Ci0JCX0KLQkJCi0JCS8vdXBkYXRlZCBhZGRlZCByZWZlcmVuY2VzIGFjY29yZGluZ2x5Ci0JCWlmKGFkZGVkUmVmZXJlbmNlcyAhPSBudWxsKXsKLQkJCVNldCByZWZlcmVuY2VzID0gYWRkZWRSZWZlcmVuY2VzLmdldCh0YXJnZXRQcm9qZWN0KTsKLQkJCWlmKHJlZmVyZW5jZXMgIT0gbnVsbCl7Ci0JCQkJaWYocmVmZXJlbmNlcy5yZW1vdmUoc291cmNlUHJvamVjdCkpewotCQkJCQlpZihyZWZlcmVuY2VzLmlzRW1wdHkoKSl7Ci0JCQkJCQlhZGRlZFJlZmVyZW5jZXMucmVtb3ZlKHRhcmdldFByb2plY3QpOwotCQkJCQkJaWYoYWRkZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSl7Ci0JCQkJCQkJYWRkZWRSZWZlcmVuY2VzID0gbnVsbDsKLQkJCQkJCQlpZigoZ2V0VHlwZSgpICYgUkVNT1ZFRCkgPT0gUkVNT1ZFRCl7Ci0JCQkJCQkJCXNldFR5cGUoUkVNT1ZFRCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0VHlwZSgwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy90aGVyZSBpcyBubyBuZXQgY2hhbmdlLCBzbyByZXR1cm4uCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChyZW1vdmVkUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzZXRUeXBlKGdldFR5cGUoKSB8IFJFTU9WRUQpOwotCQkJcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgU2V0PElQcm9qZWN0Pj4oKTsKLQkJfQotCQlTZXQgcmVmZXJlbmNlcyA9IHJlbW92ZWRSZWZlcmVuY2VzLmdldCh0YXJnZXRQcm9qZWN0KTsKLQkJaWYgKHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwotCQkJcmVtb3ZlZFJlZmVyZW5jZXMucHV0KHRhcmdldFByb2plY3QsIHJlZmVyZW5jZXMpOwotCQl9Ci0JCXJlZmVyZW5jZXMuYWRkKHNvdXJjZVByb2plY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWVvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci4KLQkgKiBJRGVwZW5kZW5jeUdyYXBoVXBkYXRlRXZlbnQjZ2V0QWRkZWRSZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgTWFwPElQcm9qZWN0LCBTZXQ8SVByb2plY3Q+PiBnZXRBZGRlZFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChhZGRlZFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gYWRkZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWVvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci4KLQkgKiBJRGVwZW5kZW5jeUdyYXBoVXBkYXRlRXZlbnQjZ2V0UmVtb3ZlZFJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBNYXA8SVByb2plY3QsIFNldDxJUHJvamVjdD4+IGdldFJlbW92ZWRSZWZlcmVuY2VzKCkgewotCQlpZiAocmVtb3ZlZFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlZFJlZmVyZW5jZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCJEZXBlbmRlbmN5IEdyYXBoIEV2ZW50IFxue1xuIGdldE1vZFN0YW1wKCkgPSAiK2dldE1vZFN0YW1wKCkrIlxuIGhhc2hDb2RlKCkgPSAiK2hhc2hDb2RlKCkrIlxuIik7Ci0JCWJvb2xlYW4gYWRkZWQgPSAoZ2V0VHlwZSgpICYgQURERUQpID09IEFEREVEOwotCQlpZihhZGRlZCl7Ci0JCQlidWZmLmFwcGVuZCgiIEFEREVEOlxuIiApOwotCQkJZm9yKEl0ZXJhdG9yPE1hcC5FbnRyeTxJUHJvamVjdCwgU2V0PElQcm9qZWN0Pj4+IGl0ZXJhdG9yID0gZ2V0QWRkZWRSZWZlcmVuY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlNYXAuRW50cnk8SVByb2plY3QsIFNldDxJUHJvamVjdD4+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWJ1ZmYuYXBwZW5kKCIgICIgKyBlbnRyeS5nZXRLZXkoKS5nZXROYW1lKCkgKyAiIC0+IHsiKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0PiBtYXBwZWRQcm9qZWN0cyA9IGVudHJ5LmdldFZhbHVlKCkuaXRlcmF0b3IoKTsgbWFwcGVkUHJvamVjdHMuaGFzTmV4dCgpOykgewotCQkJCQlidWZmLmFwcGVuZChtYXBwZWRQcm9qZWN0cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKG1hcHBlZFByb2plY3RzLmhhc05leHQoKSkgewotCQkJCQkJYnVmZi5hcHBlbmQoIiwgIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnVmZi5hcHBlbmQoIn1cbiIpOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gcmVtb3ZlZCA9IChnZXRUeXBlKCkgJiBSRU1PVkVEKSA9PSBSRU1PVkVEOwotCQlpZihyZW1vdmVkKXsKLQkJCWJ1ZmYuYXBwZW5kKCIgUkVNT1ZFRDpcbiIgKTsKLQkJCWZvcihJdGVyYXRvcjxNYXAuRW50cnk8SVByb2plY3QsIFNldDxJUHJvamVjdD4+PiBpdGVyYXRvciA9IGdldFJlbW92ZWRSZWZlcmVuY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlNYXAuRW50cnk8SVByb2plY3QsIFNldDxJUHJvamVjdD4+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWJ1ZmYuYXBwZW5kKCIgICIgKyBlbnRyeS5nZXRLZXkoKS5nZXROYW1lKCkgKyAiIC0+IHsiKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0PiBtYXBwZWRQcm9qZWN0cyA9IGVudHJ5LmdldFZhbHVlKCkuaXRlcmF0b3IoKTsgbWFwcGVkUHJvamVjdHMuaGFzTmV4dCgpOykgewotCQkJCQlidWZmLmFwcGVuZChtYXBwZWRQcm9qZWN0cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKG1hcHBlZFByb2plY3RzLmhhc05leHQoKSkgewotCQkJCQkJYnVmZi5hcHBlbmQoIiwgIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnVmZi5hcHBlbmQoIn1cbiIpOwotCQkJfQotCQl9Ci0JCWJ1ZmYuYXBwZW5kKCJ9XG4iKTsKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjllZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUE1vZHVsZXNSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5R3JhcGhJbXBsIGltcGxlbWVudHMgSURlcGVuZGVuY3lHcmFwaCB7Ci0KLQkvKioKLQkgKiBEb24ndCByZWFkIG9yIHdyaXRlIHRoZSBncmFwaCB3aXRob3V0IGZpcnN0IG9idGFpbmluZyB0aGUgZ3JhcGhMb2NrLgotCSAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IGdyYXBoTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCS8qKgotCSAqIElmIHByb2plY3RzIEEgYW5kIGFuZCBCIGJvdGggZGVwZW5kIG9uIEMgYW4gZW50cnkgaW4gdGhpcyBncmFwaCB3b3VsZCBiZQotCSAqIHtDIC0+IHtBLCBCfSB9Ci0JICovCi0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIFNldDxJUHJvamVjdD4+IGdyYXBoOwotCi0JcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG1vZFN0YW1wID0gbmV3IEF0b21pY0xvbmcoKTsKLQotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkKLQkvKiogVXNlZCB0byBndWFyZCBwYXVzZUNvdW50LiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IGpvYkxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKiogSWYgdGhpcyBpcyBncmVhdGVyIHRoYW4gemVybyB3ZSBkbyBub3QgcnVuIHRoZSBncmFwaCB1cGRhdGUgam9iLiBUaGlzIGlzIGd1YXJkZWQgYnkgam9iTG9jay4gKi8KLQlwcml2YXRlIGludCBwYXVzZUNvdW50OwotCi0JLyoqCi0JICogVGhpcyBpcyBub3QgcHVibGljLCBvbmx5IHtAbGluayBJRGVwZW5kZW5jeUdyYXBoI0lOU1RBTkNFfSBzaG91bGQgYmUKLQkgKiB1c2VkLgotCSAqLwotCXN0YXRpYyBJRGVwZW5kZW5jeUdyYXBoIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRGVwZW5kZW5jeUdyYXBoSW1wbCgpOwotCQkJaW5zdGFuY2UuaW5pdEdyYXBoKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlcGVuZGVuY3lHcmFwaEltcGwgaW5zdGFuY2U7Ci0KLQlwcml2YXRlIERlcGVuZGVuY3lHcmFwaEltcGwoKSB7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0TW9kU3RhbXAoKSB7Ci0JCXJldHVybiBtb2RTdGFtcC5nZXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5jcmVtZW50TW9kU3RhbXAoKSB7Ci0JCW1vZFN0YW1wLmluY3JlbWVudEFuZEdldCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBwcm9qZWN0cyB3aG9zZSBjb21wb25lbnRzIHJlZmVyZW5jZSB0aGUgc3BlY2lmaWVkCi0JICogdGFyZ2V0IHByb2plY3QncyBjb21wb25lbnQuIEZvciBleGFtcGxlIGlmIHByb2plY3RzIEEgYW5kIEIgYm90aAotCSAqIHJlZmVyZW5jZSBDLiBQYXNzaW5nIEMgYXMgdGhlIHRhcmdldFByb2plY3Qgd2lsbCByZXR1cm4ge0EsIEJ9Ci0JICovCi0JcHVibGljIFNldDxJUHJvamVjdD4gZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0IHRhcmdldFByb2plY3QpIHsKLQkJSURlcGVuZGVuY3lHcmFwaFJlZmVyZW5jZXMgcmVmcyA9IGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyh0YXJnZXRQcm9qZWN0LCB0cnVlKTsKLQkJcmV0dXJuIHJlZnMuZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKCk7Ci0JfQotCi0JcHVibGljIElEZXBlbmRlbmN5R3JhcGhSZWZlcmVuY2VzIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygKLQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QsIGJvb2xlYW4gd2FpdEZvckFsbFVwZGF0ZXMpIHsKLQkJRGVwZW5kZW5jeUdyYXBoUmVmZXJlbmNlcyByZWZzID0gbmV3IERlcGVuZGVuY3lHcmFwaFJlZmVyZW5jZXMoKTsKLQkJcmVmcy50YXJnZXRQcm9qZWN0ID0gdGFyZ2V0UHJvamVjdDsKLQkJaWYgKHdhaXRGb3JBbGxVcGRhdGVzKSB7Ci0JCQlyZWZzLnN0YWxlID0gZmFsc2U7Ci0JCQl3YWl0Rm9yQWxsVXBkYXRlcyhudWxsKTsKLQkJfSBlbHNlIGlmIChpc1VwZGF0ZU5lY2Vzc2FyeSgpKSB7Ci0JCQlyZWZzLnN0YWxlID0gdHJ1ZTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJU2V0PElQcm9qZWN0PiBzZXQgPSBncmFwaC5nZXQodGFyZ2V0UHJvamVjdCk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlyZWZzLnJlZmVyZW5jaW5nUHJvamVjdHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCQl9IGVsc2UgewotCQkJCURlcGVuZGVuY3lHcmFwaEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0PiBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOyBpdGVyYXRvcgkuaGFzTmV4dCgpOykgewotCQkJCQlJUHJvamVjdCBzb3VyY2VQcm9qZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoIXNvdXJjZVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCQlpbmNyZW1lbnRNb2RTdGFtcCgpOwotCQkJCQkJCWV2ZW50ID0gbmV3IERlcGVuZGVuY3lHcmFwaEV2ZW50KCk7Ci0JCQkJCQkJZXZlbnQuc2V0TW9kU3RhbXAoZ2V0TW9kU3RhbXAoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlldmVudC5yZW1vdmVSZWZlcmVuY2Uoc291cmNlUHJvamVjdCwgdGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCQkJbm90aWZpeUxpc3RlbmVycyhldmVudCk7Ci0JCQkJfQotCQkJCVNldDxJUHJvamVjdD4gY29weSA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwotCQkJCWNvcHkuYWRkQWxsKHNldCk7Ci0JCQkJcmVmcy5yZWZlcmVuY2luZ1Byb2plY3RzID0gY29weTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YWxlKCkgewotCQlyZXR1cm4gaXNVcGRhdGVOZWNlc3NhcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHF1ZXVlIHVwIHJlbGV2YW50IGNoYW5nZXMgZm9yIHRoZSBncmFwaCB1cGRhdGUgam9iLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRGVwZW5kZW5jeUdyYXBoUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCi0JCS8vIG9ubHkgcmVnaXN0ZXJlZCBmb3IgcG9zdCBjaGFuZ2UgZXZlbnRzCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJdHJ5IHsKLQkJCQlwcmVVcGRhdGUoKTsKLQkJCQlldmVudC5nZXREZWx0YSgpLmFjY2VwdCh0aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXBvc3RVcGRhdGUoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlLlJPT1Q6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUOiB7Ci0JCQkJZmluYWwgaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClyZXNvdXJjZTsKLQkJCQlpZiAoKElSZXNvdXJjZURlbHRhLkFEREVEICYga2luZCkgIT0gMCkgewotCQkJCQl1cGRhdGUocHJvamVjdCwgSURlcGVuZGVuY3lHcmFwaC5BRERFRCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKChJUmVzb3VyY2VEZWx0YS5SRU1PVkVEICYga2luZCkgIT0gMCkgewotCQkJCQl1cGRhdGUocHJvamVjdCwgSURlcGVuZGVuY3lHcmFwaC5SRU1PVkVEKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoKElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiBraW5kKSAhPSAwKSB7Ci0JCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCWlmICgoSVJlc291cmNlRGVsdGEuT1BFTiAmIGZsYWdzKSAhPSAwKSB7Ci0JCQkJCQlib29sZWFuIGlzT3BlbiA9IHByb2plY3QuaXNPcGVuKCk7Ci0JCQkJCQlpZiAoaXNPcGVuKXVwZGF0ZShwcm9qZWN0LCBJRGVwZW5kZW5jeUdyYXBoLkFEREVEKTsKLQkJCQkJCWVsc2UgdXBkYXRlKHByb2plY3QsIElEZXBlbmRlbmN5R3JhcGguUkVNT1ZFRCk7Ci0JCQkJCQkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSOgotCQkJCWlmIChyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuRE9UX1NFVFRJTkdTKSlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIElSZXNvdXJjZS5GSUxFOgotCQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLmVxdWFscyhXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5LldUUF9NT0RVTEVTX1NIT1JUX05BTUUpKSB7Ci0JCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuQURERUQpICE9IDApIHsKLQkJCQkJCXVwZGF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIElEZXBlbmRlbmN5R3JhcGguQURERUQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdXBkYXRlKHJlc291cmNlLmdldFByb2plY3QoKSwgSURlcGVuZGVuY3lHcmFwaC5NT0RJRklFRCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCIucHJvamVjdCIpKSB7Ci0JCQkJCXVwZGF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIElEZXBlbmRlbmN5R3JhcGguQURERUQpOwotCQkJCX0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgRGVwZW5kZW5jeUdyYXBoUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgZ3JhcGggaXMgYnVpbHQgbGF6aWx5IG9uY2UuIEFmdGVyd2FyZHMsIHRoZSBncmFwaCBpcyB1cGRhdGVkIGFzCi0JICogbmVjZXNzYXJ5LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0R3JhcGgoKSB7Ci0JCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQl0cnkgewotCQkJCXByZVVwZGF0ZSgpOwotCQkJCWdyYXBoID0gbmV3IEhhc2hNYXA8SVByb2plY3QsIFNldDxJUHJvamVjdD4+KCk7Ci0JCQkJbGlzdGVuZXIgPSBuZXcgRGVwZW5kZW5jeUdyYXBoUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIoKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkJCWlmIChyZXN0b3JlR3JhcGgoKSA9PSBudWxsKXJlYnVpbGQoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJcG9zdFVwZGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYnVpbGQoKSB7Ci0JCUlQcm9qZWN0W10gYWxsUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCXJlYnVpbGQoYWxsUHJvamVjdHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWJ1aWxkKElQcm9qZWN0W10gYWxsUHJvamVjdHMpIHsKLQkJZm9yIChJUHJvamVjdCBzb3VyY2VQcm9qZWN0IDogYWxsUHJvamVjdHMpIHsKLQkJCXVwZGF0ZShzb3VyY2VQcm9qZWN0LCBJRGVwZW5kZW5jeUdyYXBoLkFEREVEKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVBbGxSZWZlcmVuY2VzKERlcGVuZGVuY3lHcmFwaEV2ZW50IGV2ZW50KSB7Ci0JCXN5bmNocm9uaXplZCAoZ3JhcGhMb2NrKSB7Ci0JCQlJUHJvamVjdFtdIGFsbFJlZmVyZW5jZUtleXMgPSBuZXcgSVByb2plY3RbZ3JhcGgua2V5U2V0KCkuc2l6ZSgpXTsKLQkJCWdyYXBoLmtleVNldCgpLnRvQXJyYXkoYWxsUmVmZXJlbmNlS2V5cyk7Ci0JCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBhbGxSZWZlcmVuY2VLZXlzKSB7Ci0JCQkJcmVtb3ZlQWxsUmVmZXJlbmNlcyhwcm9qZWN0LCBldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsUmVmZXJlbmNlcyhJUHJvamVjdCB0YXJnZXRQcm9qZWN0LCBEZXBlbmRlbmN5R3JhcGhFdmVudCBldmVudCkgewotCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0JCQlTZXQ8SVByb2plY3Q+IHJlbW92ZWRTZXQgPSBncmFwaC5yZW1vdmUodGFyZ2V0UHJvamVjdCk7Ci0JCQlpZiAocmVtb3ZlZFNldCAhPSBudWxsICYmICFyZW1vdmVkU2V0LmlzRW1wdHkoKSkgewotCQkJCXJlbW92ZWQgPSB0cnVlOwotCQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IHJlbW92ZWRTZXQpIHsKLQkJCQkJZXZlbnQucmVtb3ZlUmVmZXJlbmNlKHByb2plY3QsIHRhcmdldFByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoRW50cnk8SVByb2plY3QsIFNldDxJUHJvamVjdD4+IGVudHJ5IDogZ3JhcGguZW50cnlTZXQoKSkgewotCQkJCWlmICghZW50cnkuZ2V0VmFsdWUoKS5pc0VtcHR5KCkJJiYgZW50cnkuZ2V0VmFsdWUoKS5yZW1vdmUodGFyZ2V0UHJvamVjdCkpIHsKLQkJCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCQkJCWV2ZW50LnJlbW92ZVJlZmVyZW5jZSh0YXJnZXRQcm9qZWN0LCBlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZWQpIHsKLQkJCQlpbmNyZW1lbnRNb2RTdGFtcCgpOwotCQkJCWV2ZW50LnNldE1vZFN0YW1wKGdldE1vZFN0YW1wKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJlZmVyZW5jZShJUHJvamVjdCBzb3VyY2VQcm9qZWN0LCBJUHJvamVjdCB0YXJnZXRQcm9qZWN0LCBEZXBlbmRlbmN5R3JhcGhFdmVudCBldmVudCkgewotCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJU2V0PElQcm9qZWN0PiByZWZlcmVuY2luZ1Byb2plY3RzID0gZ3JhcGguZ2V0KHRhcmdldFByb2plY3QpOwotCQkJaWYgKHJlZmVyZW5jaW5nUHJvamVjdHMgIT0gbnVsbCkgewotCQkJCWlmIChyZWZlcmVuY2luZ1Byb2plY3RzLnJlbW92ZShzb3VyY2VQcm9qZWN0KSkgewotCQkJCQlldmVudC5yZW1vdmVSZWZlcmVuY2Uoc291cmNlUHJvamVjdCwgdGFyZ2V0UHJvamVjdCk7Ci0JCQkJCWluY3JlbWVudE1vZFN0YW1wKCk7Ci0JCQkJCWV2ZW50LnNldE1vZFN0YW1wKGdldE1vZFN0YW1wKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRSZWZlcmVuY2UoSVByb2plY3Qgc291cmNlUHJvamVjdCwgSVByb2plY3QgdGFyZ2V0UHJvamVjdCwgRGVwZW5kZW5jeUdyYXBoRXZlbnQgZXZlbnQpIHsKLQkJc3luY2hyb25pemVkIChncmFwaExvY2spIHsKLQkJCVNldDxJUHJvamVjdD4gcmVmZXJlbmNpbmdQcm9qZWN0cyA9IGdyYXBoLmdldCh0YXJnZXRQcm9qZWN0KTsKLQkJCWlmIChyZWZlcmVuY2luZ1Byb2plY3RzID09IG51bGwpIHsKLQkJCQlyZWZlcmVuY2luZ1Byb2plY3RzID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0JCQkJZ3JhcGgucHV0KHRhcmdldFByb2plY3QsIHJlZmVyZW5jaW5nUHJvamVjdHMpOwotCQkJfQotCQkJYm9vbGVhbiBhZGRlZCA9IHJlZmVyZW5jaW5nUHJvamVjdHMuYWRkKHNvdXJjZVByb2plY3QpOwotCQkJaWYgKGFkZGVkKSB7Ci0JCQkJZXZlbnQuYWRkUmVmZXJlcmVuY2Uoc291cmNlUHJvamVjdCwgdGFyZ2V0UHJvamVjdCk7Ci0JCQkJaW5jcmVtZW50TW9kU3RhbXAoKTsKLQkJCQlldmVudC5zZXRNb2RTdGFtcChnZXRNb2RTdGFtcCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEdSQVBIX1VQREFURV9KT0JfRkFNSUxZID0gbmV3IE9iamVjdCgpOwotCi0JLyoqIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdlIGRlbGF5IGJlZm9yZSBzdGFydGluZyB0aGUgZ3JhcGggdXBkYXRlIGpvYi4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSk9CX0RFTEFZID0gMTAwOwotCi0JcHJpdmF0ZSBmaW5hbCBHcmFwaFVwZGF0ZUpvYiBncmFwaFVwZGF0ZUpvYiA9IG5ldyBHcmFwaFVwZGF0ZUpvYigpOwotCi0JLy8gVGhpcyBsb2NrIGlzIHVzZWQgZm9yIGRlYWRsb2NrIGF2b2lkYW5jZS4gVGhlIHNwZWNpZmljIHNjZW5hcmlvCi0JLy8gaXMgZHVyaW5nIHdhaXRGb3JBbGxVcGRhdGVzKCk7IGlmIGEgZGVhZGxvY2sgaXMgZGV0ZWN0ZWQgZHVyaW5nCi0JLy8gdGhlIGxvY2sncyBhY3F1aXJlKCkgbWV0aG9kLCB0aGlzIHRocmVhZCB3aWxsIHRlbXBvcmFyaWx5IHJlbGVhc2UKLQkvLyBpdHMgYWxyZWFkeSBhY3F1aXJlZCBJTG9ja3MgdG8gYWxsb3cgb3RoZXIgdGhyZWFkcyB0byBjb250aW51ZS4KLQkvLyBXaGVuIGV4ZWN1dGlvbiBpcyByZXR1cm5lZCB0byB0aGlzIHRocmVhZCwgYW55IHJlbGVhc2VkIElMb2NrcyB3aWxsCi0JLy8gYmUgYWNxdWlyZWQgYWdhaW4gYmVmb3JlIHByb2NlZWRpbmcuCi0JcHJpdmF0ZSBmaW5hbCBJTG9jayBqb2JJTG9jayA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JLyoqCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBqb2IgaXMgdG8gcmVhY3QgdG8gcmVzb3VyY2VzIGNoYW5nZXMgdGhhdCB3ZXJlIGRldGVjdGVkIGJ5IHRoZSBkZXBlbmRlbmN5Ci0JICogZ3JhcGggcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyLgotCSAqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBHcmFwaFVwZGF0ZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBRdWV1ZSBwcm9qZWN0c0FkZGVkID0gbmV3IFF1ZXVlKCk7Ci0JCXByaXZhdGUgZmluYWwgUXVldWUgcHJvamVjdHNSZW1vdmVkID0gbmV3IFF1ZXVlKCk7Ci0JCXByaXZhdGUgZmluYWwgUXVldWUgcHJvamVjdHNVcGRhdGVkID0gbmV3IFF1ZXVlKCk7Ci0JCQotCQkvKiogVXNlZCB0byBndWFyZCBydW5TdGFtcCBhbmQgcnVubmluZy4gKi8KLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgcnVuTG9jayA9IG5ldyBPYmplY3QoKTsKLQkJCi0JCS8qKiBBIHNpbXBsZSBjb3VudGVyIHRoYXQga2VlcHMgdHJhY2sgb2Ygd2hpY2ggcnVuIG51bWJlciB3ZSBhcmUuICovCi0JCXByaXZhdGUgbG9uZyBydW5TdGFtcDsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBydW5uaW5nOwotCi0JCXB1YmxpYyBHcmFwaFVwZGF0ZUpvYigpIHsKLQkJCXN1cGVyKFJlc291cmNlcy5KT0JfTkFNRSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJcmV0dXJuIGZhbWlseSA9PSBHUkFQSF9VUERBVEVfSk9CX0ZBTUlMWTsKLQkJfQotCi0JCS8vIFdlIHVzZSB0aGUgbGlzdGVuZXIgbGlzdCBhcyBhIHRocmVhZCBzYWZlIHF1ZXVlLgotCQlwcml2YXRlIGNsYXNzIFF1ZXVlIGV4dGVuZHMgTGlzdGVuZXJMaXN0IHsKLQkJCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0TGlzdGVuZXJzKCkgewotCQkJCU9iamVjdFtdIGRhdGEgPSBzdXBlci5nZXRMaXN0ZW5lcnMoKTsKLQkJCQljbGVhcigpOwotCQkJCXJldHVybiBkYXRhOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCXJldHVybiBzdXBlci5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJcHVibGljIHZvaWQgcXVldWVQcm9qZWN0QWRkZWQoSVByb2plY3QgcHJvamVjdCkgewotCQkJaW5jcmVtZW50TW9kU3RhbXAoKTsKLQkJCXByb2plY3RzQWRkZWQuYWRkKHByb2plY3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcXVldWVQcm9qZWN0RGVsZXRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlpbmNyZW1lbnRNb2RTdGFtcCgpOwotCQkJcHJvamVjdHNSZW1vdmVkLmFkZChwcm9qZWN0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXVlUHJvamVjdFVwZGF0ZWQoSVByb2plY3QgcHJvamVjdCkgewotCQkJaW5jcmVtZW50TW9kU3RhbXAoKTsKLQkJCXByb2plY3RzVXBkYXRlZC5hZGQocHJvamVjdCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkU2NoZWR1bGUoKSB7Ci0JCQlib29sZWFuIGlzRW1wdHkgPSBwcm9qZWN0c0FkZGVkLmlzRW1wdHkoKSAmJiBwcm9qZWN0c1JlbW92ZWQuaXNFbXB0eSgpICYmIHByb2plY3RzVXBkYXRlZC5pc0VtcHR5KCk7Ci0JCQlyZXR1cm4gIWlzRW1wdHk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0UnVubmluZyhib29sZWFuIGIpIHsKLQkJCXN5bmNocm9uaXplZCAocnVuTG9jaykgewotCQkJCXJ1bm5pbmcgPSBiOwotCQkJCWlmIChydW5uaW5nKXJ1blN0YW1wKys7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCQkJc3luY2hyb25pemVkIChydW5Mb2NrKSB7Ci0JCQkJcmV0dXJuIHJ1bm5pbmc7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gZGlkUnVuKGxvbmcgc3RhbXApIHsKLQkJCXN5bmNocm9uaXplZCAocnVuTG9jaykgewotCQkJCXJldHVybiBzdGFtcCAhPSBydW5TdGFtcDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdhaXRGb3JSdW4obG9uZyBtYXhXYWl0VGltZSkgewotCQkJaWYgKGlzUnVubmluZygpKXJldHVybjsKLQkJCQotCQkJZmluYWwgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWxvbmcgbG9jYWxSdW5TdGFtcCA9IDA7Ci0JCQlzeW5jaHJvbml6ZWQgKHJ1bkxvY2spIHsKLQkJCQlsb2NhbFJ1blN0YW1wID0gcnVuU3RhbXA7Ci0JCQl9Ci0JCQkKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lID4gbWF4V2FpdFRpbWUpcmV0dXJuOwotCQkJCQotCQkJCWlmIChkaWRSdW4obG9jYWxSdW5TdGFtcCkpcmV0dXJuOwotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlUaHJlYWQuaW50ZXJydXB0ZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0cnkgewotCQkJCWpvYklMb2NrLmFjcXVpcmUoKTsKLQkJCQlzZXRSdW5uaW5nKHRydWUpOwotCi0JCQkJLy8gd2UgZG8gbm90IHdhbnQgdG8gYmUgcnVubmluZyBkdXJpbmcgdGhlIGVhcmx5IHBhcnQgb2Ygc3RhcnR1cAotCQkJCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKLQkJCQkJZ3JhcGhVcGRhdGVKb2Iuc2NoZWR1bGUoSk9CX0RFTEFZKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCi0JCQkJZmluYWwgT2JqZWN0W10gcmVtb3ZlZCA9IHByb2plY3RzUmVtb3ZlZC5nZXRMaXN0ZW5lcnMoKTsKLQkJCQlmaW5hbCBPYmplY3RbXSB1cGRhdGVkID0gcHJvamVjdHNVcGRhdGVkLmdldExpc3RlbmVycygpOwotCQkJCWZpbmFsIE9iamVjdFtdIGFkZGVkID0gcHJvamVjdHNBZGRlZC5nZXRMaXN0ZW5lcnMoKTsKLQkJCQlpZiAocmVtb3ZlZC5sZW5ndGggPT0gMCAmJiB1cGRhdGVkLmxlbmd0aCA9PSAwICYmIGFkZGVkLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCQlpbmNyZW1lbnRNb2RTdGFtcCgpOwotCQkJCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQkJCQotCQkJCQkgLy8gR1JLIC0gd2h5IGRvbid0IHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIGpvYiBhZ2Fpbj8gCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCQkKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQlmaW5hbCBEZXBlbmRlbmN5R3JhcGhFdmVudCBldmVudCA9IG5ldyBEZXBlbmRlbmN5R3JhcGhFdmVudCgpOwotCi0JCQkJCQkvLyBhbGwgcmVmZXJlbmNlcyB3aWxsIGJlIHJlYnVpbHQgZHVyaW5nIGFuIGFkZAotCQkJCQkJaWYgKGFkZGVkLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQkJLy8gdGhpcyBpcyB0aGUgc2ltcGxlIGNhc2U7IGp1c3QgcmVtb3ZlIHRoZW0gYWxsCi0JCQkJCQkJc3luY2hyb25pemVkIChncmFwaExvY2spIHsKLQkJCQkJCQkJZm9yIChPYmplY3QgbyA6IHJlbW92ZWQpIHsKLQkJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG87Ci0JCQkJCQkJCQlyZW1vdmVBbGxSZWZlcmVuY2VzKHByb2plY3QsIGV2ZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGdldCB0aGUgdXBkYXRlZCBxdWV1ZSBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgYWRkcwotCQkJCQkJLy8gaWYgdGhlcmUgYXJlIGFueSBhZGRlZCBwcm9qZWN0cywgdGhlbiB1bmZvcnR1bmF0ZWx5Ci0JCQkJCQkvLyB0aGUgZW50aXJlIHdvcmtzcGFjZSBuZWVkcyB0byBiZSBwcm9jZXNzZWQKLQkJCQkJCWlmIChhZGRlZC5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJcmVtb3ZlQWxsUmVmZXJlbmNlcyhldmVudCk7Ci0JCQkJCQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IG51bGw7Ci0JCQkJCQkJaW50IHN0YXRlID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN0YXRlKCk7Ci0JCQkJCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQkJCQkJYWxsUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQotCQkJCQkJCWZvciAoSVByb2plY3Qgc291cmNlUHJvamVjdCA6IGFsbFByb2plY3RzKSB7Ci0JCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHNvdXJjZVByb2plY3QpOwotCQkJCQkJCQlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgVmlydHVhbENvbXBvbmVudCkgewotCQkJCQkJCQkJKChWaXJ0dWFsQ29tcG9uZW50KSBjb21wb25lbnQpLmZsdXNoQ2FjaGUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJCWZvciAoSVByb2plY3Qgc291cmNlUHJvamVjdCA6IGFsbFByb2plY3RzKSB7Ci0JCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHNvdXJjZVByb2plY3QpOwotCQkJCQkJCQlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgVmlydHVhbENvbXBvbmVudCkgewotCQkJCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gKChWaXJ0dWFsQ29tcG9uZW50KSBjb21wb25lbnQpLmdldFJhd1JlZmVyZW5jZXMoKTsKLQkJCQkJCQkJCWZvciAoSVZpcnR1YWxSZWZlcmVuY2UgcmVmIDogcmVmZXJlbmNlcykgewotCQkJCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQkJCQkJaWYgKHRhcmdldENvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBudWxsICYmICF0YXJnZXRQcm9qZWN0LmVxdWFscyhzb3VyY2VQcm9qZWN0KSkgewotCQkJCQkJCQkJCQkJYWRkUmVmZXJlbmNlKHNvdXJjZVByb2plY3QsCXRhcmdldFByb2plY3QsIGV2ZW50KTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAodXBkYXRlZC5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IG51bGw7Ci0JCQkJCQkJaW50IHN0YXRlID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN0YXRlKCk7Ci0JCQkJCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQkJCQkJYWxsUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQotCQkJCQkJCVNldDxJUHJvamVjdD4gdmFsaWRSZWZzID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0JCQkJCQkJZm9yIChPYmplY3QgbyA6IHVwZGF0ZWQpIHsKLQkJCQkJCQkJSVByb2plY3Qgc291cmNlUHJvamVjdCA9IChJUHJvamVjdCkgbzsKLQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoc291cmNlUHJvamVjdCk7Ci0JCQkJCQkJCWlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJCQkJCQl2YWxpZFJlZnMuY2xlYXIoKTsKLQkJCQkJCQkJCSgoVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50KS5mbHVzaENhY2hlKCk7Ci0JCQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSAoKFZpcnR1YWxDb21wb25lbnQpIGNvbXBvbmVudCkuZ2V0UmF3UmVmZXJlbmNlcygpOwotCQkJCQkJCQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWYgOiByZWZlcmVuY2VzKSB7Ci0JCQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQkJCQlpZiAodGFyZ2V0Q29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IHRhcmdldENvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IG51bGwgJiYgIXRhcmdldFByb2plY3QuZXF1YWxzKHNvdXJjZVByb2plY3QpKSB7Ci0JCQkJCQkJCQkJCQl2YWxpZFJlZnMuYWRkKHRhcmdldFByb2plY3QpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJc3luY2hyb25pemVkIChncmFwaExvY2spIHsKLQkJCQkJCQkJCQlmb3IgKElQcm9qZWN0IHRhcmdldFByb2plY3QgOiBhbGxQcm9qZWN0cykgewotCQkJCQkJCQkJCQkvLyBpZiB0aGUgcmVmZXJlbmNlIHdhcyBpZGVudGlmaWVkIGFib3ZlLCBiZSBzdXJlIHRvIGFkZCBpdCBvdGhlcndpc2UsIHJlbW92ZSBpdAotCQkJCQkJCQkJCQlpZiAodmFsaWRSZWZzLnJlbW92ZSh0YXJnZXRQcm9qZWN0KSkgewotCQkJCQkJCQkJCQkJYWRkUmVmZXJlbmNlKHNvdXJjZVByb2plY3QsCXRhcmdldFByb2plY3QsIGV2ZW50KTsKLQkJCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCXJlbW92ZVJlZmVyZW5jZShzb3VyY2VQcm9qZWN0LAl0YXJnZXRQcm9qZWN0LCBldmVudCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBpZiB0aGlzIHByb2plY3QgaXMgbm90IGEgY29tcG9uZW50LCB0aGVuIGl0IHNob3VsZCBiZSBjb21wbGV0ZWx5IHJlbW92ZWQuCi0JCQkJCQkJCQlyZW1vdmVBbGxSZWZlcmVuY2VzKHNvdXJjZVByb2plY3QsIGV2ZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW5vdGlmaXlMaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXNldFJ1bm5pbmcoZmFsc2UpOwotCQkJCWpvYklMb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJRGVwZW5kZW5jeUdyYXBoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSURlcGVuZGVuY3lHcmFwaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZml5TGlzdGVuZXJzKGZpbmFsIERlcGVuZGVuY3lHcmFwaEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRUeXBlKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGZpcmUgbm90aWZpY2F0aW9ucyBvbiBhIGRpZmZlcmVudCBqb2Igc28gdGhleSBkbyBub3QgYmxvY2sKLQkJLy8gd2FpdEZvckFsbFVwZGF0ZXMoKQotCQlKb2Igbm90aWZpY2F0aW9uSm9iID0gbmV3IEpvYihSZXNvdXJjZXMuTk9USUZJQ0FUSU9OX0pPQl9OQU1FKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQlmb3IgKE9iamVjdCBsaXN0ZW5lciA6IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCQkJCSgoSURlcGVuZGVuY3lHcmFwaExpc3RlbmVyKSBsaXN0ZW5lcikuZGVwZW5kZW5jeUdyYXBoVXBkYXRlKGV2ZW50KTsKLQkJCQkJCX0KLQkJCQkJCXNhdmVHcmFwaCgpOyAvLyB0cmlnZ2VyIGEgZnV0dXJlIHNhdmUKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZXhjZXB0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlub3RpZmljYXRpb25Kb2Iuc2V0U3lzdGVtKHRydWUpOwotCQlub3RpZmljYXRpb25Kb2Iuc2V0UnVsZShudWxsKTsKLQkJbm90aWZpY2F0aW9uSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlOiB1cGRhdGUocHJvamVjdCwgSURlcGVuZGVuY3lHcmFwaC5BRERFRCk7Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpfQotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlUHJvamVjdEFkZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdXBkYXRlKHByb2plY3QsIElEZXBlbmRlbmN5R3JhcGguQURERUQpOwotCX0KLQotCS8qKgotCSAqIFVzZTogdXBkYXRlKHByb2plY3QsIElEZXBlbmRlbmN5R3JhcGguUkVNT1ZFRCk7Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpfQotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlUHJvamVjdERlbGV0ZWQoSVByb2plY3QgcHJvamVjdCkgewotCQl1cGRhdGUocHJvamVjdCwgSURlcGVuZGVuY3lHcmFwaC5SRU1PVkVEKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2U6IHVwZGF0ZShwcm9qZWN0LCBJRGVwZW5kZW5jeUdyYXBoLk1PRElGSUVEKTsKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICN1cGRhdGUoSVByb2plY3QsIGludCl9Ci0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdXBkYXRlKHByb2plY3QsIElEZXBlbmRlbmN5R3JhcGguTU9ESUZJRUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBpbnQgdXBkYXRlVHlwZSkgewotCQlzd2l0Y2ggKHVwZGF0ZVR5cGUpIHsKLQkJY2FzZSBJRGVwZW5kZW5jeUdyYXBoLk1PRElGSUVEOgotCQkJZ3JhcGhVcGRhdGVKb2IucXVldWVQcm9qZWN0VXBkYXRlZChwcm9qZWN0KTsKLQkJCWJyZWFrOwotCQljYXNlIElEZXBlbmRlbmN5R3JhcGguQURERUQ6Ci0JCQlncmFwaFVwZGF0ZUpvYi5xdWV1ZVByb2plY3RBZGRlZChwcm9qZWN0KTsKLQkJCWJyZWFrOwotCQljYXNlIElEZXBlbmRlbmN5R3JhcGguUkVNT1ZFRDoKLQkJCWdyYXBoVXBkYXRlSm9iLnF1ZXVlUHJvamVjdERlbGV0ZWQocHJvamVjdCk7Ci0JCQlicmVhazsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKGpvYkxvY2spIHsKLQkJCWlmIChwYXVzZUNvdW50ID4gMClyZXR1cm47Ci0JCQlncmFwaFVwZGF0ZUpvYi5zY2hlZHVsZShKT0JfREVMQVkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGF1c2VzIHVwZGF0ZXM7IGFueSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhyb3VnaCBhCi0JICogdHJ5L2ZpbmFsbHkgYmxvY2sgdGhhdCBwb3N0VXBkYXRlIGlzIHN1YnNlcXVlbnRseSBjYWxsZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJlVXBkYXRlKCkgewotCQlzeW5jaHJvbml6ZWQgKGpvYkxvY2spIHsKLQkJCXBhdXNlQ291bnQrKzsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7Ci0JCXN5bmNocm9uaXplZCAoam9iTG9jaykgewotCQkJaWYgKHBhdXNlQ291bnQgPiAwKXBhdXNlQ291bnQtLTsJCQkKLQkJCWlmIChwYXVzZUNvdW50ID4gMClyZXR1cm47Ci0JCQlncmFwaFVwZGF0ZUpvYi5zY2hlZHVsZShKT0JfREVMQVkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2FpdEZvckFsbFVwZGF0ZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc3ViTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yKTsKLQkJc3ViTW9uaXRvci5zdWJUYXNrKFJlc291cmNlcy5XQUlUSU5HKTsKLQotCQlKb2IgY3VycmVudEpvYiA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotCQlpZiAoY3VycmVudEpvYiAhPSBncmFwaFVwZGF0ZUpvYikgewotCQkJLy8gR1JLIC0gVGhpcyBzZWVtcyBkYW5nZXJvdXMsIHdlIHNob3VsZCBkb2N1bWVudCB3aHkgdGhpcyBjYWxsIGlzIGhlcmUuCi0JCQlpZiAoSm9iLmdldEpvYk1hbmFnZXIoKS5pc1N1c3BlbmRlZCgpKSB7Ci0JCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5yZXN1bWUoKTsKLQkJCX0KLQkJCQotCQkJd2hpbGUgKGlzVXBkYXRlTmVjZXNzYXJ5KCkpIHsKLQkJCQlpZiAoc3ViTW9uaXRvci5pc0NhbmNlbGVkKCkpdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0KLQkJCQkvLyBFbnN1cmUgYW55IHBlbmRpbmcgd29yayBoYXMgY2F1c2VkIHRoZSBqb2IgdG8gYmVjb21lIHNjaGVkdWxlZAotCQkJCWlmIChncmFwaFVwZGF0ZUpvYi5zaG91bGRTY2hlZHVsZSgpKSB7Ci0JCQkJCWdyYXBoVXBkYXRlSm9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJCS8vIFdha2UgdXAgYW55IHNsZWVwaW5nIGpvYnMgc2luY2Ugd2UncmUgZ29pbmcgdG8gd2FpdCBvbiB0aGUgam9iLAotCQkJCS8vIHRoZXJlIGlzIG5vIHNlbnNlIHRvIHdhaXQgZm9yIGEgc2xlZXBpbmcgam9iCi0JCQkJZ3JhcGhVcGRhdGVKb2Iud2FrZVVwKCk7Ci0JCQkJaWYgKGN1cnJlbnRKb2IgIT0gbnVsbCAmJiAhUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJCWN1cnJlbnRKb2IueWllbGRSdWxlKHN1Yk1vbml0b3IubmV3Q2hpbGQoMTAwKSk7Ci0JCQkJfQotCi0JCQkJZ3JhcGhVcGRhdGVKb2Iud2FpdEZvclJ1big1MDApOwotCi0JCQkJYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChqb2JJTG9jay5hY3F1aXJlKDUwMCkpIHsKLQkJCQkJCWpvYklMb2NrLnJlbGVhc2UoKTsKLQkJCQkJCS8vIG9ubHkgZXhpdCBpZiB0aGUgam9iIGhhcyBoYWQgYSBjaGFuY2UgdG8gcnVuCi0JCQkJCQlpZiAoIWlzVXBkYXRlTmVjZXNzYXJ5KCkpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJaW50ZXJydXB0ZWQgPSB0cnVlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpbnRlcnJ1cHRlZCkgewotCQkJCQkJLy8gUHJvcGFnYXRlIGludGVycnVwdHMKLQkJCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG51bGwgIT0gbW9uaXRvcikgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvLyBuZWNlc3NhcnkgaWYgdGhlIGpvYiBpcyBydW5uaW5nLCB3YWl0aW5nLCBvciBzbGVlcGluZwotCS8vIG9yIHRoZXJlIGlzIGFueXRoaW5nIGluIHRoZSBncmFwaCBxdWV1ZS4KLQlwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGVOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiBncmFwaFVwZGF0ZUpvYi5nZXRTdGF0ZSgpICE9IEpvYi5OT05FIHx8IGdyYXBoVXBkYXRlSm9iLnNob3VsZFNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzdG9yZWRHcmFwaFJlc3VsdHMgewotCQlwcml2YXRlIERlcGVuZGVuY3lHcmFwaEV2ZW50IGV2ZW50OwotCQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gZ3JhcGg7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmaWxlIHdpbGwgYmUgc3RvcmVkIGhlcmU6Ci0JICogLm1ldGFkYXRhXC5wbHVnaW5zXG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZQotCSAqIFxkZXBlbmRlbmN5Q2FjaGUuaW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQRU5ERU5DWV9HUkFQSF9DQUNIRSA9ICJkZXBlbmRlbmN5Q2FjaGUuaW5kZXgiOwotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIGdyYXBoIGlmIHBvc3NpYmxlIGFuZCByZXR1cm5zIGEge0BsaW5rIFJlc3RvcmVkR3JhcGhSZXN1bHRzfQotCSAqIGlmIHN1Y2Nlc3NmdWwuCi0JICogCi0JICogPHA+Ci0JICogSXQgaXMgZXNzZW50aWFsIHRoaXMgbWV0aG9kIGRvIGV2ZXJ5dGhpbmcgcG9zc2libGUgdG8gYXZvaWQgcmVzdG9yaW5nIGJhZAotCSAqIGRhdGEgdG8gZW5zdXJlIGJhZCBkYXRhIGRvZXMgbm90IGNvcnJ1cHQgdGhlIGN1cnJlbnQgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqIElmIGJhZCBkYXRhIGlzIGRldGVjdGVkLCBpdCBpcyBkZWxldGVkIHRvIGF2b2lkIGEgcmVwZWF0IGZhaWx1cmUgdGhlIG5leHQKLQkgKiB0aW1lIHRoZSB3b3Jrc3BhY2UgaXMgcmVzdGFydGVkLgotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIFJlc3RvcmVkR3JhcGhSZXN1bHRzfSBpZiBzdWNjZXNzZnVsIGluIHJlc3RvcmluZyB0aGUKLQkgKiAgICAgICAgIGdyYXBoLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc3VjY2Vzc2Z1bAotCSAqLwotCXByaXZhdGUgUmVzdG9yZWRHcmFwaFJlc3VsdHMgcmVzdG9yZUdyYXBoKCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChncmFwaExvY2spIHsKLQkJCQlncmFwaCA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBTZXQ8SVByb2plY3Q+PigpOwotCQkJCUlQYXRoIHN0YXRlTG9jYXRpb24gPSBNb2R1bGVjb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCQkJRmlsZSBmaWxlID0gc3RhdGVMb2NhdGlvbi5hcHBlbmQoREVQRU5ERU5DWV9HUkFQSF9DQUNIRSkudG9GaWxlKCk7Ci0JCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBudWxsOyAvLyBubyBzdGF0ZSB0byByZXN0b3JlIGZyb20KLQkJCQl9IGVsc2UgewotCQkJCQlIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IHNhdmVkTWFwID0gbnVsbDsKLQkJCQkJRmlsZUlucHV0U3RyZWFtIGZJbiA9IG51bGw7Ci0JCQkJCWJvb2xlYW4gZGVsZXRlQ2FjaGUgPSB0cnVlOwotCQkJCQl0cnkgewotCQkJCQkJZkluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYkluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZkluKTsKLQkJCQkJCU9iamVjdElucHV0U3RyZWFtIG9JbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiSW4pOwotCQkJCQkJc2F2ZWRNYXAgPSAoSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+Pikgb0luLnJlYWRPYmplY3QoKTsKLQkJCQkJCW9Jbi5jbG9zZSgpOwotCQkJCQkJZGVsZXRlQ2FjaGUgPSBmYWxzZTsKLQkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChmSW4gIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWZJbi5jbG9zZSgpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGVsZXRlQ2FjaGUpIHsKLQkJCQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzYXZlZE1hcCAhPSBudWxsKSB7IAotCQkJCQkJLy8gd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmVzdG9yZSB0aGUgc3RhdGUgZnJvbQotCQkJCQkJLy8gZmlyc3QgY2hlY2sgdG8gZW5zdXJlIGFsbCBwcm9qZWN0cyBhcmUgc3RpbGwgcHJlc2VudAotCQkJCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJCQlmb3IgKFN0cmluZyBzb3VyY2VQcm9qZWN0TmFtZSA6IHNhdmVkTWFwLmtleVNldCgpKSB7Ci0JCQkJCQkJSVByb2plY3Qgc291cmNlUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChzb3VyY2VQcm9qZWN0TmFtZSk7Ci0JCQkJCQkJaWYgKCFzb3VyY2VQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCVNldDxTdHJpbmc+IHRhcmdldFByb2plY3ROYW1lcyA9IHNhdmVkTWFwLmdldChzb3VyY2VQcm9qZWN0TmFtZSk7Ci0JCQkJCQkJCWZvciAoU3RyaW5nIHRhcmdldFByb2plY3ROYW1lIDogdGFyZ2V0UHJvamVjdE5hbWVzKSB7Ci0JCQkJCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHRhcmdldFByb2plY3ROYW1lKTsKLQkJCQkJCQkJCWlmICghdGFyZ2V0UHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBuZXh0IGFkZCB0aGUgcmVmZXJlbmNlcwotCQkJCQkJRGVwZW5kZW5jeUdyYXBoRXZlbnQgZXZlbnQgPSBuZXcgRGVwZW5kZW5jeUdyYXBoRXZlbnQoKTsKLQkJCQkJCWluY3JlbWVudE1vZFN0YW1wKCk7Ci0JCQkJCQlldmVudCA9IG5ldyBEZXBlbmRlbmN5R3JhcGhFdmVudCgpOwotCQkJCQkJZXZlbnQuc2V0TW9kU3RhbXAoZ2V0TW9kU3RhbXAoKSk7Ci0KLQkJCQkJCVNldDxFbnRyeTxTdHJpbmcsIFNldDxTdHJpbmc+Pj4gZW50cmllcyA9IHNhdmVkTWFwLmVudHJ5U2V0KCk7Ci0JCQkJCQlmb3IgKEVudHJ5PFN0cmluZywgU2V0PFN0cmluZz4+IGVudHJ5IDogZW50cmllcykgewotCQkJCQkJCUlQcm9qZWN0IHNvdXJjZVByb2plY3QgPSByb290LmdldFByb2plY3QoZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJCWZvciAoU3RyaW5nIHRhcmdldFByb2plY3ROYW1lIDogZW50cnkuZ2V0VmFsdWUoKSkgewotCQkJCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHRhcmdldFByb2plY3ROYW1lKTsKLQkJCQkJCQkJYWRkUmVmZXJlbmNlKHRhcmdldFByb2plY3QsIHNvdXJjZVByb2plY3QsIGV2ZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCVJlc3RvcmVkR3JhcGhSZXN1bHRzIHJlc3VsdHMgPSBuZXcgUmVzdG9yZWRHcmFwaFJlc3VsdHMoKTsKLQkJCQkJCXJlc3VsdHMuZXZlbnQgPSBldmVudDsKLQkJCQkJCXJlc3VsdHMuZ3JhcGggPSBzYXZlZE1hcDsKLQotCQkJCQkJLy8gZmluYWxseSBlbnN1cmUgdGhlIHJlc3VsdHMgYXJlIGFjY3VyYXRlCi0JCQkJCQljaGVja1Jlc3RvcmVkUmVzdWx0cyhyZXN1bHRzKTsKLQkJCQkJCXJldHVybiByZXN1bHRzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJdHJ5IHsKLQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCUlQYXRoIHN0YXRlTG9jYXRpb24gPSBNb2R1bGVjb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCQkJRmlsZSBmaWxlID0gc3RhdGVMb2NhdGlvbi5hcHBlbmQoREVQRU5ERU5DWV9HUkFQSF9DQUNIRSkudG9GaWxlKCk7Ci0JCQkJZmlsZS5kZWxldGUoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJCS8vIGVhdCBpdAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgY2xhc3MgUGVyc2lzdEpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIFBlcnNpc3RKb2IoKSB7Ci0JCQlzdXBlcihSZXNvdXJjZXMuR1JBUEhfU0FWRV9KT0JfTkFNRSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRSdWxlKG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlwZXJzaXN0KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihleGNlcHRpb24pOwotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgcGVyc2lzdERlbGF5ID0gNjAwMDA7IC8vIDEgbWludXRlCi0JcHJpdmF0ZSBmaW5hbCBQZXJzaXN0Sm9iIHBlcnNpc3RKb2IgPSBuZXcgUGVyc2lzdEpvYigpOwotCi0JLyoqCi0JICogRmFybSBvdXQgdGhlIEkvTyB0byBhIGpvYiB0byBtaW5pbWl6ZSB0aGUgbmVjZXNzYXJ5IHByb2Nlc3NpbmcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVHcmFwaCgpIHsKLQkJcGVyc2lzdEpvYi5zY2hlZHVsZShwZXJzaXN0RGVsYXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJzaXN0KCkgewotCQlNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gc2F2ZWRNYXAgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGdyYXBoTG9jaykgewotCQkJc2F2ZWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PihncmFwaC5zaXplKCkpOwotCQkJZm9yIChJUHJvamVjdCBzb3VyY2VQcm9qZWN0IDogZ3JhcGgua2V5U2V0KCkpIHsKLQkJCQlTZXQ8U3RyaW5nPiBzYXZlZFRhcmdldHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJZm9yIChJUHJvamVjdCB0YXJnZXRQcm9qZWN0IDogZ3JhcGguZ2V0KHNvdXJjZVByb2plY3QpKSB7Ci0JCQkJCXNhdmVkVGFyZ2V0cy5hZGQodGFyZ2V0UHJvamVjdC5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlzYXZlZE1hcC5wdXQoc291cmNlUHJvamVjdC5nZXROYW1lKCksIHNhdmVkVGFyZ2V0cyk7Ci0JCQl9Ci0JCX0KLQkJSVBhdGggc3RhdGVMb2NhdGlvbiA9IE1vZHVsZWNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQkJRmlsZSBmaWxlID0gc3RhdGVMb2NhdGlvbi5hcHBlbmQoREVQRU5ERU5DWV9HUkFQSF9DQUNIRSkudG9GaWxlKCk7Ci0JCWlmIChzYXZlZE1hcC5pc0VtcHR5KCkpIHsKLQkJCS8vIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcGVyc2lzdCwgZGVsZXRlIHRoZSBmaWxlLgotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlmaWxlLmRlbGV0ZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJRmlsZU91dHB1dFN0cmVhbSBmT3V0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZk91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJPdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZk91dCk7Ci0JCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG9PdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJPdXQpOwotCQkJCW9PdXQud3JpdGVPYmplY3Qoc2F2ZWRNYXApOwotCQkJCW9PdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZk91dCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmT3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tSZXN0b3JlZFJlc3VsdHMoZmluYWwgUmVzdG9yZWRHcmFwaFJlc3VsdHMgcmVzdG9yZWRHcmFwaFJlc3VsdHMpIHsKLQkJSm9iIGNoZWNrUmVzdG9yZURhdGFKb2IgPSBuZXcgSm9iKFJlc291cmNlcy5DSEVDS19HUkFQSF9SRVNUT1JFX0pPQl9OQU1FKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IG51bGw7Ci0JCQkJCQkJaW50IHN0YXRlID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN0YXRlKCk7Ci0JCQkJCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQkJCQkJYWxsUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoaXNTdGFsZShhbGxQcm9qZWN0cykpIHsKLQkJCQkJCQkJcmVidWlsZChhbGxQcm9qZWN0cyk7Ci0JCQkJCQkJCXNhdmVHcmFwaCgpOyAvLyB0cmlnZ2VyIGEgZnV0dXJlIHNhdmUKLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcHJpdmF0ZSBib29sZWFuIGlzU3RhbGUoSVByb2plY3RbXSBhbGxQcm9qZWN0cykgewotCQkJCQkJaWYgKHJlc3RvcmVkR3JhcGhSZXN1bHRzLmV2ZW50LmdldE1vZFN0YW1wKCkgIT0gZ2V0TW9kU3RhbXAoKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCi0JCQkJCQlIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGNvbXB1dGVkR3JhcGggPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOwotCi0JCQkJCQlmb3IgKElQcm9qZWN0IHNvdXJjZVByb2plY3QgOiBhbGxQcm9qZWN0cykgewotCQkJCQkJCWlmIChyZXN0b3JlZEdyYXBoUmVzdWx0cy5ldmVudC5nZXRNb2RTdGFtcCgpICE9IGdldE1vZFN0YW1wKCkpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHNvdXJjZVByb2plY3QpOwotCQkJCQkJCWlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9ICgoVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50KS5nZXRSYXdSZWZlcmVuY2VzKCk7Ci0JCQkJCQkJCWZvciAoSVZpcnR1YWxSZWZlcmVuY2UgcmVmIDogcmVmZXJlbmNlcykgewotCQkJCQkJCQkJaWYgKHJlc3RvcmVkR3JhcGhSZXN1bHRzLmV2ZW50LmdldE1vZFN0YW1wKCkgIT0gZ2V0TW9kU3RhbXAoKSkgewotCQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQkJCWlmICh0YXJnZXRDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IG51bGwgJiYgIXRhcmdldFByb2plY3QuZXF1YWxzKHNvdXJjZVByb2plY3QpKSB7Ci0JCQkJCQkJCQkJCVN0cmluZyB0YXJnZXRQcm9qZWN0TmFtZSA9IHRhcmdldFByb2plY3QuZ2V0TmFtZSgpOwotCQkJCQkJCQkJCQlTdHJpbmcgc291cmNlUHJvamVjdE5hbWUgPSBzb3VyY2VQcm9qZWN0LmdldE5hbWUoKTsKLQkJCQkJCQkJCQkJU2V0PFN0cmluZz4gdGFyZ2V0UHJvamVjdHMgPSBjb21wdXRlZEdyYXBoLmdldCh0YXJnZXRQcm9qZWN0TmFtZSk7Ci0JCQkJCQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCQl0YXJnZXRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQkJCQkJCQkJCWNvbXB1dGVkR3JhcGgucHV0KHRhcmdldFByb2plY3ROYW1lLCB0YXJnZXRQcm9qZWN0cyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJdGFyZ2V0UHJvamVjdHMuYWRkKHNvdXJjZVByb2plY3ROYW1lKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzdG9yZWRHcmFwaFJlc3VsdHMuZXZlbnQuZ2V0TW9kU3RhbXAoKSAhPSBnZXRNb2RTdGFtcCgpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIXJlc3RvcmVkR3JhcGhSZXN1bHRzLmdyYXBoLmVxdWFscyhjb21wdXRlZEdyYXBoKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQkJaWYgKHJlc3RvcmVkR3JhcGhSZXN1bHRzLmV2ZW50LmdldE1vZFN0YW1wKCkgIT0gZ2V0TW9kU3RhbXAoKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZXhjZXB0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQljaGVja1Jlc3RvcmVEYXRhSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJY2hlY2tSZXN0b3JlRGF0YUpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQljaGVja1Jlc3RvcmVEYXRhSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkIChncmFwaExvY2spIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigiRGVwZW5kZW5jeSBHcmFwaDpcbntcbiIpOwotCQkJZm9yIChNYXAuRW50cnk8SVByb2plY3QsIFNldDxJUHJvamVjdD4+IGVudHJ5IDogZ3JhcGguZW50cnlTZXQoKSkgewotCQkJCWJ1ZmYuYXBwZW5kKCIgICIgKyBlbnRyeS5nZXRLZXkoKS5nZXROYW1lKCkgKyAiIC0+IHsiKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0PiBtYXBwZWRQcm9qZWN0cyA9IGVudHJ5LmdldFZhbHVlKCkuaXRlcmF0b3IoKTsgbWFwcGVkUHJvamVjdHMuaGFzTmV4dCgpOykgewotCQkJCQlidWZmLmFwcGVuZChtYXBwZWRQcm9qZWN0cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKG1hcHBlZFByb2plY3RzLmhhc05leHQoKSkgewotCQkJCQkJYnVmZi5hcHBlbmQoIiwgIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnVmZi5hcHBlbmQoIn1cbiIpOwotCQkJfQotCQkJYnVmZi5hcHBlbmQoIn0iKTsKLQkJCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgV0FJVElORzsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgSk9CX05BTUU7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PVElGSUNBVElPTl9KT0JfTkFNRTsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hFQ0tfR1JBUEhfUkVTVE9SRV9KT0JfTkFNRTsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfU0FWRV9KT0JfTkFNRTsKLQotCQlzdGF0aWMgewotCQkJaW5pdGlhbGl6ZU1lc3NhZ2VzKERlcGVuZGVuY3lHcmFwaEltcGwuY2xhc3MuZ2V0TmFtZSgpLAlSZXNvdXJjZXMuY2xhc3MpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhJbXBsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhJbXBsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMGY0ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoSW1wbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1XQUlUSU5HPVdhaXRpbmcKLUpPQl9OQU1FPUdyYXBoIFVwZGF0ZQotTk9USUZJQ0FUSU9OX0pPQl9OQU1FPUdyYXBoIFVwZGF0ZSBOb3RpZmljYXRpb24KLUNIRUNLX0dSQVBIX1JFU1RPUkVfSk9CX05BTUU9R3JhcGggUmVzdG9yZQotR1JBUEhfU0FWRV9KT0JfTkFNRT1HcmFwaCBwZXJzaXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjI3NWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSURlcGVuZGVuY3lHcmFwaH0KLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lHcmFwaE1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRGVwZW5kZW5jeUdyYXBoTWFuYWdlciBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwcml2YXRlIERlcGVuZGVuY3lHcmFwaE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeUdyYXBoTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpCi0JCQlJTlNUQU5DRSA9IG5ldyBEZXBlbmRlbmN5R3JhcGhNYW5hZ2VyKCk7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25zdHJ1Y3QoSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXBlbmRlbmN5IGdyYXBoIHdoaWNoIHdhcyBpbml0aWFsaXplZCBpZiBuZWVkIGJlIGluIHRoZQotCSAqIHNpbmdsZXRvbiBtYW5hZ2VyIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeUdyYXBoIGdldERlcGVuZGVuY3lHcmFwaCgpIHsKLQkJcmV0dXJuIERlcGVuZGVuY3lHcmFwaC5nZXRJbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmNlUmVmcmVzaCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBsb25nIGdldE1vZFN0YW1wKCkgewotCQlyZXR1cm4gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRNb2RTdGFtcCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrSWZTdGlsbFZhbGlkKGxvbmcgdGltZVN0YW1wKSB7Ci0JCXJldHVybiBJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmdldE1vZFN0YW1wKCkgPT0gdGltZVN0YW1wOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaFJlZmVyZW5jZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaFJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1MTk1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhSZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi1jbGFzcyBEZXBlbmRlbmN5R3JhcGhSZWZlcmVuY2VzIGltcGxlbWVudHMgSURlcGVuZGVuY3lHcmFwaFJlZmVyZW5jZXMgewotCi0JSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0KLQlTZXQ8SVByb2plY3Q+IHJlZmVyZW5jaW5nUHJvamVjdHMgPSBudWxsOwotCi0JYm9vbGVhbiBzdGFsZTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGhSZWZlcmVuY2VzI2dldFRhcmdldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGFyZ2V0UHJvamVjdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci5JRGVwZW5kZW5jeUdyYXBoUmVmZXJlbmNlcyNnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKQotCSAqLwotCXB1YmxpYyBTZXQ8SVByb2plY3Q+IGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpIHsKLQkJcmV0dXJuIHJlZmVyZW5jaW5nUHJvamVjdHM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXIuSURlcGVuZGVuY3lHcmFwaFJlZmVyZW5jZXMjaXNTdGFsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKLQkJcmV0dXJuIHN0YWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0lEZXBlbmRlbmN5R3JhcGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0lEZXBlbmRlbmN5R3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NzM1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9JRGVwZW5kZW5jeUdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiBUaGlzIGdyYXBoIHByb3ZpZGVzIGEgYmFja3dhcmQgbWFwcGluZyBvZiBwcm9qZWN0IGNvbXBvbmVudCBkZXBlbmRlbmNpZXMuIEl0Ci0gKiBwcm92aWRlcyBhIHByb2plY3QgbGltaXRlZCBpbnZlcnNlIG9mCi0gKiB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnQjZ2V0UmVmZXJlbmNlcygpfS4KLSAqIAotICogPHA+Rm9yIGV4YW1wbGU6Ci0gKiA8dWw+Ci0gKiA8bGk+aWYgdGhlIElWaXJ0dWFsQ29tcG9uZW50IGZvciBwcm9qZWN0IEEgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGUKLSAqIElWaXJ0dWFsQ29tcG9uZW50IGZvciBwcm9qZWN0IEIsIHRoZW4gY2FsbGluZwotICoge0BsaW5rICNnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoSVByb2plY3QpfSBvbiBwcm9qZWN0IEIgd2lsbCByZXR1cm4gcHJvamVjdAotICogQS4gPC9saT4KLSAqIDxsaT5pZiB0aGUgSVZpcnR1YWxDb21wb25lbnQgZm9yIHByb2plY3QgQSBoYXMgYSBkZXBlbmRlbmN5IG9uIG9uIHRoZQotICogSVZpcnR1YWxDb21wb25lbnQgZm9yIGEgamFyIGluIHByb2plY3QgQiwgdGhlbiBjYWxsaW5nCi0gKiB7QGxpbmsgI2dldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhJUHJvamVjdCl9IGZvciBwcm9qZWN0IEIgd2lsbCByZXR1cm4gcHJvamVjdAotICogQS4gVGhpcyBpcyB0cnVlIGV2ZW4gaWYgcHJvamVjdCBCIGlzIG5vdCBkZWZpbmVkIGFzIGFuIElWaXJ0dWFsQ29tcG9uZW50LgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEFueSBjYWxsIHRvIHtAbGluayAjZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0KX0gaXMgYWx3YXlzIGV4cGVjdGVkIHRvCi0gKiBiZSB1cCB0byBkYXRlLiBUaGUgb25seSBjYXNlIHdoZXJlIGEgY2xpZW50IG1heSBuZWVkIHRvIGZvcmNlIGFuIHVwZGF0ZSBpcyBpZgotICogdGhhdCBjbGllbnQgaXMgYWxzbyBkZWZpbmluZyBkeW5hbWljIElWaXJ0dWFsQ29tcG9uZW50IGRlcGVuZGVuY2llcywgaS5lLiB0aGUKLSAqIGNsaWVudCBpcyB1c2luZyB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmNvbXBvbmVudGltcGwgZXh0ZW5zaW9uCi0gKiBwb2ludC4gT25seSBpbiB0aGlzIGNhc2Ugc2hvdWxkIGEgY2xpZW50IGJlIGNhbGxpbmcgYW55IG9mCi0gKiB7QGxpbmsgI3ByZVVwZGF0ZSgpfSwge0BsaW5rICNwb3N0VXBkYXRlKCl9LCBvciB7QGxpbmsgI3VwZGF0ZShJUHJvamVjdCl9Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVwZW5kZW5jeUdyYXBoIHsKLQotCS8qKgotCSAqIEZsYWcgdXNlZCBieSB7QGxpbmsgI3VwZGF0ZShJUHJvamVjdCwgaW50KX0gdG8gc3BlY2lmeSB0aGF0IHNvbWV0aGluZyBoYXMgYmVlbgotCSAqIG1vZGlmaWVkIGluIGEgcHJvamVjdCB3aGljaCBoYXMgY2hhbmdlZCB0aGUgY29tcG9uZW50IGRlcGVuZGVuY2llcy4KLQkgKi8KLQlpbnQgTU9ESUZJRUQgPSAwOwotCi0JLyoqCi0JICogRmxhZyB1c2VkIGJ5IHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpfSB0byBzcGVjaWZ5IGEgcHJvamVjdCBoYXMgYmVlbgotCSAqIGFkZGVkIG9yIG9wZW5lZC4gVGhpcyBmbGFnIHNob3VsZCBiZSB1c2VkIGFzIHNwYXJpbmdseSBhcyBwb3NzaWJsZQotCSAqIGJlY2F1c2UgdGhlcmUgYXJlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4KLQkgKi8KLQlpbnQgQURERUQgPSAxOwotCi0JLyoqCi0JICogRmxhZyB1c2VkIGJ5IHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpfSB0byBzcGVjaWZ5IGEgcHJvamVjdCBoYXMgYmVlbgotCSAqIHJlbW92ZWQgb3IgY2xvc2VkLgotCSAqLwotCWludCBSRU1PVkVEID0gMjsKLQotCS8qKgotCSAqIFRoZSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBncmFwaC4KLQkgKi8KLQlJRGVwZW5kZW5jeUdyYXBoIElOU1RBTkNFID0gRGVwZW5kZW5jeUdyYXBoSW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0IG9mIGNvbXBvbmVudCBwcm9qZWN0cyByZWZlcmVuY2luZyB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHRhcmdldFByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JU2V0PElQcm9qZWN0PiBnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoSVByb2plY3QgdGFyZ2V0UHJvamVjdCk7Ci0KLQkvKioKLQkgKiBJZiA8Y29kZT53YWl0Rm9yQWxsVXBkYXRlczwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhpcyBtZXRob2QgaXMKLQkgKiBlcXVpdmFsZW50IHRvIHtAbGluayAjZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0KX0uIE90aGVyd2lzZSB0aGlzCi0JICogbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyBmb3IgYWxsIHVwZGF0ZXMgdG8gb2NjdXIKLQkgKiBhbmQgcG90ZW50aWFsbHkgcmV0dXJuaW5nIHN0YWxlIGRhdGEuIFRoaXMgYSBzYWZlciB3YXkgdG8gY2FsbAotCSAqIGdldFJlZmVyZW5jZXMgdG8gYXZvaWQgZGVhZGxvY2tzLiBJZiBzdGFsZSBkYXRhIGlzIHJldHVybmVkLCB0aGVuIGEKLQkgKiBzdWJzZXF1ZW50IG9uIHRoZSBzYW1lIHRocmVhZCBjYW4gYmUgbWFkZSwgYnV0IHRoZXJlIG1heSBiZSBkZWFkbG9jayByaXNrCi0JICogZGVwZW5kaW5nIG9uIHdoYXQgSVNjaGVkdWxpbmdSdWxlIGlzIGN1cnJlbnRseSBoZWxkLiAgQSBzYWZlciByZWFjdGlvbgotCSAqIHRvIHN0YWxlIGRhdGEgd291bGQgYmUgdG8gc2NoZWR1bGUgYW5vdGhlciBqb2IgdG8gcnVuIGluIGZ1dHVyZSB0byB0cnkgYWdhaW4uCi0JICogCi0JICogQHBhcmFtIHRhcmdldFByb2plY3QKLQkgKiBAcGFyYW0gd2FpdEZvckFsbFVwZGF0ZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JSURlcGVuZGVuY3lHcmFwaFJlZmVyZW5jZXMgZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0IHRhcmdldFByb2plY3QsIGJvb2xlYW4gd2FpdEZvckFsbFVwZGF0ZXMpOwotCQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyB1cGRhdGVzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzU3RhbGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbW9kaWZpY2F0aW9uIHN0YW1wLiBUaGlzIG1vZGlmaWNhdGlvbiBzdGFtcCB3aWxsIGJlIGRpZmZlcmVudAotCSAqIGlmIHRoZSBwcm9qZWN0IGRlcGVuZGVuY2llcyBldmVyIGNoYW5nZS4KLQkgKi8KLQlsb25nIGdldE1vZFN0YW1wKCk7Ci0JCi0Jdm9pZCBhZGRMaXN0ZW5lcihJRGVwZW5kZW5jeUdyYXBoTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCXZvaWQgcmVtb3ZlTGlzdGVuZXIoSURlcGVuZGVuY3lHcmFwaExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFdBUk5JTkc6IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IGltcGxlbWVudG9ycyBvZiB0aGUKLQkgKiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuY29tcG9uZW50aW1wbCBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUgdXBkYXRlIEFQSS4KLQkgKiAKLQkgKiBAc2VlIHtAbGluayAjdXBkYXRlKElQcm9qZWN0KX0KLQkgKi8KLQl2b2lkIHByZVVwZGF0ZSgpOwotCi0JLyoqCi0JICogV0FSTklORzogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgaW1wbGVtZW50b3JzIG9mIHRoZQotCSAqIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5jb21wb25lbnRpbXBsIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiA8cD5UaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB1cGRhdGUgQVBJLgotCSAqIAotCSAqIEBzZWUge0BsaW5rICN1cGRhdGUoSVByb2plY3QpfQotCSAqLwotCXZvaWQgcG9zdFVwZGF0ZSgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjdXBkYXRlKElQcm9qZWN0LCBpbnQpIHVzaW5nIHRoZSAjTU9ESUZJRUQgZmxhZy4KLQkgKi8KLQl2b2lkIHVwZGF0ZShJUHJvamVjdCBzb3VyY2VQcm9qZWN0KTsKLQotCS8qKgotCSAqIFdBUk5JTkc6IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IGltcGxlbWVudG9ycyBvZiB0aGUKLQkgKiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuY29tcG9uZW50aW1wbCBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2hlbiBhIHJlc291cmNlIGNoYW5nZSBpcyBkZXRlY3RlZCB3aGljaCB3aWxsCi0JICogYWZmZWN0IGhvdyBkZXBlbmRlbmNpZXMgYmVoYXZlLiBGb3IgZXhhbXBsZSwgdGhlIGNvcmUgSVZpcnR1YWxDb21wb25lbnQKLQkgKiBmcmFtZXdvcmsgdXBkYXRlcyB3aGVuIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlCi0JICogLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50IGZpbGUgY2hhbmdlcywgYW5kIGFsc28gd2hlbgotCSAqIElQcm9qZWN0cyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc3BhY2UuIEluIHRoZSBjYXNlIGZvciBKMkVFLAotCSAqIHRoaXMgb2NjdXJzIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgTUVUQS1JTkYvTUFOSUZFU1QuTUYgZmlsZS4gSW4KLQkgKiBnZW5lcmFsIGEgY2FsbCB0byB1cGRhdGUgc2hvdWxkIG9ubHkgYmUgbWFkZSBmcm9tIGEgZmFzdAotCSAqIHtAbGluayBJUmVzb3VyY2VEZWx0YVZpc2l0b3J9LgotCSAqIAotCSAqIDxwPkluIG9yZGVyIHRvIGltcHJvdmUgZWZmaWNpZW5jeSBhbmQgYXZvaWQgdW5uZWNlc3NhcnkgdXBkYXRlIHByb2Nlc3NpbmcsCi0JICogaXQgaXMgbmVjZXNzYXJ5IHRvIGFsd2F5cyBwcm9jZWVkIGNhbGxzIHRvIHVwZGF0ZSgpIHdpdGggYSBjYWxsIHRvCi0JICogcHJlVXBkYXRlKCkgYW5kIGZvbGxvdyB3aXRoIGEgY2FsbCB0byBwb3N0VXBkYXRlKCkgdXNpbmcgYSB0cnkgZmluYWxseQotCSAqIGJsb2NrIGFzIGZvbGxvd3M6IAotCSAqIDxwcmU+Ci0JICogdHJ5IHsKLQkgKiAgICAgcHJlVXBkYXRlKCk7Ci0JICogICAgIC8vIHBlcmZvcm0gMCBvciBtb3JlIHVwZGF0ZSgpIGNhbGxzIGhlcmUKLQkgKiB9IGZpbmFsbHkgewotCSAqICAgICBJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLnBvc3RVcGRhdGUoKTsKLQkgKiB9ICAgIAotCSAqIDwvcHJlPgotCSAqIAotCSAqIFZhbGlkIHVwZGF0ZVR5cGUgZmxhZ3MgYXJlIHtAbGluayAjTU9ESUZJRUR9LCB7QGxpbmsgI0FEREVEfSwgYW5kCi0JICoge0BsaW5rICNSRU1PVkVEfQotCSAqIAotCSAqLwotCXZvaWQgdXBkYXRlKElQcm9qZWN0IHNvdXJjZVByb2plY3QsIGludCB1cGRhdGVUeXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvSURlcGVuZGVuY3lHcmFwaExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9JRGVwZW5kZW5jeUdyYXBoTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmNjM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9JRGVwZW5kZW5jeUdyYXBoTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbmN5R3JhcGhMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBkZXBlbmRlbmN5R3JhcGhVcGRhdGUoSURlcGVuZGVuY3lHcmFwaFVwZGF0ZUV2ZW50IGV2ZW50KTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0lEZXBlbmRlbmN5R3JhcGhSZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9JRGVwZW5kZW5jeUdyYXBoUmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2U3MTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0lEZXBlbmRlbmN5R3JhcGhSZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbmN5R3JhcGhSZWZlcmVuY2VzIHsKLQotCUlQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiByZWZlcmVuY2luZyBwcm9qZWN0czsgc2VlCi0JICoge0BsaW5rIElEZXBlbmRlbmN5R3JhcGgjZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0KX0KLQkgKi8KLQlTZXQ8SVByb2plY3Q+IGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCi0JLyoqCi0JICogSWYgdGhpcyByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBkYXRhCi0JICogYXJlIHN0YWxlLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoaXMgZGF0YSBhcmUgYWNjdXJhdGUuCi0JICovCi0JYm9vbGVhbiBpc1N0YWxlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9JRGVwZW5kZW5jeUdyYXBoVXBkYXRlRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0lEZXBlbmRlbmN5R3JhcGhVcGRhdGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTA3NDhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0lEZXBlbmRlbmN5R3JhcGhVcGRhdGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJRGVwZW5kZW5jeUdyYXBoVXBkYXRlRXZlbnQgewotCi0JaW50IEFEREVEID0gMTsKLQlpbnQgUkVNT1ZFRCA9IDI7Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgYml0d2lzZSBvciBvZiB0aGUgcmVmZXJlbmNlIGNoYW5nZSB0eXBlcy4KLQkgKiAKLQkgKiBAc2VlIHtAbGluayAjQURERUR9IHtAbGluayAjUkVNT1ZFRH0KLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmaWNhdGlvbiBzdGFtcCBmb3IgdGhlIGxhc3QgdXBkYXRlIGNoYW5nZSBpbiB0aGUKLQkgKiB7QGxpbmsgSURlcGVuZGVuY3lHcmFwaH0gYmVpbmcgbm90aWZpZWQgYnkgdGhpcyBldmVudC4KLQkgKiAKLQkgKiA8cD5Ob3RlIHRoYXQgdXBkYXRlcyB0byB0aGUge0BsaW5rIElEZXBlbmRlbmN5R3JhcGh9IG1heSBiZSBxdWV1ZWQgc28KLQkgKiBzZXZlcmFsIGFyZSBoYW5kbGVkIGJ5IGEgc2luZ2xlIGV2ZW50LgotCSAqIAotCSAqIEBzZWUgSURlcGVuZGVuY3lHcmFwaCNnZXRNb2RTdGFtcCgpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWxvbmcgZ2V0TW9kU3RhbXAoKTsKLQotCS8qKgotCSAqIFRoZSBrZXkgY29udGFpbnMgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50LCB0aGUgdmFsdWUgY29udGFpbnMgdGhlIHNldCBvZgotCSAqIHJlZmVyZW5jaW5nIGNvbXBvbmVudHMgcmVjZW50bHkgYWRkZWQuIFRoaXMgbWFwIHdpbGwgb25seSBjb250YWluIHRoZQotCSAqIGNoYW5nZXMgc2luY2UgdGhlIGxhc3QgZXZlbnQgd2FzIGZpcmVkLiBJZiB7QGxpbmsgI2dldFR5cGUoKX0gfAotCSAqIHtAbGluayAjQURERUR9ICE9IHtAbGluayAjQURERUR9IHRoZW4gdGhpcyB3aWxsIGJlIGFuIGVtcHR5IG1hcC4KLQkgKiAKLQkgKiA8cD5Ob3RlIHRoYXQgdGhlIGNoYW5nZXMgc3BlY2lmaWVkIGJ5IHRoaXMgbWFwIGRvIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0Ci0JICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHtAbGluayBJRGVwZW5kZW5jeUdyYXBofSBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlCi0JICogdGhhdCBhZGRpdGlvbmFsIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGlzIGV2ZW50IHdhcyBmaXJlZC4KLQkgKiB7QGxpbmsgSURlcGVuZGVuY3lHcmFwaCNnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoSVByb2plY3QpfSB3aWxsIHJldHVybgotCSAqIHRoZSBjdXJyZW50IHJlZmVyZW5jZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTWFwPElQcm9qZWN0LCBTZXQ8SVByb2plY3Q+PiBnZXRBZGRlZFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFRoZSBrZXkgY29udGFpbnMgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50LCB0aGUgdmFsdWUgY29udGFpbnMgdGhlIHNldCBvZgotCSAqIHJlZmVyZW5jaW5nIGNvbXBvbmVudHMgcmVjZW50bHkgcmVtb3ZlZC4gVGhpcyBtYXAgd2lsbCBvbmx5IGNvbnRhaW4gdGhlCi0JICogY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCBldmVudCB3YXMgZmlyZWQuIElmIHtAbGluayAjZ2V0VHlwZSgpfSB8Ci0JICoge0BsaW5rICNSRU1PVkVEfSAhPSB7QGxpbmsgI1JFTU9WRUR9IHRoZW4gdGhpcyB3aWxsIGJlIGFuIGVtcHR5IG1hcC4KLQkgKiAKLQkgKiA8cD5Ob3RlIHRoYXQgdGhlIGNoYW5nZXMgc3BlY2lmaWVkIGJ5IHRoaXMgbWFwIGRvIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0Ci0JICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHtAbGluayBJRGVwZW5kZW5jeUdyYXBofSBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlCi0JICogdGhhdCBhZGRpdGlvbmFsIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGlzIGV2ZW50IHdhcyBmaXJlZC4KLQkgKiB7QGxpbmsgSURlcGVuZGVuY3lHcmFwaCNnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoSVByb2plY3QpfSB3aWxsIHJldHVybgotCSAqIHRoZSBjdXJyZW50IHJlZmVyZW5jZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTWFwPElQcm9qZWN0LCBTZXQ8SVByb2plY3Q+PiBnZXRSZW1vdmVkUmVmZXJlbmNlcygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvQWJzdHJhY3RGbGF0dGVuUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0NGUwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRWaXJ0dWFsQ29tcG9uZW50LkZsYXRDb21wb25lbnRUYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEEgc2ltcGxlIGFic3RyYWN0IGNsYXNzIHdpdGggZGVmYXVsdCB2YWx1ZXMgc28gY2xpZW50cwotICogY2FuIGV4dGVuZCBhbmQgb3ZlcnJpZGUgb25seSB0aGUgbWV0aG9kIHRoZXkgY2FyZSBhYm91dAotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RGbGF0dGVuUGFydGljaXBhbnQgaW1wbGVtZW50cyBJRmxhdHRlblBhcnRpY2lwYW50IHsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LAotCQkJRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsIExpc3Q8SUZsYXRSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuT3B0aW1pemUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LAotCQkJRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wdGltaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsIAotCQkJTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMsIExpc3Q8SUNoaWxkTW9kdWxlUmVmZXJlbmNlPiBjaGlsZE1vZHVsZXMpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaW5hbGl6ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwgTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQsCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwgSUZsYXRGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCwKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZWQsIEZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRBZGRFeHBvcnRhYmxlRmlsZShJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LAotCQkJSVZpcnR1YWxDb21wb25lbnQgY3VycmVudENvbXBvbmVudCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsCi0JCQlJRmxhdEZpbGUgZmlsZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSWdub3JlUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQsCi0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2VkLCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGdldENoaWxkTW9kdWxlcyhJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0NoaWxkTW9kdWxlUmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9DaGlsZE1vZHVsZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhhZjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0NoaWxkTW9kdWxlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogQ2xpZW50cyBvZiB0aGlzIGNsYXNzIHdpbGwgbmVlZCB0byBwYXkgYXR0ZW50aW9uIHRvIAotICogaWYgdGhpcyBtb2R1bGUgaXMgYmluYXJ5IG9yIG5vdC4gSWYgaXQncyBiaW5hcnksIHlvdSAKLSAqIHNob3VsZCBnZXQgdGhlIGZpbGUsIGFuZCBjb3B5IGl0IGRpcmVjdGx5IHRvIHRoZSBVUkkgcHJvdmlkZWQuCi0gKiAKLSAqIElmIGl0J3Mgbm90IGJpbmFyeSwgeW91IHNob3VsZCB1c2UgdGhlIHByb3ZpZGVkIHVyaQotICogYXMgYSBiYXNlIGZyb20gd2hpY2ggeW91IGNhbiBhcHBlbmQgaXQncyBtZW1iZXIgcmVzb3VyY2VzCi0gKiAgCi0gKiBTdHJpbmcgcGFyZW50UmVsYXRpdmUgPSBtb2R1bGUuZ2V0UmVsYXRpdmVVUkkoKTsgLy8gIHBhdGgvdG8vY2hpbGRtb2QuamFyCi0gKiBTdHJpbmcgdXJpID0gcGFyZW50TG9jLmFwcGVuZChwYXJlbnRSZWxhdGl2ZSk7Ci0gKiBpZiggbW9kdWxlLmlzQmluYXJ5KCkpIHsKLSAqICAgIEZpbGUgZiA9IG1vZHVsZS5nZXRGaWxlKCk7Ci0gKiAgICAvLyBjb3B5IGZpbGUgZiB0byB1cmk7Ci0gKiB9IGVsc2UgewotICogICAgRXhwb3J0TW9kZWwgZW0gPSBuZXcgRXhwb3J0TW9kZWwobW9kdWxlLmdldENvbXBvbmVudCgpKTsKLSAqICAgIEV4cG9ydGFibGVSZXNvdXJjZVtdIG1lbWJlcnMgPSBlbS5mZXRjaFJlc291cmNlcygpOwotICogICAgU3RyaW5nIHVyaTEgPSB1cmkuYXBwZW5kKG1lbWJlcnNbMV0uZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpOwotICogICAgU3RyaW5nIHVyaTIgPSAuLi4uCi0gKiB9Ci0gKiBAYXV0aG9yIHJvYgotICoKLSAqLwotcHVibGljIGNsYXNzIENoaWxkTW9kdWxlUmVmZXJlbmNlIGltcGxlbWVudHMgSUNoaWxkTW9kdWxlUmVmZXJlbmNlIHsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JcHJpdmF0ZSBJUGF0aCB1cmk7Ci0JcHVibGljIENoaWxkTW9kdWxlUmVmZXJlbmNlKElQcm9qZWN0IHByb2plY3QsIElGbGF0RmlsZSBmKSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuZmlsZSA9IGYgPT0gbnVsbCA/IG51bGwgOiAoRmlsZSlmLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCWlmKCBmICE9IG51bGwgJiYgZmlsZSAhPSBudWxsICkgewotCQkJdGhpcy51cmkgPSBmLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChmLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENoaWxkTW9kdWxlUmVmZXJlbmNlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSwgSVBhdGggcm9vdCkgewotCQl0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJdGhpcy5jb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQl0aGlzLnByb2plY3QgPSB0aGlzLmNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCWlmKCBjb21wb25lbnQuaXNCaW5hcnkoKSApIHsKLQkJCUZpbGUgZiA9IChGaWxlKWNvbXBvbmVudC5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJaWYoIGYuZXhpc3RzKCkgJiYgZi5pc0ZpbGUoKSkgewotCQkJCXRoaXMuZmlsZSA9IGY7Ci0JCQl9Ci0JCX0KLQkJdGhpcy51cmkgPSByb290LmFwcGVuZChyZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSkuYXBwZW5kKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogV2lsbCByZXR1cm4gYSBmaWxlIGlmIHRoaXMgY2FuIGJlIHRyYWNrZWQgdG8gb25lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbXBvbmVudCBpZiBpdCBleGlzdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJaWYoIGNvbXBvbmVudCAhPSBudWxsICkgCi0JCQlyZXR1cm4gY29tcG9uZW50OwotCQlpZiggZmlsZSAhPSBudWxsICkgCi0JCQlyZXR1cm4gbmV3IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KHByb2plY3QsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgIi8iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IFBhdGgoIi8iKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGlzIGlzIGEgc2luZ2xlIGZpbGUsIHJldHVybiB0cnVlLgotCSAqIElmIGEgbW9yZSBjb21wbGV4IGNvbXBvbmVudCwgcmV0dXJuIGZhbHNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCkgewotCQlyZXR1cm4gY29tcG9uZW50ID09IG51bGwgfHwgY29tcG9uZW50LmlzQmluYXJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgcmVsYXRpdmUgVVJJIHRvIGl0J3MgZGlyZWN0IHBhcmVudCwgCi0JICogaW5jbHVkaW5nIHBhdGggKyBmaWxlbmFtZSArIGV4dGVuc2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UmVsYXRpdmVVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvRmlsdGVyUmVzb3VyY2VQYXJ0aWNpcGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvRmlsdGVyUmVzb3VyY2VQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzVjYWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0ZpbHRlclJlc291cmNlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuRmxhdFZpcnR1YWxDb21wb25lbnQuRmxhdENvbXBvbmVudFRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyUmVzb3VyY2VQYXJ0aWNpcGFudCBleHRlbmRzIEFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50IHsKLQlwdWJsaWMgaW50ZXJmYWNlIElFeHBvcnRhYmxlUmVzb3VyY2VGaWx0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKElGbGF0UmVzb3VyY2UgcmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlckV4dGVuc2lvbnNQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElFeHBvcnRhYmxlUmVzb3VyY2VGaWx0ZXIgewotCQlwcml2YXRlIFN0cmluZ1tdIGJhbm5lZEV4dGVuc2lvbnM7Ci0JCXB1YmxpYyBGaWx0ZXJFeHRlbnNpb25zUGFydGljaXBhbnQoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQkJdGhpcy5iYW5uZWRFeHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKElGbGF0UmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCUlGaWxlIGlmaWxlID0gKElGaWxlKXJlc291cmNlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJaWYoIGlmaWxlICE9IG51bGwgKSB7Ci0JCQkJbmFtZSA9IGlmaWxlLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRmlsZSBmID0gKEZpbGUpcmVzb3VyY2UuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKLQkJCQlpZiggZiAhPSBudWxsICkKLQkJCQkJbmFtZSA9IGYuZ2V0TmFtZSgpOwotCQkJfQotCQkJaWYoIG5hbWUgIT0gbnVsbCkgewotCQkJCWZvciggaW50IGkgPSAwOyBpIDwgYmFubmVkRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyApIHsKLQkJCQkJaWYoIG5hbWUuZW5kc1dpdGgoYmFubmVkRXh0ZW5zaW9uc1tpXSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfSAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEZpbHRlclJlc291cmNlUGFydGljaXBhbnQgY3JlYXRlU3VmZml4RmlsdGVyUGFydGljaXBhbnQoU3RyaW5nW10gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IEZpbHRlclJlc291cmNlUGFydGljaXBhbnQobmV3IEZpbHRlckV4dGVuc2lvbnNQYXJ0aWNpcGFudChzdHJpbmdzKSk7Ci0JfQotCQotCXByaXZhdGUgSUV4cG9ydGFibGVSZXNvdXJjZUZpbHRlciBmaWx0ZXI7Ci0JcHVibGljIEZpbHRlclJlc291cmNlUGFydGljaXBhbnQoSUV4cG9ydGFibGVSZXNvdXJjZUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3VsZEFkZEV4cG9ydGFibGVGaWxlKElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQsCi0JCQlJVmlydHVhbENvbXBvbmVudCBjdXJyZW50Q29tcG9uZW50LCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwKLQkJCUlGbGF0RmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWx0ZXIuYWNjZXB0cyhmaWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9GbGF0RmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvRmxhdEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2MzlmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9GbGF0RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEEgZGVwbG95YWJsZSBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGF0RmlsZSBleHRlbmRzIEZsYXRSZXNvdXJjZSBpbXBsZW1lbnRzIElGbGF0RmlsZSB7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdHJlYW07Ci0JcHJpdmF0ZSBJRmlsZSBmaWxlOwotCXByaXZhdGUgRmlsZSBmaWxlMjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgSVBhdGggcGF0aDsKLQlwcml2YXRlIGxvbmcgc3RhbXAgPSAtMTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3b3Jrc3BhY2UgbW9kdWxlIGZpbGUgd2l0aCB0aGUgY3VycmVudCBtb2RpZmljYXRpb24gc3RhbXAuCi0JICogCi0JICogQHBhcmFtIGZpbGUgYSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZQotCSAqLwotCXB1YmxpYyBGbGF0RmlsZShJRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJc3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgKyBmaWxlLmdldExvY2FsVGltZVN0YW1wKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlcm5hbCBtb2R1bGUgZmlsZSAKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKi8KLQlwdWJsaWMgRmxhdEZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLmZpbGUyID0gZmlsZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJaWYgKGZpbGUyICE9IG51bGwpCi0JCQlzdGFtcCA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5rbm93biBtb2R1bGUgZmlsZSB3aXRoIGEgc3BlY2lmaWMgbW9kaWZpY2F0aW9uIHN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBzdGFtcAotCSAqLwotCXB1YmxpYyBGbGF0RmlsZShJbnB1dFN0cmVhbSBpcywgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIGxvbmcgc3RhbXApIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5zdHJlYW0gPSBpczsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5zdGFtcCA9IHN0YW1wOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIHVua25vd24gbW9kdWxlIGZpbGUgd2l0aCB0aGUgY3VycmVudCBtb2RpZmljYXRpb24gc3RhbXAuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIEZsYXRGaWxlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCkgewotCQl0aGlzKGlzLCBuYW1lLCBwYXRoLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1vZHVsZSBmaWxlIHdpdGggYSBzcGVjaWZpYyBtb2RpZmljYXRpb24gc3RhbXAgYW5kIG5vCi0JICogZmlsZSByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBzdGFtcAotCSAqLwotCXB1YmxpYyBGbGF0RmlsZShTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgbG9uZyBzdGFtcCkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLnN0YW1wID0gc3RhbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlI2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIHN0YW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBGbGF0RmlsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlGbGF0RmlsZSBtZiA9IChGbGF0RmlsZSkgb2JqOwotCQlpZiAoIW5hbWUuZXF1YWxzKG1mLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcGF0aC5lcXVhbHMobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpICogMzcgKyBwYXRoLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsKSB7Ci0JCWlmIChJRmlsZS5jbGFzcy5lcXVhbHMoY2wpIHx8IElSZXNvdXJjZS5jbGFzcy5lcXVhbHMoY2wpKQotCQkJcmV0dXJuIGZpbGU7Ci0JCWVsc2UgaWYgKEZpbGUuY2xhc3MuZXF1YWxzKGNsKSkgewotCQkJaWYoIGZpbGUyICE9IG51bGwgKQotCQkJCXJldHVybiBmaWxlMjsKLQkJCWlmKCBmaWxlICE9IG51bGwgKQotCQkJCXJldHVybiBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCX0KLQkJZWxzZSBpZiggSW5wdXRTdHJlYW0uY2xhc3MuZXF1YWxzKGNsKSkgewotCQkJdHJ5IHsKLQkJCQlpZiggc3RyZWFtICE9IG51bGwgKQotCQkJCQlyZXR1cm4gc3RyZWFtOwotCQkJCWlmKCBmaWxlMiAhPSBudWxsICYmIGZpbGUyLmV4aXN0cygpKSAKLQkJCQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOwotCQkJCWlmKCBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgCi0JCQkJCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0JCQl9IGNhdGNoKCBJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkvLyBEbyBOb3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJEZXBsb3lhYmxlRmlsZSBbIiArIG5hbWUgKyAiLCAiICsgcGF0aCArICIsICIgKyBzdGFtcCArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvRmxhdEZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvRmxhdEZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTVjMDIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0ZsYXRGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUZsYXRGb2xkZXJ9IGZvciBwaHlzaWNhbCBmb2xkZXJzIG9uIGRpc2sgb3IgaW4gdGhlCi0gKiB3b3Jrc3BhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGF0Rm9sZGVyIGV4dGVuZHMgRmxhdFJlc291cmNlIGltcGxlbWVudHMgSUZsYXRGb2xkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZsYXRSZXNvdXJjZVtdIEVNUFRZX1JFU09VUkNFX0FSUkFZID0gbmV3IEZsYXRSZXNvdXJjZVswXTsKLQotCXByaXZhdGUgSUNvbnRhaW5lciBjb250YWluZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIElQYXRoIHBhdGg7Ci0JcHJpdmF0ZSBJRmxhdFJlc291cmNlW10gbWVtYmVyczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtb2R1bGUgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIgdGhlIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVua25vd24gY29udGFpbmVyCi0JICogQHBhcmFtIG5hbWUgYSBuYW1lCi0JICogQHBhcmFtIHBhdGggdGhlIG1vZHVsZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgRmxhdEZvbGRlcihJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWVtYmVycyAoY29udGVudHMpIG9mIHRoaXMgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBtZW1iZXJzIHRoZSBtZW1iZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVtYmVycyhJRmxhdFJlc291cmNlW10gbWVtYmVycykgewotCQl0aGlzLm1lbWJlcnMgPSBtZW1iZXJzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXIjbWVtYmVycygpCi0JICovCi0JcHVibGljIElGbGF0UmVzb3VyY2VbXSBtZW1iZXJzKCkgewotCQlpZiAobWVtYmVycyA9PSBudWxsKQotCQkJcmV0dXJuIEVNUFRZX1JFU09VUkNFX0FSUkFZOwotCQlyZXR1cm4gbWVtYmVyczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEZsYXRGb2xkZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJRmxhdEZvbGRlciBtZiA9IChGbGF0Rm9sZGVyKSBvYmo7Ci0JCWlmICghbmFtZS5lcXVhbHMobWYubmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghcGF0aC5lcXVhbHMobWYucGF0aCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBuYW1lLmhhc2hDb2RlKCkgKiAzNyArIHBhdGguaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2wpIHsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlpZiAoSUNvbnRhaW5lci5jbGFzcy5lcXVhbHMoY2wpIHx8IElGb2xkZXIuY2xhc3MuZXF1YWxzKGNsKSB8fCBJUmVzb3VyY2UuY2xhc3MuZXF1YWxzKGNsKSkKLQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJaWYoIEZpbGUuY2xhc3MuZXF1YWxzKGNsKSkKLQkJCQlyZXR1cm4gY29udGFpbmVyLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJEZXBsb3lhYmxlRm9sZGVyIFsiICsgbmFtZSArICIsICIgKyBwYXRoICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9GbGF0UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0ZsYXRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZmMTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0ZsYXRSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxhdFJlc291cmNlIGltcGxlbWVudHMgSUZsYXRSZXNvdXJjZSwgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHJlbGF0aXZlIHBhdGggdG8gdGhpcyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIHJlc291cmNlCi0JICovCi0JcHVibGljIGFic3RyYWN0IElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvRmxhdFZpcnR1YWxDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0ZsYXRWaXJ0dWFsQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDE5ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvRmxhdFZpcnR1YWxDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LlNob3VsZEluY2x1ZGVVdGlsaXR5Q2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBGbGF0VmlydHVhbENvbXBvbmVudCBpbXBsZW1lbnRzIElGbGF0VmlydHVhbENvbXBvbmVudCwgU2hvdWxkSW5jbHVkZVV0aWxpdHlDYWxsYmFjayB7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGbGF0Q29tcG9uZW50VGFza01vZGVsIGV4dGVuZHMgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4gewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBkYXRhbW9kZWwsIHdoaWNoIG1heSBjb250YWluIHByZWZlcmVuY2VzLCBzZXR0aW5ncywgb3Igb3RoZXIgZGF0YQotCSAqIHVzZWQgYnkgdGhlIHZhcmlvdXMgcGFydGljaXBhbnRzIHRvIGRldGVybWluZSBob3cgdG8gcHJvcGVybHkgCi0JICogdHJhdmVyc2UgdGhpcyBjb21wb25lbnQuIAotCSAqLwotCXByaXZhdGUgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWw7Ci0JCi0JLyoqCi0JICogVGhlIHJvb3QgY29tcG9uZW50IGJlaW5nIGZsYXR0ZW5lZC4gCi0JICovCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgcGFydGljaXBhbnRzIHRvIGVuZ2FnZSBpbiB0aGUgZmxhdHRlbmluZyBwcm9jZXNzLiAKLQkgKi8KLQlwcml2YXRlIElGbGF0dGVuUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHM7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBtZW1iZXIgcmVzb3VyY2VzIGZvciB0aGlzIGNvbXBvbmVudAotCSAqLwotCXByaXZhdGUgTGlzdDxJRmxhdFJlc291cmNlPiBtZW1iZXJzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBjaGlsZCBtb2R1bGVzIGZvciB0aGlzIGNvbXBvbmVudAotCSAqLwotCXByaXZhdGUgTGlzdDxJQ2hpbGRNb2R1bGVSZWZlcmVuY2U+IGNoaWxkcmVuID0gbnVsbDsKLQkKLQkKLQlwdWJsaWMgRmxhdFZpcnR1YWxDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXRoaXMoY29tcG9uZW50LCBuZXcgRmxhdENvbXBvbmVudFRhc2tNb2RlbCgpKTsKLQl9Ci0JCi0JcHVibGljIEZsYXRWaXJ0dWFsQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQlwYXJ0aWNpcGFudHMgPSBzZXRQYXJ0aWNpcGFudHMoKTsKLQkJZGF0YU1vZGVsLnB1dChFWFBPUlRfTU9ERUwsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGxpc3Qgb2YgcGFydGljaXBhbnRzIGZvciB0aGlzIHZpcnR1YWwgY29tcG9uZW50LiAKLQkgKiBUaGlzIGlzIHB1bGxlZCBmcm9tIHRoZSBkYXRhbW9kZWwuIAotCSAqLwotCXByb3RlY3RlZCBJRmxhdHRlblBhcnRpY2lwYW50W10gc2V0UGFydGljaXBhbnRzKCkgewotCQlPYmplY3QgbyA9IGRhdGFNb2RlbC5nZXQoUEFSVElDSVBBTlRfTElTVCk7Ci0JCWlmKCBvICE9IG51bGwgKSB7Ci0JCQlpZiggbyBpbnN0YW5jZW9mIElGbGF0dGVuUGFydGljaXBhbnQgKQotCQkJCXJldHVybiBuZXcgSUZsYXR0ZW5QYXJ0aWNpcGFudFtdIHsgKElGbGF0dGVuUGFydGljaXBhbnQpb307Ci0JCQlpZiggbyBpbnN0YW5jZW9mIElGbGF0dGVuUGFydGljaXBhbnRbXSkKLQkJCQlyZXR1cm4gKElGbGF0dGVuUGFydGljaXBhbnRbXSlvOwotCQkJaWYoIG8gaW5zdGFuY2VvZiBMaXN0ICkgewotCQkJCUxpc3Q8SUZsYXR0ZW5QYXJ0aWNpcGFudD4gbCA9IChMaXN0PElGbGF0dGVuUGFydGljaXBhbnQ+KW87Ci0JCQkJcmV0dXJuIChJRmxhdHRlblBhcnRpY2lwYW50W10pIGwKLQkJCQkJCS50b0FycmF5KG5ldyBJRmxhdHRlblBhcnRpY2lwYW50W2wuc2l6ZSgpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBJRmxhdHRlblBhcnRpY2lwYW50W117fTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdFZpcnR1YWxDb21wb25lbnQjZmV0Y2hSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBJRmxhdFJlc291cmNlW10gZmV0Y2hSZXNvdXJjZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKCBtZW1iZXJzID09IG51bGwpCi0JCQljYWNoZVJlc291cmNlcygpOwotCQlyZXR1cm4gKEZsYXRSZXNvdXJjZVtdKSBtZW1iZXJzLnRvQXJyYXkobmV3IEZsYXRSZXNvdXJjZVttZW1iZXJzLnNpemUoKV0pOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0VmlydHVhbENvbXBvbmVudCNnZXRDaGlsZE1vZHVsZXMoKQotCSAqLwotCXB1YmxpYyBJQ2hpbGRNb2R1bGVSZWZlcmVuY2VbXSBnZXRDaGlsZE1vZHVsZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKCBtZW1iZXJzID09IG51bGwgKQotCQkJY2FjaGVSZXNvdXJjZXMoKTsKLQkJcmV0dXJuIChDaGlsZE1vZHVsZVJlZmVyZW5jZVtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBDaGlsZE1vZHVsZVJlZmVyZW5jZVtjaGlsZHJlbi5zaXplKCldKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgY2FjaGVSZXNvdXJjZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bkluaXRpYWxpemF0aW9ucygpOwotCQlpZiggY2FuT3B0aW1pemUoKSkgewotCQkJb3B0aW1pemUobWVtYmVycywgY2hpbGRyZW4pOwotCQl9IGVsc2UgewotCQkJdHJlZVdhbGsoKTsKLQkJCXJ1bkZpbmFsaXphdGlvbnMobWVtYmVycyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcnVuSW5pdGlhbGl6YXRpb25zKCkgewotCQltZW1iZXJzID0gbmV3IEFycmF5TGlzdDxJRmxhdFJlc291cmNlPigpOwotCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SUNoaWxkTW9kdWxlUmVmZXJlbmNlPigpOwotCQlmb3IoIGludCBpID0gMDsgaSA8IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyApIHsKLQkJCXBhcnRpY2lwYW50c1tpXS5pbml0aWFsaXplKGNvbXBvbmVudCwgZGF0YU1vZGVsLCBtZW1iZXJzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5PcHRpbWl6ZSgpIHsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBwYXJ0aWNpcGFudHMubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiggcGFydGljaXBhbnRzW2ldLmNhbk9wdGltaXplKGNvbXBvbmVudCwgZGF0YU1vZGVsKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3B0aW1pemUoTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMsIExpc3Q8SUNoaWxkTW9kdWxlUmVmZXJlbmNlPiBjaGlsZHJlbikgewotCQlmb3IoIGludCBpID0gMDsgaSA8IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyApIHsKLQkJCWlmKCBwYXJ0aWNpcGFudHNbaV0uY2FuT3B0aW1pemUoY29tcG9uZW50LCBkYXRhTW9kZWwpKSB7Ci0JCQkJcGFydGljaXBhbnRzW2ldLm9wdGltaXplKGNvbXBvbmVudCwgZGF0YU1vZGVsLCByZXNvdXJjZXMsIGNoaWxkcmVuKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcnVuRmluYWxpemF0aW9ucyhMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlmb3IoIGludCBpID0gMDsgaSA8IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyApIHsKLQkJCXBhcnRpY2lwYW50c1tpXS5maW5hbGl6ZShjb21wb25lbnQsIGRhdGFNb2RlbCwgcmVzb3VyY2VzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0cmVlV2FsaygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkgdXRpbCA9IG5ldyBWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkobWVtYmVycywgdGhpcyk7Ci0JCQlJVmlydHVhbEZvbGRlciB2Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCQotCQkJLy8gYWN0dWFsbHkgd2FsayB0aGUgdHJlZQotCQkJdXRpbC5hZGRNZW1iZXJzKGNvbXBvbmVudCwgdkZvbGRlciwgUGF0aC5FTVBUWSk7Ci0KLQkJCS8vYWRkUmVsZXZhbnRPdXRwdXRGb2xkZXJzKCk7IC8vIHRvIGJlIGRvbmUgaW4gYSBwYXJ0aWNpcGFudCBsYXRlcgotCi0JCQlhZGRDb25zdW1lZFJlZmVyZW5jZXModXRpbCwgY29tcG9uZW50LCBuZXcgUGF0aCgiIikpOwotCQkJYWRkVXNlZFJlZmVyZW5jZXModXRpbCwgY29tcG9uZW50LCBuZXcgUGF0aCgiIikpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnN1bWVkIHJlZmVyZW5jZXMgYXJlLCBieSBkZWZpbml0aW9uLCBjb25zdW1lZCwgYW5kIHNob3VsZCBub3QKLQkgKiBiZSBlbGlnaWJsZSB0byBiZSBleHBvc2VkIGFzIGNoaWxkIG1vZHVsZXMuIFRoZXkgYXJlIGNvbnN1bWVkIAotCSAqIGRpcmVjdGx5IGludG8gdGhlIG1vZHVsZSB0cmVlLiAKLQkgKiAKLQkgKiBUaGUgcmVmZXJlbmNlIGluIHF1ZXN0aW9uIG1heSBoYXZlIHJlZmVyZW5jZXMgb2YgaXRzIG93biwgYm90aAotCSAqIHVzZWQgYW5kIGNvbnN1bWVkLiBSZWZlcmVuY2VzIG9mIHRoZSBjaGlsZCB3aWxsIGJlIHRyZWF0ZWQKLQkgKiBhcyByZWZlcmVuY2VzIG9mIHRoZSBwYXJlbnQsIHdoZXRoZXIgY29uc3VtZWQgb3IgdXNlZC4gIAotCSAqIAotCSAqIEEga2V5IGRpZmZlcmVuY2UgaW4gdGhlIGhhbmRsaW5nIG9mIG5vbi1jaGlsZCBVU0VEIHJlZmVyZW5jZXMgCi0JICogYXMgY29tcGFyZWQgdG8gQ09OU1VNRVMgaXMgdGhhdCBDT05TVU1FRCByZWZlcmVuY2VzIGhhdmUgdGhlaXIKLQkgKiBhcmNoaXZlTmFtZSAqaWdub3JlZCosIGFuZCBpdHMgY2hpbGQgbWVtYmVycyBhcmUgZGlyZWN0bHkgY29uc3VtZWQuIAotCSAqIEluIGNvbnRyYXN0LCBhIFVTRUQgbm9uLWNoaWxkIGtlZXBzIGl0cyBhcmNoaXZlTmFtZSBhcyB0aGUgZm9sZGVyIG5hbWUuIAotCSAqICAKLQkgKiBAcGFyYW0gdmMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25zdW1lZFJlZmVyZW5jZXMoVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5IHV0aWwsIElWaXJ0dWFsQ29tcG9uZW50IHZjLCBJUGF0aCByb290KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgY29uc3VtYWJsZU1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlvcHRpb25zLnB1dChJVmlydHVhbENvbXBvbmVudC5SRVFVRVNURURfUkVGRVJFTkNFX1RZUEUsIElWaXJ0dWFsQ29tcG9uZW50LkZMQVRURU5BQkxFX1JFRkVSRU5DRVMpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSB2Yy5nZXRSZWZlcmVuY2VzKG9wdGlvbnMpOwotICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZkNvbXBvbmVudHNbaV07Ci0gICAgCQlpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCk9PUlWaXJ0dWFsUmVmZXJlbmNlLkRFUEVOREVOQ1lfVFlQRV9DT05TVU1FUykgewotCQkJCWNvbnN1bWVDb21wb25lbnQodXRpbCwgcm9vdCwgcmVmZXJlbmNlKTsKLSAgICAJCX0KLSAgICAJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnN1bWVDb21wb25lbnQoVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5IHV0aWwsIElQYXRoIHJvb3QsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVmlydHVhbENvbXBvbmVudCBjb25zdW1lZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCWlmIChjb25zdW1lZENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkhPW51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSBjb25zdW1lZENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQl1dGlsLmFkZE1lbWJlcnMoY29uc3VtZWRDb21wb25lbnQsIHZGb2xkZXIsIHJvb3QuYXBwZW5kKHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKSk7Ci0JCQlhZGRDb25zdW1lZFJlZmVyZW5jZXModXRpbCwgY29uc3VtZWRDb21wb25lbnQsIHJvb3QuYXBwZW5kKHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKSk7Ci0JCQlhZGRVc2VkUmVmZXJlbmNlcyh1dGlsLCBjb25zdW1lZENvbXBvbmVudCwgcm9vdC5hcHBlbmQocmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGNoZWNrcyB0byBzZWUgaWYgYW55IGV4cG9ydGFibGUgZmlsZSBpcyBhY3R1YWxseSBhIGNoaWxkIG1vZHVsZS4KLQkgKiBDaGlsZHJlbiBtb2R1bGVzIHdpbGwgYmUgZXhwb3NlZCB2aWEgdGhlIGdldENoaWxkTW9kdWxlcygpIG1ldGhvZC4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQWRkQ29tcG9uZW50RmlsZShJVmlydHVhbENvbXBvbmVudCBjdXJyZW50LCBJRmxhdEZpbGUgZmlsZSkgewotCQlmb3IoIGludCBpID0gMDsgaSA8IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyApIHsKLQkJCWlmKCBwYXJ0aWNpcGFudHNbaV0uaXNDaGlsZE1vZHVsZShjb21wb25lbnQsIGRhdGFNb2RlbCwgZmlsZSkpIHsKLQkJCQlDaGlsZE1vZHVsZVJlZmVyZW5jZSBjaGlsZCA9IG5ldyBDaGlsZE1vZHVsZVJlZmVyZW5jZShjdXJyZW50LmdldFByb2plY3QoKSwgZmlsZSk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmKCAhcGFydGljaXBhbnRzW2ldLnNob3VsZEFkZEV4cG9ydGFibGVGaWxlKGNvbXBvbmVudCwgY3VycmVudCwgZGF0YU1vZGVsLCBmaWxlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNlZFJlZmVyZW5jZXMoVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5IHV0aWwsIElWaXJ0dWFsQ29tcG9uZW50IHZjLCBJUGF0aCByb290KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlvcHRpb25zLnB1dChJVmlydHVhbENvbXBvbmVudC5SRVFVRVNURURfUkVGRVJFTkNFX1RZUEUsIElWaXJ0dWFsQ29tcG9uZW50LkZMQVRURU5BQkxFX1JFRkVSRU5DRVMpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIGFsbFJlZmVyZW5jZXMgPSB2Yy5nZXRSZWZlcmVuY2VzKG9wdGlvbnMpOwotICAgIAlmb3IgKGludCBpID0gMDsgaSA8IGFsbFJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLSAgICAJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGFsbFJlZmVyZW5jZXNbaV07Ci0JCQlJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiAocmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCkgPT0gRGVwZW5kZW5jeVR5cGUuVVNFUyApIHsKLQkJCQlpZiggc2hvdWxkSWdub3JlUmVmZXJlbmNlKHJlZmVyZW5jZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCQotCQkJCWlmKCAhaXNDaGlsZE1vZHVsZShyZWZlcmVuY2UpKSB7Ci0JCQkJCWFkZE5vbkNoaWxkVXNlZFJlZmVyZW5jZSh1dGlsLCB2YywgcmVmZXJlbmNlLCByb290LmFwcGVuZChyZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUNoaWxkTW9kdWxlUmVmZXJlbmNlIGNtID0gbmV3IENoaWxkTW9kdWxlUmVmZXJlbmNlKHJlZmVyZW5jZSwgcm9vdCk7Ci0JCQkJCUxpc3Q8SUNoaWxkTW9kdWxlUmVmZXJlbmNlPiBkdXBsaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IoIElDaGlsZE1vZHVsZVJlZmVyZW5jZSB0bXAgOiBjaGlsZHJlbiApIHsKLQkJCQkJCWlmKHRtcC5nZXRSZWxhdGl2ZVVSSSgpLmVxdWFscyhjbS5nZXRSZWxhdGl2ZVVSSSgpKSkKLQkJCQkJCQlkdXBsaWNhdGVzLmFkZCh0bXApOwotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuLnJlbW92ZUFsbChkdXBsaWNhdGVzKTsKLQkJCQkJY2hpbGRyZW4uYWRkKGNtKTsKLQkJCQl9Ci0JCQl9CQotICAgIAl9Ci0gICAgCWFkZFVzZWRSZWZlcmVuY2VzRnJvbVBhcnRpY2lwYW50cyh1dGlsLCB2Yywgcm9vdCk7ICAgIAkKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHJlZmVyZW5jZXMgcHJvdmlkZWQgYnkgcGFydGljaXBhbnRzIChlLmcuLCBjb21wb25lbnRzIHByb3ZpZGVkIGJ5IGEgY2hpbGQgdG8gdGhlIHJlY2VpdmluZyBwYXJlbnQgYnkgCi0JICogbWFwcGluZyBpdCB0byAuLi8KLQkgKiBAcGFyYW0gdXRpbAotCSAqIEBwYXJhbSB2YwotCSAqIEBwYXJhbSByb290Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNlZFJlZmVyZW5jZXNGcm9tUGFydGljaXBhbnRzKFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eSB1dGlsLCBJVmlydHVhbENvbXBvbmVudCB2YywgSVBhdGggcm9vdCkgdGhyb3dzIENvcmVFeGNlcHRpb257CQkKLQkJTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IG51bGw7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgcGFydGljaXBhbnRzLmxlbmd0aDsgaSsrICkgewotCQkJcmVmZXJlbmNlcyA9IHBhcnRpY2lwYW50c1tpXS5nZXRDaGlsZE1vZHVsZXModmMsIGRhdGFNb2RlbCk7Ci0JCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsIHx8IHJlZmVyZW5jZXMuaXNFbXB0eSgpKXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2U6cmVmZXJlbmNlcykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAocmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCkgPT0gRGVwZW5kZW5jeVR5cGUuVVNFUyApIHsJCQotCQkJCQlpZiggIWlzQ2hpbGRNb2R1bGUocmVmZXJlbmNlKSkgewotCQkJCQkJYWRkTm9uQ2hpbGRVc2VkUmVmZXJlbmNlKHV0aWwsIHZjLCByZWZlcmVuY2UsIHJvb3QuYXBwZW5kKHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlDaGlsZE1vZHVsZVJlZmVyZW5jZSBjbSA9IG5ldyBDaGlsZE1vZHVsZVJlZmVyZW5jZShyZWZlcmVuY2UsIHJvb3QpOwotCQkJCQkJTGlzdDxJQ2hpbGRNb2R1bGVSZWZlcmVuY2U+IGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IoIElDaGlsZE1vZHVsZVJlZmVyZW5jZSB0bXAgOiBjaGlsZHJlbiApIHsKLQkJCQkJCQlpZih0bXAuZ2V0UmVsYXRpdmVVUkkoKS5lcXVhbHMoY20uZ2V0UmVsYXRpdmVVUkkoKSkpCi0JCQkJCQkJCWR1cGxpY2F0ZXMuYWRkKHRtcCk7Ci0JCQkJCQl9Ci0JCQkJCQljaGlsZHJlbi5yZW1vdmVBbGwoZHVwbGljYXRlcyk7Ci0JCQkJCQljaGlsZHJlbi5hZGQoY20pOwotCQkJCQl9Ci0JCQkJfQkKLQkJCX0KLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgd2UgZXhwb3NlIHRoaXMgdXNlZCByZWZlcmVuY2UgYXMgYSBtZW1iZXIgZmlsZT8KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudENvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQgd2UncmUgdHJhdmVyc2luZwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIGEgbWVtYmVyIGZpbGUsIGZhbHNlIGlmIGl0J3MgYSBjaGlsZCBtb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NoaWxkTW9kdWxlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBwYXJ0aWNpcGFudHMubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiggcGFydGljaXBhbnRzW2ldLmlzQ2hpbGRNb2R1bGUoY29tcG9uZW50LCByZWZlcmVuY2VkQ29tcG9uZW50LCBkYXRhTW9kZWwpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJZ25vcmVSZWZlcmVuY2UoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlZENvbXBvbmVudCkgewotCQlmb3IoIGludCBpID0gMDsgaSA8IHBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyApIHsKLQkJCWlmKCBwYXJ0aWNpcGFudHNbaV0uc2hvdWxkSWdub3JlUmVmZXJlbmNlKGNvbXBvbmVudCwgcmVmZXJlbmNlZENvbXBvbmVudCwgZGF0YU1vZGVsKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uQ2hpbGRVc2VkUmVmZXJlbmNlKFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eSB1dGlsLCBJVmlydHVhbENvbXBvbmVudCBwYXJlbnQsIAotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlLCBJUGF0aCBydW50aW1lUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiggcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5pc0JpbmFyeSgpKSB7Ci0JCQloYW5kbGVOb25DaGlsZFVzZWRCaW5hcnlSZWZlcmVuY2UodXRpbCwgcGFyZW50LCByZWZlcmVuY2UsIHJ1bnRpbWVQYXRoKTsKLQkJfSBlbHNlIC8qICF2aXJ0dWFsQ29tcC5pc0JpbmFyeSgpICovIHsKLQkJCS8qCi0JCQkgKiB1c2VkIHJlZmVyZW5jZXMgdG8gbm9uLWJpbmFyeSBjb21wb25lbnRzIHRoYXQgYXJlIE5PVCBjaGlsZCBtb2R1bGVzLgotCQkJICogVGhlc2Ugc2hvdWxkIGJlICdjb25zdW1lZCcgYnV0IG1haW50YWluIHRoZWlyIG5hbWUKLQkJCSAqIEFzIG9mIG5vdyBJIGRvbid0IGJlbGlldmUgdGhlcmUgYXJlIGFueSBzdWNoIGluc3RhbmNlcyBvZiB0aGlzLgotCQkJICogSSBhbHNvIGJlbGlldmUgaW4gbW9zdCBjYXNlcywgdGhpcyBwcm9iYWJseSBpcyBhIGNoaWxkIG1vZHVsZSB0aGF0IAotCQkJICogdGhlIHBhcmVudCBqdXN0IGRvZXNuJ3Qga25vdyBhYm91dC4KLQkJCSAqIAotCQkJICogRXhhbXBsZTogRWFyIFByb2plY3QgY29uc3VtZXMgRVNCIHByb2plY3QsIEVhciBwcm9qZWN0IGRvZXMgbm90IAotCQkJICogcmVjb2duaXplIEVTQiBwcm9qZWN0IGFzIGEgY2hpbGQgSG93ZXZlciwgaWYgdGhlIHNlcnZlciBhZGFwdGVyIAotCQkJICogY2FuIHVzZSBuZXN0ZWQgZXhwbG9kZWQgZGVwbG95bWVudHMgKGZvbGRlcnMgaW5zdGVhZCBvZiB6aXBzKSwKLQkJCSAqIHRoZW4gdGhpcyB3aWxsIHN0aWxsIHdvcmsuIAotCQkJICogCi0JCQkgKiBUT0RPIEludmVzdGlnYXRlIC8gRGlzY3VzcwotCQkJICovCi0JCQl1dGlsLmFkZE1lbWJlcnMocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSwgcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRSb290Rm9sZGVyKCksIAotCQkJCQlydW50aW1lUGF0aC5hcHBlbmQocmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb25DaGlsZFVzZWRCaW5hcnlSZWZlcmVuY2UoVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5IHV0aWwsIElWaXJ0dWFsQ29tcG9uZW50IHBhcmVudCwgCi0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UsIElQYXRoIHJ1bnRpbWVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEJpbmFyeSB1c2VkIHJlZmVyZW5jZXMgbXVzdCBiZSBhZGRlZCBhcyBhIHNpbmdsZSBmaWxlIHVubGVzcyB0aGV5J3JlIGNoaWxkIG1vZHVsZXMKLQkJZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lMiA9IHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOwotCQlmaW5hbCBTdHJpbmcgYXJjaGl2ZU5hbWUgPSBuZXcgUGF0aChhcmNoaXZlTmFtZTIpLmxhc3RTZWdtZW50KCk7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJRmxhdEZpbGUgbWYgPSBudWxsOwotCQlJRmlsZSBpZmlsZSA9IChJRmlsZSl2aXJ0dWFsQ29tcC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYoIGlmaWxlICE9IG51bGwgKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG51bGwgIT0gYXJjaGl2ZU5hbWUgPyBhcmNoaXZlTmFtZSA6IGlmaWxlLmdldE5hbWUoKTsKLQkJCW1mID0gbmV3IEZsYXRGaWxlKGlmaWxlLCBuYW1lLCBydW50aW1lUGF0aC5tYWtlUmVsYXRpdmUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGV4dEZpbGUgPSAoRmlsZSl2aXJ0dWFsQ29tcC5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJaWYoIGV4dEZpbGUgIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG51bGwgIT0gYXJjaGl2ZU5hbWUgPyBhcmNoaXZlTmFtZSA6IGV4dEZpbGUuZ2V0TmFtZSgpOwotCQkJCW1mID0gbmV3IEZsYXRGaWxlKGV4dEZpbGUsIG5hbWUsIHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYoIG1mICE9IG51bGwgKSB7Ci0JCQlJRmxhdFJlc291cmNlIG1vZHVsZVBhcmVudCA9IFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eS5nZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMsIG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKTsKLQkJCWlmIChtb2R1bGVQYXJlbnQgIT0gbnVsbCAmJiBtb2R1bGVQYXJlbnQgaW5zdGFuY2VvZiBJRmxhdEZvbGRlcikgewotCQkJCUlGbGF0UmVzb3VyY2VbXSBtZl9tZW1iZXJzID0gKChJRmxhdEZvbGRlciltb2R1bGVQYXJlbnQpLm1lbWJlcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1mX21lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG1mX21lbWJlcnNbaV0uZ2V0TmFtZSgpLmVxdWFscyhtZi5nZXROYW1lKCkpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkuYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKChJRmxhdEZvbGRlciltb2R1bGVQYXJlbnQsIG5ldyBGbGF0UmVzb3VyY2VbXXttZn0pOwotCQkJfSBlbHNlIHsKLQkJCQlpZiggc2hvdWxkQWRkRXhwb3J0YWJsZUZpbGUodmlydHVhbENvbXAsIG1mKSkgewotCQkJCQlpZiAobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IoIElGbGF0UmVzb3VyY2UgdG1wIDogbWVtYmVycykgCi0JCQkJCQkJaWYoIHRtcC5nZXROYW1lKCkuZXF1YWxzKG1mLmdldE5hbWUoKSkpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCW1lbWJlcnMuYWRkKG1mKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChtb2R1bGVQYXJlbnQgPT0gbnVsbCkgewotCQkJCQkJCW1vZHVsZVBhcmVudCA9IFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eS5lbnN1cmVQYXJlbnRFeGlzdHMobWVtYmVycywgbWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCksIChJQ29udGFpbmVyKXBhcmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOwotCQkJCQkJfQotCQkJCQkJVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcigoSUZsYXRGb2xkZXIpbW9kdWxlUGFyZW50LCBuZXcgRmxhdFJlc291cmNlW10ge21mfSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBBdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGNoaWxkcmVuIGlmIGl0IG5lZWRlZCB0byBiZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFkZEV4cG9ydGFibGVGaWxlKElWaXJ0dWFsQ29tcG9uZW50IGN1cnJlbnQsIEZsYXRGaWxlIGZpbGUpIHsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBwYXJ0aWNpcGFudHMubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiAoICFwYXJ0aWNpcGFudHNbaV0uc2hvdWxkQWRkRXhwb3J0YWJsZUZpbGUoY29tcG9uZW50LCBjdXJyZW50LCBkYXRhTW9kZWwsIGZpbGUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlyZXR1cm4gY29tcG9uZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0lDaGlsZE1vZHVsZVJlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUNoaWxkTW9kdWxlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2YwZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUNoaWxkTW9kdWxlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogQSBjaGlsZCBtb2R1bGUgbWF5IGJlIGJhc2VkIG9uIGEgZmlsZSAoaWYgYmluYXJ5KSwgCi0gKiBvciBvbiBhIHJlZmVyZW5jZSAvIGNvbXBvbmVudCBpZiBub3QuIAotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDaGlsZE1vZHVsZVJlZmVyZW5jZSB7Ci0JLyoqCi0JICogV2lsbCByZXR1cm4gYSBmaWxlIGlmIHRoaXMgY2FuIGJlIHRyYWNrZWQgdG8gb25lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZmVyZW5jZSBpZiBpdCBleGlzdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY29tcG9uZW50IGlmIGl0IGV4aXN0cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCk7Ci0JCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbmdsZSBmaWxlLCByZXR1cm4gdHJ1ZS4KLQkgKiBJZiBhIG1vcmUgY29tcGxleCBjb21wb25lbnQsIHJldHVybiBmYWxzZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpOwotCQotCS8qKgotCSAqIEdldCB0aGUgcmVsYXRpdmUgVVJJIHRvIGl0J3MgZGlyZWN0IHBhcmVudCwgCi0JICogaW5jbHVkaW5nIHBhdGggKyBmaWxlbmFtZSArIGV4dGVuc2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UmVsYXRpdmVVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0lGbGF0RmlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUZsYXRGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjQ5YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUZsYXRGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGbGF0RmlsZSBleHRlbmRzIElGbGF0UmVzb3VyY2UgewotCS8qKgotCSAqIFJldHVybnMgYSBtb2RpZmljYXRpb24gc3RhbXAuIFdoZW5ldmVyIHRoZSBtb2RpZmljYXRpb24KLQkgKiBzdGFtcCBjaGFuZ2VzLCB0aGVyZSBtYXkgaGF2ZSBiZWVuIGEgY2hhbmdlIHRvIHRoZSBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGlmaWNhdGlvbiBzdGFtcAotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUZsYXRGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0lGbGF0Rm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGNmNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUZsYXRGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGbGF0Rm9sZGVyIGV4dGVuZHMgSUZsYXRSZXNvdXJjZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVtYmVycyAoY29udGVudHMpIG9mIHRoaXMgZm9sZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbW9kdWxlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSUZsYXRSZXNvdXJjZVtdIG1lbWJlcnMoKTsKLQkvKioKLQkgKiBTZXRzIHRoZSBtZW1iZXJzIChjb250ZW50cykgb2YgdGhpcyBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIG1lbWJlcnMgdGhlIG1lbWJlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKElGbGF0UmVzb3VyY2VbXSBtZW1iZXJzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0lGbGF0UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0lGbGF0UmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiOTE5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9JRmxhdFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGbGF0UmVzb3VyY2UgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSByZWxhdGl2ZSBwYXRoIHRvIHRoaXMgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHJlc291cmNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUZsYXRWaXJ0dWFsQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9JRmxhdFZpcnR1YWxDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiOWI4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvZmxhdC9JRmxhdFZpcnR1YWxDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZsYXRWaXJ0dWFsQ29tcG9uZW50IHsKLQkKLQkvKioKLQkgKiBBbiBvcHRpb25zIGtleSBsaXN0aW5nIHRoZSBleHBvcnQgcGFydGljaXBhbnRzLgotCSAqIFRoZSB2YWx1ZSBtdXN0IGJlIGEgTGlzdDxJRXhwb3J0VXRpbFBhcnRpY2lwYW50PiwgCi0JICogIG9yIHNpbXBseSBhbiBJRXhwb3J0VXRpbFBhcnRpY2lwYW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSVElDSVBBTlRfTElTVCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZXhwb3J0LnBhcnRpY2lwYW50TGlzdCI7Ci0JCi0JLyoqCi0JICogVGhlIEV4cG9ydE1vZGVsIGJlaW5nIHVzZWQ7IHRoZSB2YWx1ZSBvZiB0aGlzIHNob3VsZCBiZSB0aGUgSUZsYXRWaXJ0dWFsQ29tcG9uZW50IGl0c2VsZi4gCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVhQT1JUX01PREVMID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5leHBvcnQuZXhwb3J0TW9kZWwiOwotCi0JLyoqCi0JICogRmV0Y2ggdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLCB3aGljaCBpbmNsdWRlIHJhdyBmaWxlcyBvciBmb2xkZXJzIG9ubHkKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElGbGF0UmVzb3VyY2VbXSBmZXRjaFJlc291cmNlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEZldGNoIGEgbGlzdCBvZiBjaGlsZCBtb2R1bGUgcmVmZXJlbmNlcy4KLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElDaGlsZE1vZHVsZVJlZmVyZW5jZVtdIGdldENoaWxkTW9kdWxlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUZsYXR0ZW5QYXJ0aWNpcGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvSUZsYXR0ZW5QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmViN2IzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L0lGbGF0dGVuUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuRmxhdFZpcnR1YWxDb21wb25lbnQuRmxhdENvbXBvbmVudFRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcGFydGljaXBhbnQgaW4gdGhlIHByb2Nlc3MKLSAqIG9mIHRyYXZlcnNpbmcgdGhlIHZpcnR1YWwgY29tcG9uZW50IGFuZCBkZWNpZGluZyB3aGljaAotICogcmVzb3VyY2VzIHNob3VsZCBiZSBleHBvc2VkIGJ5IHRoZSBtb2RlbCwgYW5kIAotICogaW4gd2hhdCBmYXNoaW9uLgotICogCi0gKiBDbGllbnRzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoaXMgY2xhc3MgZGlyZWN0bHksIAotICogYnV0IHNob3VsZCByYXRoZXIgZXh0ZW5kIEFic3RyYWN0RXhwb3J0UGFydGljaXBhbnQuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGbGF0dGVuUGFydGljaXBhbnQgewotCQotCS8qKgotCSAqIFNlZWQgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHdpdGggZW50cmllcyB0aGF0IG11c3QgYmUgcHJlc2VudCwgCi0JICogc3BlY2lmaWNhbGx5IGZpbGVzIHRoYXQgbWF5IGJlIG1pc3NlZCBieSBvcHRpbWl6YXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHBhcmFtIG9yaWdpbmFsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCAKLQkJCUZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsLCBMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcyk7Ci0JCi0JLyoqCi0JICogQ2FuIHRoaXMgcGFydGljaXBhbnQgcmV0dXJuIG9wdGltaXplZCBtZW1iZXJzIHRoYXQKLQkgKiBwcmVjbHVkZSB0aGUgbmVlZCBmb3IgcnVubmluZyB0aGUgZnVsbCBhbGdvcml0aG0/Ci0JICogCi0JICogQ2F1dGlvbiBpcyBlbmNvdXJhZ2VkLiBJZiByZWZlcmVuY2UgdHlwZXMgeW91IGRvIG5vdCB1bmRlcnN0YW5kCi0JICogYXJlIHByZXNlbnQgYW5kIHlvdSBtaXN0YWtlbmx5IGNsYWltIHlvdSBjYW5PcHRpbWl6ZSwgeW91IG1heQotCSAqIGxlYXZlIHNvbWUgcmVmZXJlbmNlcyBpZ25vcmVkIGFuZCB0aGUgYXJjaGl2ZSBpbmNvbXBsZXRlbHkgYXNzZW1ibGVkLgotCSAqIAotCSAqIEV4YW1wbGU6IGlmIHRoZSBjb21wb25lbnQgc2F0aXNmaWVzIHNpbmdsZVJvb3QgcmVxdWlyZW1lbnRzLCB0aGlzIG1heSByZXR1cm4gdHJ1ZQotCSAqIAotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbk9wdGltaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZnVsbCBhbmQgY29tcGxldGUgbGlzdCBvZiBtZW1iZXJzIHRvIGJlIHB1Ymxpc2hlZC4KLQkgKiBUaGUgb3JpZ2luYWwgZW50cmllcyBzaG91bGQgYmUgaW5jbHVkZWQsIHVubGVzcyBsZWZ0IG91dCBpbnRlbnRpb25hbGx5LgotCSAqIAotCSAqIE9ubHkgdGhlIGZpcnN0IHBhcnRpY2lwYW50IHRvIGNsYWltIGl0IGNhbiBvcHRpbWl6ZSB3aWxsIGJlIGFsbG93ZWQgdG8gZG8gc28uCi0JICogVGhpcyB3aWxsIGJlIHRoZSBmaW5hbCBsaXN0IHJldHVybmVkIGJ5IEV4cG9ydFV0aWwuCi0JICogTm8gZmluYWxpemF0aW9uIG9yIG90aGVyIGFjdGlvbnMgb24gdGhpcyBsaXN0IHdpbGwgdGFrZSBwbGFjZQotCSAqIAotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHBhcmFtIG9yaWdpbmFsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyB2b2lkIG9wdGltaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsIAotCQkJTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMsIExpc3Q8SUNoaWxkTW9kdWxlUmVmZXJlbmNlPiBjaGlsZHJlbik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcGFydGljaXBhbnQgY29uc2lkZXJzIHRoaXMgZmlsZSB0byBiZSBhIGNoaWxkIG1vZHVsZQotCSAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjb25zaWRlciB0aGUgZmlsZSBhIGNoaWxkIG1vZHVsZSBpZiBhdCBsZWFzdCBvbmUgcGFydGljaXBhbnQKLQkgKiByZXR1cm5zIHRydWUgdG8gdGhpcyBtZXRob2QuIAotCSAqIAotCSAqIFRoZSBpdGVtIGluIHF1ZXN0aW9uIGlzIGEgZmxhdCBmaWxlIHdoaWNoIGhhcyBiZWVuIGZvdW5kIGluc2lkZSB0aGUgcHJvamVjdAotCSAqIG9yIGluc2lkZSBhIGNvbnN1bWVkIHJlZmVyZW5jZSBvZiB0aGUgcHJvamVjdC4gVGhlIGZyYW1ld29yayBpcyBhc2tpbmcKLQkgKiBhbGwgcGFydGljaXBhbnRzIGlmIHRoaXMgZmlsZSBpcyBhIGNoaWxkIG1vZHVsZSwgdG8gYmUgZXhwb3NlZCBhcyBzdWNoIGxhdGVyLCAKLQkgKiBvciBpZiBpdCBpcyBqdXN0IGEgZ2VuZXJpYyByZXNvdXJjZSwgd2hpY2ggc2hvdWxkIGJlIGV4cG9zZWQgYXMgYSByZWd1bGFyIG1lbWJlciBmaWxlLiAKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENvbXBvbmVudAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQsCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwgSUZsYXRGaWxlIGZpbGUpOwotCQotCQotCS8qKgotCSAqIFNob3VsZCB0aGUgcHJvcG9zZWQgZmlsZSBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0IHNldCBvciBub3QuCi0JICogSWYgYW55IG9uZSBwYXJ0aWNpcGFudCBzYXlzIG5vLCB0aGUgZmlsZSB3aWxsIG5vdCBiZSBpbmNsdWRlZC4KLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgd291bGQgYmUgdG8gcmV0dXJuIHRydWUgdW5sZXNzIHlvdQotCSAqIGhhdmUgYSBjb21wZWxsaW5nIHJlYXNvbiB0byBibG9jayB0aGUgZmlsZSBmcm9tIGluY2x1c2lvbgotCSAqIAotCSAqIEV4YW1wbGU6IElmIHRoZSBmaWxlIGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIChpbiBhIC5zdm4gZm9sZGVyKSByZXR1cm4gZmFsc2UKLQkgKiBDYXV0aW9uIGlzIGVuY291cmFnZWQgaGVyZSwgYXMgYSBjb25zdW1lZCByZWZlcmVuY2UgbWF5IGFjdGl2ZWx5IAotCSAqIGJlIHByb3ZpZGluZyB0aGUgZmlsZXMgeW91IG1heSBiZSB0cnlpbmcgdG8gZmlsdGVyLiBJdCdzIGFkdmlzZWQgdG8gb25seQotCSAqIGZpbHRlciBpZiB5b3Uga25vdyB3aGF0IHR5cGUgY3VycmVudENvbXBvbmVudCBpcyBhbmQgaG93IGl0IHdvcmtzLgotCSAqIAotCSAqIEBwYXJhbSByb290Q29tcG9uZW50IFRoZSByb290IGNvbXBvbmVudCB0aGF0IGlzIGJlaW5nIGFzc2VtYmxlZAotCSAqIEBwYXJhbSBjdXJyZW50Q29tcG9uZW50IFRoZSBjb21wb25lbnQgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCwgZWl0aGVyIHJvb3RDb21wb25lbnQgb3IgYSBjb25zdW1lZCByZWZlcmVuY2UKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQWRkRXhwb3J0YWJsZUZpbGUoSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCwKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGN1cnJlbnRDb21wb25lbnQsIAotCQkJRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsIElGbGF0RmlsZSBmaWxlKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwYXJ0aWNpcGFudCBjb25zaWRlcnMgdGhlIHJlZmVyZW5jZSBhIGNoaWxkIG1vZHVsZS4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgY29uc2lkZXIgaXQgYSBjaGlsZCBtb2R1bGUgaWYgYXQgbGVhc3Qgb25lIHBhcnRpY2lwYW50IHJldHVybnMgdHJ1ZS4gCi0JICogCi0JICogVGhlIGZyYW1ld29yayBpcyBhc2tpbmcgd2hldGhlciB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQgaXMgYSBjaGlsZCBtb2R1bGUsIAotCSAqIHdoaWNoIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBjaGlsZHJlbiBtb2R1bGVzIGFuZCBleHBvc2VkIGFzIGFuICAKLQkgKiBJQ2hpbGRNb2R1bGVSZWZlcmVuY2UsIG9yIGlmIGl0IGlzIGp1c3Qgc29tZSBnZW5lcmljIHR5cGUgb2YgZW50aXR5IHRvIGJlIAotCSAqIGV4cG9zZWQgYXMgbWVtYmVyIHJlc291cmNlcyBpbnNpZGUgdGhlIGN1cnJlbnQgZmxhdCBjb21wb25lbnQuIAotCSAqIAotCSAqIFRoZSBwYXJhbWV0ZXIgInJlZmVyZW5jZWQiIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSAiVVNFRCIgcmVmZXJlbmNlLAotCSAqIGFzICJDT05TVU1FRCIgcmVmZXJlbmNlcyBoYXZlIGFscmVhZHkgYmVlbiBjb25zdW1lZCBkaXJlY3RseSBpbnRvIHRoZSBwcm9qZWN0Ci0JICogYXMgaWYgdGhleSB3ZXJlIHBhcnQgb2YgaXQgb3JpZ2luYWxseS4gIAotCSAqIAotCSAqIEEgIlVTRUQiIHJlZmVyZW5jZSB3aGljaCBpcyBhIGNoaWxkIG1vZHVsZSB3aWxsIGJlIGV4cG9zZWQgYXMgYW4gCi0JICogSUNoaWxkTW9kdWxlUmVmZXJlbmNlIGFuZCB1c2UgdGhlIGFyY2hpdmVOYW1lIHJldHJpZXZlZCBmcm9tIHRoZSBJVmlydHVhbFJlZmVyZW5jZS4gCi0JICogCi0JICogQSAiVVNFRCIgcmVmZXJlbmNlIHdoaWNoIGlzICpub3QqIGEgY2hpbGQgbW9kdWxlIHdpbGwgYmUgcmVwcmVzZW50ZWQKLQkgKiBhcyBhIGZvbGRlciBtZW1iZXIgcmVzb3VyY2UgaW5zaWRlIHRoZSBwYXJlbnQsIGFuZCB0aGUgZm9sZGVyJ3MgbmFtZSB3aWxsCi0JICogYWxzbyBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYXJjaGl2ZU5hbWUgYXR0cmlidXRlIG9mIHRoZSBJVmlydHVhbFJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENvbXBvbmVudAotCSAqIEBwYXJhbSByZWZlcmVuY2VkIAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZE1vZHVsZShJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LCAKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZWQsIEZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsKTsKLQkKLQkvKioKLQkgKiBTaG91bGQgdGhpcyByZWZlcmVuY2UgYmUgaWdub3JlZCwgaWUgaGFuZGxlZCBlbHNld2hlcmUKLQkgKiBAcGFyYW0gcm9vdENvbXBvbmVudAotCSAqIEBwYXJhbSByZWZlcmVuY2VkCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJZ25vcmVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCwKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZWQsIEZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsKTsKLQkvKioKLQkgKiBGaW5hbGl6ZSB0aGUgbGlzdCBvZiByZXNvdXJjZXMgYnkgYWRkaW5nIG1pc3NlZCByZXNvdXJjZXMgb3IgCi0JICogcmVtb3ZpbmcgZmlsZXMgYWRkZWQgYnkgbWlzdGFrZS4gCi0JICogCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcGFyYW0gb3JpZ2luYWwKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmFsaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwgTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMpOwotCQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0aGF0IHRoaXMgcGFydGljaXBhbnQgYmVsaWV2ZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgY2hpbGQgbW9kdWxlcy4KLQkgKiBAcGFyYW0gcm9vdENvbXBvbmVudAotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGdldENoaWxkTW9kdWxlcyhJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9mbGF0L1ZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYWFkNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ZsYXQvVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi0vKioKLSAqIFRoaXMgdXRpbGl0eSBjbGFzcyBpcyBhbG1vc3QgZW50aXJlbHkgY29waWVkIGZyb20gQ29tcG9uZW50RGVwbG95YWJsZQotICogYW5kIGRlYWxzIHdpdGggdGhlIG51dHMgYW5kIGJvbHRzIG9mIGNyZWF0aW5nIHRoZSBtb2RlbCBvYmplY3RzIHdoZW4KLSAqIHdhbGtpbmcgYSBwb3J0aW9uIG9mIHRoZSB0cmVlCi0gKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFNob3VsZEluY2x1ZGVVdGlsaXR5Q2FsbGJhY2sgewotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRBZGRDb21wb25lbnRGaWxlKElWaXJ0dWFsQ29tcG9uZW50IGN1cnJlbnQsIElGbGF0RmlsZSBmaWxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PElGbGF0UmVzb3VyY2U+IG1lbWJlcnM7Ci0JcHJpdmF0ZSBTaG91bGRJbmNsdWRlVXRpbGl0eUNhbGxiYWNrIGhhbmRsZXI7Ci0JcHVibGljIFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eSgKLQkJCUxpc3Q8SUZsYXRSZXNvdXJjZT4gbWVtYmVycywgU2hvdWxkSW5jbHVkZVV0aWxpdHlDYWxsYmFjayBoYW5kbGVyKSB7Ci0JCXRoaXMubWVtYmVycyA9IG1lbWJlcnM7Ci0JCXRoaXMuaGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1lbWJlcnMoSVZpcnR1YWxDb21wb25lbnQgY3VycmVudCwgSVZpcnR1YWxDb250YWluZXIgY29udCwgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQllbnN1cmVQYXJlbnRFeGlzdHMobWVtYmVycywgcGF0aCwgbnVsbCk7Ci0JCUZsYXRSZXNvdXJjZVtdIG1yID0gYWRkTWVtYmVyc0ludGVybmFsKGN1cnJlbnQsIGNvbnQsIHBhdGgpOwotCQlpbnQgc2l6ZSA9IG1yLmxlbmd0aDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCW1lbWJlcnMuYWRkKG1yW2pdKTsKLQkJfQotCX0KLQkKLQkvLyBBZGQgdGhpcyBjb250YWluZXIncyBjaGlsZHJlbgotCXB1YmxpYyB2b2lkIGFkZENvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lciwgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VbXSBjaGlsZHJlbiA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiggY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJQ29udGFpbmVyICkgewotCQkJCWFkZENvbnRhaW5lckludGVybmFsKChJQ29udGFpbmVyKWNoaWxkcmVuW2ldLCBwYXRoKTsKLQkJCX0gZWxzZSBpZiggY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJRmlsZSApewotCQkJCWFkZEZpbGUobnVsbCwgKElGaWxlKWNoaWxkcmVuW2ldLCBwYXRoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBQaHlzaWNhbGx5IGFkZHMgdGhpcyBjb250YWluZXIKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250YWluZXJJbnRlcm5hbChJQ29udGFpbmVyIGNvbnRhaW5lciwgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmxhdEZvbGRlciBtZiA9IChGbGF0Rm9sZGVyKSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMscGF0aC5hcHBlbmQoY29udGFpbmVyLmdldE5hbWUoKSkubWFrZVJlbGF0aXZlKCkpOwotCQlpZiggbWYgPT0gbnVsbCApIHsKLQkJCW1mID0gbmV3IEZsYXRGb2xkZXIoY29udGFpbmVyLCBjb250YWluZXIuZ2V0TmFtZSgpLCBwYXRoKTsKLQkJCUlGbGF0Rm9sZGVyIHBhcmVudCA9IChGbGF0Rm9sZGVyKSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMsIHBhdGgpOwotCQkJaWYgKHBhdGguaXNFbXB0eSgpKQotCQkJCW1lbWJlcnMuYWRkKG1mKTsKLQkJCWVsc2UgewotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJcGFyZW50ID0gZW5zdXJlUGFyZW50RXhpc3RzKG1lbWJlcnMsIHBhdGgsIGNvbnRhaW5lcik7Ci0JCQkJYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKHBhcmVudCwgbmV3IElGbGF0UmVzb3VyY2VbXSB7bWZ9KTsKLQkJCX0KLQkJfQotCQkvLyByZWN1cnNlCi0JCWFkZENvbnRhaW5lcihjb250YWluZXIsIHBhdGguYXBwZW5kKGNvbnRhaW5lci5nZXROYW1lKCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZsYXRSZXNvdXJjZVtdIGFkZE1lbWJlcnNJbnRlcm5hbChJVmlydHVhbENvbXBvbmVudCBjdXJyZW50LCBJVmlydHVhbENvbnRhaW5lciBjb250LCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXMgPSBjb250Lm1lbWJlcnMoKTsKLQkJaW50IHNpemUyID0gcmVzLmxlbmd0aDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplMik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJaWYgKHJlc1tqXSBpbnN0YW5jZW9mIElWaXJ0dWFsQ29udGFpbmVyKSB7Ci0JCQkJSVZpcnR1YWxDb250YWluZXIgY2MgPSAoSVZpcnR1YWxDb250YWluZXIpIHJlc1tqXTsKLQkJCQlJRmxhdEZvbGRlciBtZiA9IGFkZFZpcnR1YWxDb250YWluZXJJbnRlcm5hbChjYywgcGF0aCk7Ci0JCQkJSUZsYXRSZXNvdXJjZVtdIG1yID0gYWRkTWVtYmVyc0ludGVybmFsKGN1cnJlbnQsIGNjLCBwYXRoLmFwcGVuZChjYy5nZXROYW1lKCkpKTsKLQkJCQlhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIobWYsIG1yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRkRmlsZShjdXJyZW50LCBwYXRoLCAoSUFkYXB0YWJsZSlyZXNbal0pOwotCQkJfQotCQl9Ci0JCUZsYXRSZXNvdXJjZVtdIG1yID0gbmV3IEZsYXRSZXNvdXJjZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtcik7Ci0JCXJldHVybiBtcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRmlsZShJVmlydHVhbENvbXBvbmVudCBjdXJyZW50LCBJUGF0aCBwYXRoLCBJQWRhcHRhYmxlIGZpbGUpIHsKLQkJSUZpbGUgZiA9IChJRmlsZSlmaWxlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlJRmxhdEZpbGUgbWYgPSBudWxsOwotCQlpZiggZiAhPSBudWxsICkKLQkJCSBtZiA9IGNyZWF0ZU1vZHVsZUZpbGUoZiwgcGF0aC5tYWtlUmVsYXRpdmUoKSk7Ci0JCWVsc2UgewotCQkJRmlsZSBmMiA9IChGaWxlKWZpbGUuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKLQkJCWlmKCBmMiAhPSBudWxsICkKLQkJCQltZiA9IG5ldyBGbGF0RmlsZShmMiwgZjIuZ2V0TmFtZSgpLCBwYXRoLm1ha2VSZWxhdGl2ZSgpKTsKLQkJfQotCQlpZiggbWYgIT0gbnVsbCApIHsKLQkJCWlmIChoYW5kbGVyID09IG51bGwgfHwgaGFuZGxlci5zaG91bGRBZGRDb21wb25lbnRGaWxlKGN1cnJlbnQsIG1mKSkgewotCQkJCWlmKCBtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5pc0VtcHR5KCkpIHsKLQkJCQkJbWVtYmVycy5yZW1vdmUobWYpOwotCQkJCQltZW1iZXJzLmFkZChtZik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJRmxhdEZvbGRlciBtb2R1bGVQYXJlbnQgPSBWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkuZW5zdXJlUGFyZW50RXhpc3RzKG1lbWJlcnMsIG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLCBudWxsKTsKLQkJCQkJTGlzdCB0ZW1wUGFyZW50TWVtYmVycyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChtb2R1bGVQYXJlbnQubWVtYmVycygpKSk7Ci0JCQkJCXRlbXBQYXJlbnRNZW1iZXJzLnJlbW92ZShtZik7Ci0JCQkJCXRlbXBQYXJlbnRNZW1iZXJzLmFkZChtZik7Ci0JCQkJCW1vZHVsZVBhcmVudC5zZXRNZW1iZXJzKChJRmxhdFJlc291cmNlW10pIHRlbXBQYXJlbnRNZW1iZXJzLnRvQXJyYXkobmV3IElGbGF0UmVzb3VyY2VbdGVtcFBhcmVudE1lbWJlcnMuc2l6ZSgpXSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRGaWxlKElWaXJ0dWFsQ29tcG9uZW50IGN1cnJlbnQsIElGaWxlIGYsIElQYXRoIHBhdGgpIHsKLQkJYWRkRmlsZShjdXJyZW50LCBwYXRoLCAoSUFkYXB0YWJsZSlmKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGbGF0Rm9sZGVyIGFkZFZpcnR1YWxDb250YWluZXJJbnRlcm5hbChJVmlydHVhbENvbnRhaW5lciBjYywgSVBhdGggcGF0aCkgewotCQkvLyBSZXRyaWV2ZSBhbHJlYWR5IGV4aXN0aW5nIG1vZHVsZSBmb2xkZXIgaWYgYXBwbGljYWJsZQotCQlJRmxhdEZvbGRlciBtZiA9IChGbGF0Rm9sZGVyKSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMscGF0aC5hcHBlbmQoY2MuZ2V0TmFtZSgpKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCWlmIChtZiA9PSBudWxsKSB7Ci0JCQltZiA9IG5ldyBGbGF0Rm9sZGVyKChJQ29udGFpbmVyKWNjLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLCBjYy5nZXROYW1lKCksIHBhdGgpOwotCQkJSUZsYXRGb2xkZXIgcGFyZW50ID0gKEZsYXRGb2xkZXIpIGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycywgcGF0aCk7Ci0JCQlpZiAocGF0aC5pc0VtcHR5KCkpCi0JCQkJbWVtYmVycy5hZGQobWYpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQlwYXJlbnQgPSBlbnN1cmVQYXJlbnRFeGlzdHMobWVtYmVycywgcGF0aCwgKElDb250YWluZXIpY2MuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOwotCQkJCWFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihwYXJlbnQsIG5ldyBJRmxhdFJlc291cmNlW10ge21mfSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1mOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEZsYXRGaWxlIGNyZWF0ZU1vZHVsZUZpbGUoZmluYWwgSUZpbGUgZmlsZSwgZmluYWwgSVBhdGggcGF0aCkgewotCQlyZXR1cm4gbmV3IEZsYXRGaWxlKGZpbGUsIGZpbGUuZ2V0TmFtZSgpLCBwYXRoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGUgY3VycmVudCBjYWNoZSB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1vZHVsZSByZXNvdXJjZSBmb3IKLQkgKiB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiBAcGFyYW0gYUxpc3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gYW4gZXhpc3RpbmcgbW9kdWxlUmVzb3VyY2UgZnJvbSB0aGUgY2FjaGVkIHJlc3VsdAotCSAqLwotCSAKLQlwdWJsaWMgc3RhdGljIEZsYXRSZXNvdXJjZSBnZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKExpc3QgYUxpc3QsIElQYXRoIHBhdGgpIHsgCi0gICAgCS8vIElmIHRoZSBsaXN0IGlzIGVtcHR5LCByZXR1cm4gbnVsbAotICAgIAlpZiAoYUxpc3Q9PW51bGwgfHwgYUxpc3QuaXNFbXB0eSgpIHx8IHBhdGggPT0gbnVsbCkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAkvLyBPdGhlcndpc2UgcmVjdXJzaXZlbHkgY2hlY2sgdG8gc2VlIGlmIGdpdmVuIHJlc291cmNlIG1hdGNoZXMgY3VycmVudCByZXNvdXJjZSBvciBpZiBpdCBpcyBhIGNoaWxkCi0gICAgCVN0cmluZ1tdIHBhdGhTZWdtZW50cyA9IHBhdGguc2VnbWVudHMoKTsgCi0gICAgCUZsYXRSZXNvdXJjZSBleHBvcnRhYmxlUmVzb3VyY2UgPSBudWxsOwotICAgIAkKLSAgICAJaWYocGF0aFNlZ21lbnRzLmxlbmd0aCA9PSAwKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCWZvciAoSXRlcmF0b3IgaXRlciA9IGFMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgIAkJZXhwb3J0YWJsZVJlc291cmNlID0gKEZsYXRSZXNvdXJjZSkgaXRlci5uZXh0KCk7ICAgICAJCi0gICAgCQlTdHJpbmdbXSBtb2R1bGVTZWdtZW50cyA9IGV4cG9ydGFibGVSZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5zZWdtZW50cygpOwotICAgIAkJLy8gSWYgdGhlIGxhc3Qgc2VnbWVudCBpbiBwYXNzZWQgaW4gcGF0aCBlcXVhbHMgdGhlIG1vZHVsZSByZXNvdXJjZSBuYW1lIAotICAgIAkJLy8gYW5kIHNlZ21lbnQgY291bnQgaXMgdGhlIHNhbWUgYW5kIHRoZSBwYXRoIHNlZ21lbnRzIHN0YXJ0IHdpdGggdGhlIG1vZHVsZSBwYXRoIHNlZ21lbnRzCi0gICAgCQkvLyB0aGVuIHdlIGhhdmUgYSBtYXRjaCBhbmQgd2UgcmV0dXJuIHRoZSBleGlzdGluZyBtb2R1bGVSZXNvdXJjZQotICAgIAkJaWYgKHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV0uZXF1YWxzKGV4cG9ydGFibGVSZXNvdXJjZS5nZXROYW1lKCkpICYmIAotCQkgICAgCQkobW9kdWxlU2VnbWVudHMubGVuZ3RoICsgMSkgPT0gcGF0aFNlZ21lbnRzLmxlbmd0aCAmJiAKLQkJICAgIAkJc3RhcnRzV2l0aChtb2R1bGVTZWdtZW50cywgcGF0aFNlZ21lbnRzKSkKLQkJICAgIAlyZXR1cm4gZXhwb3J0YWJsZVJlc291cmNlOyAKLSAgICAJCQotICAgIAkJLy8gT3RoZXJ3aXNlLCBpZiBpdCBpcyBhIGZvbGRlciwgY2hlY2sgaXRzIGNoaWxkcmVuIGZvciB0aGUgZXhpc3RpbmcgcmVzb3VyY2UgcGF0aAotICAgIAkJLy8gYnV0IG9ubHkgY2hlY2sgaWYgdGhlIGJlZ2lubmluZyBzZWdtZW50cyBhcmUgYSBtYXRjaAotCSAgICAJaWYoZXhwb3J0YWJsZVJlc291cmNlIGluc3RhbmNlb2YgRmxhdEZvbGRlciAmJiAKLQkgICAgCQkJc3RhcnRzV2l0aChtb2R1bGVTZWdtZW50cywgcGF0aFNlZ21lbnRzKSAmJiBwYXRoU2VnbWVudHMubGVuZ3RoID4gbW9kdWxlU2VnbWVudHMubGVuZ3RoICYmCi0JICAgIAkJCWV4cG9ydGFibGVSZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKHBhdGhTZWdtZW50c1ttb2R1bGVTZWdtZW50cy5sZW5ndGggPiAwID8gbW9kdWxlU2VnbWVudHMubGVuZ3RoIDogMF0pKQkgICAgCSAgCi0gICAgCQkJaWYgKCgoRmxhdEZvbGRlcilleHBvcnRhYmxlUmVzb3VyY2UpLm1lbWJlcnMoKSE9bnVsbCkKLSAgICAJCQkJcmV0dXJuIGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UoQXJyYXlzLmFzTGlzdCgoKEZsYXRGb2xkZXIpZXhwb3J0YWJsZVJlc291cmNlKS5tZW1iZXJzKCkpLHBhdGgpOwotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFRydWUgaWYgYmVnaW5uaW5nU2VnbWVudHNbaV0gPT0gdGVzdFNlZ21lbnRzW2ldIGZvciBhbGwgMDw9aTxiZWdpbm5pbmdTZWdtZW50c1tpXSAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGgoU3RyaW5nW10gYmVnaW5uaW5nU2VnbWVudHMsIFN0cmluZ1tdIHRlc3RTZWdtZW50cykgeyAKLQkJZm9yKGludCBpPTA7IGkgPCBiZWdpbm5pbmdTZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYoIWJlZ2lubmluZ1NlZ21lbnRzW2ldLmVxdWFscyh0ZXN0U2VnbWVudHNbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRmxhdEZvbGRlciBlbnN1cmVQYXJlbnRFeGlzdHMoTGlzdDxJRmxhdFJlc291cmNlPiBtZW1iZXJzLCBJUGF0aCBwYXRoLCBJQ29udGFpbmVyIGNjKSB7Ci0JCUlGbGF0Rm9sZGVyIHBhcmVudCA9IChJRmxhdEZvbGRlcikgZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShtZW1iZXJzLCBwYXRoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQlTdHJpbmcgZm9sZGVyTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCUlQYXRoIGZvbGRlclBhdGggPSBQYXRoLkVNUFRZOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCk+MSkKLQkJCQlmb2xkZXJQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlwYXJlbnQgPSBuZXcgRmxhdEZvbGRlcihjYywgZm9sZGVyTmFtZSwgZm9sZGVyUGF0aCk7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKT4xKQotCQkJCWFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihlbnN1cmVQYXJlbnRFeGlzdHMobWVtYmVycywgcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksY2MpLCBuZXcgSUZsYXRSZXNvdXJjZVtdIHtwYXJlbnR9KTsKLQkJCWVsc2UKLQkJCQltZW1iZXJzLmFkZChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgcmVzb3VyY2VzIGZyb20gbXIgdG8gdGhlIGV4aXN0aW5nIHJlc291cmNlcyBpbiBNb2R1bGUgRm9sZGVyIG1mCi0JICogQHBhcmFtIE1vZHVsZUZvbGRlciBtZgotCSAqIEBwYXJhbSBJTW9kdWxlUmVzb3VyY2VbXSBtcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIoSUZsYXRGb2xkZXIgbWYsIElGbGF0UmVzb3VyY2VbXSBtcikgewotCQkvLyBJZiB0aGUgZm9sZGVyIGlzIG51bGwgb3IgdGhlIHJlc291cmNlcyB0byBhZGQgYXJlIG51bGwgb3IgZW1wdHksIGJhaWwgYW5kIHJldHVybgotCQlpZiAobWYgPT0gbnVsbCB8fCBtciA9PSBudWxsIHx8IG1yLmxlbmd0aD09MCkgCi0JCQlyZXR1cm47Ci0JCS8vIEdldCB0aGUgZXhpc3RpbmcgbWVtYmVycyBpbiB0aGUgbW9kdWxlIGZvbGRlcgotCQlJRmxhdFJlc291cmNlW10gbWZfbWVtYmVycyA9IG1mLm1lbWJlcnMoKTsKLQkJaW50IG1mX3NpemUgPSAwOwotCQkvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZXhpc3RpbmcgbWVtYmVycyBpbiB0aGUgbW9kdWxlIGZvbGRlcgotCQlpZiAobWZfbWVtYmVycyAhPSBudWxsKQotCQkJbWZfc2l6ZSA9IG1mX21lbWJlcnMubGVuZ3RoOwotCQkvLyBDcmVhdGUgYSBuZXcgYXJyYXkgdG8gc2V0IG9uIHRoZSBtb2R1bGUgZm9sZGVyIHdoaWNoIHdpbGwgY29tYmluZSB0aGUgZXhpc3RpbmcgYW5kCi0JCS8vIG5ldyBtb2R1bGUgcmVzb3VyY2VzCi0JCUlGbGF0UmVzb3VyY2VbXSByZXMgPSBuZXcgRmxhdFJlc291cmNlW21mX3NpemUgKyBtci5sZW5ndGhdOwotCQkvLyBDb3B5IHRoZSBleGlzdGluZyBtZW1iZXJzIGludG8gdGhlIGFycmF5IGlmIHRoZXJlIGFyZSBhbnkKLQkJaWYgKG1mX21lbWJlcnMgIT0gbnVsbCAmJiBtZl9zaXplID4gMCkKLQkJCVN5c3RlbS5hcnJheWNvcHkobWZfbWVtYmVycywgMCwgcmVzLCAwLCBtZl9zaXplKTsKLQkJLy8gQ29weSB0aGUgbmV3IG1lbWJlcnMgaW50byB0aGUgYXJyYXkKLQkJU3lzdGVtLmFycmF5Y29weShtciwgMCwgcmVzLCBtZl9zaXplLCBtci5sZW5ndGgpOwotCQkvLyBTZXQgdGhlIG5ldyBtZW1iZXJzIGFycmF5IG9uIHRoZSBtb2R1bGUgZm9sZGVyCi0JCW1mLnNldE1lbWJlcnMocmVzKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9BcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0FydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1N2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0FydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFZGl0TW9kZWxGYWN0b3J5IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRURJVF9NT0RFTF9JRCA9ICJvcmcuZWNsaXBzZS53c3QubW9kdWxlY29yZS5lZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTU9EVUxFX1VSSSA9ICJNT0RVTEVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfVVJJID0gIlJPT1RfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFID0gIlJPT1RfQ09OVEVOVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpIDogbnVsbCk7Ci0JCVVSSSByb290VVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfVVJJKSA6IG51bGwpOwotCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlID0gKFN0cmluZykgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFKSA6IG51bGwpOwotCQlpZihtb2R1bGVVUkkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgTW9kdWxlIFVSSSBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCQotCQlyZXR1cm4gIG5ldyBBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgdHJ1ZSwgbW9kdWxlVVJJLCByb290VVJJLCByb290Q29udGVudFR5cGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5I2NyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpIDogbnVsbCk7Ci0JCVVSSSByb290VVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfVVJJKSA6IG51bGwpOwotCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlID0gKFN0cmluZykgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFKSA6IG51bGwpOwotCQlpZihtb2R1bGVVUkkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgTW9kdWxlIFVSSSBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCXJldHVybiAgbmV3IEFydGlmYWN0RWRpdE1vZGVsKGVkaXRNb2RlbElELCBjb250ZXh0LCBmYWxzZSwgbW9kdWxlVVJJLCByb290VVJJLCByb290Q29udGVudFR5cGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5I2dldENhY2hlSUQoamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhY2hlSUQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zKSB7IAotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSlwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpOwotCQlpZihtb2R1bGVVUkkgIT0gbnVsbCkKLQkJCXJldHVybiBlZGl0TW9kZWxJRCsiOiIrbW9kdWxlVVJJLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVkaXRNb2RlbElEKyI6Tk9VUkkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRDb3JlVVJJQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRDb3JlVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzljYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSU1hcHBpbmdSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlciBleHRlbmRzIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsIHsKLQkKLQlwcml2YXRlIElQcm9qZWN0IGNvbnRhaW5pbmdQcm9qZWN0OwotLy8JcHJpdmF0ZSBJRm9sZGVyIGFyY2hpdmVSb290OwotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyKElQcm9qZWN0IGFDb250YWluaW5nUHJvamVjdCkgewotCQlzdXBlcigpOwotCQljb250YWluaW5nUHJvamVjdCA9IGFDb250YWluaW5nUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUNvbnRhaW5lcgotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICovCi0JcHVibGljIENvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIoSVByb2plY3QgYUNvbnRhaW5pbmdQcm9qZWN0LCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7Ci0JCXN1cGVyKGFDb250YWluaW5nUHJvamVjdCwgYVN5bmNocm9uaXplcik7Ci0JCWNvbnRhaW5pbmdQcm9qZWN0ID0gYUNvbnRhaW5pbmdQcm9qZWN0OwotCX0gCi0gCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGZpbmRDb21wb25lbnQoSVJlc291cmNlIHJlcykgewotCQkKLQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5leGlzdHMoKSkKLQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChyZXMuZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVySW1wbCNub3JtYWxpemUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgYVVSSSkgewotCQlVUkkgbm9ybWFsaXplZFVSSSA9IG51bGw7Ci0JCWlmKFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEUuZXF1YWxzKGFVUkkuc2NoZW1lKCkpKSB7IAkJCi0JCQl0cnkgewotCQkJCW5vcm1hbGl6ZWRVUkkgPSBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24ucmVzb2x2ZShhVVJJKTsKLQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9IAotCQl9IGVsc2UgewotCQkJbm9ybWFsaXplZFVSSSA9IHN1cGVyLm5vcm1hbGl6ZShhVVJJKTsKLQkJfQotCQlpZihub3JtYWxpemVkVVJJID09IG51bGwpIHsKLQkJCW5vcm1hbGl6ZWRVUkkgPSBuZXdQbGF0Zm9ybVVSSShhVVJJKTsKLQkJfQotCQllbHNlIGlmKG5vcm1hbGl6ZWRVUkkuc2NoZW1lKCkgPT0gbnVsbCB8fCBub3JtYWxpemVkVVJJLnNjaGVtZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCW5vcm1hbGl6ZWRVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRJbnB1dENvbnRhaW5lcigpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKG5vcm1hbGl6ZWRVUkkudG9TdHJpbmcoKSkudG9TdHJpbmcoKSk7CQotCQl9Ci0JCXJldHVybiBub3JtYWxpemVkVVJJOwotCX0KLQkKLQlwcml2YXRlIFVSSSBuZXdQbGF0Zm9ybVVSSShVUkkgYU5ld1VSSSkgewotCQkKLQkJdHJ5IHsKLS8vCQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBTdHJ1Y3R1cmVFZGl0LmdldERlcGxveWVkTmFtZShhTmV3VVJJKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGNvbnRhaW5pbmdQcm9qZWN0KTsKLQotCQkJVVJJIGRlcGxveVBhdGhTZWdtZW50ID0gTW9kdWxlVVJJVXRpbC50cmltVG9EZXBsb3lQYXRoU2VnbWVudChhTmV3VVJJKTsKLQkJCQotCQkJLy9JVmlydHVhbEZpbGUgbmV3RmlsZSA9IGNvbXBvbmVudC5nZXRGaWxlKG5ldyBQYXRoKGRlcGxveVBhdGhTZWdtZW50LnBhdGgoKSkpOwkJCQotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJVmlydHVhbEZpbGUgbmV3RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChkZXBsb3lQYXRoU2VnbWVudC5wYXRoKCkpKTsKLQkJCQotCQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG5ld0ZpbGUuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkgCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyI2RlTm9ybWFsaXplKFVSSSkKLQkgKi8KLQlwdWJsaWMgVVJJIGRlTm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJCQotCQkJaWYgKGFGaWxlICE9IG51bGwpIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRDb250YWluaW5nUHJvamVjdCgpKTsKLQkJCQkKLQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQkJSVByb2plY3QgZmlsZVByb2plY3QgPSBnZXRDb250YWluaW5nUHJvamVjdCgpOwotCQkJCQkKLQkJCQkJaWYgKHJlc291cmNlU2V0U3luY2hyb25pemVyLmdldFByb2plY3QoKSA9PSBmaWxlUHJvamVjdCl7Ci0JCQkJCQlMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKSk7Ci0JCQkJCQlJUGF0aCBwYXRoID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFBhdGhGcm9tQ29udGFpbmVycyhsaXN0LCBhRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCXJldHVybiBzdXBlci5kZU5vcm1hbGl6ZSh1cmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCQotCXByb3RlY3RlZCBVUkkgZ2V0Q29udGFpbmVyUmVsYXRpdmVVUkkoSUZpbGUgYUZpbGUpIHsKLQkJSVBhdGggcGF0aCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRQYXRoRnJvbUNvbnRhaW5lcnMoaW5wdXRDb250YWluZXJzLCBhRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKHBhdGgudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgVVJJIGdldEFyY2hpdmVSZWxhdGl2ZVVSSShJRmlsZSBhRmlsZSwgSUNvbnRhaW5lciBhQ29udGFpbmVyKSB7Ci0JCUlQYXRoIHBhdGggPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UGF0aEZyb21Db250YWluZXJzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYUNvbnRhaW5lciksIGFGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldENvbnRhaW5pbmdQcm9qZWN0KCkgewotCQlyZXR1cm4gY29udGFpbmluZ1Byb2plY3Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFVSSU1hcCBnZXRJbnRlcm5hbFVSSU1hcCgpIHsKLQotCSAgICBpZiAodXJpTWFwID09IG51bGwpCi0JICAgIHsKLQkgICAgICBVUklNYXBwaW5nUmVnaXN0cnlJbXBsIG1hcHBpbmdSZWdpc3RyeUltcGwgPSAKLQkgICAgICAgIG5ldyBVUklNYXBwaW5nUmVnaXN0cnlJbXBsKCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkgICAgICAgICAgQE92ZXJyaWRlCi0JICAgICAgICAgIHByb3RlY3RlZCBVUkkgZGVsZWdhdGVkR2V0VVJJKFVSSSB1cmkpCi0JICAgICAgICAgIHsKLQkgICAgICAgIAlpZiAoTW9kdWxlVVJJVXRpbC5oYXNDb250ZW50VHlwZU5hbWUodXJpKSkKLQkgICAgICAgIAkJcmV0dXJuIG5ld1BsYXRmb3JtVVJJKHVyaSk7Ci0JICAgICAgICAgICAgcmV0dXJuIFVSSU1hcHBpbmdSZWdpc3RyeUltcGwuSU5TVEFOQ0UuZ2V0VVJJKHVyaSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH07Ci0KLQkgICAgICB1cmlNYXAgPSAoVVJJTWFwKW1hcHBpbmdSZWdpc3RyeUltcGwubWFwKCk7Ci0JICAgIH0KLQotCSAgICBVUklNYXAgdXJpQ29udmVydGVySW1wbFVSSU1hcCA9IG51bGw7Ci0JICAgIGlmICh1cmlNYXAgaW5zdGFuY2VvZiBVUklNYXApCi0JICAgIHsKLQkgICAgCXVyaUNvbnZlcnRlckltcGxVUklNYXAgPSAoVVJJTWFwKXVyaU1hcDsKLQkgICAgfQotCSAgICByZXR1cm4gdXJpQ29udmVydGVySW1wbFVSSU1hcDsKLQkgIAotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTk4Y2QxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50UmVzb3VyY2VJbXBsLmphdmEsdiAxLjQuNC4xIDIwMTEvMDgvMDMgMTk6NDE6NTkgcnNhbmNoZXogRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWwuRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2JlbmNoIE1vZHVsZSBSZXNvdXJjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldFNvdXJjZVBhdGggPGVtPlNvdXJjZSBQYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRSZXNvdXJjZUltcGwjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldEV4Y2x1c2lvbnMgPGVtPkV4Y2x1c2lvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldFJlc291cmNlVHlwZSA8ZW0+UmVzb3VyY2UgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldFRhZyA8ZW0+VGFnPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50UmVzb3VyY2VJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb21wb25lbnRSZXNvdXJjZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZVBhdGgoKSA8ZW0+U291cmNlIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggU09VUkNFX1BBVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlUGF0aCgpIDxlbT5Tb3VyY2UgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIHNvdXJjZVBhdGggPSBTT1VSQ0VfUEFUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSdW50aW1lUGF0aCgpIDxlbT5SdW50aW1lIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJ1bnRpbWVQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElQYXRoIFJVTlRJTUVfUEFUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSdW50aW1lUGF0aCgpIDxlbT5SdW50aW1lIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJ1bnRpbWVQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggcnVudGltZVBhdGggPSBSVU5USU1FX1BBVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdXNpb25zKCkgPGVtPkV4Y2x1c2lvbnM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVzaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4Y2x1c2lvbnM7Ci0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVHlwZSgpIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1RZUEVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVHlwZSgpIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VUeXBlID0gUkVTT1VSQ0VfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWcoKSA8ZW0+VGFnPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWcoKSA8ZW0+VGFnPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFnID0gVEFHX0VERUZBVUxUOwotCi0JcHJvdGVjdGVkIElQcm9qZWN0IG93bmluZ1Byb2plY3Q7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVklSVFVBTCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVEID0gMTsKLQkKLQlwcml2YXRlIGludCB0eXBlID0gUEVSU0lTVEVEOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRTb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gc291cmNlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VQYXRoKElQYXRoIG5ld1NvdXJjZVBhdGgpIHsKLQkJSVBhdGggb2xkU291cmNlUGF0aCA9IHNvdXJjZVBhdGg7Ci0JCXNvdXJjZVBhdGggPSBuZXdTb3VyY2VQYXRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1NPVVJDRV9QQVRILCBvbGRTb3VyY2VQYXRoLCBzb3VyY2VQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKCkgewotCQlyZXR1cm4gcnVudGltZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVBhdGgoSVBhdGggbmV3UnVudGltZVBhdGgpIHsKLQkJSVBhdGggb2xkUnVudGltZVBhdGggPSBydW50aW1lUGF0aDsKLQkJcnVudGltZVBhdGggPSBuZXdSdW50aW1lUGF0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SVU5USU1FX1BBVEgsIG9sZFJ1bnRpbWVQYXRoLCBydW50aW1lUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeGNsdXNpb25zKCkgewotCQlpZiAoZXhjbHVzaW9ucyA9PSBudWxsKSB7Ci0JCQlleGNsdXNpb25zID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TKTsKLQkJfQotCQlyZXR1cm4gZXhjbHVzaW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudCllQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQgbmV3Q29tcG9uZW50KSB7Ci0JCWlmIChuZXdDb21wb25lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCAmJiBuZXdDb21wb25lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdDb21wb25lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbXBvbmVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb21wb25lbnQpLmVJbnZlcnNlQWRkKHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUywgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdDb21wb25lbnQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5ULCBuZXdDb21wb25lbnQsIG5ld0NvbXBvbmVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgbmV3UmVzb3VyY2VUeXBlKSB7Ci0JCVN0cmluZyBvbGRSZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7Ci0JCXJlc291cmNlVHlwZSA9IG5ld1Jlc291cmNlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SRVNPVVJDRV9UWVBFLCBvbGRSZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gdGFnOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZyhTdHJpbmcgbmV3VGFnKSB7Ci0JCVN0cmluZyBvbGRUYWcgPSB0YWc7Ci0JCXRhZyA9IG5ld1RhZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19UQUcsIG9sZFRhZywgdGFnKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1NPVVJDRV9QQVRIOgotCQkJCXJldHVybiBnZXRTb3VyY2VQYXRoKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIOgotCQkJCXJldHVybiBnZXRSdW50aW1lUGF0aCgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlM6Ci0JCQkJcmV0dXJuIGdldEV4Y2x1c2lvbnMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQ6Ci0JCQkJcmV0dXJuIGdldENvbXBvbmVudCgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlVHlwZSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1RBRzoKLQkJCQlyZXR1cm4gZ2V0VGFnKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1NPVVJDRV9QQVRIOgotCQkJCXNldFNvdXJjZVBhdGgoKElQYXRoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIOgotCQkJCXNldFJ1bnRpbWVQYXRoKChJUGF0aCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlM6Ci0JCQkJZ2V0RXhjbHVzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhjbHVzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQlzZXRDb21wb25lbnQoKFdvcmtiZW5jaENvbXBvbmVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEU6Ci0JCQkJc2V0UmVzb3VyY2VUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19UQUc6Ci0JCQkJc2V0VGFnKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEg6Ci0JCQkJc2V0U291cmNlUGF0aChTT1VSQ0VfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JVTlRJTUVfUEFUSDoKLQkJCQlzZXRSdW50aW1lUGF0aChSVU5USU1FX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TOgotCQkJCWdldEV4Y2x1c2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQ6Ci0JCQkJc2V0Q29tcG9uZW50KChXb3JrYmVuY2hDb21wb25lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEU6Ci0JCQkJc2V0UmVzb3VyY2VUeXBlKFJFU09VUkNFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19UQUc6Ci0JCQkJc2V0VGFnKFRBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEg6Ci0JCQkJcmV0dXJuIFNPVVJDRV9QQVRIX0VERUZBVUxUID09IG51bGwgPyBzb3VyY2VQYXRoICE9IG51bGwgOiAhU09VUkNFX1BBVEhfRURFRkFVTFQuZXF1YWxzKHNvdXJjZVBhdGgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JVTlRJTUVfUEFUSDoKLQkJCQlyZXR1cm4gUlVOVElNRV9QQVRIX0VERUZBVUxUID09IG51bGwgPyBydW50aW1lUGF0aCAhPSBudWxsIDogIVJVTlRJTUVfUEFUSF9FREVGQVVMVC5lcXVhbHMocnVudGltZVBhdGgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlM6Ci0JCQkJcmV0dXJuIGV4Y2x1c2lvbnMgIT0gbnVsbCAmJiAhZXhjbHVzaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UOgotCQkJCXJldHVybiBnZXRDb21wb25lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEU6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVHlwZSAhPSBudWxsIDogIVJFU09VUkNFX1RZUEVfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVHlwZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fVEFHOgotCQkJCXJldHVybiBUQUdfRURFRkFVTFQgPT0gbnVsbCA/IHRhZyAhPSBudWxsIDogIVRBR19FREVGQVVMVC5lcXVhbHModGFnKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNvdXJjZVBhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNvdXJjZVBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJ1bnRpbWVQYXRoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChydW50aW1lUGF0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVzaW9uczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVzaW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFnKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRPd25pbmdQcm9qZWN0KCkgewotCQlyZXR1cm4gb3duaW5nUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25pbmdQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCW93bmluZ1Byb2plY3QgPSBhUHJvamVjdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0IGVBZGFwdGVycygpCi0JICB7Ci0JICAgIGlmIChlQWRhcHRlcnMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVBZGFwdGVycyA9ICBuZXcgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQWRhcHRlcnM7Ci0JICB9Ci0JCi0KLX0gLy9Db21wb25lbnRSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMyZjIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDUvMDQvMDQgMDc6MDQ6NTkgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kdWxlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldENvbXBvbmVudFR5cGVJZCA8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFR5cGVJbXBsI2dldE1ldGFkYXRhUmVzb3VyY2VzIDxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29tcG9uZW50VHlwZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudFR5cGVJZCgpIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRV9JRF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50VHlwZUlkKCkgPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcG9uZW50VHlwZUlkID0gQ09NUE9ORU5UX1RZUEVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGFkYXRhUmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0YWRhdGFSZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGVJZCgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nIG5ld0NvbXBvbmVudFR5cGVJZCkgewotCQlTdHJpbmcgb2xkQ29tcG9uZW50VHlwZUlkID0gY29tcG9uZW50VHlwZUlkOwotCQljb21wb25lbnRUeXBlSWQgPSBuZXdDb21wb25lbnRUeXBlSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRCwgb2xkQ29tcG9uZW50VHlwZUlkLCBjb21wb25lbnRUeXBlSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSB7Ci0JCWlmIChtZXRhZGF0YVJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltZXRhZGF0YVJlc291cmNlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChJUGF0aC5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGFkYXRhUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQcm9wZXJ0aWVzKCkgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChQcm9wZXJ0eS5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEOgotCQkJCXJldHVybiBnZXRDb21wb25lbnRUeXBlSWQoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRDoKLQkJCQlzZXRDb21wb25lbnRUeXBlSWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCWdldE1ldGFkYXRhUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRhZGF0YVJlc291cmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEOgotCQkJCXNldENvbXBvbmVudFR5cGVJZChDT01QT05FTlRfVFlQRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCWdldE1ldGFkYXRhUmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEOgotCQkJCXJldHVybiBDT01QT05FTlRfVFlQRV9JRF9FREVGQVVMVCA9PSBudWxsID8gY29tcG9uZW50VHlwZUlkICE9IG51bGwgOiAhQ09NUE9ORU5UX1RZUEVfSURfRURFRkFVTFQuZXF1YWxzKGNvbXBvbmVudFR5cGVJZCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCXJldHVybiBtZXRhZGF0YVJlc291cmNlcyAhPSBudWxsICYmICFtZXRhZGF0YVJlc291cmNlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21wb25lbnRUeXBlSWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbXBvbmVudFR5cGVJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0YWRhdGFSZXNvdXJjZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGFkYXRhUmVzb3VyY2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29tcG9uZW50VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiY2FiMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwuamF2YSx2IDEuOCAyMDA2LzA0LzI3IDA0OjE3OjQwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ29tcG9uZW50Y29yZUZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudGNvcmVGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlDb21wb25lbnRjb3JlRmFjdG9yeSB0aGVDb21wb25lbnRjb3JlRmFjdG9yeSA9IChDb21wb25lbnRjb3JlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY29tcG9uZW50Y29yZS54bWkiKTsgCi0JCQlpZiAodGhlQ29tcG9uZW50Y29yZUZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVDb21wb25lbnRjb3JlRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVDogcmV0dXJuIGNyZWF0ZVdvcmtiZW5jaENvbXBvbmVudCgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0U6IHJldHVybiBjcmVhdGVDb21wb25lbnRSZXNvdXJjZSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRTogcmV0dXJuIGNyZWF0ZUNvbXBvbmVudFR5cGUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFk6IHJldHVybiBjcmVhdGVQcm9wZXJ0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVDogcmV0dXJuIGNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTOiByZXR1cm4gY3JlYXRlUHJvamVjdENvbXBvbmVudHMoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkRFUEVOREVOQ1lfVFlQRTogewotCQkJCURlcGVuZGVuY3lUeXBlIHJlc3VsdCA9IERlcGVuZGVuY3lUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLklQQVRIOgotCQkJCXJldHVybiBjcmVhdGVJUGF0aEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5VUkk6Ci0JCQkJcmV0dXJuIGNyZWF0ZVVSSUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuREVQRU5ERU5DWV9UWVBFOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5JUEFUSDoKLQkJCQlyZXR1cm4gY29udmVydElQYXRoVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuVVJJOgotCQkJCXJldHVybiBjb252ZXJ0VVJJVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlXb3JrYmVuY2hDb21wb25lbnRJbXBsIHdvcmtiZW5jaENvbXBvbmVudCA9IG5ldyBXb3JrYmVuY2hDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiB3b3JrYmVuY2hDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlIGNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCkgewotCQlDb21wb25lbnRSZXNvdXJjZUltcGwgY29tcG9uZW50UmVzb3VyY2UgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VJbXBsKCk7Ci0JCXJldHVybiBjb21wb25lbnRSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50VHlwZSBjcmVhdGVDb21wb25lbnRUeXBlKCkgewotCQlDb21wb25lbnRUeXBlSW1wbCBjb21wb25lbnRUeXBlID0gbmV3IENvbXBvbmVudFR5cGVJbXBsKCk7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpIHsKLQkJUHJvcGVydHlJbXBsIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlZmVyZW5jZWRDb21wb25lbnQgY3JlYXRlUmVmZXJlbmNlZENvbXBvbmVudCgpIHsKLQkJUmVmZXJlbmNlZENvbXBvbmVudEltcGwgcmVmZXJlbmNlZENvbXBvbmVudCA9IG5ldyBSZWZlcmVuY2VkQ29tcG9uZW50SW1wbCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlZENvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdENvbXBvbmVudHMgY3JlYXRlUHJvamVjdENvbXBvbmVudHMoKSB7Ci0JCVByb2plY3RDb21wb25lbnRzSW1wbCBwcm9qZWN0Q29tcG9uZW50cyA9IG5ldyBQcm9qZWN0Q29tcG9uZW50c0ltcGwoKTsKLQkJcmV0dXJuIHByb2plY3RDb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBjcmVhdGVJUGF0aEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKElQYXRoKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydElQYXRoVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgY3JlYXRlVVJJRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoVVJJKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVSSVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgZ2V0Q29tcG9uZW50Y29yZVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoQ29tcG9uZW50Y29yZVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9Db21wb25lbnRjb3JlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzcxYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlUGFja2FnZUltcGwuamF2YSx2IDEuMTAuNC4xIDIwMTEvMDgvMDMgMTk6NDE6NTkgcnNhbmNoZXogRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRjb3JlUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb21wb25lbnRjb3JlUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBvbmVudFJlc291cmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbXBvbmVudFR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9qZWN0Q29tcG9uZW50c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGRlcGVuZGVuY3lUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaVBhdGhFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdXJpRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb25lbnRjb3JlUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQ29tcG9uZW50Y29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tcG9uZW50Y29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlDb21wb25lbnRjb3JlUGFja2FnZUltcGwgdGhlQ29tcG9uZW50Y29yZVBhY2thZ2UgPSAoQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIENvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IENvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlQ29tcG9uZW50Y29yZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVDb21wb25lbnRjb3JlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVDb21wb25lbnRjb3JlUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCXJldHVybiB3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya2JlbmNoQ29tcG9uZW50X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfUmVmZXJlbmNlZENvbXBvbmVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtiZW5jaENvbXBvbmVudF9NZXRhZGF0YVJlc291cmNlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9uZW50UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBjb21wb25lbnRSZXNvdXJjZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFJlc291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50UmVzb3VyY2VfRXhjbHVzaW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFJlc291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29tcG9uZW50UmVzb3VyY2VfQ29tcG9uZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRSZXNvdXJjZV9SZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRSZXNvdXJjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1RhZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFJlc291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gY29tcG9uZW50VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRUeXBlX0NvbXBvbmVudFR5cGVJZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRUeXBlX1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29tcG9uZW50VHlwZV9Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9uZW50VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFR5cGVfTWV0YWRhdGFSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlZmVyZW5jZWRDb21wb25lbnQoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfSGFuZGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfUnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdENvbXBvbmVudHMoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q29tcG9uZW50c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2plY3RDb21wb25lbnRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2plY3RDb21wb25lbnRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2plY3RDb21wb25lbnRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERlcGVuZGVuY3lUeXBlKCkgewotCQlyZXR1cm4gZGVwZW5kZW5jeVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldElQYXRoKCkgewotCQlyZXR1cm4gaVBhdGhFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmlFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudGNvcmVGYWN0b3J5IGdldENvbXBvbmVudGNvcmVGYWN0b3J5KCkgewotCQlyZXR1cm4gKENvbXBvbmVudGNvcmVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLQkVOQ0hfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtiZW5jaENvbXBvbmVudEVDbGFzcywgV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX01FVEFEQVRBX1JFU09VUkNFUyk7Ci0KLQkJY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9ORU5UX1JFU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ09NUE9ORU5UX1JFU09VUkNFX19TT1VSQ0VfUEFUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MsIENPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFJlc291cmNlRUNsYXNzLCBDT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFJlc291cmNlRUNsYXNzLCBDT01QT05FTlRfUkVTT1VSQ0VfX1RBRyk7Ci0KLQkJY29tcG9uZW50VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QT05FTlRfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9uZW50VHlwZUVDbGFzcywgQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRUeXBlRUNsYXNzLCBDT01QT05FTlRfVFlQRV9fVkVSU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29tcG9uZW50VHlwZUVDbGFzcywgQ09NUE9ORU5UX1RZUEVfX1BST1BFUlRJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFR5cGVFQ2xhc3MsIENPTVBPTkVOVF9UWVBFX19NRVRBREFUQV9SRVNPVVJDRVMpOwotCi0JCXByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fVkFMVUUpOwotCi0JCXJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVGRVJFTkNFRF9DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19IQU5ETEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEgpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTkNZX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MsIFJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fQVJDSElWRV9OQU1FKTsKLQotCQlwcm9qZWN0Q29tcG9uZW50c0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9KRUNUX0NPTVBPTkVOVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2plY3RDb21wb25lbnRzRUNsYXNzLCBQUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvamVjdENvbXBvbmVudHNFQ2xhc3MsIFBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvamVjdENvbXBvbmVudHNFQ2xhc3MsIFBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTik7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWRlcGVuZGVuY3lUeXBlRUVudW0gPSBjcmVhdGVFRW51bShERVBFTkRFTkNZX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWlQYXRoRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElQQVRIKTsKLQkJdXJpRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFVSSSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgIldvcmtiZW5jaENvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrYmVuY2hDb21wb25lbnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsICIiLCAxLCAxLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpLCB0aGlzLmdldENvbXBvbmVudFJlc291cmNlKCksIHRoaXMuZ2V0Q29tcG9uZW50UmVzb3VyY2VfQ29tcG9uZW50KCksICJyZXNvdXJjZXMiLCBudWxsLCAwLCAtMSwgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXb3JrYmVuY2hDb21wb25lbnRfQ29tcG9uZW50VHlwZSgpLCB0aGlzLmdldENvbXBvbmVudFR5cGUoKSwgbnVsbCwgImNvbXBvbmVudFR5cGUiLCBudWxsLCAxLCAxLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdvcmtiZW5jaENvbXBvbmVudF9SZWZlcmVuY2VkQ29tcG9uZW50cygpLCB0aGlzLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSwgbnVsbCwgInJlZmVyZW5jZWRDb21wb25lbnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRQcm9wZXJ0eSgpLCBudWxsLCAicHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya2JlbmNoQ29tcG9uZW50X01ldGFkYXRhUmVzb3VyY2VzKCksIHRoaXMuZ2V0SVBhdGgoKSwgIm1ldGFkYXRhUmVzb3VyY2VzIiwgbnVsbCwgMCwgLTEsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MsIENvbXBvbmVudFJlc291cmNlLmNsYXNzLCAiQ29tcG9uZW50UmVzb3VyY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpLCB0aGlzLmdldElQYXRoKCksICJzb3VyY2VQYXRoIiwgbnVsbCwgMSwgMSwgQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKSwgdGhpcy5nZXRJUGF0aCgpLCAicnVudGltZVBhdGgiLCBudWxsLCAxLCAxLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRSZXNvdXJjZV9FeGNsdXNpb25zKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleGNsdXNpb25zIiwgIiIsIDAsIC0xLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKSwgdGhpcy5nZXRXb3JrYmVuY2hDb21wb25lbnQoKSwgdGhpcy5nZXRXb3JrYmVuY2hDb21wb25lbnRfUmVzb3VyY2VzKCksICJjb21wb25lbnQiLCBudWxsLCAxLCAxLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VUeXBlIiwgIiIsIDEsIDEsIENvbXBvbmVudFJlc291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFJlc291cmNlX1RhZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnIiwgbnVsbCwgMCwgMSwgQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGNvbXBvbmVudFR5cGVFQ2xhc3MsIENvbXBvbmVudFR5cGUuY2xhc3MsICJDb21wb25lbnRUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21wb25lbnRUeXBlSWQiLCAiIiwgMSwgMSwgQ29tcG9uZW50VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRUeXBlX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCAiIiwgMSwgMSwgQ29tcG9uZW50VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRQcm9wZXJ0eSgpLCBudWxsLCAicHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBDb21wb25lbnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFR5cGVfTWV0YWRhdGFSZXNvdXJjZXMoKSwgdGhpcy5nZXRJUGF0aCgpLCAibWV0YWRhdGFSZXNvdXJjZXMiLCBudWxsLCAwLCAtMSwgQ29tcG9uZW50VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocHJvcGVydHlFQ2xhc3MsIFByb3BlcnR5LmNsYXNzLCAiUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCAiIiwgMSwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgIiIsIDEsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSZWZlcmVuY2VkQ29tcG9uZW50LmNsYXNzLCAiUmVmZXJlbmNlZENvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKSwgdGhpcy5nZXRVUkkoKSwgImhhbmRsZSIsIG51bGwsIDEsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9SdW50aW1lUGF0aCgpLCB0aGlzLmdldElQYXRoKCksICJydW50aW1lUGF0aCIsIG51bGwsIDEsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpLCB0aGlzLmdldERlcGVuZGVuY3lUeXBlKCksICJkZXBlbmRlbmN5VHlwZSIsIG51bGwsIDEsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbnRPYmplY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgbnVsbCwgImRlcGVuZGVudE9iamVjdCIsIG51bGwsIDAsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9BcmNoaXZlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYXJjaGl2ZU5hbWUiLCBudWxsLCAwLCAxLCBSZWZlcmVuY2VkQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhwcm9qZWN0Q29tcG9uZW50c0VDbGFzcywgUHJvamVjdENvbXBvbmVudHMuY2xhc3MsICJQcm9qZWN0Q29tcG9uZW50cyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvamVjdE5hbWUiLCAiIiwgMSwgMSwgUHJvamVjdENvbXBvbmVudHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpLCB0aGlzLmdldFdvcmtiZW5jaENvbXBvbmVudCgpLCBudWxsLCAiY29tcG9uZW50cyIsIG51bGwsIDAsIC0xLCBQcm9qZWN0Q29tcG9uZW50cy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDEsIDEsIFByb2plY3RDb21wb25lbnRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGRlcGVuZGVuY3lUeXBlRUVudW0sIERlcGVuZGVuY3lUeXBlLmNsYXNzLCAiRGVwZW5kZW5jeVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZGVwZW5kZW5jeVR5cGVFRW51bSwgRGVwZW5kZW5jeVR5cGUuVVNFU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRlcGVuZGVuY3lUeXBlRUVudW0sIERlcGVuZGVuY3lUeXBlLkNPTlNVTUVTX0xJVEVSQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGlQYXRoRURhdGFUeXBlLCBJUGF0aC5jbGFzcywgIklQYXRoIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHVyaUVEYXRhVHlwZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSS5jbGFzcywgIlVSSSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGtleXdvcmRzCi0JCWNyZWF0ZUtleXdvcmRzQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmtleXdvcmRzPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVLZXl3b3Jkc0Fubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImtleXdvcmRzIjsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGlQYXRoRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAiZGF0YXR5cGUiLCBudWxsCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodXJpRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAiZGF0YXR5cGUiLCBudWxsCi0JCSAgIH0pOwotCX0KLQotfSAvL0NvbXBvbmVudGNvcmVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSU1vZHVsZVN0cnVjdHVyZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9JTW9kdWxlU3RydWN0dXJlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhOTdkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9JTW9kdWxlU3RydWN0dXJlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVTdHJ1Y3R1cmVMaXN0ZW5lciB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RydWN0dXJlQ2hhbmdlZChNb2R1bGVTdHJ1Y3R1cmVFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0lSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSVJlc291cmNlRmFjdG9yeUV4dFB0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTFlNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSVJlc291cmNlRmFjdG9yeUV4dFB0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VGYWN0b3J5RXh0UHRDb25zdGFudHMgewotCQotCi0JU3RyaW5nIEVYVFBUX1JFU09VUkNFX0ZBQ1RPUklFUyA9ICJyZXNvdXJjZUZhY3RvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgVEFHX1JFU09VUkNFX0ZBQ1RPUlkgPSAicmVzb3VyY2VGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEFUVF9TSE9SVF9TRUdNRU5UID0gInNob3J0U2VnbWVudCI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JU3RyaW5nIFRBR19DT05URU5UVFlQRSA9ICJjb250ZW50VHlwZUJpbmRpbmciOyAvLyROT04tTkxTLTEkIAotCQotCVN0cmluZyBBVFRfQ09OVEVOVFRZUEVJRCA9ICJjb250ZW50VHlwZUlkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQlTdHJpbmcgQVRUX0lTREVGQVVMVCA9ICJpc0RlZmF1bHQiOyAvLyROT04tTkxTLTEkIAotCQotCVN0cmluZyBBVFRfT1ZFUlJJREVTX0ZBQ1RPUlkgPSJvdmVycmlkZXNGYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkIAotCQkKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTWFwcGVkQ29tcG9uZW50WE1JSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9NYXBwZWRDb21wb25lbnRYTUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwY2NiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9NYXBwZWRDb21wb25lbnRYTUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLk1hcHBlZFhNSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLQotcHVibGljIGNsYXNzIE1hcHBlZENvbXBvbmVudFhNSUhlbHBlciBleHRlbmRzIE1hcHBlZFhNSUhlbHBlciB7Ci0KLQlwdWJsaWMgTWFwcGVkQ29tcG9uZW50WE1JSGVscGVyKFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgcHJlZml4ZXNUb1VSSXMpIHsKLQkJc3VwZXIocmVzb3VyY2UsIHByZWZpeGVzVG9VUklzKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIHJlc29sdmUoVVJJIHJlbGF0aXZlLCBVUkkgYmFzZSkgewotCQlVUkkgcmVzb2x2ZWQgPSBudWxsOwotCQlpZiAoIWlzTWFwcGVkKHJlbGF0aXZlKSkKLQkJCXJlc29sdmVkID0gcmVzb2x2ZVVSSUZyb21Db21wb25lbnQocmVsYXRpdmUsYmFzZSk7Ci0JCWVsc2UKLQkJCXJlc29sdmVkID0gcmVsYXRpdmU7Ci0JCQotCQlyZXR1cm4gcmVzb2x2ZWQgPT0gbnVsbCA/IHN1cGVyLnJlc29sdmUocmVsYXRpdmUsIGJhc2UpIDogcmVzb2x2ZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc01hcHBlZChVUkkgcmVsYXRpdmUpIHsKLQkJYm9vbGVhbiBpc01hcHBlZCA9IGZhbHNlOwotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJVVJJIGxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZTsKLQkJCWlmIChyZWxhdGl2ZS5oYXNGcmFnbWVudCgpKQotCQkJCWxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZS50cmltRnJhZ21lbnQoKTsKLQkJCWlzTWFwcGVkID0gISgoVVJJQ29udmVydGVySW1wbC5VUklNYXApIHNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKGxvY2FscmVzb3VyY2VVUkkpLmVxdWFscyhsb2NhbHJlc291cmNlVVJJKTsKLQkJfQotCQlyZXR1cm4gaXNNYXBwZWQ7Ci0JfQotCQotCXByaXZhdGUgVVJJIHJlc29sdmVVUklGcm9tQ29tcG9uZW50KFVSSSByZWxhdGl2ZSwgVVJJIGJhc2UpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KGJhc2UpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChyZWxhdGl2ZS50b1N0cmluZygpKSk7Ci0JCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCkgewotCQkJCUlQYXRoIHJlc29sdmluZ1BhdGggPSB2aXJ0dWFsRmlsZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJCQlpZiAocmVzb2x2aW5nUGF0aCAhPW51bGwpIAotCQkJCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb2x2aW5nUGF0aC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoVVJJIGJhc2UpIHsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ID09IG51bGwgfHwgc2V0LmdldFVSSUNvbnZlcnRlcigpPT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSSSBub3JtYWxpemVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShiYXNlKTsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkobm9ybWFsaXplZCkpIHsKLQkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUobm9ybWFsaXplZCk7Ci0JCQlpZiAoZmlsZSAhPW51bGwpIHsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQkJCWlmICh2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aD4wKQotCQkJCQlyZXR1cm4gdmlydHVhbFJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbmRleGluZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUluZGV4aW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ2ZTUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUluZGV4aW5nQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVJbmRleGluZ0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBNT0RVTEVfSU5ERVhJTkdfQURBUFRFUl9DTEFTUyA9IE1vZHVsZUluZGV4aW5nQWRhcHRlci5jbGFzczsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBhTm90aWZpY2F0aW9uKSB7Ci0JCWlmIChhTm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IG5vdGlmaWVyID0gKEVPYmplY3QpIGFOb3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllci5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSA9PSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFMpIHsKLQkJCQlQcm9qZWN0Q29tcG9uZW50c0ltcGwgcHJvamVjdE1vZHVsZXMgPSAoUHJvamVjdENvbXBvbmVudHNJbXBsKSBub3RpZmllcjsKLQkJCQlzeW5jaHJvbml6ZWQgKHByb2plY3RNb2R1bGVzLmdldE1vZHVsZXNJbmRleCgpKSB7Ci0JCQkJCXN3aXRjaCAoYU5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQkJCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgYU5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQkJCXByb2plY3RNb2R1bGVzLmdldE1vZHVsZXNJbmRleCgpLnB1dChtb2R1bGUuZ2V0TmFtZSgpLCBtb2R1bGUpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCX0KLQkJfSAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gTU9EVUxFX0lOREVYSU5HX0FEQVBURVJfQ0xBU1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIyMjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5IGV4dGVuZHMgRWRpdE1vZGVsRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1NUUlVDVFVSQUxfTU9ERUxfSUQgPSAib3JnLmVjbGlwc2Uud3N0Lm1vZHVsZWNvcmUuc3RydWN0dXJhbE1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBNYXAgdGhlUGFyYW1zKSB7Ci0JCXJldHVybiBuZXcgTW9kdWxlU3RydWN0dXJhbE1vZGVsKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0cnVlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIE1hcCB0aGVQYXJhbXMpIHsKLQkJcmV0dXJuIG5ldyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIGZhbHNlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVTdHJ1Y3R1cmVFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MmUzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVTdHJ1Y3R1cmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjYsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotCi0vL2luIHByb2dyZXNzLi4uCi0KLXB1YmxpYyBjbGFzcyBNb2R1bGVTdHJ1Y3R1cmVFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLSAgICAvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIENvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzOwotCi0gICAgcHVibGljIE1vZHVsZVN0cnVjdHVyZUV2ZW50KE9iamVjdCBzb3VyY2UpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1vZHVsZVN0cnVjdHVyZUV2ZW50KE9iamVjdCBzb3VyY2UsIENvbXBvbmVudFJlc291cmNlW10gdGhlTW9kdWxlUmVzb3VyY2VzKSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgICAgIHJlc291cmNlcyA9IHRoZU1vZHVsZVJlc291cmNlczsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZ2V0TW91ZGxlUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwotICAgIH0KLSAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVVUklVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVVUklVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzY2NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlVVJJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVVSSVV0aWwgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVVJJX1BST1RPQ09MID0gUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRV9QUk9UT0NPTCtJUGF0aC5TRVBBUkFUT1IrUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLlJFU09VUkNFX01PRFVMRStJUGF0aC5TRVBBUkFUT1I7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX1VSSV9QUk9UT0NPTCA9IFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wrSVBhdGguU0VQQVJBVE9SK1BsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5DTEFTU1BBVEggK0lQYXRoLlNFUEFSQVRPUjsKLQkKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBNb2R1bGVVUkkgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJfUFJPVE9DT0xfSU5EWCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RfTkFNRV9JTkRYID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX05BTUVfSU5EWCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9JTkRYID0gMzsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1NDSEVNRSA9ICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9QUk9UT0NPTCA9ICJyZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIDxwPgotCSAqIEEgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkgd2lsbCBjb250YWluIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgdGhlIGRlcGxveWVkIG5hbWUKLQkgKiBvZiB0aGUgbW9kdWxlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBkZXBsb3llZCBuYW1lIG9mIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cmVmZXJlbmNlZCBieSB0aGUgbW9kdWxlIFVSSQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJIGlzIGludmFsaWQgb3IgdW5yZXNvbHZlYWJsZS4KLQkgKi8gCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVwbG95ZWROYW1lKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoYU1vZHVsZVVSSSk7Ci0JCXJldHVybiBhTW9kdWxlVVJJLnNlZ21lbnQoTW9kdWxlVVJJLk1PRFVMRV9OQU1FX0lORFgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkksIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKFVSSSBhTW9kdWxlVVJJLCBib29sZWFuIHRvVGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlpZiAoYU1vZHVsZVVSSS5zZWdtZW50Q291bnQoKSA8IDMpIHsKLQkJCWlmKHRvVGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeSkKLQkJCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhTW9kdWxlVVJJKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShVUkkgYU1vZHVsZVVSSSkgewotCQlpZiAoYU1vZHVsZVVSSS5zZWdtZW50Q291bnQoKSA8IDMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZFBsYXRmb3JtVVJJKFVSSSBhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSwgYm9vbGVhbiB0b1Rocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLnNlZ21lbnRDb3VudCgpIDwgMiB8fCAhUExBVEZPUk1fU0NIRU1FLmVxdWFscyhhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5zY2hlbWUoKSkgfHwgIVJFU09VUkNFX1BST1RPQ09MLmVxdWFscyhhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5zZWdtZW50KDApKSkgewotCQkJaWYgKHRvVGhyb3dFeGNlcHRpb25JZk5lY2Vzc2FyeSkKLQkJCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRQbGF0Zm9ybVVSSShVUkkgYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZFBsYXRmb3JtVVJJKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSB0cmltTW9kdWxlUmVzb3VyY2VQYXRoVG9Nb2R1bGVVUkkoVVJJIGFNb2R1bGVSZXNvdXJjZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShhTW9kdWxlUmVzb3VyY2VQYXRoKTsKLQkJaW50IHRyaW1JbmRleCA9IChoYXNDb250ZW50VHlwZU5hbWUoYU1vZHVsZVJlc291cmNlUGF0aCkgPyA0IDogMyk7Ci0JCXJldHVybiBhTW9kdWxlUmVzb3VyY2VQYXRoLnRyaW1TZWdtZW50cyhhTW9kdWxlUmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpIC0gdHJpbUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSB0cmltV29ya3NwYWNlUGF0aFRvUHJvamVjdFJlbGF0aXZlVVJJKFVSSSBhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlVUkkgcHJvamVjdFJlbGF0aXZlUGF0aCA9IG51bGw7Ci0JCS8qIENoZWNrIGZvciBhIG5vbi1oaWVyYWNoaWNhbCBXb3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBvZiB0aGUgZm9ybSBwbGF0Zm9ybTovcmVzb3VyY2UvPHByb2plY3Q+Ly4uLiovCi0JCWlmIChlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkUGxhdGZvcm1VUkkoYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkksIGZhbHNlKSkgewotCQkJaWYgKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLnNlZ21lbnRDb3VudCgpID09IDIpCi0JCQkJLyogVGhlIFVSSSBwb2ludHMgdG8gYSBwcm9qZWN0LCByZXNvbHZlIHRvIGFuIGVtcHR5IFVSSSAqLwotCQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvKgotCQkJICogVGhlIFVSSSBoYXMgdG8gYmUgPiAyIHNpbmNlIHRoZSB2YWxpZGF0aW9uIG1ldGhvZCBhYm92ZSBjaGVja3MgZm9yIDwgMiwgYW5kIGp1c3QKLQkJCSAqIGNoZWNrZWQgZm9yID09IDIgc28gaWYgWCBOT1QgPCAyIGFuZCBYIE5PVCA9PSAyLCBUSEVOID4gMgotCQkJICovCi0JCQlwcm9qZWN0UmVsYXRpdmVQYXRoID0gdHJpbVRvUmVsYXRpdmVQYXRoKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLCAyKTsKLQotCQl9IGVsc2UgaWYoYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkuaXNIaWVyYXJjaGljYWwoKSAmJiBhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5wYXRoKCkuc3RhcnRzV2l0aCgiIitJUGF0aC5TRVBBUkFUT1IpKSB7Ci0JCQlwcm9qZWN0UmVsYXRpdmVQYXRoID0gdHJpbVRvUmVsYXRpdmVQYXRoKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLCAxKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJKTsKLQkJfQotCQlyZXR1cm4gcHJvamVjdFJlbGF0aXZlUGF0aDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVUkkgdHJpbVRvUmVsYXRpdmVQYXRoKFVSSSBhVVJJLCBpbnQgYVN0YXJ0SW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIHJlbGF0aXZlUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgc2VnbWVudEluZGV4ID0gYVN0YXJ0SW5kZXg7IHNlZ21lbnRJbmRleCA8IGFVUkkuc2VnbWVudENvdW50KCk7IHNlZ21lbnRJbmRleCsrKSB7Ci0JCQlyZWxhdGl2ZVBhdGguYXBwZW5kKGFVUkkuc2VnbWVudChzZWdtZW50SW5kZXgpKTsKLQkJCWlmIChzZWdtZW50SW5kZXggPCAoYVVSSS5zZWdtZW50Q291bnQoKSAtIDEpKQotCQkJCXJlbGF0aXZlUGF0aC5hcHBlbmQoSVBhdGguU0VQQVJBVE9SKTsKLQkJfQotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShyZWxhdGl2ZVBhdGgudG9TdHJpbmcoKSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBwYXJhbSBhTW9kdWxlUmVzb3VyY2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIHRyaW1Ub0RlcGxveVBhdGhTZWdtZW50KFVSSSBhRnVsbHlRdWFsaWZpZWRNb2R1bGVSZXNvdXJjZVBhdGgpIHsKLQkJaW50IHNlZ21lbnRDb3VudCA9IGFGdWxseVF1YWxpZmllZE1vZHVsZVJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJVVJJIHVyaTsKLQkJaW50IHRyaW1JbmRleCA9IChoYXNDb250ZW50VHlwZU5hbWUoYUZ1bGx5UXVhbGlmaWVkTW9kdWxlUmVzb3VyY2VQYXRoKSA/IDUgOiA0KTsKLQkJaWYoc2VnbWVudENvdW50ID4gdHJpbUluZGV4KXsKLQkJCXVyaSA9IGFGdWxseVF1YWxpZmllZE1vZHVsZVJlc291cmNlUGF0aC5kZXJlc29sdmUoYUZ1bGx5UXVhbGlmaWVkTW9kdWxlUmVzb3VyY2VQYXRoLnRyaW1TZWdtZW50cyhzZWdtZW50Q291bnQgLSB0cmltSW5kZXgpLCBmYWxzZSxmYWxzZSx0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXVyaSA9IFVSSS5jcmVhdGVVUkkoYUZ1bGx5UXVhbGlmaWVkTW9kdWxlUmVzb3VyY2VQYXRoLnNlZ21lbnQoc2VnbWVudENvdW50LTEpKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNvbmNhdChVUkkgdXJpMSwgVVJJIHVyaTIpewotCSAgICBVUkkgY29uY2F0VVJJID0gdXJpMS5hcHBlbmRTZWdtZW50cyh1cmkyLnNlZ21lbnRzKCkpOwotCSAgICByZXR1cm4gY29uY2F0VVJJOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBmdWxseVF1YWxpZnlVUkkoV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmKGVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoYUNvbXBvbmVudC5nZXRIYW5kbGUoKSwgZmFsc2UpKQotCQkJCXJldHVybiBhQ29tcG9uZW50LmdldEhhbmRsZSgpOyAKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGFDb21wb25lbnQpOwotCQkJaWYocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBhQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQl9IAotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOyAKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIFVSSSBmdWxseVF1YWxpZnlVUkkoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgYVByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgYVByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBVUkkgZnVsbHlRdWFsaWZ5VVJJKElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgY29udGVudFR5cGVEZXNjcmliZXIpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgYVByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgYVByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgY29udGVudFR5cGVEZXNjcmliZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGFyY2hpdmVDb21wb25lbnRmdWxseVF1YWxpZnlVUkkoU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKEFSQ0hJVkVfVVJJX1BST1RPQ09MICsgYUNvbXBvbmVudE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc1BhdGhVUkkoVVJJIHVyaSl7Ci0JCWlmKHVyaSE9bnVsbCAmJiBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uQ0xBU1NQQVRILmVxdWFscyh1cmkuc2VnbWVudCgwKSApKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZVR5cGUoVVJJIGFNb2R1bGVVUkkpdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQllbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlyZXR1cm4gYU1vZHVsZVVSSS5zZWdtZW50KE1vZHVsZVVSSS5QUk9KRUNUX05BTUVfSU5EWCk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoVVJJIGFNb2R1bGVVUkkpdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQllbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlVUkkgdXJpID0gdHJpbVRvUmVsYXRpdmVQYXRoKGFNb2R1bGVVUkksIE1vZHVsZVVSSS5NT0RVTEVfTkFNRV9JTkRYKTsKLQkJcmV0dXJuIHVyaS50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIYW5kbGVTdHJpbmcoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCl7Ci0JCWlmIChhQ29tcG9uZW50LmlzQmluYXJ5KCkpCi0JCQlyZXR1cm4gTW9kdWxlVVJJVXRpbC5hcmNoaXZlQ29tcG9uZW50ZnVsbHlRdWFsaWZ5VVJJKGFDb21wb25lbnQuZ2V0TmFtZSgpKS50b1N0cmluZygpOwotCQllbHNlCi0JCQlyZXR1cm4gIlsiICsgYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSArICJdOiIgKyBhQ29tcG9uZW50LmdldFByb2plY3QoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250ZW50VHlwZU5hbWUoVVJJIHVyaSkgewotCQkKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSB8fCAhaXNWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKHVyaSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllciA9ICh1cmkuc2VnbWVudENvdW50KCkgPiAzID8gdXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSA6IG51bGwpOwotCQlpZiAoY29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwgJiYgUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUodXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSkgIT0gbnVsbCkKLQkJCXJldHVybiBjb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udGVudFR5cGVOYW1lKFVSSSB1cmkpIHsKLQkJCi0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkZW50aWZpZXIgPSAodXJpLnNlZ21lbnRDb3VudCgpID4gMyA/IHVyaS5zZWdtZW50KE1vZHVsZVVSSS5DT05URU5UX1RZUEVfSU5EWCkgOiBudWxsKTsKLQkJaWYgKGNvbnRlbnRUeXBlSWRlbnRpZmllciAhPSBudWxsICYmIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKHVyaS5zZWdtZW50KE1vZHVsZVVSSS5DT05URU5UX1RZUEVfSU5EWCkpICE9IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1BsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzM2ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjAsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuUGxhdGZvcm1VUkxDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC5QbGF0Zm9ybVVSTEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uIGV4dGVuZHMgUGxhdGZvcm1VUkxDb25uZWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRSA9ICJtb2R1bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1BST1RPQ09MID0gTU9EVUxFICsgUGxhdGZvcm1VUkxIYW5kbGVyLlBST1RPQ09MX1NFUEFSQVRPUjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEggPSAiY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTU9EVUxFID0gInJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSWV9NT0RVTEUgPSAiYmluYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uKFVSTCBhVVJMKSB7Ci0JCXN1cGVyKGFVUkwpOwotCX0KLSAKLQlwdWJsaWMgc3RhdGljIFVSSSByZXNvbHZlKFVSSSBhTW9kdWxlUmVzb3VyY2VSdW50aW1lUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IGNvbXBvbmVudFByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVSZXNvdXJjZVJ1bnRpbWVQYXRoKTsKLQkJCS8vU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBNb2R1bGVVUklVdGlsLmdldERlcGxveWVkTmFtZShhTW9kdWxlUmVzb3VyY2VSdW50aW1lUGF0aCk7Ci0JCQlVUkkgcnVudGltZVVSSSA9IE1vZHVsZVVSSVV0aWwudHJpbVRvRGVwbG95UGF0aFNlZ21lbnQoYU1vZHVsZVJlc291cmNlUnVudGltZVBhdGgpOwotCQkJSVBhdGggcnVudGltZVBhdGggPSBuZXcgUGF0aChydW50aW1lVVJJLnBhdGgoKSk7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRQcm9qZWN0KTsKLQkJCS8vSVZpcnR1YWxGaWxlIHZGaWxlID0gY29tcG9uZW50LmdldEZpbGUocnVudGltZVBhdGgpOwotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQlpbnQgbWF0Y2hpbmdTZWdzID0gcnVudGltZVBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHJvb3RGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJCWlmKG1hdGNoaW5nU2VncyA+IDApCi0JCQkJcnVudGltZVBhdGggPSBydW50aW1lUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKG1hdGNoaW5nU2Vncyk7Ci0JCQlJVmlydHVhbEZpbGUgdkZpbGUgPSByb290Rm9sZGVyLmdldEZpbGUocnVudGltZVBhdGgpOwotCQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHZGaWxlLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBhTW9kdWxlUmVzb3VyY2VSdW50aW1lUGF0aDsKLQkJIAotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgVVJJIG5vcm1hbGl6ZVRvV29ya3NwYWNlUmVsYXRpdmUoSVByb2plY3QgcHJvamVjdCwgSVBhdGggc291cmNlUGF0aCwgVVJJIG1vZHVsZVJlc291cmNlRGVwbG95UGF0aCkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotLy8JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotLy8JCXJldHVybiBVUkkuY3JlYXRlVVJJKHByb2plY3ROYW1lICsgJy8nICsgc291cmNlUGF0aC50b1N0cmluZygpKTsKLS8vCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LlBsYXRmb3JtVVJMQ29ubmVjdGlvbiNyZXNvbHZlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVVJMIHJlc29sdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVSTDogIiArIGdldFVSTCgpKTsKLQkJLy9JUGF0aCBtb2R1bGVSZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJLy9TdHJpbmcgbW9kdWxlTmFtZSA9IG1vZHVsZVJlbGF0aXZlUGF0aC5zZWdtZW50KDEpOwotCi0JCUlQYXRoIHJlc29sdmVkUGF0aCA9IG51bGw7IC8vIGhhbmRsZS5nZXRSZXNvbHZlZFBhdGgoKS5hcHBlbmQobW9kdWxlUmVsYXRpdmVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMikpOwotCi0JCWludCBjb3VudCA9IHJlc29sdmVkUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJLy8gaWYgdGhlcmUgYXJlIHR3byBzZWdtZW50cyB0aGVuIHRoZSBzZWNvbmQgaXMgYSBwcm9qZWN0IG5hbWUuCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocmVzb2x2ZWRQYXRoLnNlZ21lbnQoMCkpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCS8vIFRPRE8gRml4IHRoaXMgc3RyaW5nCi0JCQlTdHJpbmcgbWVzc2FnZSA9ICJDb3VsZCBub3QgcmVzb2x2ZSBVUkwiOyAvL1BvbGljeS5iaW5kKCJ1cmwuY291bGROb3RSZXNvbHZlIiwgcHJvamVjdC5nZXROYW1lKCksIHVybC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCUlQYXRoIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjb3VudCA9PSAyKQotCQkJcmVzdWx0ID0gcHJvamVjdC5nZXRMb2NhdGlvbigpOwotCQllbHNlIHsKLQkJCXJlc29sdmVkUGF0aCA9IHJlc29sdmVkUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOwotCQkJcmVzdWx0ID0gcHJvamVjdC5nZXRGaWxlKHJlc29sdmVkUGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCByZXN1bHQudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCVBsYXRmb3JtVVJMSGFuZGxlci5yZWdpc3RlcihQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uTU9EVUxFLCBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uY2xhc3MpOwotCX0KLQotCS8vIHByaXZhdGUgSVByb2plY3QgZ2V0UmVsZXZhbnRQcm9qZWN0KFVSSSBhTW9kdWxlVVJJKSB7Ci0JLy8gYU1vZHVsZVVSSS5zZWdtZW50KCkKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9qZWN0Q29tcG9uZW50c0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Byb2plY3RDb21wb25lbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY0NWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Byb2plY3RDb21wb25lbnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvamVjdENvbXBvbmVudHNJbXBsLmphdmEsdiAxLjMgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvamVjdCBNb2R1bGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvamVjdENvbXBvbmVudHNJbXBsI2dldENvbXBvbmVudHMgPGVtPkNvbXBvbmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdENvbXBvbmVudHNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQcm9qZWN0Q29tcG9uZW50cyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lID0gUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50cygpIDxlbT5Db21wb25lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb21wb25lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMS4wLjAiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5kZXhlZDsKLQotCXByaXZhdGUgZmluYWwgTWFwIG1vZHVsZXNJbmRleCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RDb21wb25lbnRzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5MaXRlcmFscy5QUk9KRUNUX0NPTVBPTkVOVFM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5ld1Byb2plY3ROYW1lKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCQlwcm9qZWN0TmFtZSA9IG5ld1Byb2plY3ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRSwgb2xkUHJvamVjdE5hbWUsIHByb2plY3ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbXBvbmVudHMoKSB7Ci0JCWlmIChjb21wb25lbnRzID09IG51bGwpIHsKLQkJCWNvbXBvbmVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCB0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFMpOwotCQl9Ci0JCXJldHVybiBjb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbXBvbmVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBnZXRQcm9qZWN0TmFtZSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbXBvbmVudHMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0UHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFM6Ci0JCQkJZ2V0Q29tcG9uZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29tcG9uZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRToKLQkJCQlzZXRQcm9qZWN0TmFtZShQUk9KRUNUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19DT01QT05FTlRTOgotCQkJCWdldENvbXBvbmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBQUk9KRUNUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3ROYW1lICE9IG51bGwgOiAhUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhwcm9qZWN0TmFtZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gY29tcG9uZW50cyAhPSBudWxsICYmICFjb21wb25lbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJvamVjdE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2plY3ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudCBmaW5kV29ya2JlbmNoTW9kdWxlKFN0cmluZyBhRGVwbG95TmFtZSkgewotCQlpZiAoZ2V0Q29tcG9uZW50cygpLnNpemUoKSA9PSAxKQotCQkJcmV0dXJuICgoV29ya2JlbmNoQ29tcG9uZW50KWdldENvbXBvbmVudHMoKS5nZXQoMCkpLmdldE5hbWUoKS5lcXVhbHMoYURlcGxveU5hbWUpID8gKFdvcmtiZW5jaENvbXBvbmVudClnZXRDb21wb25lbnRzKCkuZ2V0KDApIDogbnVsbDsKLQkJaWYgKCFpc0luZGV4ZWQoKSkgCi0JCQlpbmRleE1vZHVsZXMoKTsgCi0JCXJldHVybiAoV29ya2JlbmNoQ29tcG9uZW50KSBnZXRNb2R1bGVzSW5kZXgoKS5nZXQoYURlcGxveU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbmRleGVkKCkgewotCQlyZXR1cm4gaXNJbmRleGVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleE1vZHVsZXMoKSB7Ci0JCWlmIChpc0luZGV4ZWQpCi0JCQlyZXR1cm47Ci0KLQkJc3luY2hyb25pemVkIChtb2R1bGVzSW5kZXgpIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGVBZGFwdGVycygpLCBNb2R1bGVJbmRleGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgCi0JCQkJZUFkYXB0ZXJzKCkuYWRkKChhZGFwdGVyID0gbmV3IE1vZHVsZUluZGV4aW5nQWRhcHRlcigpKSk7Ci0JCQkKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb21wb25lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCW1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotCQkJCW1vZHVsZXNJbmRleC5wdXQobW9kdWxlLmdldE5hbWUoKSwgbW9kdWxlKTsKLQkJCX0KLQkJfQotCQlpc0luZGV4ZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQkvKiBwYWNrYWdlICovIE1hcCBnZXRNb2R1bGVzSW5kZXgoKSB7Ci0JCXJldHVybiBtb2R1bGVzSW5kZXg7Ci0JfQotCi19IC8vIFByb2plY3RDb21wb25lbnRzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlOGE5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb3BlcnR5SW1wbC5qYXZhLHYgMS4xIDIwMDUvMDQvMDQgMDc6MDQ6NTkgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvcGVydHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YjNkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVmZXJlbmNlZENvbXBvbmVudEltcGwuamF2YSx2IDEuNCAyMDA3LzAyLzE0IDE2OjAwOjUyIGpzaG9sbCBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlcGVuZGVudCBNb2R1bGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsI2dldEhhbmRsZSA8ZW0+SGFuZGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXRSdW50aW1lUGF0aCA8ZW0+UnVudGltZSBQYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXREZXBlbmRlbmN5VHlwZSA8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXREZXBlbmRlbnRPYmplY3QgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsI2dldEFyY2hpdmVOYW1lIDxlbT5BcmNoaXZlIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkQ29tcG9uZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVmZXJlbmNlZENvbXBvbmVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZSgpIDxlbT5IYW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgSEFORExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZSgpIDxlbT5IYW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSBoYW5kbGUgPSBIQU5ETEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVudGltZVBhdGgoKSA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBSVU5USU1FX1BBVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVudGltZVBhdGgoKSA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIHJ1bnRpbWVQYXRoID0gUlVOVElNRV9QQVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlcGVuZGVuY3lUeXBlKCkgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVwZW5kZW5jeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeVR5cGUgREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUID0gRGVwZW5kZW5jeVR5cGUuVVNFU19MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVwZW5kZW5jeVR5cGUoKSA8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXBlbmRlbmN5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERlcGVuZGVuY3lUeXBlIGRlcGVuZGVuY3lUeXBlID0gREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVwZW5kZW50T2JqZWN0KCkgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlcGVuZGVudE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZGVwZW5kZW50T2JqZWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmNoaXZlTmFtZSgpIDxlbT5BcmNoaXZlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFyY2hpdmVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJjaGl2ZU5hbWUoKSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcmNoaXZlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlTmFtZSA9IEFSQ0hJVkVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWZlcmVuY2VkQ29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRIYW5kbGUoKSB7Ci0JCXJldHVybiBoYW5kbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlKFVSSSBuZXdIYW5kbGUpIHsKLQkJVVJJIG9sZEhhbmRsZSA9IGhhbmRsZTsKLQkJaGFuZGxlID0gbmV3SGFuZGxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFLCBvbGRIYW5kbGUsIGhhbmRsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIHJ1bnRpbWVQYXRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVQYXRoKElQYXRoIG5ld1J1bnRpbWVQYXRoKSB7Ci0JCUlQYXRoIG9sZFJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGg7Ci0JCXJ1bnRpbWVQYXRoID0gbmV3UnVudGltZVBhdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEgsIG9sZFJ1bnRpbWVQYXRoLCBydW50aW1lUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5VHlwZSBnZXREZXBlbmRlbmN5VHlwZSgpIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlIG5ld0RlcGVuZGVuY3lUeXBlKSB7Ci0JCURlcGVuZGVuY3lUeXBlIG9sZERlcGVuZGVuY3lUeXBlID0gZGVwZW5kZW5jeVR5cGU7Ci0JCWRlcGVuZGVuY3lUeXBlID0gbmV3RGVwZW5kZW5jeVR5cGUgPT0gbnVsbCA/IERFUEVOREVOQ1lfVFlQRV9FREVGQVVMVCA6IG5ld0RlcGVuZGVuY3lUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFLCBvbGREZXBlbmRlbmN5VHlwZSwgZGVwZW5kZW5jeVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBlbmRlbnRPYmplY3QoKSB7Ci0JCWlmIChkZXBlbmRlbnRPYmplY3QgIT0gbnVsbCAmJiBkZXBlbmRlbnRPYmplY3QuZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBvbGREZXBlbmRlbnRPYmplY3QgPSBkZXBlbmRlbnRPYmplY3Q7Ci0JCQlkZXBlbmRlbnRPYmplY3QgPSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZGVwZW5kZW50T2JqZWN0KTsKLQkJCWlmIChkZXBlbmRlbnRPYmplY3QgIT0gb2xkRGVwZW5kZW50T2JqZWN0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1QsIG9sZERlcGVuZGVudE9iamVjdCwgZGVwZW5kZW50T2JqZWN0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGVuZGVudE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBiYXNpY0dldERlcGVuZGVudE9iamVjdCgpIHsKLQkJcmV0dXJuIGRlcGVuZGVudE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBlbmRlbnRPYmplY3QoRU9iamVjdCBuZXdEZXBlbmRlbnRPYmplY3QpIHsKLQkJRU9iamVjdCBvbGREZXBlbmRlbnRPYmplY3QgPSBkZXBlbmRlbnRPYmplY3Q7Ci0JCWRlcGVuZGVudE9iamVjdCA9IG5ld0RlcGVuZGVudE9iamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1QsIG9sZERlcGVuZGVudE9iamVjdCwgZGVwZW5kZW50T2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmVOYW1lKFN0cmluZyBuZXdBcmNoaXZlTmFtZSkgewotCQlTdHJpbmcgb2xkQXJjaGl2ZU5hbWUgPSBhcmNoaXZlTmFtZTsKLQkJYXJjaGl2ZU5hbWUgPSBuZXdBcmNoaXZlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRSwgb2xkQXJjaGl2ZU5hbWUsIGFyY2hpdmVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFOgotCQkJCXJldHVybiBnZXRIYW5kbGUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UnVudGltZVBhdGgoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGVwZW5kZW5jeVR5cGUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZXBlbmRlbnRPYmplY3QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBlbmRlbnRPYmplY3QoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19IQU5ETEU6Ci0JCQkJc2V0SGFuZGxlKChVUkkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSDoKLQkJCQlzZXRSdW50aW1lUGF0aCgoSVBhdGgpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRToKLQkJCQlzZXREZXBlbmRlbmN5VHlwZSgoRGVwZW5kZW5jeVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1Q6Ci0JCQkJc2V0RGVwZW5kZW50T2JqZWN0KChFT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUU6Ci0JCQkJc2V0QXJjaGl2ZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRToKLQkJCQlzZXRIYW5kbGUoSEFORExFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEg6Ci0JCQkJc2V0UnVudGltZVBhdGgoUlVOVElNRV9QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTkNZX1RZUEU6Ci0JCQkJc2V0RGVwZW5kZW5jeVR5cGUoREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNUOgotCQkJCXNldERlcGVuZGVudE9iamVjdCgoRU9iamVjdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUU6Ci0JCQkJc2V0QXJjaGl2ZU5hbWUoQVJDSElWRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRToKLQkJCQlyZXR1cm4gSEFORExFX0VERUZBVUxUID09IG51bGwgPyBoYW5kbGUgIT0gbnVsbCA6ICFIQU5ETEVfRURFRkFVTFQuZXF1YWxzKGhhbmRsZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEg6Ci0JCQkJcmV0dXJuIFJVTlRJTUVfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcnVudGltZVBhdGggIT0gbnVsbCA6ICFSVU5USU1FX1BBVEhfRURFRkFVTFQuZXF1YWxzKHJ1bnRpbWVQYXRoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRToKLQkJCQlyZXR1cm4gZGVwZW5kZW5jeVR5cGUgIT0gREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5UX09CSkVDVDoKLQkJCQlyZXR1cm4gZGVwZW5kZW50T2JqZWN0ICE9IG51bGw7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUU6Ci0JCQkJcmV0dXJuIEFSQ0hJVkVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gYXJjaGl2ZU5hbWUgIT0gbnVsbCA6ICFBUkNISVZFX05BTUVfRURFRkFVTFQuZXF1YWxzKGFyY2hpdmVOYW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaGFuZGxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBydW50aW1lUGF0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocnVudGltZVBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlcGVuZGVuY3lUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXBlbmRlbmN5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXJjaGl2ZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFyY2hpdmVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVmZXJlbmNlZENvbXBvbmVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkMjI5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMKLQkJUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIHsKLQotCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBhY3R1YWxseSBpbnN0YW50aWF0ZSBhIG5ldyBSZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IFJlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0Njg4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5NYXBwZWRYTUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbDsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcwotCQlSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgUmVzb3VyY2UgewotCi0JcHVibGljIFJlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCX0KLQlwcm90ZWN0ZWQgTWFwcGVkWE1JSGVscGVyIGRvQ3JlYXRlWE1MSGVscGVyKCkgewotCQlyZXR1cm4gbmV3IE1hcHBlZENvbXBvbmVudFhNSUhlbHBlcih0aGlzLCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWFiNDFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSVBhdGhQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVRyZWVOb2RlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfTk9ORSA9IDB4MDsKLQkvKiogCi0JICogVHlwZSBjb25zdGFudCAoYml0IG1hc2sgdmFsdWUgMSkgd2hpY2ggaWRlbnRpZmllcyBjcmVhdGluZyBjaGlsZCBub2Rlcy4KLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSRUFURV9UUkVFTk9ERV9JRk5FQyA9IDB4MTsKLQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDIpIHdoaWNoIGlkZW50aWZpZXMgYWx3YXlzIGNyZWF0aW5nIGEgdmlydHVhbCByZXNvdXJjZS4KLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSRUFURV9SRVNPVVJDRV9BTFdBWVMgPSAweDI7Ci0KLQlwcml2YXRlIGZpbmFsIFNldCBtb2R1bGVSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IExpbmtlZEhhc2hTZXQoKSk7CQotCXByaXZhdGUgZmluYWwgTWFwIGNoaWxkcmVuID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBMaW5rZWRIYXNoTWFwKCkpOwotCXByaXZhdGUgZmluYWwgTWFwIHRyYW5zaWVudENoaWxkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBMaW5rZWRIYXNoTWFwKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudFJlc291cmNlW10gTk9fTU9EVUxFX1JFU09VUkNFUyA9IG5ldyBDb21wb25lbnRSZXNvdXJjZVtde307Ci0JcHJpdmF0ZSBJUGF0aFByb3ZpZGVyIHBhdGhQcm92aWRlcjsKLS8vCXByaXZhdGUgUmVzb3VyY2VUcmVlTm9kZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcGF0aFNlZ21lbnQ7Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlTm9kZShTdHJpbmcgYVBhdGhTZWdtZW50LCBSZXNvdXJjZVRyZWVOb2RlIHBhcmVudCwgSVBhdGhQcm92aWRlciBhUGF0aFByb3ZpZGVyKSB7Ci0JCXBhdGhTZWdtZW50ID0gYVBhdGhTZWdtZW50OwotCQlwYXRoUHJvdmlkZXIgPSBhUGF0aFByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIGFkZENoaWxkKFJlc291cmNlVHJlZU5vZGUgYUNoaWxkKSB7Ci0JCWNoaWxkcmVuLnB1dChhQ2hpbGQuZ2V0UGF0aFNlZ21lbnQoKSwgYUNoaWxkKTsKLQkJcmV0dXJuIGFDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlTm9kZSBhZGRDaGlsZChDb21wb25lbnRSZXNvdXJjZSBhTW9kdWxlUmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VUcmVlTm9kZSBuZXdDaGlsZCA9IGZpbmRDaGlsZChnZXRQYXRoUHJvdmlkZXIoKS5nZXRQYXRoKGFNb2R1bGVSZXNvdXJjZSksIENSRUFURV9UUkVFTk9ERV9JRk5FQyk7Ci0JCWlmKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCW5ld0NoaWxkLmFkZE1vZHVsZVJlc291cmNlKGFNb2R1bGVSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgcmVtb3ZlQ2hpbGQoUmVzb3VyY2VUcmVlTm9kZSBhQ2hpbGQpIHsKLQkJcmV0dXJuIChSZXNvdXJjZVRyZWVOb2RlKSBjaGlsZHJlbi5yZW1vdmUoYUNoaWxkLmdldFBhdGhTZWdtZW50KCkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIHJlbW92ZUNoaWxkKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgeyAKLQkJUmVzb3VyY2VUcmVlTm9kZSBjb250YWluaW5nQ2hpbGQgPSBmaW5kQ2hpbGQoZ2V0UGF0aFByb3ZpZGVyKCkuZ2V0UGF0aChhTW9kdWxlUmVzb3VyY2UpLCBDUkVBVEVfTk9ORSk7Ci0JCWlmKGNvbnRhaW5pbmdDaGlsZCAhPSBudWxsKSB7Ci0JCQljb250YWluaW5nQ2hpbGQucmVtb3ZlUmVzb3VyY2UoYU1vZHVsZVJlc291cmNlKTsKLQkJCWlmKGNvbnRhaW5pbmdDaGlsZC5oYXNNb2R1bGVSZXNvdXJjZXMoKSkKLQkJCQlyZXR1cm4gY29udGFpbmluZ0NoaWxkOwotCQkJcmV0dXJuIHJlbW92ZUNoaWxkKGNvbnRhaW5pbmdDaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgcmVtb3ZlQ2hpbGQoSVBhdGggdGFyZ2V0UGF0aCwgQ29tcG9uZW50UmVzb3VyY2UgYU1vZHVsZVJlc291cmNlKSB7IAotCQlSZXNvdXJjZVRyZWVOb2RlIGNvbnRhaW5pbmdDaGlsZCA9IGZpbmRDaGlsZCh0YXJnZXRQYXRoLCBDUkVBVEVfTk9ORSk7Ci0JCWlmKGNvbnRhaW5pbmdDaGlsZCAhPSBudWxsKSB7Ci0JCQljb250YWluaW5nQ2hpbGQucmVtb3ZlUmVzb3VyY2UoYU1vZHVsZVJlc291cmNlKTsKLQkJCWlmKGNvbnRhaW5pbmdDaGlsZC5oYXNNb2R1bGVSZXNvdXJjZXMoKSkKLQkJCQlyZXR1cm4gY29udGFpbmluZ0NoaWxkOwotCQkJcmV0dXJuIHJlbW92ZUNoaWxkKGNvbnRhaW5pbmdDaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKENvbXBvbmVudFJlc291cmNlIGFSZXNvdXJjZSkgewotCQltb2R1bGVSZXNvdXJjZXMucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKElQYXRoIGFQYXRoKSB7Ci0JCXJldHVybiBmaW5kQ2hpbGQoYVBhdGgsIENSRUFURV9UUkVFTk9ERV9JRk5FQyk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKElQYXRoIGFQYXRoLCBpbnQgY3JlYXRpb25GbGFncykgewotCQlpZihhUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlVHJlZU5vZGUgY2hpbGQgPSB0aGlzOwotCQlpZiAoYVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQljaGlsZCA9IGZpbmRDaGlsZChhUGF0aC5zZWdtZW50KDApLCBjcmVhdGlvbkZsYWdzKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGFQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpCi0JCQkJcmV0dXJuIGNoaWxkOwotCQkJY2hpbGQgPSBjaGlsZC5maW5kQ2hpbGQoYVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSwgY3JlYXRpb25GbGFncyk7Ci0KLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKFN0cmluZyBhUGF0aFNlZ21lbnQpIHsKLQkJaWYgKGFQYXRoU2VnbWVudCA9PSBudWxsIHx8IGFQYXRoU2VnbWVudC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBmaW5kQ2hpbGQoYVBhdGhTZWdtZW50LCBDUkVBVEVfTk9ORSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKFN0cmluZyBhUGF0aFNlZ21lbnQsIGludCBjcmVhdGlvbkZsYWdzKSB7Ci0JCWJvb2xlYW4gdG9DcmVhdGVDaGlsZElmTmVjZXNzYXJ5ID0gKGNyZWF0aW9uRmxhZ3MgJiBDUkVBVEVfVFJFRU5PREVfSUZORUMpID09IENSRUFURV9UUkVFTk9ERV9JRk5FQzsKLQkJUmVzb3VyY2VUcmVlTm9kZSBjaGlsZE5vZGUgPSAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW4uZ2V0KGFQYXRoU2VnbWVudCk7Ci0JCWlmIChjaGlsZE5vZGUgPT0gbnVsbCAmJiB0b0NyZWF0ZUNoaWxkSWZOZWNlc3NhcnkpCi0JCQljaGlsZE5vZGUgPSBhZGRDaGlsZChhUGF0aFNlZ21lbnQpOwotCQlyZXR1cm4gY2hpbGROb2RlOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRNb2R1bGVSZXNvdXJjZXMoSVBhdGggYVBhdGgsIGludCBjcmVhdGlvbkZsYWdzKSB7Ci0KLQkJU2V0IGZvdW5kTW9kdWxlUmVzb3VyY2VzID0gZmluZE1vZHVsZVJlc291cmNlc1NldChhUGF0aCwgYVBhdGgsIGNyZWF0aW9uRmxhZ3MpOwotCQlpZiAoZm91bmRNb2R1bGVSZXNvdXJjZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gTk9fTU9EVUxFX1JFU09VUkNFUzsKLQkJcmV0dXJuIChDb21wb25lbnRSZXNvdXJjZVtdKSBmb3VuZE1vZHVsZVJlc291cmNlcy50b0FycmF5KG5ldyBDb21wb25lbnRSZXNvdXJjZVtmb3VuZE1vZHVsZVJlc291cmNlcy5zaXplKCldKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXhpc3RzKElQYXRoIGFQYXRoLCBpbnQgY3JlYXRpb25GbGFncykgewotCi0JCVNldCBmb3VuZE1vZHVsZVJlc291cmNlcyA9IGZpbmRNb2R1bGVSZXNvdXJjZXNTZXQoYVBhdGgsIGFQYXRoLCBjcmVhdGlvbkZsYWdzKTsKLQkJaWYgKGZvdW5kTW9kdWxlUmVzb3VyY2VzLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAodHJ1ZSkgewotCQkJCVJlc291cmNlVHJlZU5vZGUgY2hpbGQgPSBmaW5kQ2hpbGQoYVBhdGguc2VnbWVudCgwKSwgY3JlYXRpb25GbGFncyk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vZHVsZVJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlc291cmNlcy5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGdldE1vZHVsZVJlc291cmNlcygpIHsKLQkJcmV0dXJuIChDb21wb25lbnRSZXNvdXJjZVtdKSBtb2R1bGVSZXNvdXJjZXMudG9BcnJheShuZXcgQ29tcG9uZW50UmVzb3VyY2VbbW9kdWxlUmVzb3VyY2VzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgU2V0IGZpbmRNb2R1bGVSZXNvdXJjZXNTZXQoSVBhdGggYUZ1bGxQYXRoLCBJUGF0aCBhUGF0aCwgaW50IGNyZWF0aW9uRmxhZ3MpIHsKLQotCQlpZiAoYVBhdGguc2VnbWVudENvdW50KCkgPT0gMCkgewotCQkJU2V0IHJlc291cmNlcyA9IGFnZ3JlZ2F0ZVJlc291cmNlcyhuZXcgTGlua2VkSGFzaFNldCgpKTsKLQkJCXJldHVybiByZXNvdXJjZXM7Ci0JCX0KLQkJUmVzb3VyY2VUcmVlTm9kZSBjaGlsZCA9IGZpbmRDaGlsZChhUGF0aC5zZWdtZW50KDApLCBjcmVhdGlvbkZsYWdzKTsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmluZE1hdGNoaW5nVmlydHVhbFBhdGhzU2V0KGFGdWxsUGF0aCwgYVBhdGgsIGNyZWF0aW9uRmxhZ3MpOwotCQlTZXQgZm91bmRSZXNvdXJjZXMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQlmb3VuZFJlc291cmNlcy5hZGRBbGwoY2hpbGQuZmluZE1vZHVsZVJlc291cmNlc1NldChhRnVsbFBhdGgsIGFQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIGNyZWF0aW9uRmxhZ3MpKTsKLQkJZm91bmRSZXNvdXJjZXMuYWRkQWxsKGZpbmRNYXRjaGluZ1ZpcnR1YWxQYXRoc1NldChhRnVsbFBhdGgsIGFQYXRoLCBjcmVhdGlvbkZsYWdzKSk7Ci0JCXJldHVybiBmb3VuZFJlc291cmNlczsKLQl9Ci0KLQlwcml2YXRlIFNldCBmaW5kTWF0Y2hpbmdWaXJ0dWFsUGF0aHNTZXQoSVBhdGggYUZ1bGxQYXRoLCBJUGF0aCBhUGF0aCwgaW50IGNyZWF0aW9uRmxhZ3MpIHsKLQkJYm9vbGVhbiB0b0NyZWF0ZVJlc291cmNlQWx3YXlzID0gKGNyZWF0aW9uRmxhZ3MgJiBDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTKSA9PSBDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTOwotCQlpZiAoaGFzTW9kdWxlUmVzb3VyY2VzKCkpIHsKLQkJCUNvbXBvbmVudFJlc291cmNlIG1vZHVsZVJlc291cmNlID0gbnVsbDsKLQkJCUlSZXNvdXJjZSBlY2xpcHNlUmVzb3VyY2UgPSBudWxsOwotCQkJSUNvbnRhaW5lciBlY2xpcHNlQ29udGFpbmVyID0gbnVsbDsKLQkJCVNldCByZXN1bHRTZXQgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciByZXNvdXJjZUl0ZXIgPSBtb2R1bGVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgcmVzb3VyY2VJdGVyLmhhc05leHQoKTspIHsKLQkJCQltb2R1bGVSZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgcmVzb3VyY2VJdGVyLm5leHQoKTsKLQkJCQlpZihtb2R1bGVSZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpICE9IG51bGwgJiYgbW9kdWxlUmVzb3VyY2UuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQllY2xpcHNlUmVzb3VyY2UgPSBTdHJ1Y3R1cmVFZGl0LmdldEVjbGlwc2VSZXNvdXJjZShtb2R1bGVSZXNvdXJjZSk7Ci0JCQkJCQotCQkJCQlpZiAoZWNsaXBzZVJlc291cmNlICE9IG51bGwgJiYgKGVjbGlwc2VSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiB8fCBlY2xpcHNlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSkgewotCQkJCQkJZWNsaXBzZUNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBlY2xpcHNlUmVzb3VyY2U7Ci0JCQkJIAotCQkJCQkJSVBhdGggcnVudGltZVVSSSA9IG1vZHVsZVJlc291cmNlLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKTsKLQkJCQkJCUlQYXRoIHNyY1BhdGggPSBlY2xpcHNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5hcHBlbmQoYVBhdGgpOwotCQkJCQkJCi0JCQkJCQkvLyBjaGVjayBmb3IgZXhpc3Rpbmcgc3VicGF0aCBpbiB0cmVlCi0JCQkJCQlDb21wb25lbnRSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IGZpbmRFeGlzdGluZ0NvbXBvbmVudFJlc291cmNlKG1vZHVsZVJlc291cmNlLmdldENvbXBvbmVudCgpLCBydW50aW1lVVJJLCBzcmNQYXRoKTsKLQkJCQkJCQotCQkJCQkJLy8gYWRkIG5ldyByZXNvdXJjZSBpZiBudWxsCi0JCQkJCQlpZihuZXdSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gZmxlc2ggb3V0IHRoZSB0cmVlCi0JCQkJCQkJSVJlc291cmNlIGVjbGlwc2VSZXMgPSBlY2xpcHNlQ29udGFpbmVyLmZpbmRNZW1iZXIoYVBhdGgpOwotCQkJCQkJCWlmICgodG9DcmVhdGVSZXNvdXJjZUFsd2F5cykgfHwgKGVjbGlwc2VSZXMgIT0gbnVsbCkpIHsKLQkJCQkJCQkJbmV3UmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpdHJhbnNpZW50Q2hpbGRSZXNvdXJjZXMuZ2V0KHNyY1BhdGgpOwotCQkJCQkJCQlpZiAobmV3UmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQkJCQluZXdSZXNvdXJjZSA9IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRjb3JlRmFjdG9yeSgpLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCk7Ci0JCQkJCQkJCS8vIE5vdCBzZXR0aW5nIHRoZSBwYXJlbnQgb24gdGhpcyB0cmFuc2llbnQgY2hpbGQgcmVzb3VyY2UKLQkJCQkJCQkJLy8gbmV3UmVzb3VyY2Uuc2V0Q29tcG9uZW50KG1vZHVsZVJlc291cmNlLmdldENvbXBvbmVudCgpKTsKLQkJCQkJCQkJbmV3UmVzb3VyY2Uuc2V0UnVudGltZVBhdGgocnVudGltZVVSSSk7Ci0JCQkJCQkJCW5ld1Jlc291cmNlLnNldFNvdXJjZVBhdGgoc3JjUGF0aCk7Ci0JCQkJCQkJCWlmIChlY2xpcHNlUmVzICE9IG51bGwpCi0JCQkJCQkJCQluZXdSZXNvdXJjZS5zZXRPd25pbmdQcm9qZWN0KGVjbGlwc2VSZXMuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQkJdHJhbnNpZW50Q2hpbGRSZXNvdXJjZXMucHV0KHNyY1BhdGgsbmV3UmVzb3VyY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJlc3VsdFNldC5hZGQobmV3UmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0U2V0LnNpemUoKSA+IDAgPyByZXN1bHRTZXQgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudFJlc291cmNlIGZpbmRFeGlzdGluZ0NvbXBvbmVudFJlc291cmNlKFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQsIElQYXRoIHJ1bnRpbWVVUkksIElQYXRoIHNyY1BhdGgpIHsgCi0JCUxpc3QgcmVzb3VyY2VzID0gY29tcG9uZW50LmdldFJlc291cmNlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSBlbGVtZW50ID0gKENvbXBvbmVudFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmKHJ1bnRpbWVVUkkuZXF1YWxzKGVsZW1lbnQuZ2V0UnVudGltZVBhdGgoKSkgJiYgc3JjUGF0aC5lcXVhbHMoZWxlbWVudC5nZXRTb3VyY2VQYXRoKCkpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgYWdncmVnYXRlUmVzb3VyY2VzKFNldCBhbkFnZ3JlZ2F0aW9uU2V0KSB7Ci0JCWlmIChoYXNNb2R1bGVSZXNvdXJjZXMoKSkKLQkJCWFuQWdncmVnYXRpb25TZXQuYWRkQWxsKG1vZHVsZVJlc291cmNlcyk7Ci0JCVJlc291cmNlVHJlZU5vZGUgY2hpbGROb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbkl0ZXJhdG9yID0gY2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsgY2hpbGRyZW5JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQljaGlsZE5vZGUgPSAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7Ci0JCQljaGlsZE5vZGUuYWdncmVnYXRlUmVzb3VyY2VzKGFuQWdncmVnYXRpb25TZXQpOwotCQl9Ci0JCXJldHVybiBhbkFnZ3JlZ2F0aW9uU2V0OwotCX0KLQotCXB1YmxpYyBpbnQgY2hpbGRyZW5Db3VudCgpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhTZWdtZW50KCkgewotCQlyZXR1cm4gcGF0aFNlZ21lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlVHJlZU5vZGUgYWRkQ2hpbGQoU3RyaW5nIGFQYXRoU2VnbWVudCkgewotCQlSZXNvdXJjZVRyZWVOb2RlIG5ld0NoaWxkID0gbnVsbDsKLQkJaWYgKChuZXdDaGlsZCA9IChSZXNvdXJjZVRyZWVOb2RlKSBjaGlsZHJlbi5nZXQoYVBhdGhTZWdtZW50KSkgPT0gbnVsbCkgewotCQkJbmV3Q2hpbGQgPSBuZXcgUmVzb3VyY2VUcmVlTm9kZShhUGF0aFNlZ21lbnQsIHRoaXMsIHBhdGhQcm92aWRlcik7Ci0JCQljaGlsZHJlbi5wdXQobmV3Q2hpbGQuZ2V0UGF0aFNlZ21lbnQoKSwgbmV3Q2hpbGQpOwotCQl9Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VUcmVlTm9kZSByZW1vdmVDaGlsZChTdHJpbmcgYVBhdGhTZWdtZW50KSB7Ci0JCXJldHVybiAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW4ucmVtb3ZlKGFQYXRoU2VnbWVudCk7Ci0JfQotCi0JLyogcGFja2FnZSAqL3ZvaWQgYWRkTW9kdWxlUmVzb3VyY2UoQ29tcG9uZW50UmVzb3VyY2UgYU1vZHVsZVJlc291cmNlKSB7Ci0JCW1vZHVsZVJlc291cmNlcy5hZGQoYU1vZHVsZVJlc291cmNlKTsKLQl9Ci0KLQkvKiBwYWNrYWdlICovSVBhdGhQcm92aWRlciBnZXRQYXRoUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwYXRoUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBNYXAgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVRyZWVSb290LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVRyZWVSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjkzY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSVBhdGhQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUcmVlUm9vdCBleHRlbmRzIFJlc291cmNlVHJlZU5vZGUgewotCQotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VUcmVlUmVzb3VyY2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkKLQkJCWlmKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKSkgewotCQkJCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQlzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlyZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmKHJlc291cmNlICE9IG51bGwpCi0JCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQoZ2V0UmVzb3VyY2VQYXRoTGlzdGVuZXJBZGFwdGVyKCkpOwkJCQkJCi0JCQkJCWJyZWFrOyAKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJTGlzdCBuZXdWYWx1ZXMgPSAoTGlzdCkgbXNnLmdldE5ld1ZhbHVlKCk7CQkJCQkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdWYWx1ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBuZXdWYWx1ZXMuZ2V0KGkpOwotCQkJCQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKGdldFJlc291cmNlUGF0aExpc3RlbmVyQWRhcHRlcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCXJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCl7Ci0JCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUoZ2V0UmVzb3VyY2VQYXRoTGlzdGVuZXJBZGFwdGVyKCkpOwotCQkJCQkJcmVtb3ZlQ2hpbGQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlMaXN0IHJlbW92ZWRWYWx1ZXMgPSAoTGlzdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChyZW1vdmVkVmFsdWVzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZFZhbHVlcy5zaXplKCk7IGkrKykgewotCQkJCQkJCXJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSByZW1vdmVkVmFsdWVzLmdldChpKTsKLQkJCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUoZ2V0UmVzb3VyY2VQYXRoTGlzdGVuZXJBZGFwdGVyKCkpOwotCQkJCQkJCXJlbW92ZUNoaWxkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZVBhdGhMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJCi0JCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJCWlmKG5ld1RhcmdldCBpbnN0YW5jZW9mIENvbXBvbmVudFJlc291cmNlKSB7CQkJCQotLy8JCQkJaWYoZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotLy8JCQkJCWlmKGdldFBhdGhQcm92aWRlcigpLmdldFBhdGgoKENvbXBvbmVudFJlc291cmNlKWdldFRhcmdldCgpKSAhPSBudWxsKQotLy8JCQkJCQlyZW1vdmVDaGlsZCgoQ29tcG9uZW50UmVzb3VyY2UpZ2V0VGFyZ2V0KCkpOwotLy8JCQkJfQotCQkJCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBuZXdUYXJnZXQ7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlpZihnZXRQYXRoUHJvdmlkZXIoKS5nZXRQYXRoKHJlc291cmNlKSAhPSBudWxsKQotCQkJCQkJYWRkQ2hpbGQocmVzb3VyY2UpOwkJCQkJCi0JCQkJfQkJCi0JCQl9Ci0JCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkKLQkJCWlmKG1zZy5nZXRGZWF0dXJlKCkgPT0gZ2V0UGF0aFByb3ZpZGVyKCkuZ2V0RmVhdHVyZSgpKSB7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIG1zZy5nZXROb3RpZmllcigpOwotCQkJCXN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQotCQkJCQkvLyByZW1vdmUgdGhlIG9sZCB2YWx1ZSAKLQkJCQkJSVBhdGggb2xkUGF0aCA9IChJUGF0aCltc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYob2xkUGF0aCE9bnVsbCkKLQkJCQkJCXJlbW92ZUNoaWxkKG9sZFBhdGgsIHJlc291cmNlKTsKLQkJCQkJCi0JCQkJCUlQYXRoIG5ld1BhdGggPSAoSVBhdGgpbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmKG5ld1BhdGghPW51bGwpCi0JCQkJCQlhZGRDaGlsZChyZXNvdXJjZSk7Ci0JCQkJCWJyZWFrOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPIFRoZSBzb3VyY2UgdHJlZSBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgbW9kdWxlcyByb290LCBub3QgZWFjaCBtb2R1bGUuCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVRyZWVSb290IGdldFNvdXJjZVJlc291cmNlVHJlZVJvb3QoV29ya2JlbmNoQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIgcmVzb3VyY2VUcmVlQWRhcHRlciA9IChSZXNvdXJjZVRyZWVSb290QWRhcHRlcikgRXh0ZW5kZWRFY29yZVV0aWwuZ2V0QWRhcHRlcihhTW9kdWxlLCBhTW9kdWxlLmVBZGFwdGVycygpLCBSZXNvdXJjZVRyZWVSb290QWRhcHRlci5TT1VSQ0VfQURBUFRFUl9UWVBFKTsKLQkJaWYgKHJlc291cmNlVHJlZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiByZXNvdXJjZVRyZWVBZGFwdGVyLmdldFJlc291cmNlVHJlZVJvb3QoKTsKLQkJcmVzb3VyY2VUcmVlQWRhcHRlciA9IG5ldyBSZXNvdXJjZVRyZWVSb290QWRhcHRlcihSZXNvdXJjZVRyZWVSb290QWRhcHRlci5TT1VSQ0VfVFJFRSk7Ci0JCWFNb2R1bGUuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlVHJlZUFkYXB0ZXIpOwotCQlyZXR1cm4gcmVzb3VyY2VUcmVlQWRhcHRlci5nZXRSZXNvdXJjZVRyZWVSb290KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVRyZWVSb290IGdldERlcGxveVJlc291cmNlVHJlZVJvb3QoV29ya2JlbmNoQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIgcmVzb3VyY2VUcmVlQWRhcHRlciA9IChSZXNvdXJjZVRyZWVSb290QWRhcHRlcikgRXh0ZW5kZWRFY29yZVV0aWwuZ2V0QWRhcHRlcihhTW9kdWxlLCBhTW9kdWxlLmVBZGFwdGVycygpLCBSZXNvdXJjZVRyZWVSb290QWRhcHRlci5ERVBMT1lfQURBUFRFUl9UWVBFKTsKLQkJaWYgKHJlc291cmNlVHJlZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiByZXNvdXJjZVRyZWVBZGFwdGVyLmdldFJlc291cmNlVHJlZVJvb3QoKTsKLQkJcmVzb3VyY2VUcmVlQWRhcHRlciA9IG5ldyBSZXNvdXJjZVRyZWVSb290QWRhcHRlcihSZXNvdXJjZVRyZWVSb290QWRhcHRlci5ERVBMT1lfVFJFRSk7Ci0JCWFNb2R1bGUuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlVHJlZUFkYXB0ZXIpOwotCQlyZXR1cm4gcmVzb3VyY2VUcmVlQWRhcHRlci5nZXRSZXNvdXJjZVRyZWVSb290KCk7Ci0JfQotCQotCXByaXZhdGUgZmluYWwgV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZTsKLQlwcml2YXRlIFJlc291cmNlVHJlZVJlc291cmNlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBSZXNvdXJjZVBhdGhMaXN0ZW5lciBwYXRoTGlzdGVuZXI7Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlUm9vdChXb3JrYmVuY2hDb21wb25lbnQgYU1vZHVsZSwgSVBhdGhQcm92aWRlciBhUGF0aFByb3ZpZGVyKSB7Ci0JCXN1cGVyKCIvIiwgbnVsbCwgYVBhdGhQcm92aWRlcik7IC8vJE5PTi1OTFMtMSQKLQkJbW9kdWxlID0gYU1vZHVsZTsgCQotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCW1vZHVsZS5lQWRhcHRlcnMoKS5hZGQoZ2V0UmVzb3VyY2VUcmVlTGlzdGVuZXJBZGFwdGVyKCkpOwotCQlMaXN0IG1vZHVsZVJlc291cmNlcyA9IG1vZHVsZS5nZXRSZXNvdXJjZXMoKTsKLQkJQ29tcG9uZW50UmVzb3VyY2UgbW9kdWxlUmVzb3VyY2UgPSBudWxsOwkJIAotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCW1vZHVsZVJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBtb2R1bGVSZXNvdXJjZXMuZ2V0KGkpOwotCQkJYWRkQ2hpbGQobW9kdWxlUmVzb3VyY2UpOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZVRyZWVSZXNvdXJjZUxpc3RlbmVyIGdldFJlc291cmNlVHJlZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJaWYobGlzdGVuZXIgPT0gbnVsbCkKLQkJCWxpc3RlbmVyID0gbmV3IFJlc291cmNlVHJlZVJlc291cmNlTGlzdGVuZXIoKTsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZVBhdGhMaXN0ZW5lciBnZXRSZXNvdXJjZVBhdGhMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCWlmKHBhdGhMaXN0ZW5lciA9PSBudWxsKQotCQkJcGF0aExpc3RlbmVyID0gbmV3IFJlc291cmNlUGF0aExpc3RlbmVyKCk7Ci0JCXJldHVybiBwYXRoTGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZE1vZHVsZVJlc291cmNlcyhVUkkgYVVSSSkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYVVSSS50b1N0cmluZygpKTsKLQkJdHJ5IHsKLQkJCWlmIChNb2R1bGVVUklVdGlsLmVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRQbGF0Zm9ybVVSSShhVVJJLCBmYWxzZSkpCi0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsgCi0JCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gdXVyaWUpIHsKLQotCQl9Ci0JCXJldHVybiBmaW5kTW9kdWxlUmVzb3VyY2VzKHBhdGgsIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZVJvb3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzRkMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkRlcGxveWVkUGF0aFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklQYXRoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuU291cmNlUGF0aFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVHJlZVJvb3RBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTT1VSQ0VfQURBUFRFUl9UWVBFID0gbmV3IE9iamVjdCgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERFUExPWV9BREFQVEVSX1RZUEUgPSBuZXcgT2JqZWN0KCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX1RSRUUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFUExPWV9UUkVFID0gMTsKLQkKLQlwcml2YXRlIFJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdDsKLQlwcml2YXRlIGludCB0eXBlOwotCQotCXB1YmxpYyBSZXNvdXJjZVRyZWVSb290QWRhcHRlcihpbnQgYVR5cGUpIHsKLQkJdHlwZSA9IGFUeXBlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IGFuQWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIChTT1VSQ0VfQURBUFRFUl9UWVBFID09IGFuQWRhcHRlclR5cGUgJiYgdHlwZSA9PSBTT1VSQ0VfVFJFRSkgfHwgKERFUExPWV9BREFQVEVSX1RZUEUgPT0gYW5BZGFwdGVyVHlwZSAmJiB0eXBlID09IERFUExPWV9UUkVFKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlVHJlZVJvb3QgZ2V0UmVzb3VyY2VUcmVlUm9vdCgpIHsJCQotCQlpZihyZXNvdXJjZVRyZWVSb290ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzb3VyY2VUcmVlUm9vdDsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCWlmKHJlc291cmNlVHJlZVJvb3QgPT0gbnVsbCkgewotCQkJCUlQYXRoUHJvdmlkZXIgcGF0aFByb3ZpZGVyPSAodHlwZSA9PSBERVBMT1lfVFJFRSkgPyBEZXBsb3llZFBhdGhQcm92aWRlci5JTlNUQU5DRSA6IFNvdXJjZVBhdGhQcm92aWRlci5JTlNUQU5DRTsKLQkJCQlyZXNvdXJjZVRyZWVSb290ID0gbmV3IFJlc291cmNlVHJlZVJvb3QoKFdvcmtiZW5jaENvbXBvbmVudClnZXRUYXJnZXQoKSwgcGF0aFByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VUcmVlUm9vdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUcmVlUm9vdChSZXNvdXJjZVRyZWVSb290IHIpewotCQkKLQkJcmVzb3VyY2VUcmVlUm9vdCA9IHI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBFbnRpdHlSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQRW50aXR5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmZTBiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBFbnRpdHlSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLy8gVE9ETzogV2UgbmVlZCB0byBwb3J0IHRoZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGV4Y2VwdGlvbnMuCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdUUEVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCi0JLyoqCi0JICogQWxsIHRoZSBkdGRzIHRoYXQgdGhpcyByZXNvbHZlciBrbm93cyBhYm91dDsgaW1wb3J0IHN0cmF0ZWdpZXMgcmVnaXN0ZXIgdGhlc2UgYXQgc3RhcnR1cAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIHN1cHBvcnRlZER0RHM7Ci0JCi0JLy8gc3RhdGljIHsKLQkvLyByZWdpc3RlckR0RCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIiwgInhtbC54c2QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gcmVnaXN0ZXJEdEQoIlhNTFNjaGVtYS5kdGQiLCAiWE1MU2NoZW1hLmR0ZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLyByZWdpc3RlckR0RCgiZGF0YXR5cGVzLmR0ZCIsICJkYXRhdHlwZXMuZHRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8vIH0KLQkKLQlwdWJsaWMgc3RhdGljIFdUUEVudGl0eVJlc29sdmVyIElOU1RBTkNFID0gbmV3IFdUUEVudGl0eVJlc29sdmVyKCk7Ci0KLQkvKioKLQkgKiBFamJYbWxFbnRpdHlSZXNvbHZlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXVFBFbnRpdHlSZXNvbHZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRTdXBwb3J0ZWREdERzKCkgewotCQlpZiAoc3VwcG9ydGVkRHREcyA9PSBudWxsKQotCQkJc3VwcG9ydGVkRHREcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBzdXBwb3J0ZWREdERzOwotCX0KLQotCS8qKgotCSAqIE1hcHMgdGhlIHN5c3RlbSBpZCBmb3IgdGhlIGR0ZCB0byBhIGxvY2FsIGlkIHRvIGJlIHJldHJpZXZlZCBsb2FkZWQgZnJvbSB0aGUgY2xhc3MgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0RChTdHJpbmcgc3lzdGVtSUQsIFN0cmluZyBsb2NhbElEKSB7Ci0JCS8vIFRPRE8gUmVtb3ZpbmcgUmVnaXN0cmF0aW9uIG1lY2hhbmlzbSB1bnRpbCBmaW5hbCBsb2NhdGlvbiBpcyBmb3VuZAotCQkvKgotCQkgKiBnZXRTdXBwb3J0ZWREdERzKCkucHV0KHN5c3RlbUlELCBsb2NhbElEKTsgZ2V0U3VwcG9ydGVkRHREcygpLnB1dChnZXRTaG9ydE5hbWUoc3lzdGVtSUQpLAotCQkgKiBsb2NhbElEKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogZm9yIGEgc3lzdGVtIGlkIHdpdGggYSBVUkwgdGhhdCBiZWdpbnMgd2l0aCAiaHR0cDovL2phdmEuc3VuLmNvbS8iLCBjaGVjayB0byBzZWUgaWYgdGhhdCBpcyBhCi0JICogcmVjb2duaXplZCBkdGQ7IGlmIHNvLCBsb2FkIHRoZSBkdGQgZnJvbSB0aGUgY2xhc3MgcGF0aCB1c2luZyB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyZWQKLQkgKiBkdGQuCi0JICogCi0JICogQHJldHVybiBhbiBJbnB1dCBzb3VyY2Ugb24gYSBsb2NhbGx5IHJlc29sdmVkIGR0ZCwgb3IgbnVsbCBvZiB0aGUgc3lzdGVtaWQgZG9lcyBub3Qgc3RhcnQKLQkgKiAgICAgICAgIHdpdGggImh0dHA6Ly9qYXZhLnN1bi5jb20vIgotCSAqIAotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgd2l0aCBhIG5lc3RlZCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhlIGR0ZCBpcyBub3QgcmVjb2duaXplZAotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHJlc29sdmVkIGR0ZCBjYW5ub3QgYmUgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqLwotCXB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxvY2FsUmVzb3VyY2VOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBpc0phdmFTeXRlbUlkID0gZmFsc2U7Ci0JCWlmIChzaG91bGRCZVJlZ2lzdGVyZWQoc3lzdGVtSWQpKSB7Ci0JCQlsb2NhbFJlc291cmNlTmFtZSA9IChTdHJpbmcpIGdldFN1cHBvcnRlZER0RHMoKS5nZXQoc3lzdGVtSWQpOwotCQkJaXNKYXZhU3l0ZW1JZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc2hvcnROYW1lID0gZ2V0U2hvcnROYW1lKHN5c3RlbUlkKTsKLQkJCWxvY2FsUmVzb3VyY2VOYW1lID0gKFN0cmluZykgZ2V0U3VwcG9ydGVkRHREcygpLmdldChzaG9ydE5hbWUpOwotCQkJaWYgKGxvY2FsUmVzb3VyY2VOYW1lICE9IG51bGwpCi0JCQkJc3lzdGVtSWQgPSBsb2NhbFJlc291cmNlTmFtZTsKLQkJfQotCi0JCWlmIChsb2NhbFJlc291cmNlTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNKYXZhU3l0ZW1JZCkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gIlR5cGUgaXMgdW5yZWNvZ25pemVkIG9yIG5vdCB5ZXQgc3VwcG9ydGVkOiBQVUJMSUNfSUQ9IHswfTtTWVNURU1fSUQ9ezF9IjsKLQkJCQl0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJaWYgKGxvYWRlciA9PSBudWxsKSB7Ci0JCQl1cmwgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShsb2NhbFJlc291cmNlTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UobG9jYWxSZXNvdXJjZU5hbWUpOwotCQl9Ci0KLQotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBwYXJzZSB4bWwgYmVjYXVzZSB0aGUgcmVzb2x2ZWQgcmVzb3VyY2UgXCJ7MH1cIiBjb3VsZCBub3QgYmUgZm91bmQgaW4gY2xhc3NwYXRoIjsKLQkJCXRocm93IG5ldyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCi0JCUlucHV0U291cmNlIHJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZSh1cmwudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCS8vIGZvcmNlIHRoZSBlbmNvZGluZyB0byBiZSBVVEY4Ci0JCXJlc3VsdC5zZXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQmVSZWdpc3RlcmVkKFN0cmluZyBzeXN0ZW1JZCkgewotCQkvLyBUT0RPIFJlbW92ZWQgUmVzb2x2ZXIgZnVuY3Rpb24gdW50aWwgZmlsZSBsb2NhdGlvbiBpcyBrbm93bi4uLgotCQlyZXR1cm4gZmFsc2U7Ci0JCS8qCi0JCSAqIHJldHVybiBzeXN0ZW1JZC5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuSkFWQV9TVU5fQ09NX1VSTCkgfHwKLQkJICogc3lzdGVtSWQuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLldXV19XM19PUkdfVVJMKSB8fAotCQkgKiBzeXN0ZW1JZC5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV1dXX0lCTV9DT01fVVJMKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgdXJpLCBvciB0aGUgc2VnbWVudCBhZnRlciB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNob3J0TmFtZShTdHJpbmcgdXJpKSB7Ci0JCVN0cmluZyB0ZW1wVVJJID0gdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJd2hpbGUgKHRlbXBVUkkuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJdGVtcFVSSSA9IHRlbXBVUkkuc3Vic3RyaW5nKDAsIHRlbXBVUkkubGVuZ3RoKCkgLSAxKTsKLQkJaW50IGxhc3RJbmRleCA9IHRlbXBVUkkubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKGxhc3RJbmRleCA9PSAtMSkKLQkJCXJldHVybiB1cmk7Ci0JCXJldHVybiB1cmkuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEsIHRlbXBVUkkubGVuZ3RoKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUE1vZHVsZXNJbml0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWI1NTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUE1vZHVsZXNJbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkVuY29kZXJEZWNvZGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5QYXNzd29yZEVuY29kZXJEZWNvZGVyOwotCi0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV1RQTW9kdWxlc0luaXQgewotIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQlpbml0KHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChib29sZWFuIHRvUHJlcmVnaXN0ZXJQYWNrYWdlcykgewotCQlpZiAoIWlzSW5pdGlhbGl6ZWQpIHsKLQkJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCk7Ci0JCQlET01VdGlsaXRpZXMuc2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKFdUUEVudGl0eVJlc29sdmVyLklOU1RBTkNFKTsgCi0JCQlpbml0UmVzb3VyY2VGYWN0b3JpZXMoKTsKLQkJCQotCQkJLy9UT0RPOiBSZW1vdmUgdGhpcyBsaW5lIGFmdGVyIFNFRCBBZGFwdGVyIGlzIHJlc3RvcmVkLgotCQkJRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJfQotCQlpZih0b1ByZXJlZ2lzdGVyUGFja2FnZXMpIAotCQkJcHJlcmVnaXN0ZXJQYWNrYWdlcygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZUZhY3RvcmllcygpIHsKLQkJV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwkKLQl9Ci0KLQkvKiogCi0JICogSWYgdGhlIGN1cnJlbnRseSBkZWZhdWx0ZWQgZW5jb2RlciBpcyB0aGUgaW5pdGlhbCBwYXNzIHRocnUgZW5jb2RlciwKLQkgKiB0aGVuIHJlZ2lzdGVyIGEgUGFzc3dvcmQgZW5jb2RlciBmb3Igc2VjdXJpdHk7IG90aGVyd2lzZSBpZiBhIG1vcmUgc29waGlzdGljYXRlZAotCSAqIGVuY29kZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGVuIGRvIG5vdGhpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSB7Ci0JCUVuY29kZXJEZWNvZGVyUmVnaXN0cnkgcmVnID0gRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZy5nZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSA9PSBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LklOSVRJQUxfREVGQVVMVF9FTkNPREVSKSB7Ci0JCQlyZWcuc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKG5ldyBQYXNzd29yZEVuY29kZXJEZWNvZGVyKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlcmVnaXN0ZXJQYWNrYWdlcygpIHsgCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgibW9kdWxlQ29yZS54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMjA4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5XVFBNb2R1bGVzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdUUE1vZHVsZXNSZXNvdXJjZSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBUcmFuc2xhdG9yUmVzb3VyY2UgewotCQotCXB1YmxpYyBXVFBNb2R1bGVzUmVzb3VyY2UoVVJJIGFVUkksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhVVJJLCBhUmVuZGVyZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFB1YmxpY0lkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQdWJsaWNJZCgpIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFN5c3RlbUlkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgeyAKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlI2dldERvY3R5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBXVFBNb2R1bGVzVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmE2ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1RQX01PRFVMRVNfU0hPUlRfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfV1RQX01PRFVMRVNfU0hPUlRfTkFNRSA9ICIuY29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX1dUUF9NT0RVTEVTX1NIT1JUX05BTUUgPSAiLnd0cG1vZHVsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgV1RQX01PRFVMRVNfVVJJX09CSiA9IFVSSS5jcmVhdGVVUkkoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIE9MRF9XVFBfTU9EVUxFU19VUklfT0JKID0gVVJJLmNyZWF0ZVVSSSgiLnNldHRpbmdzLy5jb21wb25lbnQiKTsKLQkKLQotCS8qKgotCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LgotCSAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkuTGlzdGVuZXIjdXBkYXRlUmVuZGVyZXJGYWN0b3J5KGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlbmRlcmVyRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgbmV3UmVuZGVyZXJGYWN0b3J5KSB7Ci0JCS8vRG8gTm90aGluZy4uLiAgIG5vdCBhbGxvd2VkIHRvIHN3aXRjaAotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2UoVVJJLCBSZW5kZXJlcikKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IFdUUE1vZHVsZXNSZXNvdXJjZSh1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXVFBfTU9EVUxFU19TSE9SVF9OQU1FLCBuZXcgV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KE9MRF9XVFBfTU9EVUxFU19TSE9SVF9OQU1FLCBuZXcgV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEZJUlNUX1dUUF9NT0RVTEVTX1NIT1JUX05BTUUsIG5ldyBXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLQl9Ci0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRSZWdpc3RlcmVkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoV1RQX01PRFVMRVNfVVJJX09CSik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmZGEyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlc291cmNlRmFjdG9yeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IGV4dGVuZHMgRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JIAotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gTE9HX1dBUk5JTkdTID0gZmFsc2U7Ci0JCi0JCi0JcHJpdmF0ZSBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJbmV3IFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGRlbGVnYXRlZEdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlpZiAoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UgPT0gdGhpcykKLQkJCXJldHVybiBzdXBlci5kZWxlZ2F0ZWRHZXRGYWN0b3J5KHVyaSk7Ci0JCXJldHVybiBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KHVyaSk7CQotCX0gICAKLQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSwgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbXBvbmVudFByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KHVyaSk7Ci0JCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJLy8gZG9uJ3QgZG8gYW55dGhpbmcKLQkJfQotCQlJTG9jayBsb2NrID0gRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmdldFByb2plY3RMb2NrT2JqZWN0KGNvbXBvbmVudFByb2plY3QpOwotCQl0cnl7Ci0JCQlpZihudWxsICE9IGxvY2spewotCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJfQotCQkJc3luY2hyb25pemVkKHRoaXMpewotCQkJCVJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gbnVsbDsKLQkJCQlpZih1cmkgIT0gbnVsbCAmJiB1cmkubGFzdFNlZ21lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJCWlmKG51bGwgPT0gZGVzY3JpcHRpb24pewotCQkJCQkJZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKHVyaSwgZGVzY3JpcHRpb24pOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlRmFjdG9yeSA9IGdldEZhY3RvcnkoZGVzY3JpcHRvcik7CQotCQkJCQl9CQotCQkJCX0KLQkJCQlpZihyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkKLQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeSh1cmkpOwotCQkJCXJldHVybiByZXNvdXJjZUZhY3Rvcnk7Ci0JCQl9Ci0JCX0gZmluYWxseXsKLQkJCWlmKG51bGwgIT0gbG9jayl7Ci0JCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0gCi0JfQotCQotCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeSh1cmksIChJQ29udGVudERlc2NyaXB0aW9uKW51bGwpOwotCX0JCi0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgZmlsZSBuYW1lIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWdtZW50IG9mIGEgVVJJIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBSZXNvdXJjZS5GYWN0b3J5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChTdHJpbmcgYVNpbXBsZUZpbGVOYW1lLCBSZXNvdXJjZS5GYWN0b3J5IGFGYWN0b3J5KSB7IAotCQkKLQkJaWYoTE9HX1dBUk5JTkdTKSB7Ci0JCQkvKiB0aGUgdGhpcmQgZW50cnkgaW4gdGhlIGFycmF5IGlzIHRoaXMgc3RhY2sgZnJhbWUsIHdlIHdhbGsgYmFjayBmcm9tIHRoZXJlLiAqLwotCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlID0gKG5ldyBFeGNlcHRpb24oKSkuZ2V0U3RhY2tUcmFjZSgpOwotCQkJaWYoc3RhY2tUcmFjZS5sZW5ndGggPiA0KSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHdhcm5pbmdNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoKSB3YXMgY2FsbGVkIGV4cGxpY2l0bHkgZnJvbSAiICsgc3RhY2tUcmFjZVszXSk7Ci0JCQkJd2FybmluZ01lc3NhZ2UuYXBwZW5kKCJcblRoaXMgaGFwcGVuZWQgYXJvdW5kOiBcbiIpOwotCQkJCWZvciAoaW50IGkgPSA0OyAoaSA8IHN0YWNrVHJhY2UubGVuZ3RoKSAmJiBpIDwgODsgaSsrKSB7Ci0JCQkJCXdhcm5pbmdNZXNzYWdlLmFwcGVuZCgiXHRuZWFyICIpLmFwcGVuZChzdGFja1RyYWNlW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCQkJfQotCQkJCXdhcm5pbmdNZXNzYWdlLmFwcGVuZCgiLlxuQ2xpZW50cyBzaG91bGQgdXNlIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUucmVzb3VyY2VGYWN0b3JpZXMgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQuIik7Ci0JCQkJTW9kdWxlY29yZVBsdWdpbi5sb2coSVN0YXR1cy5JTkZPLCAwLCB3YXJuaW5nTWVzc2FnZS50b1N0cmluZygpLCBudWxsKTsJCQotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChhU2ltcGxlRmlsZU5hbWUsIGFGYWN0b3J5KTsKLQkJCi0JfSAgCi0JcHJpdmF0ZSBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBnZXRLZXkoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IGtleSA9IG5ldyBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSgpOwotCQlrZXkuc2hvcnROYW1lID0gZGVzY3JpcHRvci5nZXRTaG9ydFNlZ21lbnQoKTsKLQkJa2V5LnR5cGUgPSBkZXNjcmlwdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCWtleS5pc0RlZmF1bHQgPSBkZXNjcmlwdG9yLmlzRGVmYXVsdCgpOwotCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpewotCQkJQ29uZmlndXJhdGlvblJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgY29uZmlndXJhdGlvbkRlc2NyaXB0b3IgPSAoQ29uZmlndXJhdGlvblJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpZGVzY3JpcHRvcjsKLQkJCWtleS5mYWN0b3J5Q2xhc3NOYW1lID0gY29uZmlndXJhdGlvbkRlc2NyaXB0b3IuZ2V0RmFjdG9yeUNsYXNzTmFtZSgpOwotCQkJa2V5Lm92ZXJyaWRlc0ZhY3RvcnlDbGFzc05hbWUgPSBjb25maWd1cmF0aW9uRGVzY3JpcHRvci5nZXRPdmVycmlkZXNGYWN0b3J5Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjbGFyZXMgYSBzdWJjbGFzcyB0byBjcmVhdGUgUmVzb3VyY2UuRmFjdG9yeShpZXMpIGZyb20gYW4gZXh0ZW5zaW9uLiAKLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbmZpZ3VyYXRpb25SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciAgaW1wbGVtZW50cyBJUmVzb3VyY2VGYWN0b3J5RXh0UHRDb25zdGFudHMgewotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgc2hvcnRTZWdtZW50OwotCQlwcml2YXRlIElDb250ZW50VHlwZSBjb250ZW50VHlwZTsKLQkJcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdCA9IHRydWU7Ci0JCXByaXZhdGUgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBvdmVycmlkZXNGYWN0b3J5Q2xhc3NOYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsgCi0JCQotCQlwdWJsaWMgQ29uZmlndXJhdGlvblJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJQXNzZXJ0LmlzTm90TnVsbChleHQpOwotCQkJZWxlbWVudCA9IGV4dDsKLQkJCWluaXQoKTsKLQkJfSAKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0T3ZlcnJpZGVzRmFjdG9yeUNsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBvdmVycmlkZXNGYWN0b3J5Q2xhc3NOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkgewotCQkJcmV0dXJuIGZhY3RvcnlDbGFzc05hbWU7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXNob3J0U2VnbWVudCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TSE9SVF9TRUdNRU5UKTsKLQkJCQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYmluZGluZ3MgPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19DT05URU5UVFlQRSk7Ci0JCQlpZiAoYmluZGluZ3MubGVuZ3RoID4gMCkgewotCQkJCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQkJCQljb250ZW50VHlwZUlkID0gYmluZGluZ3NbMF0uZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UVFlQRUlEKTsJCQkKLQkJCQlpZiAoY29udGVudFR5cGVJZCAhPSBudWxsKQotCQkJCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQkJfQotCQkJCi0JCQlpZiAoKHNob3J0U2VnbWVudCA9PSBudWxsIHx8IHNob3J0U2VnbWVudC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCSYmIGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIAotCQkJCQkJCQkJCSJFaXRoZXIgdGhlIHNob3J0U2VnbWVudCBhdHRyaWJ1dGUgb3IgdGhlIGNvbnRlbnRUeXBlIGVsZW1lbnQgb2YgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBUQUdfUkVTT1VSQ0VfRkFDVE9SWSAKLQkJCQkJCQkJCQkrICIgbXVzdCBiZSBzcGVjaWZpZWQgaW4gIiAKLQkJCQkJCQkJCQkrIGVsZW1lbnQuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpCi0JCQkJCQkJCQkJKyAiLiAgVGhlIHNob3J0U2VnbWVudCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIHdpdGggYSB2YWxpZCwgbm9uLW51bGwsICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSsgIm5vbi1lbXB0eSB2YWx1ZSwgYW5kIHRoZSBjb250ZW50VHlwZSBlbGVtZW50IGlzIHNwZWNpZmllZCB3aXRoIGEgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAidmFsaWQsIG5vbi1udWxsLCBub24tZW1wdHkgY29udGVudFR5cGVJZC4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQksIG51bGwpKTsKLQkJCX0KLQkJCQotCQkJaWYgKCJmYWxzZSIuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JU0RFRkFVTFQpKSkKLQkJCQlpc0RlZmF1bHQgPSBmYWxzZTsKLQkJCQkKLSAgICAgICAgICAgIGZhY3RvcnlDbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQkJb3ZlcnJpZGVzRmFjdG9yeUNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9PVkVSUklERVNfRkFDVE9SWSk7CQkJCQotCQl9IAotCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSkgewotCQkJLy8gTm90IHN1cmUgd2hlcmUgdGhpcyBpcyBhY3R1YWxseSB1c2VkLCBzbyBub3Qgc3VyZSB3aGF0IHRoZSBwcm9wZXIgCi0JCQkvLyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUsIHNvIHNpbXBseSBjaGVja2luZyB0aGUgc2hvcnQgc2VnbWVudCBmb3Igbm93Ci0JCQlpZiAoZmlsZVVSSSAhPSBudWxsICYmIGZpbGVVUkkubGFzdFNlZ21lbnQoKSAhPSBudWxsICYmIHNob3J0U2VnbWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNob3J0U2VnbWVudC5lcXVhbHMoZmlsZVVSSS5sYXN0U2VnbWVudCgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSAKLQkJCi0JCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKSB7Ci0JCQkKLQkJCWZpbmFsIFJlc291cmNlLkZhY3RvcnlbXSBmYWN0b3J5ID0gbmV3IFJlc291cmNlLkZhY3RvcnlbMV07Ci0JCQkKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlmYWN0b3J5WzBdID0gKFJlc291cmNlLkZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwkJCQkJCi0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nKE1vZHVsZWNvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7CQkJCQkKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJcmV0dXJuIGZhY3RvcnlbMF0gIT0gbnVsbCA/IGZhY3RvcnlbMF0gOiBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5HTE9CQUxfRkFDVE9SWTsKLQkJCQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKSB7Ci0JCQlyZXR1cm4gc2hvcnRTZWdtZW50OwotCQl9Ci0KLQkJcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJCXJldHVybiBjb250ZW50VHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJCXJldHVybiBpc0RlZmF1bHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpbnQgaGFzaENvZGUgPSAwOwotCQkJaWYgKGdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJCWhhc2hDb2RlIHw9IGdldENvbnRlbnRUeXBlKCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCWlmIChnZXRTaG9ydFNlZ21lbnQoKSAhPSBudWxsKSB7Ci0JCQkJaGFzaENvZGUgfD0gZ2V0U2hvcnRTZWdtZW50KCkuaGFzaENvZGUoKTsKLQkJCX0KLQkJCXJldHVybiBoYXNoQ29kZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoISAobyBpbnN0YW5jZW9mIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciByZmRvID0gKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpIG87Ci0JCQlib29sZWFuIGVxdWFscyA9IHRydWU7Ci0JCQllcXVhbHMgJj0gKGdldENvbnRlbnRUeXBlKCkgPT0gbnVsbCkgPyByZmRvLmdldENvbnRlbnRUeXBlKCkgPT0gbnVsbCA6Ci0JCQkJZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMocmZkby5nZXRDb250ZW50VHlwZSgpKTsKLQkJCWVxdWFscyAmPSAoZ2V0U2hvcnRTZWdtZW50KCkgPT0gbnVsbCkgPyByZmRvLmdldFNob3J0U2VnbWVudCgpID09IG51bGwgOgotCQkJCWdldFNob3J0U2VnbWVudCgpLmVxdWFscyhyZmRvLmdldFNob3J0U2VnbWVudCgpKTsKLQkJCXJldHVybiBlcXVhbHM7Ci0JCX0KLQl9Ci0JIAotCQotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIElSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cyB7IAotIAkJCi0JCXB1YmxpYyBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBFWFRQVF9SRVNPVVJDRV9GQUNUT1JJRVMpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQotCQkJaWYoZWxlbWVudCAhPSBudWxsICYmIFRBR19SRVNPVVJDRV9GQUNUT1JZLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlmaW5hbCBib29sZWFuW10gc3VjY2VzcyA9IG5ldyBib29sZWFuW10geyB0cnVlIH07IAotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQlhZGREZXNjcmlwdG9yKG5ldyBDb25maWd1cmF0aW9uUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJCX0gCi0KLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nKE1vZHVsZWNvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JCQkJCQlzdWNjZXNzWzBdID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsJCQkJCi0JCQkJcmV0dXJuIHN1Y2Nlc3NbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0JCi0JCX0KLQl9Ci0JcHJpdmF0ZSBjbGFzcyBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSB7IAotIAkJCi0JCXB1YmxpYyBTdHJpbmcgb3ZlcnJpZGVzRmFjdG9yeUNsYXNzTmFtZTsKLQkJcHVibGljIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lOwotCQlwdWJsaWMgU3RyaW5nIHNob3J0TmFtZTsKLQkJcHVibGljIElDb250ZW50VHlwZSB0eXBlOwotCQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQgPSB0cnVlOwotCQlwdWJsaWMgV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQkvKioKLQkJICogU29ydCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKLQkJICogRmlyc3QsIHNvcnQgYnkgc2hvcnROYW1lLCBpZiBzaG9ydE5hbWUgaXMgbnVsbCwgdGhlbiBpdCBjb21lcyBsYXN0Ci0JCSAqIElmIHNob3J0TmFtZXMgYXJlIGVxdWFsLCB0aGVuIHNvcnQgYnkgaXNEZWZhdWx0Ci0JCSAqIElmIGlzRGVmYXVsdCBpcyBhbHNvIGVxdWFsLCB0aGVuIHRoZSBvbmUgZGVmaW5pbmcgYSBmYWN0b3J5Q2xhc3NOYW1lIHdpbnMKLQkJICogSWYgYm90aCBoYXZlIGZhY3RvcnlDbGFzc05hbWVzLCB0aGVuIGNoZWNrIHRvIHNlZSBpZiBvbmUgb3ZlcnJpZGVzIHRoZSBvdGhlciB2aWEgb3ZlcnJpZGVzRmFjdG9yeUNsYXNzTmFtZQotCQkgKiBJZiBuZWl0aGVyIG92ZXJyaWRlIHRoZSBvdGhlciBmYWN0b3J5IGNsYXNzLCB0aGVuIHNvcnQgYnkgZmFjdG9yeUNsYXNzbmFtZQotCQkgKiBAcGFyYW0gb3RoZXIKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlVG8oV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXkgb3RoZXIpewotCQkJaWYodGhpcyA9PSBvdGhlcil7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZihzaG9ydE5hbWUgPT0gbnVsbCAmJiBvdGhlci5zaG9ydE5hbWUgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgaWYoc2hvcnROYW1lID09IG51bGwpewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmKG90aGVyLnNob3J0TmFtZSA9PSBudWxsKXsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkKLQkJCWludCBzaG9ydE5hbWVDb21wYXJlID0gdGhpcy5zaG9ydE5hbWUuY29tcGFyZVRvKG90aGVyLnNob3J0TmFtZSk7Ci0JCQlpZihzaG9ydE5hbWVDb21wYXJlICE9IDApewotCQkJCXJldHVybiBzaG9ydE5hbWVDb21wYXJlOwotCQkJfSBlbHNlIHsKLQkJCQlpZih0aGlzLmlzRGVmYXVsdCAhPSBvdGhlci5pc0RlZmF1bHQpewotCQkJCQlpZih0aGlzLmlzRGVmYXVsdCl7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmKHRoaXMuZmFjdG9yeUNsYXNzTmFtZSA9PSBudWxsICYmIG90aGVyLmZhY3RvcnlDbGFzc05hbWUgPT0gbnVsbCl7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfSBlbHNlIGlmKG90aGVyLmZhY3RvcnlDbGFzc05hbWUgPT0gbnVsbCl7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0gZWxzZSBpZiAodGhpcy5mYWN0b3J5Q2xhc3NOYW1lID09IG51bGwpewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0gZWxzZSBpZihvdGhlci5mYWN0b3J5Q2xhc3NOYW1lLmVxdWFscyh0aGlzLm92ZXJyaWRlc0ZhY3RvcnlDbGFzc05hbWUpKXsKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJfSBlbHNlIGlmKHRoaXMuZmFjdG9yeUNsYXNzTmFtZS5lcXVhbHMob3RoZXIub3ZlcnJpZGVzRmFjdG9yeUNsYXNzTmFtZSkpewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5mYWN0b3J5Q2xhc3NOYW1lLmNvbXBhcmVUbyhvdGhlci5mYWN0b3J5Q2xhc3NOYW1lKTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdG9yKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlnZXREZXNjcmlwdG9ycygpLnB1dChnZXRLZXkoZGVzY3JpcHRvciksIGRlc2NyaXB0b3IpOwotCX0KLQkKLQlwcml2YXRlIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IFtdICBzb3J0ZWREZXNjcmlwdG9ycyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBbXSAgZ2V0U29ydGVkRGVzY3JpcHRvcktleXMoKSB7Ci0JCWlmKHNvcnRlZERlc2NyaXB0b3JzID09IG51bGwgfHwgc29ydGVkRGVzY3JpcHRvcnMubGVuZ3RoICE9IGdldERlc2NyaXB0b3JzKCkuc2l6ZSgpKXsKLQkJCVNldCBrZXlzID0gZ2V0RGVzY3JpcHRvcnMoKS5rZXlTZXQoKTsKLQkJCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IFtdIGFycmF5ID0gbmV3IFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IFtrZXlzLnNpemUoKV07Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpO2NvdW50KyspIHsKLQkJCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBrZXkgPSAoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlhcnJheVtjb3VudF0gPSBrZXk7Ci0JCQl9Ci0JCQlBcnJheXMuc29ydChhcnJheSwgbmV3IENvbXBhcmF0b3I8V1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXk+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBrZXkxLAotCQkJCQkJV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlLZXkga2V5MikgewotCQkJCQlyZXR1cm4ga2V5MS5jb21wYXJlVG8oa2V5Mik7Ci0JCQkJfQotCQkJfSk7Ci0JCQlzb3J0ZWREZXNjcmlwdG9ycyA9IGFycmF5OwotCQl9Ci0JCXJldHVybiBzb3J0ZWREZXNjcmlwdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihVUkkgdXJpLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IFtdIGtleXMgPSBnZXRTb3J0ZWREZXNjcmlwdG9yS2V5cygpOwotCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlZmF1bHREZXNjcmlwdG9yID0gbnVsbDsKLQkJCi0JCS8vIGZpcnN0IGNoZWNrIGNvbnRlbnQgdHlwZQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJZm9yIChXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBrZXkgOiBrZXlzKSB7Ci0JCQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3JzKCkuZ2V0KGtleSk7Ci0JCQkJCi0JCQkJaWYgKChrZXkudHlwZSAhPSBudWxsKSAmJiAoZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoa2V5LnR5cGUpKSkgewotCQkJCQlpZiAoKGRlZmF1bHREZXNjcmlwdG9yID09IG51bGwpIHx8IChrZXkuaXNEZWZhdWx0KSkgewotCQkJCQkJZGVmYXVsdERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGVuIGNoZWNrIHNob3J0IG5hbWUsIG92ZXJyaWRpbmcgZGVmYXVsdCBpZiBuZWNlc3NhcnkKLQkJZm9yIChXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBrZXkgOiBrZXlzKSB7Ci0JCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcnMoKS5nZXQoa2V5KTsKLQkJCQkJCQotCQkJaWYgKChrZXkuc2hvcnROYW1lICE9IG51bGwpICYmICh1cmkubGFzdFNlZ21lbnQoKS5lcXVhbHMoa2V5LnNob3J0TmFtZSkpKSB7Ci0JCQkJaWYgKChkZWZhdWx0RGVzY3JpcHRvciA9PSBudWxsKSAKLQkJCQkJCXx8ICgoZGVzY3JpcHRpb24gPT0gbnVsbCkgJiYgKGtleS5pc0RlZmF1bHQpKSkgewotCQkJCQlkZWZhdWx0RGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZGVmYXVsdERlc2NyaXB0b3I7Ci0JfQotCQotCXByaXZhdGUgVVJJIG5ld1BsYXRmb3JtVVJJKFVSSSBhTmV3VVJJLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIE1vZHVsZVVSSVV0aWwudHJpbVRvRGVwbG95UGF0aFNlZ21lbnQoYU5ld1VSSSk7Ci0JCXRyeSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQotCQkJVVJJIGRlcGxveVBhdGhTZWdtZW50ID0gTW9kdWxlVVJJVXRpbC50cmltVG9EZXBsb3lQYXRoU2VnbWVudChhTmV3VVJJKTsKLQkJCQotCQkJLy9JVmlydHVhbEZpbGUgbmV3RmlsZSA9IGNvbXBvbmVudC5nZXRGaWxlKG5ldyBQYXRoKGRlcGxveVBhdGhTZWdtZW50LnBhdGgoKSkpOwkJCQotCQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJVmlydHVhbEZpbGUgbmV3RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChkZXBsb3lQYXRoU2VnbWVudC5wYXRoKCkpKTsKLQkJCQotCQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG5ld0ZpbGUuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkgCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbkZyb21VUkkoVVJJIHVyaSkgewotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyID0gTW9kdWxlVVJJVXRpbC5nZXRDb250ZW50VHlwZU5hbWUodXJpKTsKLQkJaWYgKGNvbnRlbnRUeXBlSWRlbnRpZmllciAhPSBudWxsKQotCQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWRlbnRpZmllcikuZ2V0RGVmYXVsdERlc2NyaXB0aW9uKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihVUkkgdXJpKSB7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUodXJpKTsKLQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ly9DaGVjayBmb3Igb3B0aW9uYWwgZW1iZWRkZWQgdXJpIHNlZ21lbnQsIHRoZW4gbm9ybWFsaXplCi0JCQlkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uRnJvbVVSSSh1cmkpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbXBvbmVudFByb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KHVyaSk7Ci0JCQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCQl1cmkgPSBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24ucmVzb2x2ZSh1cmkpOwotCQkJCQl1cmkgPSBuZXdQbGF0Zm9ybVVSSSh1cmksY29tcG9uZW50UHJvamVjdCk7Ci0JCQkJfSAKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCQotCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlZmF1bHREZXNjID0gZ2V0RGVzY3JpcHRvcih1cmksIGRlc2NyaXB0aW9uKTsKLQkJLy8gT2sgbm8gY29udGVudCB0eXBlIG1hdGNoIC0gZ28gdG8gc3VwZXIKLQkJaWYgKGRlZmF1bHREZXNjICE9IG51bGwpewotCQkJcmV0dXJuIGRlZmF1bHREZXNjOwotCQl9Ci0JCWVsc2V7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVzY3JpcHRvcih1cmkpOwotCQl9Ci0JfQotCi0JcHVibGljIEZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RmFjdG9yeSh1cmksIHR5cGUuZ2V0RGVmYXVsdERlc2NyaXB0aW9uKCkpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RmFjdG9yeSh1cmksIGNvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXJpIGlzIGZvdW5kIGluIHRoZSBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBkZXNjcmlwdG9yLgotCSAqICBUaGlzIHdpbGwgbm90IGxvYWQgYW55IGV4dGVuc2lvbiBwb2ludHMKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2hvcnROYW1lUmVnaXN0ZXJlZChVUkkgdXJpKSB7Ci0JCU1hcCBtID0gZ2V0RGVzY3JpcHRvcnMoKTsKLQkJQ29sbGVjdGlvbiBjID0gbS52YWx1ZXMoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGMuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHVyaUxhc3RTZWdtZW50ID0gdXJpLmxhc3RTZWdtZW50KCk7Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlpZihkZXNjcmlwdG9yLmdldFNob3J0U2VnbWVudCgpICE9IG51bGwgJiYgZGVzY3JpcHRvci5nZXRTaG9ydFNlZ21lbnQoKS5lcXVhbHModXJpTGFzdFNlZ21lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dvcmtiZW5jaENvbXBvbmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dvcmtiZW5jaENvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2NWJhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Xb3JrYmVuY2hDb21wb25lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrYmVuY2ggTW9kdWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwjZ2V0Q29tcG9uZW50VHlwZSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMgPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsI2dldE1ldGFkYXRhUmVzb3VyY2VzIDxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hDb21wb25lbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXb3JrYmVuY2hDb21wb25lbnQgewotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0IGV4dGVuZHMgRUFkYXB0ZXJMaXN0Ci0JICB7Ci0JCi0JICAgIEBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0W10gZGF0YSgpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcyl7cmV0dXJuIHN1cGVyLmRhdGEoKTt9Ci0JCX0KLQotCQlwdWJsaWMgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCQlzdXBlcihub3RpZmllcik7Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLmFkZChvYmplY3QpO30KLQkgICAgfQotCQotCSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN5bmNocm9uaXplZCAodGhpcykge3N1cGVyLmFkZChpbmRleCwgb2JqZWN0KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pO30KLQkgICAgfQotCQotCSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIucmVtb3ZlKG9iamVjdCk7fQotCSAgICB9Ci0JCi0JICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pO30KLQkgICAgfQotCQotCSAgICBwdWJsaWMgdm9pZCBjbGVhcigpCi0JICAgIHsKLQkgICAgIHN5bmNocm9uaXplZCAodGhpcykge3N1cGVyLmNsZWFyKCk7fTsKLQkgICAgfQotCQotCQotCSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLnNldChpbmRleCwgb2JqZWN0KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIHZvaWQgbW92ZShpbnQgbmV3UG9zaXRpb24sIE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7c3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2JqZWN0KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIE9iamVjdCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgaW50IG9sZFBvc2l0aW9uKQotCSAgICB7Ci0JICAgIHN5bmNocm9uaXplZCAodGhpcykge3JldHVybiBzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvbGRQb3NpdGlvbik7fQotCSAgICB9Ci0JICB9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZXMoKSA8ZW0+UmVzb3VyY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50VHlwZSgpIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFR5cGUgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGFkYXRhUmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0YWRhdGFSZXNvdXJjZXMgPSBudWxsOwotCi0vLwlwcml2YXRlIGZpbmFsIE1hcCByZXNvdXJjZUluZGV4QnlEZXBsb3lQYXRoID0gbmV3IEhhc2hNYXAoKTsKLS8vCXByaXZhdGUgZmluYWwgTWFwIHJlc291cmNlSW5kZXhCeVNvdXJjZVBhdGggPSBuZXcgSGFzaE1hcCgpOwotCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNJbmRleGVkQnlEZXBsb3lQYXRoOwotCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNJbmRleGVkQnlTb3VyY2VQYXRoOwotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRSZXNvdXJjZVtdIE5PX01PRFVMRV9SRVNPVVJDRVMgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VbMF07Ci0KLQlwcml2YXRlIFVSSSBoYW5kbGU7Ci0JCi0JcHJpdmF0ZSBJUGF0aCBkZWZhdWx0U291cmNlUm9vdDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoQ29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldEZpcnN0Um9vdFNvdXJjZSgpIHsKLQkJCi0JCUxpc3QgcmVzID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbXBvbmVudFJlc291cmNlIGVsZW1lbnQgPSAoQ29tcG9uZW50UmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMobmV3IFBhdGgoIi8iKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U291cmNlUGF0aCgpOwotCQkJCi0JCX0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElQYXRoIGdldEZpcnN0VGFnZ2VkUm9vdFNvdXJjZSgpewotCQlMaXN0IHJlcyA9IGdldFJlc291cmNlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSBlbGVtZW50ID0gKENvbXBvbmVudFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKCIvIikpICYmICBERUZBVUxUX1JPT1RfU09VUkNFX1RBRy5lcXVhbHMoZWxlbWVudC5nZXRUYWcoKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U291cmNlUGF0aCgpOwotCQl9CQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZUdlbihTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3RGVwbG95ZWROYW1lKSB7Ci0JCXNldE5hbWVHZW4obmV3RGVwbG95ZWROYW1lKTsKLQkJLy8gVE9ETyBBIG1vcmUgYWR2YW5jZWQgYWRhcHRlciBzaG91bGQgYmUgYXBwbGllZCB0byBrZWVwIHRoZSBoYW5kbGUgdXAgdG8gZGF0ZS4KLQkJaWYgKGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCVVSSSByZXNvdXJjZVVSSSA9IGVSZXNvdXJjZSgpLmdldFVSSSgpOwotLy8JCQlTdHJpbmcgc2FmZURlcGxveWVkTmFtZSA9IGdldE5hbWUoKSAhPSBudWxsID8gZ2V0TmFtZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXNvdXJjZVVSSSAhPSBudWxsICYmIHJlc291cmNlVVJJLnNlZ21lbnRDb3VudCgpID49IDIpCi0JCQkJc2V0SGFuZGxlKGNvbXB1dGVIYW5kbGUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SGFuZGxlKFVSSSBhSGFuZGxlKSB7Ci0JCWhhbmRsZSA9IGFIYW5kbGU7Ci0JfQotCQotCXB1YmxpYyBVUkkgZ2V0SGFuZGxlKCkgewotCQlpZihoYW5kbGUgPT0gbnVsbCkKLQkJCWhhbmRsZSA9IGNvbXB1dGVIYW5kbGUoKTsKLQkJcmV0dXJuIGhhbmRsZTsKLQl9Ci0KLQlwcml2YXRlIFVSSSBjb21wdXRlSGFuZGxlKCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uTU9EVUxFX1BST1RPQ09MICsgSVBhdGguU0VQQVJBVE9SICsgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLlJFU09VUkNFX01PRFVMRSArIElQYXRoLlNFUEFSQVRPUiArIGNvbXB1dGVQcm9qZWN0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgZ2V0TmFtZSgpKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZVByb2plY3ROYW1lKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHRoaXMpOwotCQlyZXR1cm4gKHByb2plY3QhPW51bGwpP3Byb2plY3QuZ2V0TmFtZSgpOiJVTkNPTlRBSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTLCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50VHlwZSBnZXRDb21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb21wb25lbnRUeXBlKENvbXBvbmVudFR5cGUgbmV3Q29tcG9uZW50VHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb21wb25lbnRUeXBlIG9sZENvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlOwotCQljb21wb25lbnRUeXBlID0gbmV3Q29tcG9uZW50VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEUsIG9sZENvbXBvbmVudFR5cGUsIG5ld0NvbXBvbmVudFR5cGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZSBuZXdDb21wb25lbnRUeXBlKSB7Ci0JCWlmIChuZXdDb21wb25lbnRUeXBlICE9IGNvbXBvbmVudFR5cGUpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbXBvbmVudFR5cGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29tcG9uZW50VHlwZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb21wb25lbnRUeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbXBvbmVudFR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb21wb25lbnRUeXBlKG5ld0NvbXBvbmVudFR5cGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEUsIG5ld0NvbXBvbmVudFR5cGUsIG5ld0NvbXBvbmVudFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKSB7Ci0JCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50cyA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VkQ29tcG9uZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZWZlcmVuY2VkQ29tcG9uZW50LmNsYXNzLCB0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFMpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VkQ29tcG9uZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydGllcygpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUHJvcGVydHkuY2xhc3MsIHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRNZXRhZGF0YVJlc291cmNlcygpIHsKLQkJaWYgKG1ldGFkYXRhUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCW1ldGFkYXRhUmVzb3VyY2VzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KElQYXRoLmNsYXNzLCB0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19NRVRBREFUQV9SRVNPVVJDRVMpOwotCQl9Ci0JCXJldHVybiBtZXRhZGF0YVJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbXBvbmVudFR5cGUobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIGdldFJlc291cmNlcygpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCXJldHVybiBnZXRNZXRhZGF0YVJlc291cmNlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUzoKLQkJCQlnZXRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRToKLQkJCQlzZXRDb21wb25lbnRUeXBlKChDb21wb25lbnRUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUzoKLQkJCQlnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlnZXRNZXRhZGF0YVJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVM6Ci0JCQkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFOgotCQkJCXNldENvbXBvbmVudFR5cGUoKENvbXBvbmVudFR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFM6Ci0JCQkJZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlnZXRNZXRhZGF0YVJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gcmVzb3VyY2VzICE9IG51bGwgJiYgIXJlc291cmNlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFOgotCQkJCXJldHVybiBjb21wb25lbnRUeXBlICE9IG51bGw7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlZENvbXBvbmVudHMgIT0gbnVsbCAmJiAhcmVmZXJlbmNlZENvbXBvbmVudHMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19NRVRBREFUQV9SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIG1ldGFkYXRhUmVzb3VyY2VzICE9IG51bGwgJiYgIW1ldGFkYXRhUmVzb3VyY2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRhZGF0YVJlc291cmNlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWV0YWRhdGFSZXNvdXJjZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChJUGF0aCBhRGVwbG95UGF0aCkgeyAKLQkJUmVzb3VyY2VUcmVlUm9vdCByZXNvdXJjZVRyZWVSb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXREZXBsb3lSZXNvdXJjZVRyZWVSb290KHRoaXMpOwotCQlyZXR1cm4gcmVzb3VyY2VUcmVlUm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGFEZXBsb3lQYXRoLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsgCi0JfQotCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5U291cmNlUGF0aChJUGF0aCBhU291cmNlUGF0aCwgaW50IHJlc291cmNlRmxhZykgeyAKLQkJUmVzb3VyY2VUcmVlUm9vdCByZXNvdXJjZVRyZWVSb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXRTb3VyY2VSZXNvdXJjZVRyZWVSb290KHRoaXMpOwotCQlyZXR1cm4gcmVzb3VyY2VUcmVlUm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGFTb3VyY2VQYXRoLCByZXNvdXJjZUZsYWcpOyAKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXhpc3RzKElQYXRoIGFTb3VyY2VQYXRoLCBpbnQgcmVzb3VyY2VGbGFnKSB7IAotCQlSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldFNvdXJjZVJlc291cmNlVHJlZVJvb3QodGhpcyk7Ci0JCXJldHVybiByZXNvdXJjZVRyZWVSb290LmV4aXN0cyhhU291cmNlUGF0aCwgcmVzb3VyY2VGbGFnKTsgCi0JfQotCXB1YmxpYyBFTGlzdCBlQWRhcHRlcnMoKQotCSAgewotCSAgICBpZiAoZUFkYXB0ZXJzID09IG51bGwpCi0JICAgIHsKLQkgICAgICBlQWRhcHRlcnMgPSAgbmV3IEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUFkYXB0ZXJzOwotCSAgfQotCi0KLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3luY2hyb25pemVkIChlQWRhcHRlcnMoKSkgewotCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZGVmYXVsdFNvdXJjZVJvb3QgPSBudWxsOwotCQkJCQloYW5kbGUgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldERlZmF1bHRTb3VyY2VSb290KCkgewotCQlpZiAoZGVmYXVsdFNvdXJjZVJvb3QgPT0gbnVsbCl7Ci0JCQlkZWZhdWx0U291cmNlUm9vdCA9IGdldEZpcnN0VGFnZ2VkUm9vdFNvdXJjZSgpOwotCQkJaWYgKGRlZmF1bHRTb3VyY2VSb290ID09IG51bGwpCi0JCQl7Ci0JCQkJZGVmYXVsdFNvdXJjZVJvb3QgPSBnZXRGaXJzdFJvb3RTb3VyY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFNvdXJjZVJvb3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTb3VyY2VSb290KElQYXRoIGRlZmF1bHRTb3VyY2VSb290KSB7Ci0JCXRoaXMuZGVmYXVsdFNvdXJjZVJvb3QgPSBkZWZhdWx0U291cmNlUm9vdDsKLQl9Ci0gIAotCi19IC8vIFdvcmtiZW5jaENvbXBvbmVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzY2VhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FkZFJlZmVyZW5jZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIGFuIGFsdGVybmF0aXZlIHRvIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcgotICogd2hpY2ggcmVxdWlyZXMgbGVzcyBvcHRpb25zIGFuZCBhbGxvd3MgZm9yIGEgcHJlLW1hZGUgSVZpcnR1YWxSZWZlcmVuY2UgdG8gYmUgc3RvcmVkLgotICovCi1wdWJsaWMgY2xhc3MgQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIEFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFNPVVJDRV9DT01QT05FTlQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQVJHRVRfUkVGRVJFTkNFX0xJU1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChTWU5DX1BSSU1BUllfUlVOVElNRSk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVmZXJlbmNlc09wKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCU9iamVjdCByZXRWYWwgPSBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKFNZTkNfUFJJTUFSWV9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKXsKLQkJCXJldFZhbCA9IEJvb2xlYW4uVFJVRTsKLQkJfQotCQlyZXR1cm4gcmV0VmFsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQWRkUmVmZXJlbmNlc09wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FkZFJlZmVyZW5jZXNPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWY5ZGRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQWRkUmVmZXJlbmNlc09wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIEFkZFJlZmVyZW5jZXNPcCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCi0JcHVibGljIEFkZFJlZmVyZW5jZXNPcChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCF2YWxpZGF0ZUVkaXQoKS5pc09LKCkpCi0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCWFkZFJlZmVyZW5jZWRDb21wb25lbnRzKG1vbml0b3IpOwotCQlhZGRQcm9qZWN0UmVmZXJlbmNlcyhtb25pdG9yKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgZWRpdCBmb3IgcmVzb3VyY2Ugc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotCQlJVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBzb3VyY2VDb21wLmdldFByb2plY3QoKTsKLQotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJU3RydWN0dXJlRWRpdCBzRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQkJc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlU3RhdGUoc0VkaXQuZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoc0VkaXQgIT1udWxsKQotCQkJCQlzRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlGaWxlIFtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotCQlmaWxlc1swXSA9IHByb2plY3QuZ2V0RmlsZShQcm9qZWN0VXRpbGl0aWVzLkRPVF9QUk9KRUNUKTsKLQkJc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgbnVsbCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gZ2V0TGlzdEZyb21Nb2RlbChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IG1vZGVsLmdldFByb3BlcnR5KElBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9SRUZFUkVOQ0VfTElTVCk7Ci0JCUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IG1vZExpc3QgPSB2YWx1ZSBpbnN0YW5jZW9mIExpc3QgPyAgKExpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KXZhbHVlIDogQXJyYXlzLmFzTGlzdChuZXcgSVZpcnR1YWxSZWZlcmVuY2VbXXsoSVZpcnR1YWxSZWZlcmVuY2UpdmFsdWV9KTsKLQkJcmV0dXJuIG1vZExpc3Q7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RSZWZlcmVuY2VzKCkgewotCQlhZGRQcm9qZWN0UmVmZXJlbmNlcyhudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9qZWN0UmVmZXJlbmNlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCUxpc3QgbW9kTGlzdCA9IGdldExpc3RGcm9tTW9kZWwobW9kZWwpOwotCQlMaXN0IHRhcmdldHByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKSBtb2RMaXN0LmdldChpKSkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYodmlydHVhbENvbXBvbmVudC5pc0JpbmFyeSgpKXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJCXRhcmdldHByb2plY3RMaXN0LmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJfQotCQl0cnkgewotCQkJUHJvamVjdFV0aWxpdGllcy5hZGRSZWZlcmVuY2VQcm9qZWN0cyhzb3VyY2VDb21wLmdldFByb2plY3QoKSwgdGFyZ2V0cHJvamVjdExpc3QpOwotCi0JCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm9wZXJ0aWVzLlNZTkNfUFJJTUFSWV9SVU5USU1FKSkKLQkJCXsKLQkJCQkvLyBzZXQgdGhlIHByaW1hcnkgcnVudGltZSBmb3IgdGhlIGNoaWxkIG1vZHVsZXMgdG8gYmUgdGhlIHBhcmVudCBtb2R1bGUncyBwcmltYXJ5IHJ1bnRpbWUsIGlmIG5lY2Vzc2FyeQotCSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdCBzb3VyY2VQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBzb3VyY2VDb21wLmdldFByb2plY3QoKSApOwotCSAgICAgICAgICAgIElSdW50aW1lIHNvdXJjZVJ1bnRpbWUgPSBzb3VyY2VQcm9qZWN0LmdldFByaW1hcnlSdW50aW1lKCk7Ci0JICAgICAgICAgICAgZm9yIChJdGVyYXRvciB0cGxJdHIgPSB0YXJnZXRwcm9qZWN0TGlzdC5pdGVyYXRvcigpOyB0cGxJdHIuaGFzTmV4dCgpOykKLQkgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgIElGYWNldGVkUHJvamVjdCBtb2R1bGVGYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggKChJUHJvamVjdCl0cGxJdHIubmV4dCgpKSApOwotCQkKLQkJICAgICAgICAgICAgaWYoIG1vZHVsZUZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgISBlcXVhbHMoIHNvdXJjZVJ1bnRpbWUsIG1vZHVsZUZhY2V0ZWRQcm9qZWN0LmdldFByaW1hcnlSdW50aW1lKCkgKSApCi0JCSAgICAgICAgICAgIHsKLQkJICAgICAgICAgICAgCWJvb2xlYW4gc3VwcG9ydHMgPSB0cnVlOwotCQkKLQkJICAgICAgICAgICAgCWlmKCBzb3VyY2VSdW50aW1lICE9IG51bGwgKQotCQkgICAgICAgICAgICAJewotCQkgICAgICAgICAgICAJCWZvciggSXRlcmF0b3IgaXRyID0gbW9kdWxlRmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLQkJICAgICAgICAgICAgCQl7Ci0JCSAgICAgICAgICAgIAkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ZXIgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ci5uZXh0KCk7Ci0JCSAgICAgICAgICAgIAkJCWlmKCAhIHNvdXJjZVJ1bnRpbWUuc3VwcG9ydHMoIGZ2ZXIgKSApCi0JCSAgICAgICAgICAgIAkJCXsKLQkJICAgICAgICAgICAgCQkJCXN1cHBvcnRzID0gZmFsc2U7Ci0JCSAgICAgICAgICAgIAkJCQlicmVhazsKLQkJICAgICAgICAgICAgCQkJfQotCQkgICAgICAgICAgICAJCX0KLQkJICAgICAgICAgICAgCX0KLQkJCSAgICAgICAgICAgIGlmKCBzdXBwb3J0cyApCi0JCQkgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICAgICAgbW9kdWxlRmFjZXRlZFByb2plY3Quc2V0UnVudGltZSggc291cmNlUnVudGltZSwgc3VibW9uKCBtb25pdG9yLCAxICkgKTsKLQkJCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgfQotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VkQ29tcG9uZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlZkxpc3QgPSBnZXRMaXN0RnJvbU1vZGVsKG1vZGVsKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHJlZkxpc3QudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVmTGlzdC5zaXplKCldKTsKLQkJc291cmNlQ29tcC5hZGRSZWZlcmVuY2VzKHJlZnMpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBzdWJtb24oZmluYWwgSVByb2dyZXNzTW9uaXRvciBwYXJlbnQsIGZpbmFsIGludCB0aWNrcykgewotCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocGFyZW50LCB0aWNrcykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKCBmaW5hbCBPYmplY3Qgb2JqMSwgZmluYWwgT2JqZWN0IG9iajIgKQotCXsKLQkJaWYoIG9iajEgPT0gb2JqMiApCi0JCXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoIG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gb2JqMS5lcXVhbHMoIG9iajIgKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2MTQyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIEFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRZUEVfSUQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT01QT05FTlRfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST01QVF9PTl9TQVZFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX1BST0pFQ1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQVJHRVRfQ09NUE9ORU5UKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST01QVF9PTl9TQVZFKSkKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRBUkdFVF9QUk9KRUNUKSkKLQkJCXJldHVybiBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFSR0VUX0NPTVBPTkVOVCkpCi0JCQlyZXR1cm4gZ2V0VGFyZ2V0Q29tcG9uZW50KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09NUE9ORU5UX05BTUUpKQotCQkJcmV0dXJuIGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudCBnZXRXb3JrYmVuY2hNb2R1bGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJCW1vZHVsZSA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobnVsbCAhPSBtb2R1bGVDb3JlKSB7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBub3RpZnkgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAoQ09NUE9ORU5UX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlzZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQlyZXR1cm4gbm90aWZ5OwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IGdldFdvcmtiZW5jaE1vZHVsZSgpOwotCQlJUHJvamVjdCBwcm9qID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChtb2R1bGUpOwotCQlyZXR1cm4gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvaik7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJU3RhdHVzIHJlc3VsdCA9IHN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzT0soKSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkKLQkJCXJldHVybiB2YWxpZGF0ZU1vZHVsZU5hbWUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZU1vZHVsZU5hbWUoKSB7Ci0JCVN0cmluZyBtb2R1bGVOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJaWYgKG1vZHVsZU5hbWUgPT0gbnVsbCB8fCBtb2R1bGVOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5QUk9KRUNUX05BTUVfRU1QVFkpKTsKLQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldFRhcmdldENvbXBvbmVudCgpIHsKLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShDT01QT05FTlRfTkFNRSk7Ci0JCWlmIChtb2R1bGVOYW1lICE9IG51bGwgJiYgbW9kdWxlTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIG51bGw7Ci0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9BcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGE0NmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSUFydGlmYWN0RWRpdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dCBlbWZXb3JrYmVuY2hDb250ZXh0OwotLy8JcHJpdmF0ZSBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotCi0JcHVibGljIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZW1mV29ya2JlbmNoQ29udGV4dCA9IChFTUZXb3JrYmVuY2hDb250ZXh0KSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlRU1GQ29udGV4dChnZXRUYXJnZXRQcm9qZWN0KCksIG51bGwpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRUYXJnZXRDb21wb25lbnQoKTsgCi0JCWFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdEZvck1vZHVsZShjb21wb25lbnQpOwotCQlkb0luaXRpYWxpemUobW9uaXRvcik7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldFRhcmdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFRhcmdldFByb2plY3QoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0luaXRpYWxpemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vRGVmYXVsdAotCX0KLQotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuaW5zdGFuY2UoKTsKLQkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IHJlYWRlci5nZXRBcnRpZmFjdEVkaXQoY29tcC5nZXRQcm9qZWN0KCkpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvcldyaXRlKGNvbXApOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChhcnRpZmFjdEVkaXQhPW51bGwpIHsKLQkJCWFydGlmYWN0RWRpdC5zYXZlSWZOZWNlc3NhcnkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWluaXRpYWxpemUobW9uaXRvcik7Ci0JCQlpZiAodmFsaWRhdGVFZGl0KCkuaXNPSygpKQotCQkJCXJldHVybiBkb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0gZmluYWxseSB7Ci0JCQlkaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0KCl7Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgZWRpdCBmb3IgcmVzb3VyY2Ugc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoKSB7Ci0JCUlWYWxpZGF0ZUVkaXRDb250ZXh0IHZhbGlkYXRvciA9IChJVmFsaWRhdGVFZGl0Q29udGV4dCkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShJVmFsaWRhdGVFZGl0Q29udGV4dC5DTEFTU19LRVkpOwotCQlyZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRlU3RhdGUoKEVkaXRNb2RlbClnZXRBcnRpZmFjdEVkaXQoKS5nZXRBZGFwdGVyKEFydGlmYWN0RWRpdE1vZGVsLkFEQVBURVJfVFlQRSkpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0NyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2N2EyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0NyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChTT1VSQ0VfQ09NUE9ORU5UKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVApOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AobW9kZWwpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKFRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBtYXApOwotCQkJcmV0dXJuIG1hcDsKLQkJfQotCQllbHNlIGlmIChUQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVAuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBtYXApOwotCQkJcmV0dXJuIG1hcDsKLQkJfQotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFSR0VUX0NPTVBPTkVOVF9MSVNUKSkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgpKXsKLQkJCXJldHVybiAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmY2M3NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQotCXB1YmxpYyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghdmFsaWRhdGVFZGl0KCkuaXNPSygpKQotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQlhZGRSZWZlcmVuY2VkQ29tcG9uZW50cyhtb25pdG9yKTsKLQkJYWRkUHJvamVjdFJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgZWRpdCBmb3IgcmVzb3VyY2Ugc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotCQlJVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gc291cmNlQ29tcC5nZXRQcm9qZWN0KCk7Ci0KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCVN0cnVjdHVyZUVkaXQgc0VkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZVN0YXRlKHNFZGl0LmdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbCgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHNFZGl0ICE9bnVsbCkKLQkJCQkJc0VkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCQotCQlJRmlsZSBbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLQkJZmlsZXNbMF0gPSBwcm9qZWN0LmdldEZpbGUoUHJvamVjdFV0aWxpdGllcy5ET1RfUFJPSkVDVCk7Ci0JCXN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsIG51bGwpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RSZWZlcmVuY2VzKCkgewotCi0JCUlWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKTsKLQkJTGlzdCBtb2RMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQlMaXN0IHRhcmdldHByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZExpc3QuZ2V0KGkpOwotCQkJaWYodmlydHVhbENvbXBvbmVudC5pc0JpbmFyeSgpKXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJCXRhcmdldHByb2plY3RMaXN0LmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJfQotCQl0cnkgewotCQkJUHJvamVjdFV0aWxpdGllcy5hZGRSZWZlcmVuY2VQcm9qZWN0cyhzb3VyY2VDb21wLmdldFByb2plY3QoKSwgdGFyZ2V0cHJvamVjdExpc3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlZmVyZW5jZWRDb21wb25lbnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCUxpc3Qgdmxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbW9kTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJTWFwIG1vZERlcGxveVBhdGhNYXAgPSAoTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEhfTUFQKTsKLQkJU3RyaW5nIGRlcGxveVBhdGhTdHIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgpOwotCQlJUGF0aCBkZXBsb3lQYXRoID0gbnVsbDsKLQkJSVBhdGggYXJjaGl2ZURlcGxveVBhdGggPSBudWxsOwotCQlpZiAoZGVwbG95UGF0aFN0ciAhPSBudWxsICYmIGRlcGxveVBhdGhTdHIubGVuZ3RoKCkgPiAwKXsKLQkJCWRlcGxveVBhdGggPSBuZXcgUGF0aChkZXBsb3lQYXRoU3RyKTsKLQkJfQotCQllbHNlIGlmIChkZXBsb3lQYXRoU3RyLmxlbmd0aCgpID09IDApIGRlcGxveVBhdGggPSBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RMaXN0LmdldChpKTsKLQkJCWlmICghc3JjQ29tcG9uZW50Q29udGFpbnNSZWZlcmVuY2Uoc291cmNlQ29tcCwgY29tcCwgZGVwbG95UGF0aCkpIHsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZShzb3VyY2VDb21wLCBjb21wKTsKLQkJCQlkZXBsb3lQYXRoU3RyID0gKFN0cmluZyltb2REZXBsb3lQYXRoTWFwLmdldChjb21wKTsKLQkJCQlpZiAoZGVwbG95UGF0aFN0ciAhPSBudWxsKQotCQkJCXsKLQkJCQkJYXJjaGl2ZURlcGxveVBhdGggPSBuZXcgUGF0aChkZXBsb3lQYXRoU3RyKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJYXJjaGl2ZURlcGxveVBhdGggPSBkZXBsb3lQYXRoOwotCQkJCX0KLQkJCQlpZihhcmNoaXZlRGVwbG95UGF0aCAhPSBudWxsKXsKLQkJCQkJcmVmLnNldFJ1bnRpbWVQYXRoKGFyY2hpdmVEZXBsb3lQYXRoKTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSBnZXRBcmNoaXZlTmFtZShjb21wKTsKLQkJCQlpZiAoYXJjaGl2ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlZi5zZXRBcmNoaXZlTmFtZShhcmNoaXZlTmFtZSk7Ci0JCQkJfQotCQkJCXZsaXN0LmFkZChyZWYpOwotCQkJfQotCQl9Ci0KLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHZsaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3ZsaXN0LnNpemUoKV0pOwotCQlzb3VyY2VDb21wLmFkZFJlZmVyZW5jZXMocmVmcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCU1hcCBtYXAgPSAoTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCk7Ci0JCVN0cmluZyB1cmkgPSAoU3RyaW5nKSBtYXAuZ2V0KGNvbXApOwotCQlyZXR1cm4gdXJpID09IG51bGwgPyAiIiA6IHVyaTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIHNyY0NvbXBvbmVudENvbnRhaW5zUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXAsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIElQYXRoIGRlcGxveVBhdGgpIHsKLQkJaWYgKChzb3VyY2VDb21wICE9IG51bGwgJiYgc291cmNlQ29tcC5nZXRQcm9qZWN0KCkgIT0gbnVsbCkgJiYgKGNvbXAgIT0gbnVsbCAmJiBjb21wLmdldFByb2plY3QoKSAhPSBudWxsKSkgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBleGlzdGluZ1JlZmVyZW5jZXMgPSBzb3VyY2VDb21wLmdldFJlZmVyZW5jZXMoKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBudWxsOwotCQkJaWYgKGV4aXN0aW5nUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ1JlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gZXhpc3RpbmdSZWZlcmVuY2VzW2ldOwotCQkJCQlpZihyZWYgIT0gbnVsbCl7Ci0JCQkJCQkvL2Fsc28gY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXBsb3kgcGF0aCBpcyB0aGUgc2FtZSAocmVtZW1iZXIgdGhhdCBpdCBjYW4gYmUgbnVsbCkKLQkJCQkJCWlmKChyZWYuZ2V0UnVudGltZVBhdGgoKSA9PSBudWxsICYmIGRlcGxveVBhdGggIT0gbnVsbCkgfHwgcmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKGRlcGxveVBhdGgpKXsKLQkJCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsJCi0JCQkJCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQgIT0gbnVsbCAmJiByZWZlcmVuY2VkQ29tcG9uZW50LmVxdWFscyhjb21wKSApeyAKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXREYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXREYXRhTW9kZWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkNGRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0ZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBGYWNldERhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBGYWNldERhdGFNb2RlbE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldFByb2o7Ci0JCXRyeSB7Ci0JCQlmYWNldFByb2ogPSBjcmVhdGVQcm9qZWN0KG1vbml0b3IpOwotCQkJU2V0IGFjdGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQkJYWN0aW9ucy5hZGQobmV3IElGYWNldGVkUHJvamVjdC5BY3Rpb24oKFR5cGUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVFlQRSksIChJUHJvamVjdEZhY2V0VmVyc2lvbikgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OKSwgbW9kZWwpKTsKLQkJCWZhY2V0UHJvai5tb2RpZnkoYWN0aW9ucywgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZVByb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKFN0cmluZykgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpKTsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0UHJvaiA9IG51bGw7Ci0KLQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0LCB0cnVlLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCQlpZiAobW9kZWwuaXNQcm9wZXJ0eShJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX0xPQ0FUSU9OKSkKLQkJCXsKLQkJCQlsb2NhdGlvbiA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04pOwotCQkJfQotCQkJSVBhdGggbG9jYXRpb25QYXRoID0gbnVsbCA9PSBsb2NhdGlvbiA/IG51bGwgOiBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlmYWNldFByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpLCBsb2NhdGlvblBhdGgsIG1vbml0b3IpOwotCQl9Ci0JCWlmIChtb2RlbC5pc1Byb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpCi0JCXsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCQlJUnVudGltZSBleGlzdGluZ1J1bnRpbWUgPSBmYWNldFByb2ouZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLQkJCWlmIChydW50aW1lICE9IG51bGwgJiYgKGV4aXN0aW5nUnVudGltZSA9PSBudWxsIHx8ICFydW50aW1lLmVxdWFscyhleGlzdGluZ1J1bnRpbWUpKSkgewotCQkJCWZhY2V0UHJvai5zZXRUYXJnZXRlZFJ1bnRpbWVzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihydW50aW1lKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY2V0UHJvajsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0ZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0ZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NWFkMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9GYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW50aW1lQWRkZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBGYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qID0gY3JlYXRlUHJvamVjdChtb25pdG9yKTsKLQkJCVNldCBleGlzdGluZ0ZhY2V0cyA9IGZhY2V0UHJvai5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0KLQkJCU1hcCBkbU1hcCA9IChNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCVNldCBhY3Rpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCUlEYXRhTW9kZWwgZmFjZXRETSA9IG51bGw7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZG1NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWZhY2V0RE0gPSAoSURhdGFNb2RlbCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChmYWNldERNLmdldEJvb2xlYW5Qcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlNIT1VMRF9FWEVDVVRFKSkgewotCQkJCQlTdHJpbmcgZmFjZXRJRCA9IGZhY2V0RE0uZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCk7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkSW5zdGFsbEZhY2V0ID0gdHJ1ZTsKLQkJCQkJZm9yIChJdGVyYXRvciBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yID0gZXhpc3RpbmdGYWNldHMuaXRlcmF0b3IoKTsgc2hvdWxkSW5zdGFsbEZhY2V0ICYmIGV4aXN0aW5nRmFjZXRzSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgZXhpc3RpbmdGYWNldHNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAodmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscyhmYWNldElEKSkgewotCQkJCQkJCXNob3VsZEluc3RhbGxGYWNldCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzaG91bGRJbnN0YWxsRmFjZXQpIHsKLQkJCQkJCWFjdGlvbnMuYWRkKGZhY2V0RE0uZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9BQ1RJT04pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCU1hcCBhY3Rpb25zTWFwID0gKE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9BQ1RJT05fTUFQKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3Rpb25zTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlhY3Rpb25zLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJfQotCQkJaWYgKCFhY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJCWZhY2V0UHJvai5tb2RpZnkoYWN0aW9ucywgbW9uaXRvcik7Ci0JCQl9Ci0JCQlTZXQgZml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldCgpLCBuZXdGYWNldFZlcnNpb25zID0gZmFjZXRQcm9qLmdldFByb2plY3RGYWNldHMoKSwgZXhpc3RpbmdGaXhlZEZhY2V0cyA9IGZhY2V0UHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0ZhY2V0VmVyc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgZmFjZXRJRCA9IGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpOwotCQkJCWJvb2xlYW4gc2hvdWxkSW5zdGFsbEZhY2V0ID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGV4aXN0aW5nRmFjZXRzSXRlcmF0b3IgPSBleGlzdGluZ0ZpeGVkRmFjZXRzLml0ZXJhdG9yKCk7IHNob3VsZEluc3RhbGxGYWNldCAmJiBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2plY3RGYWNldCBmYWNldCA9IChJUHJvamVjdEZhY2V0KSBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGZhY2V0LmdldElkKCkuZXF1YWxzKGZhY2V0SUQpKSB7Ci0JCQkJCQlzaG91bGRJbnN0YWxsRmFjZXQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoc2hvdWxkSW5zdGFsbEZhY2V0KSB7Ci0JCQkJCWZpeGVkRmFjZXRzLmFkZChmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZml4ZWRGYWNldHMuaXNFbXB0eSgpKSB7Ci0JCQkJZmFjZXRQcm9qLnNldEZpeGVkUHJvamVjdEZhY2V0cyhmaXhlZEZhY2V0cyk7Ci0JCQl9Ci0JCQlpZiAocnVudGltZUFkZGVkKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKLQkJCQlhZGREZWZhdWx0RmFjdGV0cyhmYWNldFByb2osIHJ1bnRpbWUpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRGVmYXVsdEZhY2V0cyhJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qLCBTZXQgZGVmYXVsdEZhY2V0cykgewotCQlTZXQgYWN0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlZmF1bHRGYWNldHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFmYWNldFByb2ouaGFzUHJvamVjdEZhY2V0KGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKSkpIHsKLQkJCQlhY3Rpb25zLmFkZChuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbihBY3Rpb24uVHlwZS5JTlNUQUxMLCBmYWNldFZlcnNpb24sIG51bGwpKTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlpZiAoIWFjdGlvbnMuaXNFbXB0eSgpKQotCQkJCWZhY2V0UHJvai5tb2RpZnkoYWN0aW9ucywgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJRmFjZXRlZFByb2plY3QgY3JlYXRlUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoU3RyaW5nKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSkpOwotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qID0gbnVsbDsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0LCB0cnVlLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04pOwotCQkJSVBhdGggbG9jYXRpb25QYXRoID0gbnVsbCA9PSBsb2NhdGlvbiA/IG51bGwgOiBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlmYWNldFByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpLCBsb2NhdGlvblBhdGgsIG1vbml0b3IpOwotCQl9Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCUlSdW50aW1lIGV4aXN0aW5nUnVudGltZSA9IGZhY2V0UHJvai5nZXRQcmltYXJ5UnVudGltZSgpOwotCQlpZiAocnVudGltZSAhPSBudWxsICYmIChleGlzdGluZ1J1bnRpbWUgPT0gbnVsbCB8fCAhcnVudGltZS5lcXVhbHMoZXhpc3RpbmdSdW50aW1lKSkpIHsKLQkJCWZhY2V0UHJvai5zZXRUYXJnZXRlZFJ1bnRpbWVzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihydW50aW1lKSwgbnVsbCk7Ci0JCQlydW50aW1lQWRkZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWNldFByb2o7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGREZWZhdWx0RmFjdGV0cyhJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qLCBJUnVudGltZSBydW50aW1lKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCi0JCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBudWxsOwotCQkJCXRyeXsKLQkJCQkJZnBqd2MgPSBmYWNldFByb2ouY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkJU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBwcmVzZXRGYWNldHMgPSBmcGp3Yy5nZXREZWZhdWx0Q29uZmlndXJhdGlvbigpLmdldFByb2plY3RGYWNldHMoKTsKLQkJCQkJYWRkRGVmYXVsdEZhY2V0cyhmYWNldFByb2osIHByZXNldEZhY2V0cyk7Ci0JCQkJfSBmaW5hbGx5ewotCQkJCQlpZihmcGp3YyAhPSBudWxsKXsKLQkJCQkJCWZwandjLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0lBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0lBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzM5MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAiSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVFlQRV9JRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfTkFNRSA9ICJJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPcHRpb25hbCwgc2hvdWxkIHNhdmUgd2l0aCBwcm9tcHQuLi5kZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST01QVF9PTl9TQVZFID0gIklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST01QVF9PTl9TQVZFIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9QUk9KRUNUID0gIklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DT01QT05FTlQgPSAiSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVCI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1Byb2plY3RNaWdyYXRvckRhdGFNb2RlbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg3NDA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSUNvbXBvbmVudFByb2plY3RNaWdyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIFdUUCAzLjEuMiBhbmQgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4KLSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyOTM0Ci0gKiBAZGVwcmVjYXRlZCAKLSAqIEBhdXRob3IganNob2xsCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2ogPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCQlJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yW10gbWlncmF0b3JzID0gUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0TWlncmF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1pZ3JhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlDb21wb25lbnRQcm9qZWN0TWlncmF0b3IgbWlncmF0b3IgPSBtaWdyYXRvcnNbaV07Ci0JCQkJbWlncmF0b3IubWlncmF0ZVByb2plY3QocHJvaik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlZDU0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHVibGljIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZW1vdmVSZWZlcmVuY2VkQ29tcG9uZW50cyhtb25pdG9yKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuY2VkQ29tcG9uZW50cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKTsKLQkJaWYgKHNvdXJjZUNvbXAgPT0gbnVsbCB8fCAhc291cmNlQ29tcC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkgfHwgc291cmNlQ29tcC5pc0JpbmFyeSgpKSByZXR1cm47Ci0JCQotCQlJVmlydHVhbFJlZmVyZW5jZSBbXSBleGlzdGluZ1JlZmVyZW5jZXNBcnJheSA9IHNvdXJjZUNvbXAuZ2V0UmVmZXJlbmNlcygpOwotCQlpZihleGlzdGluZ1JlZmVyZW5jZXNBcnJheSA9PSBudWxsIHx8IGV4aXN0aW5nUmVmZXJlbmNlc0FycmF5Lmxlbmd0aCA9PSAwKXsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBleGlzdGluZ1JlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaT0wO2k8ZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXkubGVuZ3RoOyBpKyspewotCQkJZXhpc3RpbmdSZWZlcmVuY2VzLmFkZChleGlzdGluZ1JlZmVyZW5jZXNBcnJheVtpXSk7Ci0JCX0KLQkJCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQkvL2lmIHRoZSBkZXBsb3lQYXRoIGlzIG5vdCBleHBsaWNpdGx5IHNldCwgdGhlbiBsZWF2ZSBpdCBhcyBudWxsIHNvIHRoZSBmaXJzdCByZWZlcmVuY2UgaXMgcmVtb3ZlZC4KLQkJaWYobW9kZWwuaXNQcm9wZXJ0eVNldCggSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIICkpewotCQkJU3RyaW5nIGRlcGxveVBhdGggPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eSggSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIICk7Ci0JCQlwYXRoID0gbmV3IFBhdGgoIGRlcGxveVBhdGggKTsKLQkJfQotCQkKLQkJTGlzdCBtb2RMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotICAgIAotCQkKLQkJTGlzdCB0YXJnZXRwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZExpc3Quc2l6ZSgpICYmICFleGlzdGluZ1JlZmVyZW5jZXMuaXNFbXB0eSgpOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZExpc3QuZ2V0KGkpOwotCQkJaWYgKGNvbXA9PW51bGwgKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBmaW5kTWF0Y2hpbmdSZWZlcmVuY2UoZXhpc3RpbmdSZWZlcmVuY2VzLCBjb21wLCBwYXRoKTsKLQkJCS8vaWYgYSByZWYgd2FzIGZvdW5kIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgZGVwbG95UGF0aCwgdGhlbiByZW1vdmUgaXQKLQkJCWlmKHJlZiAhPSBudWxsKXsKLQkJCQlyZW1vdmVSZWZlcmVuZWNlSW5Db21wb25lbnQoc291cmNlQ29tcCwgcmVmKTsKLQkJCQlleGlzdGluZ1JlZmVyZW5jZXMucmVtb3ZlKHJlZik7Ci0JCQkJLy9hZnRlciByZW1vdmluZyB0aGUgcmVmLCBjaGVjayB0byBzZWUgaWYgaXQgd2FzIHRoZSBsYXN0IHJlZiByZW1vdmVkIHRvIHRoYXQgY29tcG9uZW50Ci0JCQkJLy9hbmQgaWYgaXQgd2FzLCB0aGVuIGFsc28gcmVtb3ZlIHRoZSBwcm9qZWN0IHJlZmVyZW5jZQotCQkJCXJlZiA9IGZpbmRNYXRjaGluZ1JlZmVyZW5jZShleGlzdGluZ1JlZmVyZW5jZXMsIGNvbXApOwotCQkJCWlmKHJlZiA9PSBudWxsKXsKLQkJCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IGNvbXAuZ2V0UHJvamVjdCgpOwotCQkJCQl0YXJnZXRwcm9qZWN0TGlzdC5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJUHJvamVjdFV0aWxpdGllcy5yZW1vdmVSZWZlcmVuY2VQcm9qZWN0cyhzb3VyY2VDb21wLmdldFByb2plY3QoKSx0YXJnZXRwcm9qZWN0TGlzdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfQkJCi0JCQotCX0KLQotCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2UgZmluZE1hdGNoaW5nUmVmZXJlbmNlKExpc3QgZXhpc3RpbmdSZWZlcmVuY2VzLCBJVmlydHVhbENvbXBvbmVudCBjb21wLCBJUGF0aCBwYXRoKSB7Ci0JCWZvcihpbnQgaT0wO2k8ZXhpc3RpbmdSZWZlcmVuY2VzLnNpemUoKTsgaSsrKXsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSlleGlzdGluZ1JlZmVyZW5jZXMuZ2V0KGkpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZihjICE9IG51bGwgJiYgYy5nZXROYW1lKCkuZXF1YWxzKGNvbXAuZ2V0TmFtZSgpKSl7Ci0JCQkJaWYocGF0aCA9PSBudWxsKXsKLQkJCQkJcmV0dXJuIHJlZjsKLQkJCQl9IGVsc2UgaWYocGF0aC5lcXVhbHMocmVmLmdldFJ1bnRpbWVQYXRoKCkpKXsKLQkJCQkJcmV0dXJuIHJlZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZSBmaW5kTWF0Y2hpbmdSZWZlcmVuY2UoTGlzdCBleGlzdGluZ1JlZmVyZW5jZXMsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJcmV0dXJuIGZpbmRNYXRjaGluZ1JlZmVyZW5jZShleGlzdGluZ1JlZmVyZW5jZXMsIGNvbXAsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZmVyZW5lY2VJbkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQkoKFZpcnR1YWxDb21wb25lbnQpY29tcG9uZW50LmdldENvbXBvbmVudCgpKS5yZW1vdmVSZWZlcmVuY2UocmVmZXJlbmNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhkYmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9SZW1vdmVSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9SZW1vdmVSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODA4NmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gIGJlIGFuIGFsdGVybmF0aXZlIHRvIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcgotICogaW4gb3JkZXIgdG8gcmVtb3ZlIHByZS1tYWRlIG9yIHByZS1jcmFmdGVkIElWaXJ0dWFsUmVmZXJlbmNlcywgcmF0aGVyIHRoYW4gCi0gKiBzZWFyY2hpbmcgZm9yIHRoZWlyIGluZGl2aWR1YWwgcHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgUmVtb3ZlUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdmVSZWZlcmVuY2VPcGVyYXRpb24obW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9SZW1vdmVSZWZlcmVuY2VPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUmVtb3ZlUmVmZXJlbmNlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMDg1YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9SZW1vdmVSZWZlcmVuY2VPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIGFuIGFsdGVybmF0aXZlIHRvIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbgotICogaW4gb3JkZXIgdG8gcmVtb3ZlIHByZS1tYWRlIG9yIHByZS1jcmFmdGVkIElWaXJ0dWFsUmVmZXJlbmNlcywgcmF0aGVyIHRoYW4gCi0gKiBzZWFyY2hpbmcgZm9yIHRoZWlyIGluZGl2aWR1YWwgcHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVmZXJlbmNlT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHVibGljIFJlbW92ZVJlZmVyZW5jZU9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVtb3ZlUmVmZXJlbmNlT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZW1vdmVSZWZlcmVuY2VzKG1vbml0b3IpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBnZXRMaXN0RnJvbU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJT2JqZWN0IHZhbHVlID0gbW9kZWwuZ2V0UHJvcGVydHkoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX1JFRkVSRU5DRV9MSVNUKTsKLQkJTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gbW9kTGlzdCA9IHZhbHVlIGluc3RhbmNlb2YgTGlzdCA/ICAoTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4pdmFsdWUgOiBBcnJheXMuYXNMaXN0KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtdeyhJVmlydHVhbFJlZmVyZW5jZSl2YWx1ZX0pOwotCQlyZXR1cm4gbW9kTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCWlmIChzb3VyY2VDb21wID09IG51bGwgfHwgIXNvdXJjZUNvbXAuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpIHx8IHNvdXJjZUNvbXAuaXNCaW5hcnkoKSkgcmV0dXJuOwotCQkKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW9wdGlvbnMucHV0KElWaXJ0dWFsQ29tcG9uZW50LlJFUVVFU1RFRF9SRUZFUkVOQ0VfVFlQRSwgSVZpcnR1YWxDb21wb25lbnQuRElTUExBWUFCTEVfUkVGRVJFTkNFU19BTEwpOwotCQlJVmlydHVhbFJlZmVyZW5jZSBbXSBleGlzdGluZ1JlZmVyZW5jZXNBcnJheSA9IHNvdXJjZUNvbXAuZ2V0UmVmZXJlbmNlcyhvcHRpb25zKTsKLQkJaWYoZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXkgPT0gbnVsbCB8fCBleGlzdGluZ1JlZmVyZW5jZXNBcnJheS5sZW5ndGggPT0gMCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGV4aXN0aW5nUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCWV4aXN0aW5nUmVmZXJlbmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChleGlzdGluZ1JlZmVyZW5jZXNBcnJheSkpOwotCQlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBtb2RMaXN0ID0gZ2V0TGlzdEZyb21Nb2RlbChtb2RlbCk7Ci0JCUxpc3QgdGFyZ2V0cHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kTGlzdC5zaXplKCkgJiYgIWV4aXN0aW5nUmVmZXJlbmNlcy5pc0VtcHR5KCk7IGkrKykgewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gbW9kTGlzdC5nZXQoaSk7Ci0JCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKT09bnVsbCApCi0JCQkJY29udGludWU7Ci0KLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIGV4aXN0aW5nID0gZmluZE1hdGNoaW5nUmVmZXJlbmNlKGV4aXN0aW5nUmVmZXJlbmNlcywgCi0JCQkJCXJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIHJlZi5nZXRSdW50aW1lUGF0aCgpKTsKLQkJCS8vaWYgYSByZWYgd2FzIGZvdW5kIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgZGVwbG95UGF0aCwgdGhlbiByZW1vdmUgaXQKLQkJCWlmKGV4aXN0aW5nICE9IG51bGwpewotCQkJCXJlbW92ZVJlZmVyZW5lY2VJbkNvbXBvbmVudChzb3VyY2VDb21wLCBleGlzdGluZyk7Ci0JCQkJZXhpc3RpbmdSZWZlcmVuY2VzLnJlbW92ZShleGlzdGluZyk7Ci0JCQkJLy9hZnRlciByZW1vdmluZyB0aGUgcmVmLCBjaGVjayB0byBzZWUgaWYgaXQgd2FzIHRoZSBsYXN0IHJlZiByZW1vdmVkIHRvIHRoYXQgY29tcG9uZW50Ci0JCQkJLy9hbmQgaWYgaXQgd2FzLCB0aGVuIGFsc28gcmVtb3ZlIHRoZSBwcm9qZWN0IHJlZmVyZW5jZQotCQkJCWV4aXN0aW5nID0gZmluZE1hdGNoaW5nUmVmZXJlbmNlKGV4aXN0aW5nUmVmZXJlbmNlcywgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7Ci0JCQkJaWYoZXhpc3RpbmcgPT0gbnVsbCl7Ci0JCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKTsKLQkJCQkJdGFyZ2V0cHJvamVjdExpc3QuYWRkKHRhcmdldFByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVByb2plY3RVdGlsaXRpZXMucmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoc291cmNlQ29tcC5nZXRQcm9qZWN0KCksdGFyZ2V0cHJvamVjdExpc3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCX0JCQotCQkKLQl9Ci0KLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlIGZpbmRNYXRjaGluZ1JlZmVyZW5jZShMaXN0IGV4aXN0aW5nUmVmZXJlbmNlcywgSVZpcnR1YWxDb21wb25lbnQgY29tcCwgSVBhdGggcGF0aCkgewotCQlmb3IoaW50IGk9MDtpPGV4aXN0aW5nUmVmZXJlbmNlcy5zaXplKCk7IGkrKyl7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpZXhpc3RpbmdSZWZlcmVuY2VzLmdldChpKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYoYyAhPSBudWxsICYmIGMuZ2V0TmFtZSgpLmVxdWFscyhjb21wLmdldE5hbWUoKSkpewotCQkJCWlmKHBhdGggPT0gbnVsbCl7Ci0JCQkJCXJldHVybiByZWY7Ci0JCQkJfSBlbHNlIGlmKHBhdGguZXF1YWxzKHJlZi5nZXRSdW50aW1lUGF0aCgpKSl7Ci0JCQkJCXJldHVybiByZWY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2UgZmluZE1hdGNoaW5nUmVmZXJlbmNlKExpc3QgZXhpc3RpbmdSZWZlcmVuY2VzLCBJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCXJldHVybiBmaW5kTWF0Y2hpbmdSZWZlcmVuY2UoZXhpc3RpbmdSZWZlcmVuY2VzLCBjb21wLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuZWNlSW5Db21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJKChWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudC5nZXRDb21wb25lbnQoKSkucmVtb3ZlUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1NlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWRlZDQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm92aWRlciAKLSBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIKLSBpbXBsZW1lbnRzIElTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXN7Ci0KLQlwdWJsaWMgU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm92aWRlcigpewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoUFJPSkVDVCk7Ci0JCW5hbWVzLmFkZChDT05URVhUX1JPT1QpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgU2VydmVyQ29udGV4dFJvb3RVcGRhdGVPcGVyYXRpb24obW9kZWwpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vU2VydmVyQ29udGV4dFJvb3RVcGRhdGVPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vU2VydmVyQ29udGV4dFJvb3RVcGRhdGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyYjczMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1NlcnZlckNvbnRleHRSb290VXBkYXRlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyQ29udGV4dFJvb3RVcGRhdGVPcGVyYXRpb24gCi0gZXh0ZW5kcyAgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi0gaW1wbGVtZW50cyBJU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm9wZXJ0aWVzewotCQotCi0JcHVibGljIFNlcnZlckNvbnRleHRSb290VXBkYXRlT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KW1vZGVsLmdldFByb3BlcnR5KCBJU2VydmVyQ29udGV4dFJvb3REYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QgKTsKLQkJU3RyaW5nIGNvbnRleHRSb290ID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIElTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09UICk7Ci0JCWlmIChjb250ZXh0Um9vdCAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQljb21wLnNldE1ldGFQcm9wZXJ0eShJTW9kdWxlQ29uc3RhbnRzLkNPTlRFWFRST09ULCBjb250ZXh0Um9vdCk7CQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL0Fic3RyYWN0UmVzb3VyY2VMaXN0VmlydHVhbENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9BYnN0cmFjdFJlc291cmNlTGlzdFZpcnR1YWxDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4MTg3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL0Fic3RyYWN0UmVzb3VyY2VMaXN0VmlydHVhbENvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQsIEluYy4gCi0gKiBEaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlIGJ5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCi0gKiBUaGlzIHByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSAKLSAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VMaXN0VmlydHVhbENvbXBvbmVudCBpbXBsZW1lbnRzIElWaXJ0dWFsQ29tcG9uZW50IHsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNpbmdDb21wOwkKLQotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlTGlzdFZpcnR1YWxDb21wb25lbnQoSVByb2plY3QgcCwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNpbmdDb21wb25lbnQpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcDsKLQkJdGhpcy5yZWZlcmVuY2luZ0NvbXAgPSByZWZlcmVuY2luZ0NvbXBvbmVudDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKHRoaXMgPT0gbyl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZihvID09IG51bGwpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmKCF0aGlzLmdldENsYXNzKCkuZXF1YWxzKG8uZ2V0Q2xhc3MoKSkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUFic3RyYWN0UmVzb3VyY2VMaXN0VmlydHVhbENvbXBvbmVudCBvdGhlciA9IChBYnN0cmFjdFJlc291cmNlTGlzdFZpcnR1YWxDb21wb25lbnQpbzsKLQkJcmV0dXJuIChwcm9qZWN0ID09IG51bGwgPyBvdGhlci5wcm9qZWN0ID09IG51bGwgOiBwcm9qZWN0LmVxdWFscyhvdGhlci5wcm9qZWN0KSkgJiYgCi0JCQkgICAocmVmZXJlbmNpbmdDb21wID09IG51bGwgPyBvdGhlci5yZWZlcmVuY2luZ0NvbXAgPT0gbnVsbCA6IHJlZmVyZW5jaW5nQ29tcC5lcXVhbHMob3RoZXIucmVmZXJlbmNpbmdDb21wKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpICsgKHByb2plY3QgPT0gbnVsbCA/IDAgOiBwcm9qZWN0Lmhhc2hDb2RlKCkpICsgKHJlZmVyZW5jaW5nQ29tcCA9PSBudWxsID8gMCA6IHJlZmVyZW5jaW5nQ29tcC5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBJZ25vcmUKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldElkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3llZE5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJU3RyaW5nIGZpcnN0U2VnbWVudCA9IGdldEZpcnN0SWRTZWdtZW50KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5lcXVhbHMoCi0JCQkJcmVmZXJlbmNpbmdDb21wLmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gZmlyc3RTZWdtZW50OyAKLQkJcmV0dXJuIGZpcnN0U2VnbWVudCArIFBhdGguU0VQQVJBVE9SICsgcHJvamVjdC5nZXROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRGaXJzdElkU2VnbWVudCgpOwotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKSB7Ci0JCXJldHVybiByZWZlcmVuY2luZ0NvbXAgPT0gbnVsbCA/IG5ldyBJVmlydHVhbENvbXBvbmVudFtdIHt9Ci0JCQkJOiBuZXcgSVZpcnR1YWxDb21wb25lbnRbXSB7IHJlZmVyZW5jaW5nQ29tcCB9OwotCX0KLQotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRSb290Rm9sZGVyKCkgewotCQkvLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGVhY2ggdGltZSB0byBlbnN1cmUgaXQncyBub3QgY2FjaGVkCi0JCUlDb250YWluZXJbXSBjb250YWluZXJzID0gZ2V0VW5kZXJseWluZ0NvbnRhaW5lcnMoKTsKLQkJSVJlc291cmNlW10gbG9vc2VSZXNvdXJjZXMgPSBnZXRMb29zZVJlc291cmNlcygpOwotCQlSZXNvdXJjZUxpc3RWaXJ0dWFsRm9sZGVyIGZvbGRlciA9IAotCQkJbmV3IFJlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIocHJvamVjdCwgbmV3IFBhdGgoIi8iKSwgY29udGFpbmVycywgbG9vc2VSZXNvdXJjZXMpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElDb250YWluZXJbXSBnZXRVbmRlcmx5aW5nQ29udGFpbmVycygpOwotCXByb3RlY3RlZCBhYnN0cmFjdCBJUmVzb3VyY2VbXSBnZXRMb29zZVJlc291cmNlcygpOwotCQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBnZXRNZXRhUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKFN0cmluZyBhQ29tcG9uZW50TmFtZSkgewotCQkvLyBJZ25vcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKLQkJLy8gSWdub3JlOyBubyBjaGlsZHJlbgotCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW10ge307Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMpIHsKLQkJLy8gSWdub3JlLCBubyBjaGlsZHJlbgotCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW117fTsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQkvLyBJZ25vcmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQkvLyBJZ25vcmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUmVzb3VyY2VzKElQYXRoW10gdGhlTWV0YVJlc291cmNlUGF0aHMpIHsKLQkJLy8gSWdub3JlCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlcyhJVmlydHVhbFJlZmVyZW5jZVtdIHRoZVJlZmVyZW5jZXMpIHsKLQkJLy8gSWdub3JlCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJLy8gSWdub3JlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0JCS8vIElnbm9yZQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvTm9uUmVzb2x2YWJsZVZpcnR1YWxDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvTm9uUmVzb2x2YWJsZVZpcnR1YWxDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhZTc1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL05vblJlc29sdmFibGVWaXJ0dWFsQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzdHViIGZvciB2aXJ0dWFsIGNvbXBvbmVudHMgd2hvc2UgdW5kZXJseWluZyBwcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlIChlLmcgdGhlIHByb2plY3QgCi0gKiBpcyBjbG9zZWQsIG9yIHdhcyBkZWxldGVkKS4gVGhpcyBjbGFzcyBjYW4gYmUgcmV0dXJuZWQgYnkgdmlydHVhbCBjb21wb25lbnQgbWV0aG9kcyB0byBnZXQgcmVmZXJlbmNlcyAKLSAqIGlmIHRoZSB1bmRlcmx5aW5nIHByb2plY3Qgb2YgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IGlzIG5vdCBhY2Nlc3NpYmxlLiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgTm9uUmVzb2x2YWJsZVZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlTGlzdFZpcnR1YWxDb21wb25lbnQgewotCi0JcHVibGljIE5vblJlc29sdmFibGVWaXJ0dWFsQ29tcG9uZW50KElQcm9qZWN0IHAsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jaW5nQ29tcG9uZW50KSB7Ci0JCXN1cGVyKHAsIHJlZmVyZW5jaW5nQ29tcG9uZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb250YWluZXJbXSBnZXRVbmRlcmx5aW5nQ29udGFpbmVycygpIHsKLQkJcmV0dXJuIG5ldyBJQ29udGFpbmVyW117fTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVJlc291cmNlW10gZ2V0TG9vc2VSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBuZXcgSVJlc291cmNlW117fTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgeyAKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJcmV0dXJuIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpICYmIE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RJZFNlZ21lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKXsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9SZXNvdXJjZUxpc3RWaXJ0dWFsRm9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1Jlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkODlmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1Jlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0LCBJbmMuIAotICogRGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZSBieSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAotICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgCi0gKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIAotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUxpc3RWaXJ0dWFsRm9sZGVyIGV4dGVuZHMgVmlydHVhbEZvbGRlciB7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRmlsdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0cyhJUmVzb3VyY2UgcmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIEFycmF5TGlzdDxJUmVzb3VyY2U+IGNoaWxkcmVuOwotCXByaXZhdGUgQXJyYXlMaXN0PElDb250YWluZXI+IHVuZGVybHlpbmc7Ci0JcHJpdmF0ZSBSZXNvdXJjZUZpbHRlciBmaWx0ZXI7Ci0JcHVibGljIFJlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIoCi0JCQlJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwKLQkJCUlQYXRoIGFSdW50aW1lUGF0aCkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotCQl0aGlzLnVuZGVybHlpbmcgPSBuZXcgQXJyYXlMaXN0PElDb250YWluZXI+KCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIoCi0JCQlJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwKLQkJCUlQYXRoIGFSdW50aW1lUGF0aCwgSUNvbnRhaW5lcltdIHVuZGVybHlpbmdDb250YWluZXJzKSB7Ci0JCXRoaXMoYUNvbXBvbmVudFByb2plY3QsIGFSdW50aW1lUGF0aCk7Ci0JCWFkZFVuZGVybHlpbmdSZXNvdXJjZSh1bmRlcmx5aW5nQ29udGFpbmVycyk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIoCi0JCQlJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwKLQkJCUlQYXRoIGFSdW50aW1lUGF0aCwgSUNvbnRhaW5lcltdIHVuZGVybHlpbmdDb250YWluZXJzLCAKLQkJCUlSZXNvdXJjZVtdIGxvb3NlUmVzb3VyY2VzKSB7Ci0JCXRoaXMoYUNvbXBvbmVudFByb2plY3QsIGFSdW50aW1lUGF0aCwgdW5kZXJseWluZ0NvbnRhaW5lcnMpOwotCQlhZGRDaGlsZHJlbihsb29zZVJlc291cmNlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKFJlc291cmNlRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVW5kZXJseWluZ1Jlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiggcmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyICkgeyAKLQkJCXVuZGVybHlpbmcuYWRkKChJQ29udGFpbmVyKXJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlW10gbmV3Q2hpbGRyZW4gPSAoKElDb250YWluZXIpcmVzb3VyY2UpLm1lbWJlcnMoKTsKLQkJCQlmb3IoIGludCBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrICkgewotCQkJCQljaGlsZHJlbi5hZGQobmV3Q2hpbGRyZW5baV0pOwotCQkJCX0KLQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkvLyBUT0RPIGxvZwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVW5kZXJseWluZ1Jlc291cmNlKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotCQlmb3IoIGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKyApIHsKLQkJCWFkZFVuZGVybHlpbmdSZXNvdXJjZShyZXNvdXJjZXNbaV0pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLmNoaWxkcmVuLmFkZChyZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0JCXRoaXMuY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzb3VyY2VzKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlW10gZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpIHsKLQkJcmV0dXJuIGdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElDb250YWluZXIgZ2V0VW5kZXJseWluZ0ZvbGRlcigpIHsgCi0JCXJldHVybiB1bmRlcmx5aW5nLnNpemUoKSA+IDAgPyB1bmRlcmx5aW5nLmdldCgwKSA6IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKSB7Ci0JCXJldHVybiB1bmRlcmx5aW5nLnRvQXJyYXkobmV3IElDb250YWluZXJbdW5kZXJseWluZy5zaXplKCldKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoaW50IG1lbWJlckZsYWdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBJVmlydHVhbFJlc291cmNlPiB2aXJ0dWFsUmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVmlydHVhbFJlc291cmNlPigpOyAvLyByZXN1bHQKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gdGhpcy5jaGlsZHJlbi50b0FycmF5KG5ldyBJUmVzb3VyY2VbdGhpcy5jaGlsZHJlbi5zaXplKCldKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKysgKSB7Ci0JCQloYW5kbGVSZXNvdXJjZShyZXNvdXJjZXNbaV0sIHZpcnR1YWxSZXNvdXJjZXMsIG1lbWJlckZsYWdzKTsKLQkJfQotCQlDb2xsZWN0aW9uIGMgPSB2aXJ0dWFsUmVzb3VyY2VzLnZhbHVlcygpOwotCQlyZXR1cm4gKElWaXJ0dWFsUmVzb3VyY2VbXSkgYy50b0FycmF5KG5ldyBJVmlydHVhbFJlc291cmNlW2Muc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlLCBIYXNoTWFwPFN0cmluZywgSVZpcnR1YWxSZXNvdXJjZT4gbWFwLCBpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoIGZpbHRlciAhPSBudWxsICYmICFmaWx0ZXIuYWNjZXB0cyhyZXNvdXJjZSkpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiggcmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSApIHsKLQkJCWlmKCAhbWFwLmNvbnRhaW5zS2V5KHJlc291cmNlLmdldE5hbWUoKSkgKSB7Ci0JCQkJSVZpcnR1YWxGaWxlIHZpcnRGaWxlID0gbmV3IFZpcnR1YWxGaWxlKGdldFByb2plY3QoKSwgCi0JCQkJCQlnZXRSdW50aW1lUGF0aCgpLmFwcGVuZCgoKElGaWxlKXJlc291cmNlKS5nZXROYW1lKCkpLCAoSUZpbGUpcmVzb3VyY2UpOwotCQkJCW1hcC5wdXQocmVzb3VyY2UuZ2V0TmFtZSgpLCB2aXJ0RmlsZSk7Ci0JCQkJcmV0dXJuOwotCQkJfSAKLQkJfS8vIGVuZCBmaWxlCi0JCWVsc2UgaWYoIHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lciApIHsKLQkJCUlDb250YWluZXIgcmVhbENvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQkJCS8vSVJlc291cmNlW10gcmVhbENoaWxkUmVzb3VyY2VzID0gcmVhbENvbnRhaW5lci5tZW1iZXJzKG1lbWJlckZsYWdzKTsKLQkJCUlWaXJ0dWFsUmVzb3VyY2UgcHJldmlvdXNWYWx1ZSA9IG1hcC5nZXQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCWlmKCBwcmV2aW91c1ZhbHVlICE9IG51bGwgJiYgcHJldmlvdXNWYWx1ZSBpbnN0YW5jZW9mIFJlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIgKSB7Ci0JCQkJKChSZXNvdXJjZUxpc3RWaXJ0dWFsRm9sZGVyKXByZXZpb3VzVmFsdWUpLmFkZFVuZGVybHlpbmdSZXNvdXJjZShyZWFsQ29udGFpbmVyKTsKLQkJCX0gZWxzZSBpZiggcHJldmlvdXNWYWx1ZSA9PSBudWxsICkgewotCQkJCVJlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIgY2hpbGRGb2xkZXIgPSAKLQkJCQkJbmV3IFJlc291cmNlTGlzdFZpcnR1YWxGb2xkZXIoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChyZXNvdXJjZS5nZXROYW1lKCkpKTsKLQkJCQljaGlsZEZvbGRlci5hZGRVbmRlcmx5aW5nUmVzb3VyY2UocmVhbENvbnRhaW5lcik7Ci0JCQkJaWYoIGZpbHRlciAhPSBudWxsICkKLQkJCQkJY2hpbGRGb2xkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJbWFwLnB1dChyZXNvdXJjZS5nZXROYW1lKCksIGNoaWxkRm9sZGVyKTsKLQkJCX0KLQkJfSAvLyBlbmQgY29udGFpbmVyCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9SZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1Jlc291cmNlVGltZXN0YW1wTWFwcGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3MTBhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1Jlc291cmNlVGltZXN0YW1wTWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLS8qKgotICogTWFwcyByZXNvdXJjZXMgdG8gY2FjaGVkIGRhdGEgYW5kIHJlbWVtYmVycyB3aGVuIHRoZSBkYXRhIHdhcyBjYWNoZWQgYmFzZWQgb24gYSB0aW1lc3RhbXAKLSAqIHNpZ25hdHVyZSBvZiBhIGdpdmVuIHJlc291cmNlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIENPTVBPTkVOVF9NQU5JRkVTVF9QQVRIID0gbmV3IFBhdGgoIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIEZBQ0VUX0NPTkZJR19QQVRIID0gbmV3IFBhdGgoIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBOT19EQVRBID0gbmV3IE9iamVjdCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFUlJPUiA9IG5ldyBPYmplY3QoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwIHRpbWVzdGFtcHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgZmluYWwgTWFwIGRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCi0KLQkvKioKLQkgKiBSZWNvcmQgYSB0aW1lc3RhbXAgc2lnbmF0dXJlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogPHA+Ci0JICogQ2xpZW50cyBtYXkgdXNlIHtAbGluayAjaGFzQ2hhbmdlZChJUmVzb3VyY2UpfSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc291cmNlIGhhcyBjaGFuZ2VkIHNpbmNlCi0JICogaXQgd2FzIHJlY29yZGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IHdhcyBwcm9jZXNzZWQuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSByZWNvcmRpbmcgd2FzIHN1Y2Nlc3NmdWxsLiBUaGUgcmVjb3JkaW5nIG1heSBmYWlsIGlmIHRoZSByZXNvdXJjZSBkb2VzCi0JICogICAgICAgICBub3QgZXhpc3QuCi0JICogCi0JICogQHNlZSAjaGFzQ2hhbmdlZChJUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG1hcmsoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBtYXJrKHJlc291cmNlLCBOT19EQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgZGF0YSB0aGF0IHdhcyBkZXRlcm1pbmVkIHdoZW4gcHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UuIFRoZSBhIHRpbWVzdGFtcCBzaWduYXR1cmUKLQkgKiB3aWxsIGJlIHJlY29yZGVkIGZvciB0aGUgcmVzb3VyY2UgYXMgd2VsbC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBDbGllbnRzIG1heSB1c2Uge0BsaW5rICNoYXNDaGFuZ2VkKElSZXNvdXJjZSl9IHRvIGRldGVybWluZSBpZiB0aGUgY2FjaGVkIGRhdGEgc2hvdWxkIGJlCi0JICogcmVwbGFjZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRoYXQgd2FzIHByb2Nlc3NlZC4KLQkgKiBAcGFyYW0gY2FjaGVkRGF0YQotCSAqICAgICAgICAgICAgVGhlIGRhdGEgdGhhdCB3YXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBSZXNvdXJjZSB3YXMgcHJvY2Vzc2VkLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVjb3JkaW5nIHdhcyBzdWNjZXNzZnVsbC4gVGhlIHJlY29yZGluZyBtYXkgZmFpbCBpZiB0aGUgcmVzb3VyY2UgZG9lcwotCSAqICAgICAgICAgbm90IGV4aXN0LgotCSAqIAotCSAqIAotCSAqIEBzZWUgI2hhc0NoYW5nZWQoSVJlc291cmNlKQotCSAqIEBzZWUgI2hhc0NhY2hlRGF0YShJUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG1hcmsoSVJlc291cmNlIHJlc291cmNlLCBPYmplY3QgY2FjaGVkRGF0YSkgewotCi0JCWlmIChyZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB7Ci0JCQlpZiAodGltZXN0YW1wcy5jb250YWluc0tleShyZXNvdXJjZSkpIHsKLQkJCQlUaW1lc3RhbXBTaWduYXR1cmUgc2lnbmF0dXJlID0gKFRpbWVzdGFtcFNpZ25hdHVyZSkgdGltZXN0YW1wcy5nZXQocmVzb3VyY2UpOwotCQkJCXNpZ25hdHVyZS51cGRhdGUocmVzb3VyY2UpOwotCQkJfSBlbHNlIHsKLQkJCQl0aW1lc3RhbXBzLnB1dChyZXNvdXJjZSwgY3JlYXRlVGltZXN0YW1wU2lnbmF0dXJlKHJlc291cmNlKSk7Ci0JCQl9Ci0JCQlkYXRhLnB1dChyZXNvdXJjZSwgY2FjaGVkRGF0YSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTm90ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIHdoZW4gcHJvY2Vzc2luZyB0aGlzIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRoYXQgaGFkIHNvbWUgc29ydCBvZiBlcnJvciB3aGlsZSBwcm9jZXNzaW5nLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIHJlY29yZGVkLiBUaGUgZXJyb3IgbWF5IG5vdCBiZSByZWNvcmRlZCBpZiB0aGUgcmVzb3VyY2UgZG9lcwotCSAqICAgICAgICAgbm90IGV4aXN0LgotCSAqIEBzZWUgI2hhc0NhY2hlRXJyb3IoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtYXJrRXJyb3IoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLQkJaWYgKHJlc291cmNlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgIT0gSVJlc291cmNlLk5VTExfU1RBTVApIHsKLQkJCWlmICh0aW1lc3RhbXBzLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgewotCQkJCVRpbWVzdGFtcFNpZ25hdHVyZSBzaWduYXR1cmUgPSAoVGltZXN0YW1wU2lnbmF0dXJlKSB0aW1lc3RhbXBzLmdldChyZXNvdXJjZSk7Ci0JCQkJc2lnbmF0dXJlLnVwZGF0ZShyZXNvdXJjZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRpbWVzdGFtcHMucHV0KHJlc291cmNlLCBjcmVhdGVUaW1lc3RhbXBTaWduYXR1cmUocmVzb3VyY2UpKTsKLQkJCX0KLQkJCWRhdGEucHV0KHJlc291cmNlLCBFUlJPUik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdGhhdCB3YXMgb3IgaXMgYWJvdXQgdG8gYmUgcHJvY2Vzc2VkLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGNoYW5nZWQgaW4gYSBub3RpY2VhYmxlIHdheSBzaW5jZSBpdCB3YXMgbWFya2VkLgotCSAqIAotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlKQotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlLCBPYmplY3QpCi0JICogQHNlZSAjbWFya0Vycm9yKElSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlUaW1lc3RhbXBTaWduYXR1cmUgc2lnbmF0dXJlID0gKFRpbWVzdGFtcFNpZ25hdHVyZSkgdGltZXN0YW1wcy5nZXQocmVzb3VyY2UpOwotCQlyZXR1cm4gc2lnbmF0dXJlID09IG51bGwgfHwgc2lnbmF0dXJlLmhhc0NoYW5nZWQocmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRoYXQgd2FzIG9yIGlzIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYW55IGRhdGEgY2FjaGVkIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogCi0JICogQHNlZSAjbWFyayhJUmVzb3VyY2UpCi0JICogQHNlZSAjbWFyayhJUmVzb3VyY2UsIE9iamVjdCkKLQkgKiBAc2VlICNtYXJrRXJyb3IoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NhY2hlRGF0YShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJT2JqZWN0IGRhdHVtID0gZGF0YS5nZXQocmVzb3VyY2UpOwotCQlyZXR1cm4gZGF0dW0gIT0gbnVsbCAmJiBkYXR1bSAhPSBOT19EQVRBOwotCi0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IHdhcyBvciBpcyBhYm91dCB0byBiZSBwcm9jZXNzZWQuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGFueSBkYXRhIGNhY2hlZCBmb3IgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqIAotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlKQotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlLCBPYmplY3QpCi0JICogQHNlZSAjbWFya0Vycm9yKElSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZUVycm9yKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gZGF0YS5nZXQocmVzb3VyY2UpID09IEVSUk9SOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJT2JqZWN0IGRhdHVtID0gZGF0YS5nZXQocmVzb3VyY2UpOwotCQlpZiAoZGF0dW0gIT0gTk9fREFUQSkKLQkJCXJldHVybiBkYXR1bTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIFRpbWVzdGFtcFNpZ25hdHVyZSBjcmVhdGVUaW1lc3RhbXBTaWduYXR1cmUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQlyZXR1cm4gbmV3IFByb2plY3RUaW1lc3RhbXAoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFNpbXBsZVJlc291cmNlVGltZXN0YW1wKHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgcG9pbnQgaW4gdGltZSBzaWduYXR1cmUgb2YgYSBSZXNvdXJjZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGF0IHJlc291cmNlIGhhcwotCSAqIGNoYW5nZWQgaW4gYSBtZWFuaW5nZnVsIHdheSBzaW5jZSB0aGUgdGltZSB0aGlzIHNpZ25hdHVyZSB3YXMgY3JlYXRlZCBvciBsYXN0IHVwZGF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIGludGVyZmFjZSBUaW1lc3RhbXBTaWduYXR1cmUgewotCi0JCS8qKgotCQkgKiAKLQkJICogQHBhcmFtIHJlc291cmNlCi0JCSAqICAgICAgICAgICAgQSByZXNvdXJjZSByZWxhdGVkIHRvIHRoaXMgc2lnbmF0dXJlCi0JCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY3VycmVudCByZXNvdXJjZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzIHNpZ25hdHVyZSBpbiBhIG1lYW5pbmdmdWwgd2F5Ci0JCSAqLwotCQlib29sZWFuIGhhc0NoYW5nZWQoSVJlc291cmNlIHJlc291cmNlKTsKLQotCQkvKioKLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZQotCQkgKiAgICAgICAgICAgIFVwZGF0ZSB0aGUgc2lnbmF0dXJlIGRldGFpbHMgdG8gdGhlIGdpdmVuIHJlc291cmNlJ3Mgc2lnbmF0dXJlLgotCQkgKi8KLQkJdm9pZCB1cGRhdGUoSVJlc291cmNlIHJlc291cmNlKTsKLQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgc2lnbmF0dXJlIGJhc2VkIG9uIHRoZSBtb2RpZmljYXRpb25TdGFtcCBvZiBhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZVRpbWVzdGFtcCBpbXBsZW1lbnRzIFRpbWVzdGFtcFNpZ25hdHVyZSB7Ci0JCXByaXZhdGUgbG9uZyB0aW1lc3RhbXAgPSAwOwotCi0JCXB1YmxpYyBTaW1wbGVSZXNvdXJjZVRpbWVzdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXVwZGF0ZShyZXNvdXJjZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJcmV0dXJuIHRpbWVzdGFtcCAhPSByZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJdGltZXN0YW1wID0gcmVzb3VyY2UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgc2lnbmF0dXJlIGZvciBhIHByb2plY3QgYmFzZWQgb24gdGhlIG1vZGlmaWNhdGlvblN0YW1wIG9mIHRoZSAoMSkgcHJvamVjdCwgKDIpIHRoZQotCSAqIGNvbXBvbmVudCBtYW5pZmVzdCwgYW5kICgzKSB0aGUgZmFjZXQgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBQcm9qZWN0VGltZXN0YW1wIGltcGxlbWVudHMgVGltZXN0YW1wU2lnbmF0dXJlIHsKLQotCQlwcml2YXRlIGxvbmcgcHJvamVjdFRpbWVzdGFtcCA9IDA7Ci0JCXByaXZhdGUgbG9uZyBjb21wb25lbnRNYW5pZmVzdFRpbWVzdGFtcCA9IDA7Ci0JCXByaXZhdGUgbG9uZyBmYWNldENvbmZpZ1RpbWVzdGFtcCA9IDA7Ci0KLQkJcHVibGljIFByb2plY3RUaW1lc3RhbXAoSVByb2plY3QgcHJvamVjdCkgewotCQkJdXBkYXRlKHByb2plY3QpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQlpZiAocHJvamVjdFRpbWVzdGFtcCAhPSBwcm9qZWN0LmdldE1vZGlmaWNhdGlvblN0YW1wKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCi0JCQkJSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZShDT01QT05FTlRfTUFOSUZFU1RfUEFUSCk7Ci0JCQkJaWYgKCFmaWxlLmV4aXN0cygpIHx8IGNvbXBvbmVudE1hbmlmZXN0VGltZXN0YW1wICE9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQlmaWxlID0gcHJvamVjdC5nZXRGaWxlKEZBQ0VUX0NPTkZJR19QQVRIKTsKLQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkgfHwgZmFjZXRDb25maWdUaW1lc3RhbXAgIT0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQotCQkJCXByb2plY3RUaW1lc3RhbXAgPSBwcm9qZWN0LmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0KLQkJCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKENPTVBPTkVOVF9NQU5JRkVTVF9QQVRIKTsKLQkJCQljb21wb25lbnRNYW5pZmVzdFRpbWVzdGFtcCA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQkJCWZpbGUgPSBwcm9qZWN0LmdldEZpbGUoRkFDRVRfQ09ORklHX1BBVEgpOwotCQkJCWZhY2V0Q29uZmlnVGltZXN0YW1wID0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCQl9IGVsc2UgewotCQkJCXByb2plY3RUaW1lc3RhbXAgPSBjb21wb25lbnRNYW5pZmVzdFRpbWVzdGFtcCA9IGZhY2V0Q29uZmlnVGltZXN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTkwNjE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEFyY2hpdmVDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSGFzaFV0aWw7Ci0KLQotcHVibGljIGNsYXNzIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGltcGxlbWVudHMgSVZpcnR1YWxDb21wb25lbnQsIElBZGFwdGFibGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5jbGFzczsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJBUkNISVZFVFlQRSA9ICJsaWIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUkFSQ0hJVkVUWVBFID0gInZhciI7Ci0JLyoqCi0JICogVmlydHVhbEFyY2hpdmVDb21wb25lbnQgdHlwZSBmb3IgVmlydHVhbEFyY2hpdmVDb21wb25lbnRzIHRoYXQgcmVwcmVzZW50IGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jaWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSEFSQ0hJVkVUWVBFID0gImNwZSI7IC8vJE5PTi1OTFMtMQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gTk9fUkVGRVJFTkNFUyA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlWzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50W10gTk9fQ09NUE9ORU5UUyA9IG5ldyBWaXJ0dWFsQ29tcG9uZW50WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElWaXJ0dWFsUmVzb3VyY2VbXSBOT19WSVJUVUFMX1JFU09VUkNFUyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydGllcyBOT19QUk9QRVJUSUVTID0gbmV3IFByb3BlcnRpZXMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aFtdIE5PX1BBVEhTID0gbmV3IFBhdGhbMF07Ci0KLQlwcml2YXRlIElQYXRoIHJ1bnRpbWVQYXRoOwotCXByaXZhdGUgSVByb2plY3QgY29tcG9uZW50UHJvamVjdDsKLQlwcml2YXRlIElQYXRoIGFyY2hpdmVQYXRoOwotCXByaXZhdGUgU3RyaW5nIGFyY2hpdmVUeXBlOwotCi0KLQotCXB1YmxpYyBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCxTdHJpbmcgYXJjaGl2ZUxvY2F0aW9uLCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJaWYoYUNvbXBvbmVudFByb2plY3QgPT0gbnVsbCl7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQljb21wb25lbnRQcm9qZWN0ID0gYUNvbXBvbmVudFByb2plY3Q7Ci0JCXJ1bnRpbWVQYXRoID0gYVJ1bnRpbWVQYXRoOwotCi0JCVN0cmluZyBhcmNoaXZlUGF0aFN0cmluZyA9IGFyY2hpdmVMb2NhdGlvbi5zdWJzdHJpbmcoNCwgYXJjaGl2ZUxvY2F0aW9uLmxlbmd0aCgpKTsKLQkJYXJjaGl2ZVR5cGUJPSBhcmNoaXZlTG9jYXRpb24uc3Vic3RyaW5nKDAsIDMpOwotCQlhcmNoaXZlUGF0aCA9IG5ldyAgUGF0aChhcmNoaXZlUGF0aFN0cmluZyk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hcmNoaXZlVHlwZSArIElQYXRoLlNFUEFSQVRPUiArIHRoaXMuYXJjaGl2ZVBhdGgudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3llZE5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JCS8vcmV0dXJuIGdldEFyY2hpdmVQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nIGFDb21wb25lbnRUeXBlSWQpIHsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIElWaXJ0dWFsUmVzb3VyY2UuQ09NUE9ORU5UOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCkgewotCQlpbnQgeCA9IEJJTkFSWTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElQYXRoW10gZ2V0TWV0YVJlc291cmNlcygpIHsKLQkJcmV0dXJuIE5PX1BBVEhTOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFSZXNvdXJjZXMoSVBhdGhbXSB0aGVNZXRhUmVzb3VyY2VQYXRocykgewotCi0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHByb3RlY3RlZC4gRGVwcmVjYXRlZCBhcyBvZiBXVFAgMy4yIAotCSAqIFlvdSBzaG91bGQgY29udmVydCB0byBhIEZpbGUgb3IgSUZpbGUgYW5kIHRoZW4gZ2V0IHRoZSBleHRlbnNpb24uIAotCSAqIEByZXR1cm4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGFyY2hpdmVQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHByb3RlY3RlZC4gRGVwcmVjYXRlZCBhcyBvZiBXVFAgMy4yCi0JICogWW91IHNob3VsZCBjb252ZXJ0IHRvIGFuIElGaWxlIGFuZCBnZXQgaXQncyBmdWxsIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgSVBhdGggZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgewotCQlpZiggYXJjaGl2ZVBhdGguc2VnbWVudENvdW50KCkgPiAxICl7Ci0JCQlJRmlsZSBhRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShhcmNoaXZlUGF0aCk7Ci0JCQlpZiAoYUZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGFGaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBwcm90ZWN0ZWQuIERlcHJlY2F0ZWQgYXMgb2YgV1RQIDMuMgotCSAqIFlvdSBzaG91bGQgY29udmVydCB0byBhbiBJRmlsZSBhbmQgdXNlIElGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKQotCSAqIEByZXR1cm4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBJUGF0aCBnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgewotCQlJRmlsZSBhRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSk7Ci0JCWlmIChhRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBhRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gY29tcG9uZW50UHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiBydW50aW1lUGF0aCA9PSBudWxsID8gUk9PVCA6IHJ1bnRpbWVQYXRoOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRBcmNoaXZlUGF0aCgpIHsKLQkJcmV0dXJuIGFyY2hpdmVQYXRoOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gTk9fUFJPUEVSVElFUzsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIGdldFJlc291cmNlcyhTdHJpbmcgYVJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gTk9fVklSVFVBTF9SRVNPVVJDRVM7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JfQotCQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zKSB7Ci0JCXJldHVybiBOT19SRUZFUkVOQ0VTOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBOT19SRUZFUkVOQ0VTOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSB0aGVSZWZlcmVuY2VzKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0JCS8vIG5vIG9wCi0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZShTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlGaWxlIGYgPSAoRmlsZSlnZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQlyZXR1cm4gZiAhPSBudWxsICYmIGYuZXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldFJvb3RGb2xkZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpIHsKLQkJcmV0dXJuIE5PX0NPTVBPTkVOVFM7Ci0JfQotCi0KLQkvKioKLQkgKiBHdWFyYW50ZWVkIGFjY2VwdGVkIGFkYXB0ZXJzIGFuZCBiZWhhdmlvdXJzOgotCSAqIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCAtIGlmIGEgd29ya3NwYWNlIGZpbGUsIHJldHVybnMgaWZpbGUuZ2V0RnVsbFBhdGgoKSwgIGVsc2UgbmV3IFBhdGgoamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpKQotCSAqIGphdmEuaW8uRmlsZSAtIHRoZSBmaWxlLCB3aGV0aGVyIGluIHdvcmtzcGFjZSBvciBvdXQsIHRoaXMgd2lsbCBnZXQgdGhlIGFjdHVhbCBmaWxlIGlmIHRoZXJlIGlzIG9uZQotCSAqIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIC0gdGhlIHdvcmtzcGFjZSBmaWxlLCBpZiBpdCBleGlzdHMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYoIEZpbGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXJUeXBlKSkKLQkJCXJldHVybiBnZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJaWYoIElGaWxlLmNsYXNzLmVxdWFscyhhZGFwdGVyVHlwZSkpIHsKLQkJCXJldHVybiBnZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQl9Ci0JCWlmKCBJUGF0aC5jbGFzcy5lcXVhbHMoYWRhcHRlclR5cGUpKSB7Ci0JCQlJRmlsZSBmID0gZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCWlmKCBmICE9IG51bGwgKSAKLQkJCQlyZXR1cm4gZi5nZXRGdWxsUGF0aCgpOwotCQkJRmlsZSBmMiA9IGdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJaWYoIGYyICE9IG51bGwgKQotCQkJCXJldHVybiBuZXcgUGF0aChmMi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyVHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlVHlwZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVUeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoYXNoID0gSGFzaFV0aWwuU0VFRDsKLQkJaGFzaCA9IEhhc2hVdGlsLmhhc2goaGFzaCwgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGdldE5hbWUoKSk7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGlzQmluYXJ5KCkpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk90aGVyKSB7Ci0JCWlmIChhbk90aGVyIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IG90aGVyQ29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBhbk90aGVyOwotCQkJcmV0dXJuIGdldFByb2plY3QoKS5lcXVhbHMob3RoZXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKSAmJiAKLQkJCQkJZ2V0TmFtZSgpLmVxdWFscyhvdGhlckNvbXBvbmVudC5nZXROYW1lKCkpICYmIAotCQkJCQlpc0JpbmFyeSgpID09IG90aGVyQ29tcG9uZW50LmlzQmluYXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQotCX0KLQkKLQkvKioKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHByb3RlY3RlZAotCSAqIFlvdSBzaG91bGQgdXNlIGdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpCi0JICogQHJldHVybgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIElGaWxlIGdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCkgewotCQlpZiAoZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk9PW51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBwcm90ZWN0ZWQKLQkgKiBZb3Ugc2hvdWxkIHVzZSBnZXRBZGFwdGVyKEZpbGUuY2xhc3MpCi0JICogQHJldHVybgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIEZpbGUgZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCkgewotCQlTdHJpbmcgb3NQYXRoID0gbnVsbDsKLQkJSVBhdGggbG9jID0gbnVsbDsKLQkJaWYgKGdldEFyY2hpdmVUeXBlKCkuZXF1YWxzKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFKSkgewotCQkJT2JqZWN0IGFkYXB0ZWQgPSBnZXRBZGFwdGVyKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkFEQVBURVJfVFlQRSk7Ci0JCQlpZiAoYWRhcHRlZCBpbnN0YW5jZW9mIElQYXRoKSB7Ci0JCQkJSVBhdGggcmVzb2x2ZWRwYXRoID0gKElQYXRoKSBhZGFwdGVkOwotCQkJCW9zUGF0aCA9IHJlc29sdmVkcGF0aC50b09TU3RyaW5nKCk7Ci0JCQl9IAotCQl9IGVsc2UgaWYoIWFyY2hpdmVQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKGFyY2hpdmVQYXRoKTsKLQkJCWlmKGZpbGUuZXhpc3RzKCkpCi0JCQkJbG9jICA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJCWVsc2UgaWYoYXJjaGl2ZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShhcmNoaXZlUGF0aCk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSkKLQkJCQkJbG9jID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQkJfQotCQkJLy8gdGhpcyBpcyBhIGZpbGUgb24gdGhlIGxvY2FsIGZpbGVzeXN0ZW0KLQkJCWlmKGxvYyAhPSBudWxsKSAgCi0JCQkJb3NQYXRoID0gbG9jLnRvT1NTdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCW9zUGF0aCA9IGFyY2hpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQkJfQotCQlpZiAob3NQYXRoPT1udWxsIHx8IG9zUGF0aC5sZW5ndGgoKT09MCkKLQkJCXJldHVybiBudWxsOwotCQlGaWxlIGRpc2tGaWxlID0gbmV3IEZpbGUob3NQYXRoKTsKLQkJcmV0dXJuIGRpc2tGaWxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZihhcmNoaXZlUGF0aCAhPSBudWxsKXsKLQkJCXJldHVybiBjb21wb25lbnRQcm9qZWN0ICsgIiAiICthcmNoaXZlUGF0aDsKLQkJfQotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2VhMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci5JRGVwZW5kZW5jeUdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVycy5JUmVmZXJlbmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVycy5SZWZlcmVuY2VSZXNvbHZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5IYXNoVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgVmlydHVhbENvbXBvbmVudCBpbXBsZW1lbnRzIElWaXJ0dWFsQ29tcG9uZW50IHsKLQlJUGF0aAkJCXJ1bnRpbWVQYXRoOwotCUlQcm9qZWN0CWNvbXBvbmVudFByb2plY3Q7Ci0JSVZpcnR1YWxGb2xkZXIJcm9vdEZvbGRlcjsKLQlTdHJpbmcgY29tcG9uZW50VHlwZUlkOwotCXByaXZhdGUgaW50IGZsYWcgPSAwOwotCQotCS8vIENhY2hlIHZhcmlhYmxlcwotCVN0cmluZyBuYW1lID0gbnVsbDsKLQlTdHJpbmcgZGVwbG95bWVudE5hbWUgPSBudWxsOwotCU1hcCA8U3RyaW5nLCBJVmlydHVhbFJlZmVyZW5jZT4gcmVmZXJlbmNlTWFwID0gbnVsbDsKLQlJVmlydHVhbFJlZmVyZW5jZVtdIHJhd1JlZmVyZW5jZXNBcnJheSA9IG51bGw7Ci0JSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzQXJyYXkgPSBudWxsOwotCVByb3BlcnRpZXMgbWV0YVByb3BlcnRpZXMgPSBudWxsOwotCUlQYXRoW10gY2FjaGVNZXRhUmVzb3VyY2VzID0gbnVsbDsKLQlJVmlydHVhbFJlZmVyZW5jZVtdIGFsbFJlZmVyZW5jZXMgPSBudWxsOwotCQotCVJlc291cmNlIHByb2plY3RSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXIoKTsKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRCkKLQkJCQlyZXNvdXJjZUNoYW5nZWQoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhcmcwKSB7Ci0JCQkKLQkJCXJldHVybiB0aGlzLmdldENsYXNzKCkuZXF1YWxzKGFyZzAuZ2V0Q2xhc3MoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCQotCQkJcmV0dXJuIGdldENsYXNzKCkuaGFzaENvZGUoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZUNoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWNsZWFyQ2FjaGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hbmFnZWRSZXNvdXJjZSgpIHsKLQkJaWYocHJvamVjdFJlc291cmNlID09IG51bGwpCi0JCQlwcm9qZWN0UmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSgpOwotCQlpZiAocHJvamVjdFJlc291cmNlICE9IG51bGwgJiYgIXByb2plY3RSZXNvdXJjZS5lQWRhcHRlcnMoKS5jb250YWlucyhyZXNvdXJjZUFkYXB0ZXIpKQotCQkJcHJvamVjdFJlc291cmNlLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUFkYXB0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZSgpIHsKLQkJaWYocHJvamVjdFJlc291cmNlICE9IG51bGwpIHsKLQkJCXByb2plY3RSZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VBZGFwdGVyKTsKLQkJCXByb2plY3RSZXNvdXJjZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVJlc291cmNlKCkgewotCQlwcm9qZWN0UmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSgpOwotCQlhZGRNYW5hZ2VkUmVzb3VyY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKCkgewotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGlmIChjb3JlID09IG51bGwpCi0gICAgICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLSAgICAgICAgICAgIGlmKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICAgICAgCXJlcyA9IGNvbXBvbmVudC5lUmVzb3VyY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmKGNvcmUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjb3JlLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlyZW1vdmVSZXNvdXJjZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVmlydHVhbENvbXBvbmVudCgpewotCX0KLQkKLQlwdWJsaWMgVmlydHVhbENvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCWlmKGFQcm9qZWN0ID09IG51bGwpewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJY29tcG9uZW50UHJvamVjdCA9IGFQcm9qZWN0OwotCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQkJcm9vdEZvbGRlciA9IENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGNvbXBvbmVudFByb2plY3QsIG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0JCWluaXRpYWxpemVSZXNvdXJjZSgpOwotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZihuYW1lID09IG51bGwpewotCQkJbmFtZSA9IGdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95ZWROYW1lKCkgewotCQlpZihkZXBsb3ltZW50TmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVwbG95bWVudE5hbWU7Ci0JCX0KLQkJCQotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQl0cnkgewotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBnZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJCWlmKGNvcmUgIT0gbnVsbCAmJiBjb3JlLmdldENvbXBvbmVudCgpICE9IG51bGwpewotCQkJCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCQkJaWYgKGNvbXBvbmVudC5nZXROYW1lKCkhPW51bGwgJiYgY29tcG9uZW50LmdldE5hbWUoKS5sZW5ndGgoKT4wKSB7Ci0JCQkJCQlkZXBsb3ltZW50TmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0JCQkJCQlyZXR1cm4gZGVwbG95bWVudE5hbWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpCi0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCX0KLQkJZGVwbG95bWVudE5hbWUgPSBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gZGVwbG95bWVudE5hbWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsgCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFQcm9wZXJ0aWVzKCkgewotCQlpZihtZXRhUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWV0YVByb3BlcnRpZXM7Ci0JCX0KLQkJCi0gICAgICAgIFN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBtZXRhUHJvcGVydGllcyA9IHByb3BzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGlmIChjb3JlID09IG51bGwpCi0gICAgICAgICAgICAJcmV0dXJuIHByb3BzOwotICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7IAotICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKSByZXR1cm4gcHJvcHM7Ci0gICAgICAgICAgICBMaXN0IHByb3BMaXN0ID0gY29tcG9uZW50LmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGlmKHByb3BMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KXByb3BMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAJU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgCVN0cmluZyB2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCWlmKHZhbHVlID09IG51bGwpewotICAgICAgICAgICAgICAgIAkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAkJU3RyaW5nIG1lc3NhZ2UgPSAiV0FSTklORzogIFRoZSBjb21wb25lbnQgZmlsZSBpbiAiK2dldFByb2plY3QoKS5nZXROYW1lKCkrIiBoYXMgbm8gdmFsdWUgZGVmaW5lZCBmb3IgdGhlIHByb3BlcnR5OiAiK25hbWU7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIAkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcihJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKTsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0YVByb3BlcnRpZXMgPSAgcHJvcHM7IAotICAgICAgICAgICAgcmV0dXJuIHByb3BzOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29yZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvcmUuZGlzcG9zZSgpOwotICAgICAgICB9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOyAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBwcm9wTGlzdCA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgewotCQkgICAgICAgIGZvcihFbnVtZXJhdGlvbiBpdHIgPSBwcm9wZXJ0aWVzLmtleXMoKTsgaXRyLmhhc01vcmVFbGVtZW50cygpOykgewotCQkgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRyLm5leHRFbGVtZW50KCk7Ci0JCSAgICAgICAgICAgIGZpbmFsIFByb3BlcnR5IHByb3AgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJICAgICAgICAgICAgcHJvcC5zZXROYW1lKGtleSk7Ci0JCSAgICAgICAgICAgIHByb3Auc2V0VmFsdWUocHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHByb3BlcnR5IGZpcnN0Ci0JCSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxwcm9wTGlzdC5zaXplKCk7IGkrKykgewotCQkgICAgICAgICAgICAJUHJvcGVydHkgZXhpc3RpbmcgPSAoUHJvcGVydHkpIHByb3BMaXN0LmdldChpKTsKLQkJICAgICAgICAgICAgCWlmIChleGlzdGluZy5nZXROYW1lKCkuZXF1YWxzKGtleSkpIHsKLQkJICAgICAgICAgICAgCQlwcm9wTGlzdC5yZW1vdmUoZXhpc3RpbmcpOwotCQkgICAgICAgICAgICAJCWJyZWFrOwotCQkgICAgICAgICAgICAJfQotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgIC8vIEFkZCBuZXcgcHJvcGVydHkKLQkJICAgICAgICAgICAgcHJvcExpc3QuYWRkKHByb3ApOwotCQkgICAgICAgICB9Ci0JCSAgICAgICAgY2xlYXJDYWNoZSgpOwotCQkJfSAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmKGNvcmUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAJY29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0gICAgICAgICAgICAgICAgY29yZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXJNZXRhUHJvcGVydGllcygpIHsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7IAotICAgICAgICAgICAgY29tcG9uZW50LmdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgY2xlYXJDYWNoZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29yZSAhPSBudWxsKXsKLSAgICAgICAgICAgIAljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLSAgICAgICAgICAgICAgICBjb3JlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRhUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotICAgICAgICAgICAgLy9SZW1vdmUgZXhpc3RpbmcgcHJvcGVydHkgZmlyc3QKLSAgICAgICAgICAgIExpc3QgcHJvcGVydGllcyA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cHJvcGVydGllcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgCVByb3BlcnR5IGV4aXN0aW5nID0gKFByb3BlcnR5KSBwcm9wZXJ0aWVzLmdldChpKTsKLSAgICAgICAgICAgIAlpZiAoZXhpc3RpbmcuZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAJCXByb3BlcnRpZXMucmVtb3ZlKGV4aXN0aW5nKTsKLSAgICAgICAgICAgIAkJYnJlYWs7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAJLy9TZXQgbmV3IHByb3BlcnR5Ci0gICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eSBwcm9wID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQlwcm9wLnNldE5hbWUoa2V5KTsKLQkJCXByb3Auc2V0VmFsdWUodmFsdWUpOwotCQkJY29tcG9uZW50LmdldFByb3BlcnRpZXMoKS5hZGQocHJvcCk7Ci0JCQljbGVhckNhY2hlKCk7ICAgICAgICAgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZihjb3JlICE9IG51bGwpewotICAgICAgICAgICAgCWNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotICAgICAgICAgICAgICAgIGNvcmUuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JfQotCQotCXB1YmxpYyBJUGF0aFtdIGdldE1ldGFSZXNvdXJjZXMoKSB7Ci0JCWlmKGNhY2hlTWV0YVJlc291cmNlcyAhPSBudWxsKQotCQkJcmV0dXJuIGNhY2hlTWV0YVJlc291cmNlczsKLQkJCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCUxpc3QgbWV0YVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKQotCQkJCQltZXRhUmVzb3VyY2VzLmFkZEFsbChjb21wb25lbnQuZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY2FjaGVNZXRhUmVzb3VyY2VzID0gKElQYXRoW10pIG1ldGFSZXNvdXJjZXMudG9BcnJheShuZXcgSVBhdGhbbWV0YVJlc291cmNlcy5zaXplKCldKTsKLQkJcmV0dXJuIGNhY2hlTWV0YVJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUmVzb3VyY2VzKElQYXRoW10gdGhlTWV0YVJlc291cmNlUGF0aHMpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8dGhlTWV0YVJlc291cmNlUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFjb21wb25lbnQuZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5jb250YWlucyh0aGVNZXRhUmVzb3VyY2VQYXRoc1tpXSkpCi0JCQkJCQljb21wb25lbnQuZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5hZGQodGhlTWV0YVJlc291cmNlUGF0aHNbaV0pOwotCQkJCX0KLQkJCQljbGVhckNhY2hlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSVZpcnR1YWxSZXNvdXJjZS5DT01QT05FTlQ7Ci0JfQotCQotCi0JcHVibGljIGJvb2xlYW4gaXNCaW5hcnkoKXsKLQkJYm9vbGVhbiByZXQgPSAgKGZsYWcgJiBCSU5BUlkpID09IDEgID8gdHJ1ZSA6ZmFsc2U7Ci0JCXJldHVybiByZXQ7CQkKLQl9CQotCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUKLQkJCQkJLmdldENvbXBvbmVudCgpOwotCQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKQotCQkJCWNvbXBvbmVudCA9IG1vZHVsZUNvcmUKLQkJCQkJCS5jcmVhdGVXb3JrYmVuY2hNb2R1bGUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogUmV0dXJucyBhIHJhdyBsaXN0IG9mIHJlZmVyZW5jZXMgZXhhY3RseSBhcyBkZWZpbmVkIGluCi0JICogLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50LiBBbGwgcmV0dXJuZWQgcmVmZXJlbmNlcyB3aWxsCi0JICogcmV0dXJuIGEgbm9uIDxjb2RlPm51bGw8L2NvZGU+IGZvcgotCSAqIHtAbGluayBJVmlydHVhbFJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCl9LCBob3dldmVyLCBpdCBpcwotCSAqIHBvc3NpYmxlIHRoYXQgY2FsbHMgdG8gdGhlc2UgY29tcG9uZW50J3MKLQkgKiB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnQjZXhpc3RzKCl9IG1heSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSYXdSZWZlcmVuY2VzKCkgewotCQlpZiAocmF3UmVmZXJlbmNlc0FycmF5ICE9IG51bGwpIHsKLQkJCXJldHVybiByYXdSZWZlcmVuY2VzQXJyYXk7Ci0JCX0KLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChjb3JlICE9IG51bGwgJiYgY29yZS5nZXRDb21wb25lbnQoKSAhPSBudWxsKSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJCUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZENvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQlJVmlydHVhbFJlZmVyZW5jZSB2UmVmZXJlbmNlID0gU3RydWN0dXJlRWRpdC5jcmVhdGVWaXJ0dWFsUmVmZXJlbmNlKHRoaXMsIHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCQkJaWYgKHZSZWZlcmVuY2UgIT0gbnVsbCAmJiB2UmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJcmVmZXJlbmNlcy5hZGQodlJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyYXdSZWZlcmVuY2VzQXJyYXkgPSAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgcmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZWZlcmVuY2VzLnNpemUoKV0pOwotCQkJcmV0dXJuIHJhd1JlZmVyZW5jZXNBcnJheTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb3JlICE9IG51bGwpIHsKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zKSB7Ci0JCWlmKHJlZmVyZW5jZXNBcnJheSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlc0FycmF5OwotCQl9Ci0JCVN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlpZiAoY29yZSE9bnVsbCAmJiBjb3JlLmdldENvbXBvbmVudCgpIT1udWxsKSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJaWYgKGNvbXBvbmVudCE9bnVsbCkgewotCQkJCQlMaXN0IHJlZmVyZW5jZWRDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gKFJlZmVyZW5jZWRDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQ9PW51bGwpIAotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgdlJlZmVyZW5jZSA9IFN0cnVjdHVyZUVkaXQuY3JlYXRlVmlydHVhbFJlZmVyZW5jZSh0aGlzLCByZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJCWlmICh2UmVmZXJlbmNlICE9IG51bGwgJiYgdlJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgIT0gbnVsbCAmJiB2UmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5leGlzdHMoKSl7Ci0JCQkJCQkJcmVmZXJlbmNlcy5hZGQodlJlZmVyZW5jZSk7IAotCQkJCQkJCWN1c3RvbWl6ZUNyZWF0ZWRSZWZlcmVuY2UodlJlZmVyZW5jZSwgcmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZWZlcmVuY2VzQXJyYXkgPSAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgcmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZWZlcmVuY2VzLnNpemUoKV0pOwotCQkJcmV0dXJuIHJlZmVyZW5jZXNBcnJheTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKGNvcmUgIT0gbnVsbCkKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGN1c3RvbWl6ZUNyZWF0ZWRSZWZlcmVuY2UoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3QgZGVwZW5kZW50T2JqZWN0KSB7Ci0JCS8vIERvIE5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsgCi0JCUhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcyhtYXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0JCWlmIChyZWZlcmVuY2VzPT1udWxsIHx8IHJlZmVyZW5jZXMubGVuZ3RoPT0wKQotCQkJcmV0dXJuOwotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlpZiAoY29yZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWNsZWFyQ2FjaGUoKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gbnVsbDsKLQkJCUNvbXBvbmVudGNvcmVGYWN0b3J5IGZhY3RvcnkgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKTsKLQkJCUlSZWZlcmVuY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChyZWZlcmVuY2VzW2ldID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJlc29sdmVyID0gUmVmZXJlbmNlUmVzb2x2ZXJVdGlsLmdldERlZmF1bHQoKS5nZXRSZXNvbHZlcihyZWZlcmVuY2VzW2ldKTsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVzb2x2ZXIucmVzb2x2ZShyZWZlcmVuY2VzW2ldKTsKLQkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQkJCWNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpLmFkZChyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmKGNvcmUgIT0gbnVsbCkgewotCQkJCWNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkJCWNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9CQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VzKElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcykgeyAKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBudWxsOwotCQkJIAotCQkJY2xlYXJDYWNoZSgpOwotCQkJY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCUNvbXBvbmVudGNvcmVGYWN0b3J5IGZhY3RvcnkgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKTsKLQkJCUlSZWZlcmVuY2VSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlc29sdmVyID0gUmVmZXJlbmNlUmVzb2x2ZXJVdGlsLmdldERlZmF1bHQoKS5nZXRSZXNvbHZlcihyZWZlcmVuY2VzW2ldKTsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVzb2x2ZXIucmVzb2x2ZShyZWZlcmVuY2VzW2ldKTsKLQkJCQlpZiggcmVmZXJlbmNlZENvbXBvbmVudCAhPSBudWxsKQotCQkJCQljb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5hZGQocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQl9Ci0JCQkgCi0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpIHsKLQkJCQljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQkKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZihjb21wb25lbnRQcm9qZWN0ID09IG51bGwpIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOyAgLy9JZiBjb21wb25lbnQgZmFjdG9yeSBpbnN0YW5jZSwgZG9uJ3QgdXNlIHByb2plY3QgdG8gaGFzaAotCQlpbnQgaGFzaCA9IEhhc2hVdGlsLlNFRUQ7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBnZXROYW1lKCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBpc0JpbmFyeSgpKTsKLQkJcmV0dXJuIGhhc2g7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PdGhlcikgewotCQlpZihjb21wb25lbnRQcm9qZWN0ID09IG51bGwpIHJldHVybiBzdXBlci5lcXVhbHMoYW5PdGhlcik7ICAvL0lmIGNvbXBvbmVudCBmYWN0b3J5IGluc3RhbmNlLCBkb24ndCB1c2UgcHJvamVjdCB0byBjb21wYXJlCi0JCWlmKGFuT3RoZXIgPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JCWlmKGFuT3RoZXIgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgb3RoZXJDb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIGFuT3RoZXI7Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmVxdWFscyhvdGhlckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpICYmIAotCQkJCSAgIGdldE5hbWUoKS5lcXVhbHMob3RoZXJDb21wb25lbnQuZ2V0TmFtZSgpKSAmJiAKLQkJCQkgICBpc0JpbmFyeSgpID09IG90aGVyQ29tcG9uZW50LmlzQmluYXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCWlmKHJlZmVyZW5jZU1hcCA9PSBudWxsKXsKLQkJCXJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBJVmlydHVhbFJlZmVyZW5jZT4oKTsKLQkJfSBlbHNlIGlmKHJlZmVyZW5jZU1hcC5jb250YWluc0tleShhQ29tcG9uZW50TmFtZSkpIHsKLQkJCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2UpIHJlZmVyZW5jZU1hcC5nZXQoYUNvbXBvbmVudE5hbWUpOwotCQl9Ci0JCQotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBnZXRSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gcmVmc1tpXTsKLQkJCWlmKCByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpICE9IG51bGwgKXsKLQkJCQlpZiAocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXROYW1lKCkuZXF1YWxzKGFDb21wb25lbnROYW1lKSkgewotCQkJCQlyZWZlcmVuY2VNYXAucHV0KGFDb21wb25lbnROYW1lLCByZWZlcmVuY2UpOwotCQkJCQlyZXR1cm4gcmVmZXJlbmNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRSb290Rm9sZGVyKCkgewotCQlyZXR1cm4gcm9vdEZvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgY29tcG9uZW50cyB3aGljaCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXNzZWQgaW4gdGFyZ2V0IGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybiBhcnJheSBvZiBjb21wb25lbnRzCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKCkgewotCQlTZXQ8SVByb2plY3Q+IHByb2plY3RzID0gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoZ2V0UHJvamVjdCgpKTsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSByZXN1bHQgPSBuZXcgSVZpcnR1YWxDb21wb25lbnRbcHJvamVjdHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3I8SVByb2plY3Q+IGkgPSBwcm9qZWN0cy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBqPTA7IGo8cHJvamVjdHMuc2l6ZSgpOyBqKyspCi0JCQlyZXN1bHRbal0gPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChpLm5leHQoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYXNzb2NpYXRlZCBSZWZlcmVuY2VkQ29tcG9uZW50IGZvciB0aGUgdmlydHVhbCByZWZlcmVuY2UgZnJvbSB0aGUgd29ya2JlbmNoIGNvbXBvbmVudCAKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aXJ0dWFsIGNvbXBvbmVudAotCSAqIAotCSAqIEBwYXJhbSBhUmVmZXJlbmNlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKElWaXJ0dWFsUmVmZXJlbmNlIGFSZWZlcmVuY2UpIHsKLQkJU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmKGFSZWZlcmVuY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChjb3JlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljbGVhckNhY2hlKCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmQ29tcG9uZW50ID0gZ2V0V29ya2JlbmNoUmVmZXJlbmNlZENvbXBvbmVudChhUmVmZXJlbmNlLCBjb21wb25lbnQpOwotCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIHJlZkNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkucmVtb3ZlKHJlZkNvbXBvbmVudCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpIHsKLQkJCQljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3NvY2lhdGVkIHN0cnVjdHVyZSBlZGl0IFJlZmVyZW5jZWRDb21wb25lbnQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gSVZpcnR1YWxSZWZlcmVuY2UgYmFzZWQgb24gdGhlIGhhbmRsZQotCSAqIGFuZCBtb2R1bGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBhUmVmZXJlbmNlCi0JICogQHBhcmFtIGNvcmUKLQkgKiBAcmV0dXJuIFJlZmVyZW5jZWRDb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlZENvbXBvbmVudCBnZXRXb3JrYmVuY2hSZWZlcmVuY2VkQ29tcG9uZW50KElWaXJ0dWFsUmVmZXJlbmNlIGFSZWZlcmVuY2UsIFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKGFSZWZlcmVuY2UgPT0gbnVsbCB8fCBhUmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSA9PSBudWxsIHx8IGNvbXBvbmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJVVJJIHVyaSA9IFJlZmVyZW5jZVJlc29sdmVyVXRpbC5nZXREZWZhdWx0KCkuZ2V0UmVzb2x2ZXIoYVJlZmVyZW5jZSkucmVzb2x2ZShhUmVmZXJlbmNlKS5nZXRIYW5kbGUoKTsgCi0JCWZvciAoaW50IGk9MDsgaTxyZWZlcmVuY2VkQ29tcG9uZW50cy5zaXplKCk7IGkrKykgewotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWYgPSAoUmVmZXJlbmNlZENvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudHMuZ2V0KGkpOwotCQkJaWYoIHJlZi5nZXRIYW5kbGUoKS5lcXVhbHModXJpKSkKLQkJCQlyZXR1cm4gcmVmOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRDYWNoZVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIElWaXJ0dWFsUmVmZXJlbmNlW10gLSBBbGwgdGhlIHJlZmVyZW5jZXMgb2YgdGhpcyBjb21wb25lbnQsIGluY2x1ZGluZyBwb3RlbnRpYWxseSBkZWxldGVkIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRBbGxSZWZlcmVuY2VzKCkgeyAKLQkJaWYoc2hvdWxkQ2FjaGVSZWZlcmVuY2VzKCkgJiYgYWxsUmVmZXJlbmNlcyAhPSBudWxsKQotCQkJcmV0dXJuIGFsbFJlZmVyZW5jZXM7Ci0JCQotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQlMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRQcm9qZWN0KCkpOwotCQkJaWYgKGNvcmUhPW51bGwgJiYgY29yZS5nZXRDb21wb25lbnQoKSE9bnVsbCkgewotCQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wb25lbnQhPW51bGwpIHsKLQkJCQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkQ29tcG9uZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50PT1udWxsKSAKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHZSZWZlcmVuY2UgPSBTdHJ1Y3R1cmVFZGl0LmNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UodGhpcywgcmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQlpZiAodlJlZmVyZW5jZSAhPSBudWxsICYmIHZSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpICE9IG51bGwpewotCQkJCQkJCXZSZWZlcmVuY2Uuc2V0QXJjaGl2ZU5hbWUoIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QXJjaGl2ZU5hbWUoKSApOwotCQkJCQkJCXJlZmVyZW5jZXMuYWRkKHZSZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaWYgKHZSZWZlcmVuY2UgIT0gbnVsbCAmJiB2UmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSA9PSBudWxsKXsKLQkJCQkJCQkJLy8gSWYgbm9uZSBvZiB0aGUgcmVzb2x2ZXJzIHVzZWQgYnkgU3RydWN0dXJlRWRpdC5jcmVhdGVWaXJ0dWFsUmVmZXJlbmNlIGNvdWxkIGZpbmQgYSByZWZlcmVuY2Ugd2l0aCAKLQkJCQkJCQkJLy8gYSBub24tbnVsbCByZWZlcmVuY2VkIGNvbXBvbmVudCwgdHJ5IHRvIGZpbmQgaXQgb3Vyc2VsdmVzLiAgCi0JCQkJCQkJCXZSZWZlcmVuY2UgPSBnZXRSZWZlcmVuY2VGb3JOb25SZXNvbHZhYmxlQ29tcG9uZW50KHRoaXMsIHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAodlJlZmVyZW5jZSAhPSBudWxsICYmIHZSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpICE9IG51bGwpewotCQkJCQkJCQlyZWZlcmVuY2VzLmFkZCh2UmVmZXJlbmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlhbGxSZWZlcmVuY2VzID0gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHJlZmVyZW5jZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVmZXJlbmNlcy5zaXplKCldKTsKLQkJCXJldHVybiBhbGxSZWZlcmVuY2VzOwotCQl9IGZpbmFsbHkgewotCQkJaWYoY29yZSAhPSBudWxsKQotCQkJCWNvcmUuZGlzcG9zZSgpOwotCQl9CQkKLQl9Ci0JCQotCQotCS8qCi0JICogU2ltaWxhciB0byBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb2x2ZXJzLkRlZmF1bHRSZWZlcmVuY2VSZXNvbHZlciNyZXNvbHZlKElWaXJ0dWFsQ29tcG9uZW50IGNvbnRleHQsIFJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCkKLQkgKi8KLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZUZvck5vblJlc29sdmFibGVDb21wb25lbnQoVmlydHVhbENvbXBvbmVudCBjb250ZXh0LCBSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gbnVsbDsKLQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0JCVVSSSB1cmkgPSByZWZlcmVuY2VkQ29tcG9uZW50LmdldEhhbmRsZSgpOwotCQlpZiAodXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYm9vbGVhbiBpc0NsYXNzUGF0aFVSSSA9IE1vZHVsZVVSSVV0aWwuaXNDbGFzc1BhdGhVUkkodXJpKTsKLQkJaWYoICFpc0NsYXNzUGF0aFVSSSApewotCQkJdHJ5IHsgCi0JCQkJdGFyZ2V0UHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QodXJpLCBmYWxzZSk7Ci0JCQl9IGNhdGNoKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gdXVyaWUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gCi0KLQkJCXRhcmdldENvbXBvbmVudCA9IG5ldyBOb25SZXNvbHZhYmxlVmlydHVhbENvbXBvbmVudCh0YXJnZXRQcm9qZWN0LCBudWxsKTsKLQkJCVZpcnR1YWxSZWZlcmVuY2UgdlJlZiA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKGNvbnRleHQsIHRhcmdldENvbXBvbmVudCwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXRSdW50aW1lUGF0aCgpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldERlcGVuZGVuY3lUeXBlKCkuZ2V0VmFsdWUoKSk7Ci0JCQl2UmVmLnNldEFyY2hpdmVOYW1lKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQlyZXR1cm4gdlJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZXhjZXB0IGJ5IHRoZSAKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQuaW50ZXJuYWwuYnVpbGRlci5EZXBlbmRlbmN5R3JhcGhJbXBsfQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoQ2FjaGUoKSB7Ci0JCWNsZWFyQ2FjaGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJbmFtZSA9IG51bGw7Ci0JCWRlcGxveW1lbnROYW1lID0gbnVsbDsKLQkJaWYocmVmZXJlbmNlTWFwICE9IG51bGwpIHsKLQkJCXJlZmVyZW5jZU1hcC5jbGVhcigpOwotCQl9Ci0JCXJhd1JlZmVyZW5jZXNBcnJheSA9IG51bGw7Ci0JCXJlZmVyZW5jZXNBcnJheSA9IG51bGw7Ci0JCW1ldGFQcm9wZXJ0aWVzID0gbnVsbDsKLQkJY2FjaGVNZXRhUmVzb3VyY2VzID0gbnVsbDsKLQkJYWxsUmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gY29tcG9uZW50UHJvamVjdC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbENvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzVhY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlydHVhbENvbnRhaW5lciBleHRlbmRzIFZpcnR1YWxSZXNvdXJjZSBpbXBsZW1lbnRzIElWaXJ0dWFsQ29udGFpbmVyIHsKLQotCi0JcHVibGljIFZpcnR1YWxDb250YWluZXIoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQkvLyBUT0RPIFdUUDpJbXBsZW1lbnQgdGhpcyBtZXRob2QKLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoSVBhdGggcGF0aCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNmaW5kTWVtYmVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcgYUNoaWxkTmFtZSkgewotCQlyZXR1cm4gZmluZE1lbWJlcihuZXcgUGF0aChhQ2hpbGROYW1lKSwgMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGFpbmVyI2ZpbmRNZW1iZXIoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBhQ2hpbGROYW1lLCBpbnQgc2VhcmNoRmxhZ3MpIHsKLQkJcmV0dXJuIGZpbmRNZW1iZXIobmV3IFBhdGgoYUNoaWxkTmFtZSksIHNlYXJjaEZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjZmluZE1lbWJlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCBhQ2hpbGRQYXRoKSB7Ci0JCXJldHVybiBmaW5kTWVtYmVyKGFDaGlsZFBhdGgsIDApOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlIGZpbmRNZW1iZXIoSVBhdGggYVBhdGgsIGludCB0aGVTZWFyY2hGbGFncykgewotCQlTdHJ1Y3R1cmVFZGl0IHN0cnVjdHVyZUVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJc3RydWN0dXJlRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCWlmKHN0cnVjdHVyZUVkaXQgIT0gbnVsbCl7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IHN0cnVjdHVyZUVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJaWYgKG51bGwgIT0gY29tcG9uZW50KSB7Ci0JCQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChjb21wb25lbnQpOwotCQkJCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhUGF0aCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkvLyByZXR1cm4gdGhlIHJlc291cmNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByb290LCBub3QgYW55IG9mIHRoZSBjaGlsZHJlbiBpZiBpdHMgYSBmb2xkZXIKLQkJCQkJCWlmIChyZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoYVBhdGgpKSkgewotCQkJCQkJCUlSZXNvdXJjZSBwbGF0Zm9ybVJlc291cmNlID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIocmVzb3VyY2VzW2ldLmdldFNvdXJjZVBhdGgoKSk7Ci0JCQkJCQkJaWYgKHBsYXRmb3JtUmVzb3VyY2UgPT0gbnVsbCkKLQkJCQkJCQkJcGxhdGZvcm1SZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihyZXNvdXJjZXNbaV0uZ2V0U291cmNlUGF0aCgpKTsKLQkJCQkJCQlpZiAocGxhdGZvcm1SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCXN3aXRjaCAocGxhdGZvcm1SZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQkJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJCQkJCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhUGF0aCkpOwotCQkJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCQkJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRmlsZShnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc3RydWN0dXJlRWRpdCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZUVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNnZXRGaWxlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxGaWxlIGdldEZpbGUoSVBhdGggYVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRmlsZShnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGFpbmVyI2dldEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldEZvbGRlcihJUGF0aCBhUGF0aCkgewotCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciNnZXRGaWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElWaXJ0dWFsRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEZpbGUoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyI2dldEZvbGRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQobmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZW1iZXJzKElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycyhib29sZWFuKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyhib29sZWFuIGluY2x1ZGVQaGFudG9tcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbWVtYmVycyhpbmNsdWRlUGhhbnRvbXMgPyBJR05PUkVfRVhDTFVTSU9OUyA6IElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycyhpbnQpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKGludCBtZW1iZXJGbGFncykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHZpcnR1YWxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHJlc3VsdAotCQlTZXQgYWxsTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBJZ25vcmUgYWxsIG1ldGEgZGF0YSBwYXRocyBpbiB0aGUgdmlydHVhbCBjb250YWluZXIgcmVzb3VyY2Ugc2V0Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldENvbXBvbmVudCgpOwotCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCSAgICByZXR1cm4gbmV3IElWaXJ0dWFsUmVzb3VyY2VbMF07Ci0JCUlQYXRoW10gbWV0YVBhdGhzID0gY29tcG9uZW50LmdldE1ldGFSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBnZXRMb2NhbE5hbWUobWV0YVBhdGhzW2ldKTsKLQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCkKLQkJCQlhbGxOYW1lcy5hZGQobG9jYWxOYW1lKTsKLQkJfQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAod2JDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdCh3YkNvbXBvbmVudCk7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMgPSByb290LmZpbmRNb2R1bGVSZXNvdXJjZXMoZ2V0UnVudGltZVBhdGgoKSwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0JCQkJLy8gY29tcG9uZW50UmVzb3VyY2VzID0gb3JkZXJSZXNvdXJjZXNCeUZvbGRlcihjb21wb25lbnRSZXNvdXJjZXMpOwotCi0JCQkJZm9yIChpbnQgY29tcG9uZW50UmVzb3VyY2VJbmRleCA9IDA7IGNvbXBvbmVudFJlc291cmNlSW5kZXggPCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoOyBjb21wb25lbnRSZXNvdXJjZUluZGV4KyspIHsKLQkJCQkJSVBhdGggZnVsbFJ1bnRpbWVQYXRoID0gY29tcG9uZW50UmVzb3VyY2VzW2NvbXBvbmVudFJlc291cmNlSW5kZXhdLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQkJCS8vIGV4YWN0IG1hdGNoCi0JCQkJCWlmIChmdWxsUnVudGltZVBhdGguZXF1YWxzKGdldFJ1bnRpbWVQYXRoKCkpKSB7Ci0KLQkJCQkJCUlSZXNvdXJjZSByZWFsUmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihjb21wb25lbnRSZXNvdXJjZXNbY29tcG9uZW50UmVzb3VyY2VJbmRleF0uZ2V0U291cmNlUGF0aCgpKTsKLQkJCQkJCWlmICgocmVhbFJlc291cmNlICE9IG51bGwpICYmIChyZWFsUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgcmVhbFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkpIHsKLQkJCQkJCQlJQ29udGFpbmVyIHJlYWxDb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVhbFJlc291cmNlOwotCQkJCQkJCUlSZXNvdXJjZVtdIHJlYWxDaGlsZFJlc291cmNlcyA9IHJlYWxDb250YWluZXIubWVtYmVycyhtZW1iZXJGbGFncyk7Ci0JCQkJCQkJZm9yIChpbnQgcmVhbFJlc291cmNlSW5kZXggPSAwOyByZWFsUmVzb3VyY2VJbmRleCA8IHJlYWxDaGlsZFJlc291cmNlcy5sZW5ndGg7IHJlYWxSZXNvdXJjZUluZGV4KyspIHsKLQkJCQkJCQkJSVJlc291cmNlIGNoaWxkID0gcmVhbENoaWxkUmVzb3VyY2VzW3JlYWxSZXNvdXJjZUluZGV4XTsKLQkJCQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLQkJCQkJCQkJaWYgKGFsbE5hbWVzLmFkZChsb2NhbE5hbWUpKSB7Ci0JCQkJCQkJCQlJUGF0aCBuZXdSdW50aW1lUGF0aCA9IGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGxvY2FsTmFtZSk7Ci0JCQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKG5ldyBWaXJ0dWFsRmlsZShnZXRQcm9qZWN0KCksIG5ld1J1bnRpbWVQYXRoLCAoSUZpbGUpIGNoaWxkKSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgbmV3UnVudGltZVBhdGgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIEFuIElSZXNvdXJjZS5GSUxFIHdvdWxkIGJlIGFuIGVycm9yIGNvbmRpdGlvbiAoYXMgdGhpcyBpcyBhIGNvbnRhaW5lcikKLQotCQkJCQl9IGVsc2UgeyAvLyBmdXp6eSBtYXRjaAotCQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZShmdWxsUnVudGltZVBhdGgpOwotCQkJCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGFsbE5hbWVzLmFkZChsb2NhbE5hbWUpKSB7Ci0JCQkJCQkJSVJlc291cmNlIHJlYWxSZXNvdXJjZSA9IFN0cnVjdHVyZUVkaXQuZ2V0RWNsaXBzZVJlc291cmNlKGNvbXBvbmVudFJlc291cmNlc1tjb21wb25lbnRSZXNvdXJjZUluZGV4XSk7Ci0JCQkJCQkJaWYgKHJlYWxSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCUlQYXRoIG5ld1J1bnRpbWVQYXRoID0gZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQobG9jYWxOYW1lKTsKLQkJCQkJCQkJaWYgKGZ1bGxSdW50aW1lUGF0aC5zZWdtZW50Q291bnQoKSA+IGdldFJ1bnRpbWVQYXRoKCkuc2VnbWVudENvdW50KCkgKyAxKSB7CS8vIG5vdCBhIGRpcmVjdCBjaGlsZAotCQkJCQkJCQkJdmlydHVhbFJlc291cmNlcy5hZGQoQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIoZ2V0UHJvamVjdCgpLCBuZXdSdW50aW1lUGF0aCkpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHJlYWxSZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQkJCQkJdmlydHVhbFJlc291cmNlcy5hZGQobmV3IFZpcnR1YWxGaWxlKGdldFByb2plY3QoKSwgbmV3UnVudGltZVBhdGgsIChJRmlsZSkgcmVhbFJlc291cmNlKSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgbmV3UnVudGltZVBhdGgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh2aXJ0dWFsUmVzb3VyY2VzID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBJVmlydHVhbFJlc291cmNlWzBdOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsUmVzb3VyY2VbXSkgdmlydHVhbFJlc291cmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlc291cmNlW3ZpcnR1YWxSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogTG9jYWwgbmFtZSB3aXRoaW4gY29udGV4dCBvZiB0aGlzIHZpcnR1YWwgY29udGFpbmVyLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2FsTmFtZShJUGF0aCBwYXRoKSB7Ci0JCWlmICghZ2V0UnVudGltZVBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwYXRoLnNlZ21lbnQoZ2V0UnVudGltZVBhdGgoKS5zZWdtZW50Q291bnQoKSk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsRmlsZVtdIGZpbmREZWxldGVkTWVtYmVyc1dpdGhIaXN0b3J5KGludCBkZXB0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIjY3JlYXRlTGluayhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUxpbmsoSVBhdGggYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJQ29udGFpbmVyIHJlc291cmNlID0gbnVsbDsKLQkJCWlmIChhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24uaXNSb290KCkgfHwgYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJlc291cmNlID0gZ2V0UHJvamVjdCgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uKTsKLQkJCX0KLQotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChudWxsICE9IGNvbXBvbmVudCkgewotCQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChjb21wb25lbnQpOwotCQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGdldFJ1bnRpbWVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCi0JCQkJaWYgKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJCQljb21wb25lbnRSZXNvdXJjZS5zZXRSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLmFkZChjb21wb25lbnRSZXNvdXJjZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYm9vbGVhbiBmb3VuZE1hcHBpbmcgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgcmVzb3VyY2VJbmR4ID0gMDsgcmVzb3VyY2VJbmR4IDwgcmVzb3VyY2VzLmxlbmd0aCAmJiAhZm91bmRNYXBwaW5nOyByZXNvdXJjZUluZHgrKykgewotCQkJCQkJaWYgKGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5tYWtlQWJzb2x1dGUoKS5lcXVhbHMocmVzb3VyY2VzW3Jlc291cmNlSW5keF0uZ2V0U291cmNlUGF0aCgpKSkKLQkJCQkJCQlmb3VuZE1hcHBpbmcgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZm91bmRNYXBwaW5nKSB7Ci0JCQkJCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJCQkJY29tcG9uZW50UmVzb3VyY2Uuc2V0UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJCQljb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkuYWRkKGNvbXBvbmVudFJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXBkYXRlRmxhZ3MsIG1vbml0b3IpOwotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobW9uaXRvcik7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJVmlydHVhbFJlc291cmNlLkNPTVBPTkVOVDsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFVuZGVybHlpbmdSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBOT19SRVNPVVJDRVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGVNZXRhTW9kZWwoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAobnVsbCAhPSBjb21wb25lbnQpIHsKLQkJCQltb2R1bGVDb3JlLmdldENvbXBvbmVudE1vZGVsUm9vdCgpLmdldENvbXBvbmVudHMoKS5yZW1vdmUoY29tcG9uZW50KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvRGVsZXRlUmVhbFJlc291cmNlcyhpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIGdldFJlc291cmNlcyhTdHJpbmcgYVJlc291cmNlVHlwZSkgewotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJaWYgKG51bGwgIT0gY29tcG9uZW50KSB7Ci0JCQkJTGlzdCBjdXJyZW50UmVzb3VyY2VzID0gY29tcG9uZW50LmdldFJlc291cmNlcygpOwotCQkJCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQlpZiAoYVJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoYVJlc291cmNlVHlwZS5lcXVhbHMocmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpKSB7Ci0JCQkJCQkJSVZpcnR1YWxSZXNvdXJjZSB2cmVzID0gY3JlYXRlVmlydHVhbFJlc291cmNlKHJlc291cmNlKTsKLQkJCQkJCQlpZiAodnJlcyAhPSBudWxsKQotCQkJCQkJCQlmb3VuZFJlc291cmNlcy5hZGQodnJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChJVmlydHVhbFJlc291cmNlW10pIGZvdW5kUmVzb3VyY2VzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVzb3VyY2VbZm91bmRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVzb3VyY2VbMF07Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29yZSAhPSBudWxsKQotCQkJCWNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJVmlydHVhbFJlc291cmNlIGNyZWF0ZVZpcnR1YWxSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSBhQ29tcG9uZW50UmVzb3VyY2UpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gU3RydWN0dXJlRWRpdC5nZXRFY2xpcHNlUmVzb3VyY2UoYUNvbXBvbmVudFJlc291cmNlKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCXsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUoZ2V0UHJvamVjdCgpLCBhQ29tcG9uZW50UmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgYUNvbXBvbmVudFJlc291cmNlLmdldFJ1bnRpbWVQYXRoKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhNjZjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbEZpbGUgZXh0ZW5kcyBWaXJ0dWFsUmVzb3VyY2UgaW1wbGVtZW50cyBJVmlydHVhbEZpbGUgewotCi0JcHJpdmF0ZSBJRmlsZSB1bmRlcmx5aW5nRmlsZTsKLQotCXB1YmxpYyBWaXJ0dWFsRmlsZShJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXN1cGVyKGFDb21wb25lbnRQcm9qZWN0LCBhUnVudGltZVBhdGgpOyAKLQl9Ci0KLQlwdWJsaWMgVmlydHVhbEZpbGUoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCwgSUZpbGUgdW5kZXJseWluZ0ZpbGUpIHsKLQkJc3VwZXIoYUNvbXBvbmVudFByb2plY3QsIGFSdW50aW1lUGF0aCk7Ci0JCXRoaXMudW5kZXJseWluZ0ZpbGUgPSB1bmRlcmx5aW5nRmlsZTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyI2NyZWF0ZUxpbmsob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVMaW5rKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJSUZpbGUgcmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24pOwotCi0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJCi0JCQlSZXNvdXJjZVRyZWVSb290IHJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldERlcGxveVJlc291cmNlVHJlZVJvb3QoY29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGdldFJ1bnRpbWVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCi0JCQlpZihyZXNvdXJjZXMubGVuZ3RoID09IDApIHsKLQkJCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJCWNvbXBvbmVudFJlc291cmNlLnNldFJ1bnRpbWVQYXRoKGdldFJ1bnRpbWVQYXRoKCkpOwotCQkJCWNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS5hZGQoY29tcG9uZW50UmVzb3VyY2UpOwotCQkJfSBlbHNlIHsgCi0JCQkJYm9vbGVhbiBmb3VuZE1hcHBpbmcgPSBmYWxzZTsKLQkJCQlmb3IgKGludCByZXNvdXJjZUluZHggPSAwOyByZXNvdXJjZUluZHggPCByZXNvdXJjZXMubGVuZ3RoICYmICFmb3VuZE1hcHBpbmc7IHJlc291cmNlSW5keCsrKSB7Ci0JCQkJCWlmKGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5lcXVhbHMocmVzb3VyY2VzW3Jlc291cmNlSW5keF0uZ2V0U291cmNlUGF0aCgpKSkKLQkJCQkJCWZvdW5kTWFwcGluZyA9IHRydWU7Ci0JCQkJfQotCQkJCWlmKCFmb3VuZE1hcHBpbmcpIHsKLQkJCQkJQ29tcG9uZW50UmVzb3VyY2UgY29tcG9uZW50UmVzb3VyY2UgPSBtb2R1bGVDb3JlLmNyZWF0ZVdvcmtiZW5jaE1vZHVsZVJlc291cmNlKHJlc291cmNlKTsKLQkJCQkJY29tcG9uZW50UmVzb3VyY2Uuc2V0UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJCWNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS5hZGQoY29tcG9uZW50UmVzb3VyY2UpOwkJCQkJCi0JCQkJfQotCQkJfSAKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfSAKLSAKLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJVmlydHVhbFJlc291cmNlLkZJTEU7Ci0JfQotCQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFVuZGVybHlpbmdSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBnZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldFVuZGVybHlpbmdGaWxlKCkgewotCQlpZiAodW5kZXJseWluZ0ZpbGUgPT0gbnVsbCkgewotCQkJdW5kZXJseWluZ0ZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQl9Ci0JCXJldHVybiB1bmRlcmx5aW5nRmlsZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGVbXSBnZXRVbmRlcmx5aW5nRmlsZXMoKSB7Ci0JCUlQYXRoW10gcGF0aHMgPSBnZXRQcm9qZWN0UmVsYXRpdmVQYXRocygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUocGF0aHNbaV0pOwotCQkJaWYgKGZpbGUhPW51bGwgJiYgZmlsZS5leGlzdHMoKSAmJiAhcmVzdWx0LmNvbnRhaW5zKGZpbGUpKQotCQkJCXJlc3VsdC5hZGQoZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIChJRmlsZVtdKSByZXN1bHQudG9BcnJheShuZXcgSUZpbGVbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvRGVsZXRlTWV0YU1vZGVsKGludCB1cGRhdGVGbGFncyxJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy9EZWZhdWx0Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZVJlYWxSZXNvdXJjZXMoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsgCi0JCWlmKCBqYXZhLmlvLkZpbGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCXJldHVybiBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCX0KLQkJaWYoIElGaWxlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJcmV0dXJuIGdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsRm9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklUYWdnZWRWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFZpcnR1YWxGb2xkZXIgZXh0ZW5kcyBWaXJ0dWFsQ29udGFpbmVyIGltcGxlbWVudHMgSVZpcnR1YWxGb2xkZXIsIElUYWdnZWRWaXJ0dWFsUmVzb3VyY2UgeyAKLQotCS8qKgotCSAqIHA+IENyZWF0ZXMgYW4gdW5hc3NpZ25lZCBtYXBwaW5nIGNvbnRhaW5lZCBieSB0aGUgY29tcG9uZW50IGlkZW50aWZpZWQgYnkgYUNvbXBvbmVudEhhbmRsZQotCSAqIHdpdGggYSBydW50aW1lIHBhdGggb2YgYVJ1bnRpbWVQYXRoLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbXBvbmVudEhhbmRsZQotCSAqIEBwYXJhbSBhUnVudGltZVBhdGgKLQkgKi8KLQlwdWJsaWMgVmlydHVhbEZvbGRlcihJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXN1cGVyKGFDb21wb25lbnRQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCX0KLSAKLQkvLyBUT0RPIFdUUDpJbXBsZW1lbnQgdGhpcyBtZXRob2QKLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb250YWluZXIgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOyAKLQkJaWYoICFjb250YWluZXIuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5pc1Jvb3QoKSl7Ci0JCQlJRm9sZGVyIHJlYWxGb2xkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGNvbnRhaW5lci5nZXRSb290Rm9sZGVyKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsgCi0JCQlJRm9sZGVyIG5ld0ZvbGRlciA9IHJlYWxGb2xkZXIuZ2V0Rm9sZGVyKGdldFJ1bnRpbWVQYXRoKCkpOyAKLQkJCWNyZWF0ZVJlc291cmNlKG5ld0ZvbGRlciwgdXBkYXRlRmxhZ3MsIG1vbml0b3IpOyAgCi0JCX0KLQkJZWxzZSB7Ci0JCQlJRm9sZGVyIG5ld0ZvbGRlciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoZ2V0UnVudGltZVBhdGgoKSk7IAotCQkJY3JlYXRlUmVzb3VyY2UobmV3Rm9sZGVyLCB1cGRhdGVGbGFncywgbW9uaXRvcik7IAotCQl9Ci0JfSAKLQotCS8vIFRPRE8gV1RQOkltcGxlbWVudCB0aGlzIG1ldGhvZAotCXB1YmxpYyBib29sZWFuIGV4aXN0cyhJUGF0aCBwYXRoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gZmFsc2U7Ci0JfQotCi0gCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSVZpcnR1YWxSZXNvdXJjZS5GT0xERVI7Ci0JfSAKLQkKLQlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFVuZGVybHlpbmdSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBnZXRVbmRlcmx5aW5nRm9sZGVycygpOwotCX0KLQotCXB1YmxpYyBJQ29udGFpbmVyIGdldFVuZGVybHlpbmdGb2xkZXIoKSB7IAotCQlJUGF0aCBwYXRoID0gZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlpZiggIXBhdGguaXNSb290KCkgKQotCQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRGb2xkZXIoZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJcmV0dXJuIGdldFByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIElDb250YWluZXJbXSBnZXRVbmRlcmx5aW5nRm9sZGVycygpIHsKLQkJSVBhdGhbXSBwYXRocyA9IGdldFByb2plY3RSZWxhdGl2ZVBhdGhzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKCAhcGF0aHNbaV0uaXNSb290KCkgKXsKLQkJCQlJQ29udGFpbmVyIGZvbGRlciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIocGF0aHNbaV0pOwotCQkJCWlmIChmb2xkZXIhPW51bGwgJiYgZm9sZGVyLmV4aXN0cygpICYmICFyZXN1bHQuY29udGFpbnMoZm9sZGVyKSkKLQkJCQkJcmVzdWx0LmFkZChmb2xkZXIpOwotCQkJfSBlbHNlIAotCQkJCXJlc3VsdC5hZGQoZ2V0UHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gKElDb250YWluZXJbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDb250YWluZXJbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvRGVsZXRlTWV0YU1vZGVsKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gb25seSBoYW5kbGVzIGV4cGxpY2l0IG1hcHBpbmdzCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7IAotCQkJSVBhdGggcnVudGltZVBhdGggPSBnZXRSdW50aW1lUGF0aCgpOwotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gY29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKHJ1bnRpbWVQYXRoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYocnVudGltZVBhdGguZXF1YWxzKHJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpKSkgCi0JCQkJCWNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2VzW2ldKTsJCQkJCQkJCQotCQkJfQotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIGRvRGVsZXRlUmVhbFJlc291cmNlcyhpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIG9ubHkgaGFuZGxlcyBleHBsaWNpdCBtYXBwaW5ncwotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJSVBhdGggcnVudGltZVBhdGggPSBnZXRSdW50aW1lUGF0aCgpOwotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gY29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKHJ1bnRpbWVQYXRoKTsKLQkJCUlSZXNvdXJjZSByZWFsUmVzb3VyY2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmKHJ1bnRpbWVQYXRoLmVxdWFscyhyZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKSkpIHsKLQkJCQkJcmVhbFJlc291cmNlID0gU3RydWN0dXJlRWRpdC5nZXRFY2xpcHNlUmVzb3VyY2UocmVzb3VyY2VzW2ldKTsKLQkJCQkJaWYocmVhbFJlc291cmNlICE9IG51bGwgJiYgcmVhbFJlc291cmNlLmdldFR5cGUoKSA9PSBnZXRUeXBlKCkpCi0JCQkJCQlyZWFsUmVzb3VyY2UuZGVsZXRlKHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJCQotCQkJfQotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHRhZ1Jlc291cmNlKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgU3RyaW5nIHRhZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLmlzVU5DKCkpewotCQkJCWFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiA9IGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5tYWtlVU5DKGZhbHNlKTsKLQkJCX0KLQkJCUlQYXRoIGFic29sdXRlUGF0aCA9IGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5tYWtlQWJzb2x1dGUoKTsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBhQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKGdldFJ1bnRpbWVQYXRoKCkpOwotCQkJZm9yIChDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZTpyZXNvdXJjZXMpewotCQkJCWlmIChyZXNvdXJjZS5nZXRTb3VyY2VQYXRoKCkuZXF1YWxzKGFic29sdXRlUGF0aCkpewotCQkJCQlyZXNvdXJjZS5zZXRUYWcodGFnKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRGaXJzdFRhZ2dlZFJlc291cmNlKFN0cmluZyB0YWcpIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQgPSBudWxsOwotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJCi0JCWFDb21wb25lbnQgPSBnZXRSZWFkT25seUNvbXBvbmVudCgpOwotCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGFDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCWZvciAoQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2U6cmVzb3VyY2VzKXsKLQkJCWlmICh0YWcuZXF1YWxzKHJlc291cmNlLmdldFRhZygpKSl7Ci0JCQkJcGF0aCA9IHJlc291cmNlLmdldFNvdXJjZVBhdGgoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBwYXRoOwotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGdldFRhZ2dlZFJlc291cmNlcyhTdHJpbmcgdGFnKSB7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50ID0gbnVsbDsKLQkJTGlzdDxJUGF0aD4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOwotCQkKLQkJYUNvbXBvbmVudCA9IGdldFJlYWRPbmx5Q29tcG9uZW50KCk7Ci0JCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gYUNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJZm9yIChDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZTpyZXNvdXJjZXMpewotCQkJaWYgKHRhZy5lcXVhbHMocmVzb3VyY2UuZ2V0VGFnKCkpKXsKLQkJCQlwYXRocy5hZGQocmVzb3VyY2UuZ2V0U291cmNlUGF0aCgpKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBwYXRocy50b0FycmF5KG5ldyBJUGF0aFswXSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxSZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTJjNzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVycy5JUmVmZXJlbmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVycy5SZWZlcmVuY2VSZXNvbHZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5IYXNoVXRpbDsKLQotcHVibGljIGNsYXNzIFZpcnR1YWxSZWZlcmVuY2UgaW1wbGVtZW50cyBJVmlydHVhbFJlZmVyZW5jZSB7Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50OwotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgZW5jbG9zaW5nQ29tcG9uZW50OwotCXByaXZhdGUgSVBhdGggcnVudGltZVBhdGg7Ci0JcHJpdmF0ZSBpbnQgZGVwZW5kZW5jeVR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXJjaGl2ZU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlcml2ZWQ7Ci0JcHVibGljIFZpcnR1YWxSZWZlcmVuY2UoKSB7Ci0JCQotCX0gCi0JCi0JcHVibGljIFZpcnR1YWxSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYW5FbmNsb3NpbmdDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCXRoaXMoYW5FbmNsb3NpbmdDb21wb25lbnQsIGFSZWZlcmVuY2VkQ29tcG9uZW50LCBuZXcgUGF0aChTdHJpbmcudmFsdWVPZihJUGF0aC5TRVBBUkFUT1IpKSwgREVQRU5ERU5DWV9UWVBFX1VTRVMsIGZhbHNlKTsgCi0JfQotCQotCXB1YmxpYyBWaXJ0dWFsUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGFuRW5jbG9zaW5nQ29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCBhUmVmZXJlbmNlZENvbXBvbmVudCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXRoaXMoYW5FbmNsb3NpbmdDb21wb25lbnQsIGFSZWZlcmVuY2VkQ29tcG9uZW50LCBhUnVudGltZVBhdGgsIERFUEVOREVOQ1lfVFlQRV9VU0VTLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFZpcnR1YWxSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYW5FbmNsb3NpbmdDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50LCAKLQkJCUlQYXRoIGFSdW50aW1lUGF0aCwgaW50IGFEZXBlbmRlbmN5VHlwZSkgewotCQl0aGlzKGFuRW5jbG9zaW5nQ29tcG9uZW50LCBhUmVmZXJlbmNlZENvbXBvbmVudCwgYVJ1bnRpbWVQYXRoLCBhRGVwZW5kZW5jeVR5cGUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIFZpcnR1YWxSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYW5FbmNsb3NpbmdDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50LCAKLQkJCUlQYXRoIGFSdW50aW1lUGF0aCwgaW50IGFEZXBlbmRlbmN5VHlwZSwgYm9vbGVhbiBpc0Rlcml2ZWQpIHsKLQkJZW5jbG9zaW5nQ29tcG9uZW50ID0gYW5FbmNsb3NpbmdDb21wb25lbnQ7Ci0JCXJlZmVyZW5jZWRDb21wb25lbnQgPSBhUmVmZXJlbmNlZENvbXBvbmVudDsKLQkJcnVudGltZVBhdGggPSBhUnVudGltZVBhdGg7Ci0JCWRlcGVuZGVuY3lUeXBlID0gYURlcGVuZGVuY3lUeXBlOwotCQlkZXJpdmVkID0gaXNEZXJpdmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsgCi0JCVN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZW5jbG9zaW5nQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJCUlSZWZlcmVuY2VSZXNvbHZlciByZXNvbHZlciA9IFJlZmVyZW5jZVJlc29sdmVyVXRpbC5nZXREZWZhdWx0KCkuZ2V0UmVzb2x2ZXIodGhpcyk7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZkNvbXAgPSByZXNvbHZlci5yZXNvbHZlKHRoaXMpOwotCQkJaWYoIXJlZmVyZW5jZWRDb21wb25lbnRzLmNvbnRhaW5zKHJlZkNvbXApKXsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50cy5hZGQocmVmQ29tcCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseXsKLQkJCWlmKG51bGwgIT0gY29yZSl7Ci0JCQkJY29yZS5zYXZlSWZOZWNlc3NhcnkoYU1vbml0b3IpOwotCQkJCWNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVBhdGgoSVBhdGggYVJ1bnRpbWVQYXRoKSB7IAotCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKSB7IAotCQlyZXR1cm4gcnVudGltZVBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwZW5kZW5jeVR5cGUoaW50IGFEZXBlbmRlbmN5VHlwZSkgewotCQlkZXBlbmRlbmN5VHlwZSA9IGFEZXBlbmRlbmN5VHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlcGVuZGVuY3lUeXBlKCkgeyAKLQkJcmV0dXJuIGRlcGVuZGVuY3lUeXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsgCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkgeyAKLQkJcmV0dXJuIGVuY2xvc2luZ0NvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIHsgCi0JCXJldHVybiByZWZlcmVuY2VkQ29tcG9uZW50OwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byB1cGRhdGUgdGhlIGFjdHVhbCByZWZlcmVuY2VDb21wb25lbnQgb24gdGhlIC5jb21wb25lbnQgZmlsZSBmb3IgdGhpcyB2aXJ0dWFsIHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50LCBFT2JqZWN0IGRlcGVuZGVudE9iamVjdCkgewotCQlpZiAoYVJlZmVyZW5jZWRDb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RydWN0dXJlRWRpdCBlbmNsb3NpbmdDb3JlID0gbnVsbDsKLQkJU3RydWN0dXJlRWRpdCByZWZDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVuY2xvc2luZ0NvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShlbmNsb3NpbmdDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCXJlZkNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShyZWZlcmVuY2VkQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgZW5jbG9zaW5nQ29tcCA9IGVuY2xvc2luZ0NvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgcmVmQ29tcCA9IHJlZkNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IGFjdHVhbFJlZmVyZW5jZWRDb21wb25lbnQgPSBlbmNsb3NpbmdDb3JlLmZpbmRSZWZlcmVuY2VkQ29tcG9uZW50KGVuY2xvc2luZ0NvbXAsIHJlZkNvbXApOwotCQkJaWYgKGFjdHVhbFJlZmVyZW5jZWRDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCXJlZmVyZW5jZWRDb21wb25lbnQgPSBhUmVmZXJlbmNlZENvbXBvbmVudDsKLQkJCQlJUmVmZXJlbmNlUmVzb2x2ZXIgcmVzb2x2ZXIgPSBSZWZlcmVuY2VSZXNvbHZlclV0aWwuZ2V0RGVmYXVsdCgpLmdldFJlc29sdmVyKHRoaXMpOwotCQkJCVVSSSB1cmkgPSByZXNvbHZlci5yZXNvbHZlKHRoaXMpLmdldEhhbmRsZSgpOwotCQkJCWFjdHVhbFJlZmVyZW5jZWRDb21wb25lbnQuc2V0SGFuZGxlKHVyaSk7Ci0JCQkJYWN0dWFsUmVmZXJlbmNlZENvbXBvbmVudC5zZXREZXBlbmRlbnRPYmplY3QoZGVwZW5kZW50T2JqZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlbmNsb3NpbmdDb3JlICE9IG51bGwpIHsKLQkJCQllbmNsb3NpbmdDb3JlLnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQllbmNsb3NpbmdDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChyZWZDb3JlICE9IG51bGwpIHsKLQkJCQlyZWZDb3JlLnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlyZWZDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKSB7Ci0JCXJldHVybiBhcmNoaXZlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgYXJjaGl2ZU5hbWUpIHsKLQkJdGhpcy5hcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWQoKSB7Ci0JCXJldHVybiBkZXJpdmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gdmFsKSB7Ci0JCWRlcml2ZWQgPSB2YWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk90aGVyKSB7Ci0JCWlmKGFuT3RoZXIgPT0gbnVsbCB8fCAhKGFuT3RoZXIgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSkpIHJldHVybiBmYWxzZTsKLQkJaWYoYW5PdGhlciA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQkJSVZpcnR1YWxSZWZlcmVuY2Ugb3RoZXJSZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIGFuT3RoZXI7Ci0JCXJldHVybiAoZ2V0QXJjaGl2ZU5hbWUoKSAhPSBudWxsID8gZ2V0QXJjaGl2ZU5hbWUoKS5lcXVhbHMob3RoZXJSZWYuZ2V0QXJjaGl2ZU5hbWUoKSkgOiAob3RoZXJSZWYuZ2V0QXJjaGl2ZU5hbWUoKSA9PSBudWxsID8gdHJ1ZSA6IGZhbHNlKSkgJiYgCi0JCQkgICBnZXRSdW50aW1lUGF0aCgpLmVxdWFscyhvdGhlclJlZi5nZXRSdW50aW1lUGF0aCgpKSAmJiAKLQkJCSAgIGdldEVuY2xvc2luZ0NvbXBvbmVudCgpLmVxdWFscyhvdGhlclJlZi5nZXRFbmNsb3NpbmdDb21wb25lbnQoKSkgJiYgCi0JCQkgICBnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXF1YWxzKG90aGVyUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSkgJiYgCi0JCQkgICBnZXREZXBlbmRlbmN5VHlwZSgpID09IG90aGVyUmVmLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0JCQotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQotCQlpbnQgaGFzaCA9IEhhc2hVdGlsLlNFRUQ7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGdldEFyY2hpdmVOYW1lKCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBnZXRSdW50aW1lUGF0aCgpKTsKLQkJaGFzaCA9IEhhc2hVdGlsLmhhc2goaGFzaCwgZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBnZXREZXBlbmRlbmN5VHlwZSgpKTsKLQkJcmV0dXJuIGhhc2g7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODE1ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpcnR1YWxSZXNvdXJjZSBpbXBsZW1lbnRzIElWaXJ0dWFsUmVzb3VyY2UgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUmVzb3VyY2VbXSBOT19SRVNPVVJDRVMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgSVByb2plY3QgY29tcG9uZW50UHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoOwotCXByaXZhdGUgaW50IGhhc2hDb2RlOwotCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCXByaXZhdGUgU3RyaW5nIHJlc291cmNlVHlwZTsKLQotCXByaXZhdGUgZmluYWwgUmVzb3VyY2VUaW1lc3RhbXBNYXBwaW5ncyBtYXBwaW5nID0gbmV3IFJlc291cmNlVGltZXN0YW1wTWFwcGluZ3MoKTsKLQotCi0JcHJvdGVjdGVkIFZpcnR1YWxSZXNvdXJjZShJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCWNvbXBvbmVudFByb2plY3QgPSBhQ29tcG9uZW50UHJvamVjdDsKLQkJcnVudGltZVBhdGggPSBhUnVudGltZVBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCh1cGRhdGVGbGFncyAmIElWaXJ0dWFsUmVzb3VyY2UuSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0UpID09IDApIHsKLQkJCWRvRGVsZXRlUmVhbFJlc291cmNlcyh1cGRhdGVGbGFncywgbW9uaXRvcik7Ci0JCX0KLQotCQlkb0RlbGV0ZU1ldGFNb2RlbCh1cGRhdGVGbGFncywgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGVNZXRhTW9kZWwoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBhQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKGdldFJ1bnRpbWVQYXRoKCkpOwotCQkJYUNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9EZWxldGVSZWFsUmVzb3VyY2VzKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJLy8gdmVyaWZ5IGFsbCB1bmRlcmx5aW5nIHJlc291cmNlcyBleGlzdCBmb3IgdGhlIHZpcnR1YWwgcmVzb3VyY2UgdG8KLQkJLy8gZXhpc3QKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlc291cmNlc1tpXSA9PSBudWxsIHx8ICFyZXNvdXJjZXNbaV0uZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCWludCBkb3QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChkb3QgPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGRvdCA9PSBuYW1lLmxlbmd0aCgpIC0gMSkKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhkb3QgKyAxKTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKCkgewotCQlyZXR1cm4gcnVudGltZVBhdGg7Ci0JfQotCi0JcHVibGljIElQYXRoW10gZ2V0UHJvamVjdFJlbGF0aXZlUGF0aHMoKSB7Ci0KLQkJV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQgPSBnZXRSZWFkT25seUNvbXBvbmVudCgpOwotCQlpZiAoYUNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVRyZWVSb290IHJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldERlcGxveVJlc291cmNlVHJlZVJvb3QoYUNvbXBvbmVudCk7Ci0JCQkvLyBzdGlsbCBuZWVkIHNvbWUgc29ydCBvZiBsb29wIGhlcmUgdG8gc2VhcmNoIHN1YnBpZWNlcyBvZiB0aGUKLQkJCS8vIHJ1bnRpbWUgcGF0aC4KLQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gbnVsbDsKLQotCQkJaWYgKHJvb3QgIT0gbnVsbCkgewotCQkJCUlQYXRoW10gZXN0aW1hdGVkUGF0aHMgPSBudWxsOwotCQkJCUlQYXRoIHNlYXJjaFBhdGggPSBudWxsOwotCQkJCWRvIHsKLQkJCQkJc2VhcmNoUGF0aCA9IChzZWFyY2hQYXRoID09IG51bGwpID8gZ2V0UnVudGltZVBhdGgoKSA6IHNlYXJjaFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJCQlpZiAoc2VhcmNoUGF0aC5pc0Fic29sdXRlKCkpCi0JCQkJCQlzZWFyY2hQYXRoID0gc2VhcmNoUGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCQkJY29tcG9uZW50UmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKHNlYXJjaFBhdGgsIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCQkJCQllc3RpbWF0ZWRQYXRocyA9IGZpbmRCZXN0TWF0Y2hlcyhjb21wb25lbnRSZXNvdXJjZXMpOwotCQkJCX0KLQkJCQl3aGlsZSAoZXN0aW1hdGVkUGF0aHMubGVuZ3RoID09IDAgJiYgY2FuU2VhcmNoQ29udGludWUoY29tcG9uZW50UmVzb3VyY2VzLCBzZWFyY2hQYXRoKSk7Ci0JCQkJaWYgKGVzdGltYXRlZFBhdGhzID09IG51bGwgfHwgZXN0aW1hdGVkUGF0aHMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybiBuZXcgSVBhdGhbXXtnZXRSdW50aW1lUGF0aCgpfTsKLQkJCQlyZXR1cm4gZXN0aW1hdGVkUGF0aHM7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3IElQYXRoW117Z2V0UnVudGltZVBhdGgoKX07Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0JCWlmIChnZXRSdW50aW1lUGF0aCgpLmVxdWFscyhuZXcgUGF0aCgiLyIpKSkgewotCQkJV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQgPSBnZXRSZWFkT25seUNvbXBvbmVudCgpOwotCQkJaWYgKGFDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCWlmICgoKFdvcmtiZW5jaENvbXBvbmVudEltcGwpIGFDb21wb25lbnQpLmdldERlZmF1bHRTb3VyY2VSb290KCkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuICgoV29ya2JlbmNoQ29tcG9uZW50SW1wbCkgYUNvbXBvbmVudCkuZ2V0RGVmYXVsdFNvdXJjZVJvb3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0UHJvamVjdFJlbGF0aXZlUGF0aHMoKVswXTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuU2VhcmNoQ29udGludWUoQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMsIElQYXRoIHNlYXJjaFBhdGgpIHsKLQkJcmV0dXJuIChzZWFyY2hQYXRoLnNlZ21lbnRDb3VudCgpID4gMCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aFtdIGZpbmRCZXN0TWF0Y2hlcyhDb21wb25lbnRSZXNvdXJjZVtdIHRoZUNvbXBvbmVudFJlc291cmNlcykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IGN1cnJlbnRNYXRjaExlbmd0aCA9IDA7Ci0JCWludCBiZXN0TWF0Y2hMZW5ndGggPSAtMTsKLQkJSVBhdGggZXN0aW1hdGVkUGF0aCA9IG51bGw7Ci0JCUlQYXRoIGN1cnJlbnRQYXRoID0gbnVsbDsKLQkJZmluYWwgSVBhdGggYVJ1bnRpbWVQYXRoID0gZ2V0UnVudGltZVBhdGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWN1cnJlbnRQYXRoID0gdGhlQ29tcG9uZW50UmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQlpZiAoY3VycmVudFBhdGguaXNQcmVmaXhPZihhUnVudGltZVBhdGgpKSB7Ci0JCQkJaWYgKGN1cnJlbnRQYXRoLnNlZ21lbnRDb3VudCgpID09IGFSdW50aW1lUGF0aC5zZWdtZW50Q291bnQoKSkgewotCQkJCQlyZXN1bHQuYWRkKHRoZUNvbXBvbmVudFJlc291cmNlc1tpXS5nZXRTb3VyY2VQYXRoKCkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY3VycmVudE1hdGNoTGVuZ3RoID0gY3VycmVudFBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKGFSdW50aW1lUGF0aCk7Ci0JCQkJaWYgKGN1cnJlbnRNYXRjaExlbmd0aCA9PSBjdXJyZW50UGF0aC5zZWdtZW50Q291bnQoKSAmJiBjdXJyZW50TWF0Y2hMZW5ndGggPiBiZXN0TWF0Y2hMZW5ndGgpIHsKLQkJCQkJYmVzdE1hdGNoTGVuZ3RoID0gY3VycmVudE1hdGNoTGVuZ3RoOwotCQkJCQlJUGF0aCBzb3VyY2VQYXRoID0gdGhlQ29tcG9uZW50UmVzb3VyY2VzW2ldLmdldFNvdXJjZVBhdGgoKTsKLQkJCQkJSVBhdGggc3VicGF0aCA9IGFSdW50aW1lUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGN1cnJlbnRNYXRjaExlbmd0aCk7Ci0JCQkJCWVzdGltYXRlZFBhdGggPSBzb3VyY2VQYXRoLmFwcGVuZChzdWJwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdC5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChJUGF0aFtdKSByZXN1bHQudG9BcnJheShuZXcgSVBhdGhbcmVzdWx0LnNpemUoKV0pOwotCQlpZiAoZXN0aW1hdGVkUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJUGF0aFtde307Ci0JCXJldHVybiBuZXcgSVBhdGhbXXtlc3RpbWF0ZWRQYXRofTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChnZXRSdW50aW1lUGF0aCgpLnNlZ21lbnRDb3VudCgpID4gMCkKLQkJCXJldHVybiBnZXRSdW50aW1lUGF0aCgpLmxhc3RTZWdtZW50KCk7Ci0JCXJldHVybiBnZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKQotCQkJY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIGNvbXBvbmVudDsKLQl9Ci0KLQkvLyByZXR1cm5zIG51bGwgaWYgdGhlIGZvbGRlciBpcyBhbHJlYWR5IHRoZSByb290IGZvbGRlcgotCXB1YmxpYyBJVmlydHVhbENvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0JCWlmIChnZXRSdW50aW1lUGF0aCgpLnNlZ21lbnRDb3VudCgpID49IDEpCi0JCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gY29tcG9uZW50UHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh0b1N0cmluZyA9PSBudWxsKQotCQkJdG9TdHJpbmcgPSAiWyIgKyBNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhnZXRDb21wb25lbnQoKSkgKyAiOiIgKyBnZXRSdW50aW1lUGF0aCgpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gdG9TdHJpbmc7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGhhc2hDb2RlID09IDApCi0JCQloYXNoQ29kZSA9IHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PdGhlcikgewotCQlyZXR1cm4gaGFzaENvZGUoKSA9PSAoKGFuT3RoZXIgIT0gbnVsbCAmJiBhbk90aGVyIGluc3RhbmNlb2YgVmlydHVhbFJlc291cmNlKSA/IGFuT3RoZXIuaGFzaENvZGUoKSA6IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgYVJlc291cmNlVHlwZSkgewotCQlyZXNvdXJjZVR5cGUgPSBhUmVzb3VyY2VUeXBlOwotCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IGdldFJlYWRPbmx5Q29tcG9uZW50KCk7Ci0JCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gYUNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc291cmNlc1tpXS5zZXRSZXNvdXJjZVR5cGUoYVJlc291cmNlVHlwZSk7Ci0JCX0KLQotCX0KLQotCS8vIFRPRE8gRmV0Y2ggdGhlIHJlc291cmNlIHR5cGUgZnJvbSB0aGUgbW9kZWwuCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCWlmIChudWxsID09IHJlc291cmNlVHlwZSkgewotCQkJV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQgPSBnZXRSZWFkT25seUNvbXBvbmVudCgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBhQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKGdldFJ1bnRpbWVQYXRoKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXNvdXJjZVR5cGUgPSByZXNvdXJjZXNbaV0uZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JCQkJcmV0dXJuIHJlc291cmNlVHlwZTsKLQkJCX0KLQotCQl9Ci0JCXJlc291cmNlVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXNvdXJjZVR5cGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXNvdXJjZShJQ29udGFpbmVyIHJlc291cmNlLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChyZXNvdXJjZS5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJaWYgKCFyZXNvdXJjZS5nZXRQYXJlbnQoKS5leGlzdHMoKSkKLQkJCWNyZWF0ZVJlc291cmNlKHJlc291cmNlLmdldFBhcmVudCgpLCB1cGRhdGVGbGFncywgbW9uaXRvcik7Ci0JCWlmICghcmVzb3VyY2UuZXhpc3RzKCkgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsKLQkJCSgoSUZvbGRlcikgcmVzb3VyY2UpLmNyZWF0ZSh1cGRhdGVGbGFncywgdHJ1ZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvdGVudGFsTWF0Y2goSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBhUnVudGltZVBhdGguaXNQcmVmaXhPZihnZXRSdW50aW1lUGF0aCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZSNyZW1vdmVMaW5rKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGluayhJUGF0aCBhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCWlmKCBtb2R1bGVDb3JlICE9IG51bGwgKSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChjb21wb25lbnQpOwotCQkJCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhnZXRSdW50aW1lUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQkJCQkJaWYgKHJlc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlmb3IgKGludCByZXNvdXJjZUluZHggPSAwOyByZXNvdXJjZUluZHggPCByZXNvdXJjZXMubGVuZ3RoOyByZXNvdXJjZUluZHgrKykgewotCQkJCQkJCWlmIChhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24ubWFrZUFic29sdXRlKCkuZXF1YWxzKHJlc291cmNlc1tyZXNvdXJjZUluZHhdLmdldFNvdXJjZVBhdGgoKSkpIHsKLQkJCQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZXNbcmVzb3VyY2VJbmR4XSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCWlmIChnZXRDb21wb25lbnQoKSAhPSBudWxsKQotCQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBXb3JrYmVuY2hDb21wb25lbnQgZ2V0UmVhZE9ubHlDb21wb25lbnQoKSB7Ci0JCWlmICghbWFwcGluZy5oYXNDaGFuZ2VkKGdldFByb2plY3QoKSkgJiYgbWFwcGluZy5oYXNDYWNoZURhdGEoZ2V0UHJvamVjdCgpKSkKLQkJCXJldHVybiAoV29ya2JlbmNoQ29tcG9uZW50KSBtYXBwaW5nLmdldERhdGEoZ2V0UHJvamVjdCgpKTsKLQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCQltYXBwaW5nLm1hcmsoZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnQ7Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0FydGlmYWN0RWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ5NGY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0FydGlmYWN0RWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVkaXRNb2RlbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogQWRhcHRzIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSB0byBhbiB7QHNlZSBBcnRpZmFjdEVkaXQpIAotICogaW5zdGFuY2UgZmFjYWRlLCBpZiBwb3NzaWJsZS4gVGhlIGZvbGxvd2luZyBjbGFzcyBpcyAKLSAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgUGxhdGZvcm0gQWRhcHRlciBNYW5hZ2VyIGluIAotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCl9Ci0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBBUlRJRkFDVF9FRElUX01PREVMX0NMQVNTID0gQXJ0aWZhY3RFZGl0TW9kZWwuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgQVJUSUZBQ1RfRURJVF9DTEFTUyA9IEFydGlmYWN0RWRpdC5jbGFzczsKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIGFuQWRhcHRhYmxlT2JqZWN0LCBpZiBwb3NzaWJsZS4KLQkgKiA8L3A+IAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFuQWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhbkFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhbkFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdE1vZGVsLkFEQVBURVJfVFlQRSkgewotCQkJaWYgKGFuQWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3RFZGl0KSB7Ci0JCQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSAoQXJ0aWZhY3RFZGl0KWFuQWRhcHRhYmxlT2JqZWN0OwotCQkJCUlQcm9qZWN0IGFQcm9qZWN0ID0gZWRpdC5nZXRQcm9qZWN0KCk7Ci0JCQkJVVJJIGNvbXBvbmVudFVSSSA9IE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFQcm9qZWN0KTsKLQkJCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShlZGl0LmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJcGFyYW1zLnB1dChBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuUEFSQU1fTU9EVUxFX1VSSSwgY29tcG9uZW50VVJJKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmdbXSBlZGl0TW9kZWxJRHMgPSBFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0TW9kZWxJRHMoKTsKLQkJCQkJZm9yIChpbnQgaT0wOyBpPGVkaXRNb2RlbElEcy5sZW5ndGg7IGkrKykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbmF0dXJlLmdldEV4aXN0aW5nRWRpdE1vZGVsKGVkaXRNb2RlbElEc1tpXSxwYXJhbXMsZWRpdC5pc1JlYWRPbmx5KCkpOwotCQkJCQkJCWlmIChlZGl0TW9kZWwgIT1udWxsKQotCQkJCQkJCQlyZXR1cm4gZWRpdE1vZGVsOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJCS8vUmV0dXJuIG51bGwKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFuQWRhcHRlclR5cGUgPT0gQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSkgewotCQkJaWYgKGFuQWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3RFZGl0TW9kZWwpCi0JCQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXQoKEFydGlmYWN0RWRpdE1vZGVsKSBhbkFkYXB0YWJsZU9iamVjdCk7Ci0JCQlpZiAoYW5BZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCkgewotCQkJCUFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmluc3RhbmNlKCk7Ci0JICAgIAkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IHJlYWRlci5nZXRBcnRpZmFjdEVkaXQoKChJVmlydHVhbENvbXBvbmVudClhbkFkYXB0YWJsZU9iamVjdCkuZ2V0UHJvamVjdCgpKTsKLQkgICAgCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCSAgICAJCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVBcnRpZmFjdEVkaXRGb3JSZWFkKChJVmlydHVhbENvbXBvbmVudClhbkFkYXB0YWJsZU9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqICAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117QVJUSUZBQ1RfRURJVF9NT0RFTF9DTEFTUyxBUlRJRkFDVF9FRElUX0NMQVNTfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0FydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWIwNWMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0FydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfRURJVF9FWFRFTlNJT05fUE9JTlQgPSAiYXJ0aWZhY3RlZGl0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RFRElUID0gImFydGlmYWN0ZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZUlEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RFRElUQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgaW5zdGFuY2UgPSBuZXcgQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIoKTsKLQkKLQlwcml2YXRlIGZpbmFsIE1hcC8qPFN0cmluZywgQXJ0aWZhY3RFZGl0RGVzY3JpcHRvcj4qLyBkZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXAvKjxBcnRpZmFjdEVkaXREZXNjcmlwdG9yLCBJQXJ0aWZhY3RFZGl0RmFjdG9yeT4qLyBpbnN0YW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciBpbnN0YW5jZSgpIHsKLQkJLyogYWxyZWFkeSBpbml0aWFsaXplZCBhbmQgcmVnaXN0cnkgcmVhZCBieSB0aGUgdGltZSB0aGUgY2xhc3MgaW5pdGlhbGl6ZXMgKi8KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQlwdWJsaWMgQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBBUlRJRkFDVF9FRElUX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeyAKLQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCXJlYWRSZWdpc3RyeSgpOwkJCQkKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChBUlRJRkFDVEVESVQuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCi0JCQkvKiBCZWNhdXNlIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMgdHlwZSBpcyBjcmVhdGVkIGZyb20gYSBzdGF0aWMgc2luZ2xldG9uIAotCQkJICogZmllbGQsIGFuZCB0aGUgcmVnaXN0cnkgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgdHlwZSwgCi0JCQkgKiBvdGhlciB0aHJlYWRzIGNhbm5vdCBjb21wZXRlIHdpdGggcmVhZEVsZW1lbnQoKSBmb3IgYWNjZXNzIHRvIDxpPmRlc2NyaXB0b3JzPC9pPiAKLQkJCSAqLwotCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShUWVBFKTsKLQkJCWlmKHR5cGUgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdG9ycy5wdXQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoVFlQRSksIG5ldyBBcnRpZmFjdEVkaXREZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCWVsc2UgCi0JCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcigwLCAiTm8gdHlwZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGZvciAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi4iICsgQVJUSUZBQ1RfRURJVF9FWFRFTlNJT05fUE9JTlQgKyAgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCQkiIGV4dGVuc2lvbiBpbiAiICArIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBJQXJ0aWZhY3RFZGl0RmFjdG9yeSBnZXRBcnRpZmFjdEVkaXQoU3RyaW5nIHR5cGVJRCkgewotCQkKLQkJQXJ0aWZhY3RFZGl0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKEFydGlmYWN0RWRpdERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCh0eXBlSUQpOwotCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJCi0JCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkgeyAgCi0JCQkKLQkJCWZhY3RvcnkgPSAoSUFydGlmYWN0RWRpdEZhY3RvcnkpIGluc3RhbmNlcy5nZXQoZGVzY3JpcHRvcik7Ci0JCQkKLQkJCWlmKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQotCQkJCWlmKChmYWN0b3J5ID0gZGVzY3JpcHRvci5jcmVhdGVGYWN0b3J5KCkpICE9IG51bGwpIHsKLQkJCQkJaW5zdGFuY2VzLnB1dChkZXNjcmlwdG9yLCBmYWN0b3J5KTsKLQkJCQl9IGVsc2UgewotCQkJCQlkZXNjcmlwdG9ycy5yZW1vdmUoZGVzY3JpcHRvcik7Ci0JCQkJfSAKLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7CQkJCi0JfSAKLQkKLQkvLyBUT0RPIERvbid0IGxpa2UgdGhpcyBiZWNhdXNlIGl0J3MgZ29pbmcgdG8gY3ljbGUgZXZlcnkgcHJvamVjdCBmYWNldCBmb3IgZWFjaCBwcm9qZWN0Ci0JcHVibGljIElBcnRpZmFjdEVkaXRGYWN0b3J5IGdldEFydGlmYWN0RWRpdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlJdGVyYXRvciBrZXlzID0gZGVzY3JpcHRvcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJCVN0cmluZyB0eXBlSUQgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCh0eXBlSUQpOwotCQkJCQlpZiAocHJvamVjdEZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHByb2plY3RGYWNldCkpCi0JCQkJCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0KHR5cGVJRCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9KdXN0IHJldHVybiBudWxsCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfSAKLQkKLQlwdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0RGVzY3JpcHRvciB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOwotCi0JCXB1YmxpYyBBcnRpZmFjdEVkaXREZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCQllbGVtZW50ID0gY29uZmlnRWxlbWVudDsKLQkJCXR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShUWVBFKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIENyZWF0ZSBhbmQgcmV0dXJuIGFuIHtAbGluayBJQXJ0aWZhY3RFZGl0RmFjdG9yeX0gZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yIG9yIAotCQkgKiA8Yj5udWxsPC9iPiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgaW5zdGFudGlhdGluZyB0aGUgZXh0ZW5zaW9uLgotCQkgKiBAcmV0dXJuIEFuIHtAbGluayBJQXJ0aWZhY3RFZGl0RmFjdG9yeX0gZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yIG9yIAotCQkgKiA8Yj5udWxsPC9iPiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgaW5zdGFudGlhdGluZyB0aGUgZXh0ZW5zaW9uLgotCQkgKi8KLQkJcHVibGljIElBcnRpZmFjdEVkaXRGYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKSB7Ci0JCQkKLQkJCWZpbmFsIElBcnRpZmFjdEVkaXRGYWN0b3J5W10gZmFjdG9yeSA9IG5ldyBJQXJ0aWZhY3RFZGl0RmFjdG9yeVsxXTsKLQkJCQotCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7IAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlmYWN0b3J5WzBdID0gKElBcnRpZmFjdEVkaXRGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVJUSUZBQ1RFRElUQ0xBU1MpOyAKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQotCQkJcmV0dXJuIGZhY3RvcnlbMF07IAotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSB0eXBlIGlkIG9mIHRoaXMgQXJ0aWZhY3RFZGl0IGRlZmluaXRpb24gCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfSAKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRJbXBsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50SW1wbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NTVjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRJbXBsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VUaW1lc3RhbXBNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0KLQotcHVibGljIGNsYXNzIENvbXBvbmVudEltcGxNYW5hZ2VyIGltcGxlbWVudHMgSVN5bmNocm9uaXplckV4dGVuZGVyewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0ZBQ0VUUyA9ICJOT05FIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0lNUExfRVhURU5TSU9OX1BPSU5UID0gImNvbXBvbmVudGltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT01QT05FTlRfSU1QTCA9ICJjb21wb25lbnRpbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfRUxFTUVOVD0iZXh0ZW5kZWRUeXBlSUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRJbXBsTWFuYWdlciBpbnN0YW5jZSA9IG5ldyBDb21wb25lbnRJbXBsTWFuYWdlcigpOwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IExPQURfRkFJTEVEID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXAvKiA8U3RyaW5nLCBDb21wb25lbnRJbXBsRGVzY3JpcHRvcj4gKi8gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcC8qIDxDb21wb25lbnRJbXBsRGVzY3JpcHRvciwgSUNvbXBvbmVudEltcGxGYWN0b3J5PiAqLyBpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SGFzaFNldD4gc29ydGVkRGVzY3JpcHRvcnNLZXlMaXN0ID0gbmV3IEFycmF5TGlzdDxIYXNoU2V0PigpOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudEltcGxNYW5hZ2VyIGluc3RhbmNlKCkgewotCQkvKiBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCByZWdpc3RyeSByZWFkIGJ5IHRoZSB0aW1lIHRoZSBjbGFzcyBpbml0aWFsaXplcyAqLwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENvbXBvbmVudEltcGxNYW5hZ2VyKCkgewotCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCW5ldyBDb21wb25lbnRJbXBsUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLQkJCQkvL3NvcnQgZGVzY3JpcHRvcnMga2V5cyBieSBzaXplLCBiaWdnZXIgc2l6ZSBpcyBhdCBsb3dlciBpbmRleAotCQkJCWlmKCBkZXNjcmlwdG9ycyAhPSBudWxsICl7Ci0KLQkJCQkJc29ydGVkRGVzY3JpcHRvcnNLZXlMaXN0LmFkZEFsbChkZXNjcmlwdG9ycy5rZXlTZXQoKSk7Ci0JCQkJCQotCQkJCQlmaW5hbCBDb21wYXJhdG9yPEhhc2hTZXQ+IGNvbXAgPSBuZXcgQ29tcGFyYXRvcjxIYXNoU2V0PigpIHsKLQkJCQkJCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBIYXNoU2V0IGRlc2NyaXB0b3IxLCBmaW5hbCBIYXNoU2V0IGRlc2NyaXB0b3IyKSB7Ci0JCQkJCQkJaWYoIGRlc2NyaXB0b3IxLnNpemUoKSA9PSBkZXNjcmlwdG9yMi5zaXplKCkgKQotCQkJCQkJCQlyZXR1cm4gMDsKLQkJCQkJCQlyZXR1cm4gZGVzY3JpcHRvcjEuc2l6ZSgpIDwgZGVzY3JpcHRvcjIuc2l6ZSgpID8gMSA6IC0xOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZERlc2NyaXB0b3JzS2V5TGlzdCwgY29tcCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcG9uZW50SW1wbEZhY3RvcnkgZ2V0Q29tcG9uZW50SW1wbEZhY3RvcnkoSGFzaFNldCB0eXBlSUQpIHsKLQotCQlDb21wb25lbnRJbXBsRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKENvbXBvbmVudEltcGxEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQodHlwZUlEKTsKLQkJSUNvbXBvbmVudEltcGxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQotCQkJZmFjdG9yeSA9IChJQ29tcG9uZW50SW1wbEZhY3RvcnkpIGluc3RhbmNlcy5nZXQoZGVzY3JpcHRvcik7Ci0KLQkJCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQotCQkJCWlmICgoZmFjdG9yeSA9IGRlc2NyaXB0b3IuY3JlYXRlRmFjdG9yeSgpKSAhPSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlcy5wdXQoZGVzY3JpcHRvciwgZmFjdG9yeSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVzY3JpcHRvcnMucmVtb3ZlKGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0JCi0JCi0KLQlwcml2YXRlIElDb21wb25lbnRJbXBsRmFjdG9yeSBmaW5kRmFjdG9yeUZvclByb2plY3QoSVByb2plY3QgcHJvamVjdCwgTWFwIGRlc2NyaXB0b3JzKXsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0Q29tcG9uZW50SW1wbEZhY3RvcnkocHJvamVjdCk7Ci0KLQkJCWlmKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFjdG9yeTsKLQotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpewotCQkJCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlzZXQuYWRkKE5PX0ZBQ0VUUyk7Ci0JCQkJZmFjdG9yeSA9IGdldENvbXBvbmVudEltcGxGYWN0b3J5KHNldCk7Ci0JCQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuc2V0Q29tcG9uZW50SW1wbEZhY3RvcnkocHJvamVjdCwgZmFjdG9yeSk7Ci0JCQkJcmV0dXJuIGZhY3Rvcnk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmluZEZhY3RvcnlTdXBwb3J0aW5nRmFjZXRzRm9yUHJvamVjdChmYWNldGVkUHJvamVjdCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoMCwgIlJldHVybmluZyBudWxsIGZhY3RvcnkgZm9yIHByb2plY3Q6ICIgKyBwcm9qZWN0LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkubWFya0Vycm9yQ29tcG9uZW50SW1wbEZhY3RvcnkocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQkKLQlwcml2YXRlIElDb21wb25lbnRJbXBsRmFjdG9yeSBmaW5kRmFjdG9yeVN1cHBvcnRpbmdGYWNldHNGb3JQcm9qZWN0KElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCl7Ci0JCVNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gcHJvamVjdEZhY2V0cyA9IGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldHMoKTsKLQotCQlJQ29tcG9uZW50SW1wbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CQotCi0JCWlmKCBzb3J0ZWREZXNjcmlwdG9yc0tleUxpc3QgIT0gbnVsbCApewotCQkJZm9yKCBIYXNoU2V0IGtleSA6IHNvcnRlZERlc2NyaXB0b3JzS2V5TGlzdCApewotCQkJCQotCQkJCWJvb2xlYW4gaW52YWxpZERlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGtleS5pdGVyYXRvcigpOwotCi0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCi0JCQkJCVN0cmluZyB0eXBlSUQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gbnVsbDsKLQkJCQkJdHJ5ewotCQkJCQkJcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGVJRCk7Ci0JCQkJCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJCQlpbnZhbGlkRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkvL2lmIGEgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgZmFjZXQgc3VwcG9ydGVkIGJ5IHRoaXMgdHlwZSwgcmV0dXJuIAotCQkJCQlpZiAocHJvamVjdEZhY2V0ICE9IG51bGwgJiYgIWZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpKXsKLQkJCQkJCWludmFsaWREZXNjcmlwdG9yID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCAhaW52YWxpZERlc2NyaXB0b3IgKXsKLQkJCQkJZmFjdG9yeSA9IGdldENvbXBvbmVudEltcGxGYWN0b3J5KGtleSk7Ci0JCQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJCQlDb21wb25lbnRDYWNoZU1hbmFnZXIuaW5zdGFuY2UoKS5zZXRDb21wb25lbnRJbXBsRmFjdG9yeShmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0KCksIGZhY3RvcnkpOwotCQkJCQkJcmV0dXJuIGZhY3Rvcnk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGNyZWF0ZUZvbGRlcihJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKXsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KGFQcm9qZWN0LCBkZXNjcmlwdG9ycyk7Ci0JCQlpZihudWxsICE9IGZhY3RvcnkpewotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEp1c3QgcmV0dXJuIGEgZGVmYXVsdCBmb2xkZXIKLQkJfQotCQlDb21wb25lbnRDYWNoZU1hbmFnZXIuaW5zdGFuY2UoKS5zZXRDb21wb25lbnRJbXBsRmFjdG9yeShhUHJvamVjdCwgbnVsbCk7Ci0JCXJldHVybiBuZXcgVmlydHVhbEZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gY2hlY2tTZXR0aW5ncykgewotCQl0cnkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0Q29tcG9uZW50KHByb2plY3QpOwotCQkJaWYoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29tcG9uZW50OwotCQkJfQkJCi0KLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KHByb2plY3QsIGRlc2NyaXB0b3JzKTsKLQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJY29tcG9uZW50ID0gZmFjdG9yeS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQkJaWYoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuc2V0Q29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudCk7Ci0JCQkJCXJlZ2lzdGVyTGlzdGVuZXIocHJvamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBjb21wb25lbnQ7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBKdXN0IHJldHVybiBhIGRlZmF1bHQgY29tcG9uZW50Ci0JCX0KLQkJaWYoY2hlY2tTZXR0aW5ncykgewotCQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCkgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbmV3IFZpcnR1YWxDb21wb25lbnQocHJvamVjdCwgbmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCUNvbXBvbmVudENhY2hlTWFuYWdlci5pbnN0YW5jZSgpLnNldENvbXBvbmVudEltcGxGYWN0b3J5KHByb2plY3QsIG51bGwpOwotCQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuc2V0Q29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudCk7Ci0JCQlyZWdpc3Rlckxpc3RlbmVyKHByb2plY3QpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVBcmNoaXZlQ29tcG9uZW50KGFQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSwgbmV3IFBhdGgoIi8iKSk7Ci0JfQotCQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVBcmNoaXZlQ29tcG9uZW50KElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgYUNvbXBvbmVudE5hbWUsIElQYXRoIHBhdGgpIHsKLQkJcGF0aCA9IHBhdGggPT0gbnVsbCA/IG5ldyBQYXRoKCIvIikgOiBwYXRoOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDYWNoZU1hbmFnZXIuaW5zdGFuY2UoKS5nZXRBcmNoaXZlQ29tcG9uZW50KGFQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSk7Ci0JCQlpZihjb21wb25lbnQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29tcG9uZW50OwotCi0JCQlpZighQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuaXNWYWxpZENvbXBvbmVudEltcGxGYWN0b3J5KGFQcm9qZWN0KSkgewotCQkJCXJlZ2lzdGVyTGlzdGVuZXIoYVByb2plY3QpOwotCQkJfQotCi0JCQlJQ29tcG9uZW50SW1wbEZhY3RvcnkgZmFjdG9yeSA9IGZpbmRGYWN0b3J5Rm9yUHJvamVjdChhUHJvamVjdCwgZGVzY3JpcHRvcnMpOwotCQkJaWYobnVsbCAhPSBmYWN0b3J5KXsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlQ29tcG9uZW50ID0gZmFjdG9yeS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KGFQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSwgcGF0aCk7Ci0JCQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuc2V0QXJjaGl2ZUNvbXBvbmVudChhUHJvamVjdCwgYUNvbXBvbmVudE5hbWUsIGFyY2hpdmVDb21wb25lbnQpOwotCQkJCXJldHVybiBhcmNoaXZlQ29tcG9uZW50OwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSnVzdCByZXR1cm4gYSBkZWZhdWx0IGFyY2hpdmUgY29tcG9uZW50Ci0JCX0KLQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuc2V0Q29tcG9uZW50SW1wbEZhY3RvcnkoYVByb2plY3QsIG51bGwpOwotCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlQ29tcG9uZW50ID0gbmV3IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KGFQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSwgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuc2V0QXJjaGl2ZUNvbXBvbmVudChhUHJvamVjdCwgYUNvbXBvbmVudE5hbWUsIGFyY2hpdmVDb21wb25lbnQpOwotCQlyZXR1cm4gYXJjaGl2ZUNvbXBvbmVudDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSVByb2plY3QgYVByb2plY3QpIHsKLQkJUHJvamVjdFJlc291cmNlU2V0IHJlc1NldCA9IGdldFJlc291cmNlU2V0KGFQcm9qZWN0KTsKLQkJaWYgKHJlc1NldCA9PSBudWxsIHx8IHJlc1NldC5nZXRTeW5jaHJvbml6ZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZXNTZXQuZ2V0U3luY2hyb25pemVyKCkuYWRkRXh0ZW5kZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qKSB7Ci0JCXJldHVybiAoUHJvamVjdFJlc291cmNlU2V0KVdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHJvamVjdENsb3NlZCgpIHsKLQkJQ29tcG9uZW50Q2FjaGVNYW5hZ2VyLmluc3RhbmNlKCkuY2xlYXJDYWNoZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvbmVudENhY2hlTWFuYWdlciAgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRDYWNoZU1hbmFnZXIgaW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50Q2FjaGVNYW5hZ2VyKCk7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIGZhY3RvcnlNYXAgPSBuZXcgUmVzb3VyY2VUaW1lc3RhbXBNYXBwaW5ncygpOwkKLQkJcHJpdmF0ZSBmaW5hbCBNYXAgPElQcm9qZWN0ICwgSVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHNNYXAgPSBuZXcgSGFzaHRhYmxlPElQcm9qZWN0ICwgSVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0JCXByaXZhdGUgZmluYWwgTWFwIDxJUHJvamVjdCAsIE1hcDxTdHJpbmcsIElWaXJ0dWFsQ29tcG9uZW50Pj4gY29tcG9uZW50c0FyY2hpdmVzTWFwID0gbmV3IEhhc2h0YWJsZTxJUHJvamVjdCAsIE1hcDxTdHJpbmcsIElWaXJ0dWFsQ29tcG9uZW50Pj4oKTsKLQotCQlwcml2YXRlIE9iamVjdCBjYWNoZUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkJcHVibGljIENvbXBvbmVudENhY2hlTWFuYWdlcigpIHt9Ci0KLQkJcHVibGljIHN0YXRpYyBDb21wb25lbnRDYWNoZU1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCX0KLQotCQlwdWJsaWMgSUNvbXBvbmVudEltcGxGYWN0b3J5IGdldENvbXBvbmVudEltcGxGYWN0b3J5KElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXN5bmNocm9uaXplZCAoY2FjaGVMb2NrKSB7Ci0JCQkJaWYoaXNWYWxpZENvbXBvbmVudEltcGxGYWN0b3J5KHByb2plY3QpKSB7Ci0JCQkJCU9iamVjdCBkYXRhID0gZmFjdG9yeU1hcC5nZXREYXRhKHByb2plY3QpOwotCQkJCQlpZihkYXRhIGluc3RhbmNlb2YgSUNvbXBvbmVudEltcGxGYWN0b3J5KQotCQkJCQkJcmV0dXJuIChJQ29tcG9uZW50SW1wbEZhY3RvcnkpIGRhdGE7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbXBvbmVudEltcGxGYWN0b3J5KElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXN5bmNocm9uaXplZCAoY2FjaGVMb2NrKSB7Ci0JCQkJaWYoIWZhY3RvcnlNYXAuaGFzQ2hhbmdlZChwcm9qZWN0KSAmJiAhZmFjdG9yeU1hcC5oYXNDYWNoZUVycm9yKHByb2plY3QpICYmIGZhY3RvcnlNYXAuaGFzQ2FjaGVEYXRhKHByb2plY3QpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRJbXBsRmFjdG9yeShJUHJvamVjdCBwcm9qZWN0LCBJQ29tcG9uZW50SW1wbEZhY3RvcnkgZmFjdG9yeSl7Ci0JCQlzeW5jaHJvbml6ZWQgKGNhY2hlTG9jaykgewotCQkJCWlmKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlmYWN0b3J5TWFwLm1hcmsocHJvamVjdCwgZmFjdG9yeSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmYWN0b3J5TWFwLm1hcmsocHJvamVjdCwgcHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbWFya0Vycm9yQ29tcG9uZW50SW1wbEZhY3RvcnkoSVByb2plY3QgcHJvamVjdCl7Ci0JCQlzeW5jaHJvbml6ZWQgKGNhY2hlTG9jaykgewotCQkJCWZhY3RvcnlNYXAubWFya0Vycm9yKHByb2plY3QpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGNhY2hlTG9jaykgewotCQkJCWlmKGNvbXBvbmVudHNNYXAuY29udGFpbnNLZXkocHJvamVjdCkpIHsKLQkJCQkJaWYoaXNWYWxpZENvbXBvbmVudEltcGxGYWN0b3J5KHByb2plY3QpKSB7Ci0JCQkJCQlyZXR1cm4gY29tcG9uZW50c01hcC5nZXQocHJvamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb21wb25lbnRzTWFwLnJlbW92ZShwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJCXN5bmNocm9uaXplZCAoY2FjaGVMb2NrKSB7Ci0JCQkJaWYoY29tcG9uZW50ICE9IG51bGwpCi0JCQkJCWNvbXBvbmVudHNNYXAucHV0KHByb2plY3QsIGNvbXBvbmVudCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0QXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSkgewotCQkJc3luY2hyb25pemVkIChjYWNoZUxvY2spIHsKLQkJCQlNYXAgYXJjaGl2ZXMgPSBnZXRDb21wb25lbnRBcmNoaXZlcyhwcm9qZWN0KTsJCQkKLQkJCQlpZihpc1ZhbGlkQ29tcG9uZW50SW1wbEZhY3RvcnkocHJvamVjdCkpIHsKLQkJCQkJaWYoYXJjaGl2ZXMuY29udGFpbnNLZXkoY29tcG9uZW50TmFtZSkpIHsKLQkJCQkJCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnQpIGFyY2hpdmVzLmdldChjb21wb25lbnROYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYXJjaGl2ZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgSVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0JCQkJCWNvbXBvbmVudHNBcmNoaXZlc01hcC5wdXQocHJvamVjdCwgYXJjaGl2ZXMpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0Q29tcG9uZW50QXJjaGl2ZXMoSVByb2plY3QgcHJvamVjdCkgewotCQkJc3luY2hyb25pemVkIChjYWNoZUxvY2spIHsKLQkJCQlNYXAgYXJjaGl2ZXMgPSBjb21wb25lbnRzQXJjaGl2ZXNNYXAuZ2V0KHByb2plY3QpOwotCQkJCWlmKGFyY2hpdmVzID09IG51bGwpIHsKLQkJCQkJYXJjaGl2ZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgSVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0JCQkJCWNvbXBvbmVudHNBcmNoaXZlc01hcC5wdXQocHJvamVjdCwgYXJjaGl2ZXMpOwotCQkJCX0KLQkJCQlyZXR1cm4gYXJjaGl2ZXM7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnROYW1lLCBJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGNhY2hlTG9jaykgewotCQkJCWlmKGFyY2hpdmVDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQlNYXAgYXJjaGl2ZXMgPSBDb21wb25lbnRDYWNoZU1hbmFnZXIuaW5zdGFuY2UoKS5nZXRDb21wb25lbnRBcmNoaXZlcyhwcm9qZWN0KTsKLQkJCQkJYXJjaGl2ZXMucHV0KGNvbXBvbmVudE5hbWUsIGFyY2hpdmVDb21wb25lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJCU9iamVjdFtdIGNvbXBvbmVudHMgPSBudWxsOwotCQkJT2JqZWN0W10gY29tcG9uZW50c0FyY2hpdmVzID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZCAoY2FjaGVMb2NrKSB7Ci0JCQkJY29tcG9uZW50cyA9IChPYmplY3RbXSkgY29tcG9uZW50c01hcC52YWx1ZXMoKS50b0FycmF5KCk7Ci0JCQkJY29tcG9uZW50c01hcC5jbGVhcigpOwotCQkJCQotCQkJCWNvbXBvbmVudHNBcmNoaXZlcyA9IChPYmplY3RbXSkgY29tcG9uZW50c0FyY2hpdmVzTWFwLnZhbHVlcygpLnRvQXJyYXkoKTsKLQkJCQljb21wb25lbnRzQXJjaGl2ZXNNYXAuY2xlYXIoKTsKLQkJCX0KLQkJCQotCQkJZm9yKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihjb21wb25lbnRzW2ldIGluc3RhbmNlb2YgVmlydHVhbENvbXBvbmVudCkKLQkJCQkJKChWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudHNbaV0pLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCQotCQkJZm9yKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHNBcmNoaXZlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmKGNvbXBvbmVudHNBcmNoaXZlc1tpXSBpbnN0YW5jZW9mIFZpcnR1YWxDb21wb25lbnQpCi0JCQkJCSgoVmlydHVhbENvbXBvbmVudCljb21wb25lbnRzQXJjaGl2ZXNbaV0pLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29tcG9uZW50SW1wbERlc2NyaXB0b3IgewotCi0JCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JCQotCQlwdWJsaWMgQ29tcG9uZW50SW1wbERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJCWVsZW1lbnQgPSBjb25maWdFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhbmQgcmV0dXJuIGFuIHtAbGluayBJQXJ0aWZhY3RFZGl0RmFjdG9yeX0gZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yIG9yIDxiPm51bGw8L2I+Ci0JCSAqIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBpbnN0YW50aWF0aW5nIHRoZSBleHRlbnNpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIEFuIHtAbGluayBJQXJ0aWZhY3RFZGl0RmFjdG9yeX0gZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yIG9yIDxiPm51bGw8L2I+IGlmIHRoZXJlCi0JCSAqICAgICAgICAgYXJlIHByb2JsZW1zIGluc3RhbnRpYXRpbmcgdGhlIGV4dGVuc2lvbi4KLQkJICovCi0JCXB1YmxpYyBJQ29tcG9uZW50SW1wbEZhY3RvcnkgY3JlYXRlRmFjdG9yeSgpIHsKLQotCQkJZmluYWwgSUNvbXBvbmVudEltcGxGYWN0b3J5W10gZmFjdG9yeSA9IG5ldyBJQ29tcG9uZW50SW1wbEZhY3RvcnlbMV07Ci0KLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcigwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlmYWN0b3J5WzBdID0gKElDb21wb25lbnRJbXBsRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0JCQkJfQotCi0JCQl9KTsKLQotCQkJcmV0dXJuIGZhY3RvcnlbMF07Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb21wb25lbnRJbXBsUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHVibGljIENvbXBvbmVudEltcGxSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBDT01QT05FTlRfSU1QTF9FWFRFTlNJT05fUE9JTlQpOwotCQl9IAotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChUQUdfQ09NUE9ORU5UX0lNUEwuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCi0JCQkJLyoKLQkJCQkgKiBCZWNhdXNlIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMgdHlwZSBpcyBjcmVhdGVkIGZyb20gYSBzdGF0aWMgc2luZ2xldG9uIGZpZWxkLCBhbmQKLQkJCQkgKiB0aGUgcmVnaXN0cnkgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgdHlwZSwgb3RoZXIgdGhyZWFkcyBjYW5ub3QKLQkJCQkgKiBjb21wZXRlIHdpdGggcmVhZEVsZW1lbnQoKSBmb3IgYWNjZXNzIHRvIDxpPmRlc2NyaXB0b3JzPC9pPgotCQkJCSAqLwotCQkJCQotCQkJCUhhc2hTZXQ8U3RyaW5nPiBzZXRPZklkcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQlzZXRPZklkcy5hZGQoIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKSApOwotCQkJCQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkID0gZWxlbWVudC5nZXRDaGlsZHJlbihFWFRFTkRFRF9FTEVNRU5UKTsKLQkJCQlpZiggY2hpbGQubGVuZ3RoID4gMCApewotCQkJCQlmb3IoIGludCBpPTA7IGk8IGNoaWxkLmxlbmd0aDsgaSsrICl7Ci0JCQkJCQlzZXRPZklkcy5hZGQoY2hpbGRbaV0uZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCQkJZGVzY3JpcHRvcnMucHV0KHNldE9mSWRzLCBuZXcgQ29tcG9uZW50SW1wbERlc2NyaXB0b3IoZWxlbWVudCkpOwotCQkJCQkvL2Rlc2NyaXB0b3JzLnB1dChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSksIG5ldyBDb21wb25lbnRJbXBsRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJZWxzZQotCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsICJObyB0eXBlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgZm9yICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi4iICsgQ09NUE9ORU5UX0lNUExfRVhURU5TSU9OX1BPSU5UICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJIiBleHRlbnNpb24gaW4gIiArIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhODNiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24gewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gX0RFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvQ29tcG9uZW50UmVzb2x2ZXIiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wyID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9TVFJJTkcgPSBQYXRoLlJPT1QudG9TdHJpbmcoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJodHRwOiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFZhcmlvdXMgcmVzb2x2ZXJzIGRpc2FncmVlIG9uIGhvdyBtYW55IHByZWNlZGluZyBzbGFzaGVzIHNob3VsZAotCSAqIGFjdHVhbGx5IGJlIHVzZWQuIE9uIFdpbjMyLCAyIHNsYXNoZXMgcmVzdWx0cyBpbiBhIFVSTCBvYmplY3Qgd2hlcmUgdGhlCi0JICogdm9sdW1lIGlzIHN0cmlwcGVkIG91dCBvZiB0aGUgZmlsZSBwYXRoIGFzIHRoZSBob3N0IG5hbWUsIGJ1dCBvbiBVbml4IDIKLQkgKiBpcyB0aGUgY29ycmVjdCBudW1iZXIuIE9uIFdpbjMyLCBqYXZhLmlvLkZpbGUudG9VUkwgYWRkcyBvbmx5IDEgc2xhc2gsCi0JICogYW5kIG9uIFVuaXggaXQgYWRkcyAyLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIFRoZSBJRmlsZSBmb3IgdGhpcyBmaWxlIGxvY2F0aW9uCi0JICovCi0JcHJpdmF0ZSBJRmlsZSByZWNhbGN1bGF0ZUZpbGUoU3RyaW5nIHVyaSkgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQotCQlsb25nIHRpbWUwID0gLTE7Ci0JCWlmIChfREVCVUcpCi0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZiAodXJpLnN0YXJ0c1dpdGgoSFRUUF9QUk9UT0NPTCkpIHsKLQkJCUlGaWxlIGZpbGVzW10gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uVVJJKFVSSS5jcmVhdGUodXJpKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCQkJfQotCQkJfQotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXCIiICsgdXJpICsgIlwiIGZpbmRGaWxlc0ZvckxvY2F0aW9uVVJJOiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkpOwotCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQlsb2NhdGlvbiA9IHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MMikpIHsKLQkJCQlsb2NhdGlvbiA9IHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTDIubGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbG9jYXRpb24gPSB1cmk7Ci0JCQl9Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChfREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlwiIiArIGxvY2F0aW9uICsgIlwiIGZpbmRGaWxlc0ZvckxvY2F0aW9uOiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaWYgKF9ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludCgiQ29tcG9uZW50UmVzb2x2ZXI6IHJlc29sdmUgXCJbeyIgKyBwdWJsaWNJZCArICJ9eyIgKyBzeXN0ZW1JZCArICJ9XVwiIGZyb20gXCIiICsgYmFzZUxvY2F0aW9uICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQkvLyBhcmd1bWVudCBzYW5pdHkgY2hlY2tzCi0JCS8qCi0JCSAqIENoZWNrIGZvciBhIHN5c3RlbSByZWZlcmVuY2U7IHdpdGhvdXQgb25lLCB0aGVyZSdzIG5vIHBvaW50IGluCi0JCSAqIGNvbnRpbnVpbmcgKHdlIGNhbid0IHJlc29sdmUganVzdCBhIHB1YmxpYyBpZGVudGlmaWVyKS4KLQkJICovCi0JCWlmIChzeXN0ZW1JZCA9PSBudWxsIHx8IHN5c3RlbUlkLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChfREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAobm8gc3lzdGVtIHJlZmVyZW5jZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKiBSZWNvbXB1dGUgdGhlIElGaWxlLCBpZiBuZWVkZWQsIGZyb20gdGhlIGJhc2UgbG9jYXRpb24uICovCi0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCB8fCBiYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCB8fCBiYXNlTG9jYXRpb24uc3RhcnRzV2l0aCgid2JpdDoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLyoKLQkJCQkgKiBXZSBjYW4ndCBwcm9jZWVkIGlmIHdlIGxhY2sgYm90aCBhbiBJRmlsZSBhbmQgYSBzeXN0ZW0KLQkJCQkgKiByZWZlcmVuY2UKLQkJCQkgKi8KLQkJCQlpZiAoX0RFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChubyBiYXNlIGxvY2F0aW9uIG9yIGZpbGUgZ2l2ZW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmaWxlID0gcmVjYWxjdWxhdGVGaWxlKGJhc2VMb2NhdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiBhIHdvcmtzcGFjZSBJRmlsZSBpcyAoc3RpbGwpIG5vdCB0aGUgYmFzZSBwb2ludCBvZiByZWZlcmVuY2UsCi0JCSAqIGRvbid0IGNvbnRpbnVlLgotCQkgKi8KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChub3QgYSB3b3Jrc3BhY2UgZmlsZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgYW4gYWJzb2x1dGUgVVJMIGFzIHRoZSBzeXN0ZW0gcmVmZXJlbmNlLiAqLwotCQl0cnkgewotCQkJVVJMIHRlc3RVUkwgPSBuZXcgVVJMKHN5c3RlbUlkKTsKLQkJCWlmICh0ZXN0VVJMICE9IG51bGwpIHsKLQkJCQlpZiAoX0RFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChyZWZlcmVuY2UgaXMgYWxyZWFkeSBhIFVSTCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvbnRpbnVlIHJlc29sdmluZwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIGEgVVJJIHdpdGhvdXQgYSBzY2hlbWUsIGJ1dCB3aXRoIGEgaG9zdCAqLwotCQl0cnkKLQkJewotCQkJVVJJIHVyaSA9IG5ldyBVUkkoc3lzdGVtSWQpOwotCQkJaWYgKCh1cmkuZ2V0U2NoZW1lKCkgPT0gbnVsbCkgJiYgKHVyaS5nZXRIb3N0KCkgIT0gbnVsbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1c2UpCi0JCXsKLQkJCS8vIGRvIG5vdGhpbmctIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBsb2NhbCBmaWxlCi0JCX0KLQotCQkvKiBDaGVjayBmb3IgYSBzeXN0ZW0gZmlsZSBuYW1lIGFzIHRoZSBzeXN0ZW0gcmVmZXJlbmNlLiAqLwotCQlJUGF0aCBzeXN0ZW1QYXRoID0gbmV3IFBhdGgoc3lzdGVtSWQpOwotCQlpZiAoc3lzdGVtUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChyZWZlcmVuY2UgaXMgYSBzeXN0ZW0gZmlsZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlib29sZWFuIHByZXBlbmRGaWxlUHJlZml4ID0gYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkgJiYgYmFzZUxvY2F0aW9uLmxlbmd0aCgpID4gNzsKLQkJYm9vbGVhbiBwcmVwZW5kRmlsZVByZWZpeDIgPSBiYXNlTG9jYXRpb24uc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MMikgJiYgYmFzZUxvY2F0aW9uLmxlbmd0aCgpID4gODsKLQotCQlTdHJpbmcgcmVzb2x2ZWRQYXRoID0gbnVsbDsKLQotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIkV4Y2VwdGlvbiBjYWxsaW5nIENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKCkiLCBlKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPbmx5IHJldHVybiByZXN1bHRzIGZvciBGbGV4aWJsZSBwcm9qZWN0cwotCQlpZiAodmlydHVhbFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoICYmIHJlc29sdmVkUGF0aCA9PSBudWxsOyBpKyspIHsKLQkJCQlJUGF0aCByZXNvbHZlZFJ1bnRpbWVQYXRoID0gbnVsbDsKLQkJCQlpZiAoc3lzdGVtSWQuc3RhcnRzV2l0aChST09UX1BBVEhfU1RSSU5HKSkgewotCQkJCQlyZXNvbHZlZFJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoc3lzdGVtSWQpOwotCQkJCQkvKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg0MDE3IC0gQ29tcG9uZW50UmVzb2x2ZXIgZG9lcyBub3QgcmVzb2x2ZSBhYnNvbHV0ZSByZWZlcmVuY2VzIHRvIHRoZSBjb250ZXh0IHJvb3QgKi8KLQkJCQkJaWYgKHJlc29sdmVkUnVudGltZVBhdGguc2VnbWVudENvdW50KCkgPiAxICYmIHJlc29sdmVkUnVudGltZVBhdGguc2VnbWVudCgwKS5lcXVhbHMoQ29tcG9uZW50VXRpbGl0aWVzLmdldFNlcnZlckNvbnRleHRSb290KGZpbGUuZ2V0UHJvamVjdCgpKSkpIHsKLQkJCQkJCXJlc29sdmVkUnVudGltZVBhdGggPSByZXNvbHZlZFJ1bnRpbWVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc29sdmVkUnVudGltZVBhdGggPSBuZXcgUGF0aCh2aXJ0dWFsUmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChzeXN0ZW1JZCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShmaWxlLmdldFByb2plY3QoKSwgcmVzb2x2ZWRSdW50aW1lUGF0aCk7Ci0JCQkJSUZpbGUgcmVzb2x2ZWRGaWxlID0gbnVsbDsKLQkJCQlpZiAodmlydHVhbEZpbGUuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCXJlc29sdmVkRmlsZSA9IHZpcnR1YWxGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJfQotCQkJCWlmIChyZXNvbHZlZEZpbGUgIT0gbnVsbCAmJiByZXNvbHZlZEZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcmVwZW5kRmlsZVByZWZpeCkgewotCQkJCQkJcmVzb2x2ZWRQYXRoID0gRklMRV9QUk9UT0NPTCArIHJlc29sdmVkRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJlcGVuZEZpbGVQcmVmaXgyKSB7Ci0JCQkJCQlyZXNvbHZlZFBhdGggPSBGSUxFX1BST1RPQ09MMiArIHJlc29sdmVkRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXNvbHZlZFBhdGggPSByZXNvbHZlZEZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChub3QgaW4gZmxleGlibGUgcHJvamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmIChfREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0+IFwiIiArIHJlc29sdmVkUGF0aCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRQYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNTBhZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50VXRpbGl0aWVzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIENvbnRleHRSb290TWFwcGluZyA9IG5ldyBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhlIGNvbnRhaW5lciBpcyBub3QgcmVhZC1vbmx5LgotCSAqIDxwPgotCSAqIEZvciBMaW51eCwgYSBSZXNvdXJjZSBjYW5ub3QgYmUgY3JlYXRlZCBpbiBhIFJlYWRPbmx5IGZvbGRlci4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgbmV3Ci0JICogZmlsZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB3b3Jrc3BhY2UgcmVzb3VyY2UgdG8gbWFrZSByZWFkL3dyaXRlCi0JICogQHBsYW5uZWRmb3IgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5leGlzdHMoKSkgeyAvLyBpdCBtdXN0IGJlIG5ldwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCVJlc291cmNlQXR0cmlidXRlcyBhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJCWlmICghYXR0ci5pc1JlYWRPbmx5KCkpCi0JCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJCQlhdHRyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBjcmVhdGVGb2xkZXJJbkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmb2xkZXJOYW1lICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3Rmb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChyb290Zm9sZGVyLmdldFByb2plY3QoKS5nZXROYW1lKCkpLmFwcGVuZChmb2xkZXJOYW1lKSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCVByb2plY3RVdGlsaXRpZXMuZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoZm9sZGVyKTsKLQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGZvbGRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmluc3RhbmNlKCk7Ci0JCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gcmVhZGVyLmdldEFydGlmYWN0RWRpdChjb21wLmdldFByb2plY3QoKSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBjb21wLCBTdHJpbmcgdHlwZSkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCQkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IHJlYWRlci5nZXRBcnRpZmFjdEVkaXQodHlwZSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIElGaWxlIGZpbmRGaWxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIElQYXRoIGFQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb21wID09IG51bGwgfHwgYVBhdGggPT0gbnVsbCB8fCBjb21wLmlzQmluYXJ5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdCA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbFJlc291cmNlIGZpbGUgPSByb290LmZpbmRNZW1iZXIoYVBhdGgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZ2V0VHlwZSgpID09IElWaXJ0dWFsUmVzb3VyY2UuRklMRSl7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKXsKLQkJCQlyZXR1cm4gKElGaWxlKSByZXNvdXJjZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGZpbmRDb21wb25lbnQoSVJlc291cmNlIHJlcykgewotCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnQpcmVzLmdldEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqUGxlYXNlIHJlYWQgamF2YSBkb2MgYmVmb3JlIHVzaW5nIHRoaXMgYXBpKioqKioqKioqKioqKioqKioqKgotCSAqIFRoaXMgaXMgYSB2ZXJ5IGV4cGVuc2l2ZSBhcGkgZnJvbSBhIHBlcmZvcm1hbmNlIHBvaW50IGFzIGl0IGRvZXMgYSBzdHJ1Y3R1cmUgZWRpdAotCSAqIGFjY2VzcyBhbmQgcmVsZWFzZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHdvcmtzcGFjZS4gVXNlIHRoaXMgYXBpIHZlcnkgc3BhcmluZ2x5Ci0JICogYW5kIGlmIHVzZWQgY2FjaGVkIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGlzIGFwaSBmb3IgZnVydGhlciBwcm9jZXNzaW5nCi0JICogQHJldHVybiAtIEEgYW4gYXJyYXkgb2YgYWxsIHZpcnR1YWwgY29tcG9uZW50cyBpbiB0aGUgd29ya3NwYWNlCi0JICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRBbGxXb3JrYmVuY2hDb21wb25lbnRzKCkgewotCQlMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcHJvamVjdHMgPSBBcnJheXMuYXNMaXN0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmKCBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KChJUHJvamVjdClwcm9qZWN0cy5nZXQoaSkpKXsKLQkJCQlJVmlydHVhbENvbXBvbmVudCB3YkNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCgoSVByb2plY3QpcHJvamVjdHMuZ2V0KGkpKTsKLQkJCQljb21wb25lbnRzLmFkZCh3YkNvbXApOwotCQkJfQotCQl9Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gdGVtcCA9IChJVmlydHVhbENvbXBvbmVudFtdKSBjb21wb25lbnRzLnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50W2NvbXBvbmVudHMuc2l6ZSgpXSk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQkKLQkvKioKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqUGxlYXNlIHJlYWQgamF2YSBkb2MgYmVmb3JlIHVzaW5nIHRoaXMgYXBpKioqKioqKioqKioqKioqKioqKgotCSAqIFRoaXMgaXMgYSB2ZXJ5IGV4cGVuc2l2ZSBhcGkgZnJvbSBhIHBlcmZvcm1hbmNlIHBvaW50IGFzIGl0IGRvZXMgYSBzdHJ1Y3R1cmUgZWRpdAotCSAqIGFjY2VzcyBhbmQgcmVsZWFzZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHdvcmtzcGFjZS4gVXNlIHRoaXMgYXBpIHZlcnkgc3BhcmluZ2x5Ci0JICogYW5kIGlmIHVzZWQgY2FjaGVkIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGlzIGFwaSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgotCSAqIAotCSAqIEByZXR1cm4gLSBBIHZpcnR1YWwgY29tcG9uZW50IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KFN0cmluZyBjb21wb25lbnROYW1lKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gYWxsQ29tcG9uZW50cyA9IGdldEFsbFdvcmtiZW5jaENvbXBvbmVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYWxsQ29tcG9uZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKQotCQkJCXJldHVybiBhbGxDb21wb25lbnRzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmluc3RhbmNlKCk7Ci0JCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gcmVhZGVyLmdldEFydGlmYWN0RWRpdChjb21wLmdldFByb2plY3QoKSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvcldyaXRlKGNvbXApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZmluZENvbXBvbmVudChFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCVJlc291cmNlIHJlcyA9IGFuT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlyZXR1cm4gZmluZENvbXBvbmVudChyZXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZmluZENvbXBvbmVudChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoYVJlc291cmNlKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50KWZpbGUuZ2V0QWRhcHRlcihJVmlydHVhbENvbXBvbmVudC5jbGFzcyk7Ci0JfQotCi0vLwlwdWJsaWMgc3RhdGljIEphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uIGNyZWF0ZUZsZXhKYXZhUHJvamVjdEZvclByb2plY3RPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotLy8JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLS8vCQltb2RlbC5zZXRQcm9wZXJ0eShJSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotLy8JCXJldHVybiBuZXcgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24obW9kZWwpOwotLy8JfQotCi0JcHVibGljIHN0YXRpYyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AgY3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgTGlzdCB0YXJnZXRDb21wb25lbnRQcm9qZWN0cykgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZUNvbXBvbmVudCk7Ci0JCUxpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCW1vZEhhbmRsZXNMaXN0LmFkZEFsbCh0YXJnZXRDb21wb25lbnRQcm9qZWN0cyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIG1vZEhhbmRsZXNMaXN0KTsKLQkJCi0JCXJldHVybiBuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wKG1vZGVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AgY3JlYXRlV0xQUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgTGlzdCB0YXJnZXRDb21wb25lbnRQcm9qZWN0cykgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZUNvbXBvbmVudCk7Ci0JCUxpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCW1vZEhhbmRsZXNMaXN0LmFkZEFsbCh0YXJnZXRDb21wb25lbnRQcm9qZWN0cyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIG1vZEhhbmRsZXNMaXN0KTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCIvV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihtb2RIYW5kbGVzTGlzdCAhPSBudWxsKXsKLQkJCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yKGludCBpPTA7IGk8bW9kSGFuZGxlc0xpc3Quc2l6ZSgpO2krKyl7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCltb2RIYW5kbGVzTGlzdC5nZXQoaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IGNvbXAuZ2V0TmFtZSgpLnJlcGxhY2UoJyAnLCAnXycpICsgIi5qYXIiOwotCQkJCW1hcC5wdXQoY29tcCwgdXJpKTsKLQkJCX0KLQkJCWlmKG1hcC5zaXplKCkgPiAwKXsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgbWFwKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AobW9kZWwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uIHJlbW92ZVdMUFJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wb25lbnQsIExpc3QgdGFyZ2V0Q29tcG9uZW50UHJvamVjdHMpIHsKLQkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBzb3VyY2VDb21wb25lbnQpOwotCQlMaXN0IG1vZEhhbmRsZXNMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQltb2RIYW5kbGVzTGlzdC5hZGRBbGwodGFyZ2V0Q29tcG9uZW50UHJvamVjdHMpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RIYW5kbGVzTGlzdCk7Ci0JCQotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZXR1cm4gbmV3IFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihtb2RlbCk7Ci0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24gcmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKElWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXBvbmVudCwgTGlzdCB0YXJnZXRDb21wb25lbnRQcm9qZWN0cykgewotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHNvdXJjZUNvbXBvbmVudCk7Ci0JCUxpc3QgbW9kSGFuZGxlc0xpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCW1vZEhhbmRsZXNMaXN0LmFkZEFsbCh0YXJnZXRDb21wb25lbnRQcm9qZWN0cyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIG1vZEhhbmRsZXNMaXN0KTsKLQkJcmV0dXJuIG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwpOwotCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRDb21wb25lbnRzKElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwcm9qZWN0cyE9bnVsbCkgewotCQkJZm9yIChpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3RzW2ldICE9IG51bGwpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RzW2ldKTsKLQkJCQkJaWYgKGNvbXAgIT0gbnVsbCAmJiBjb21wLmV4aXN0cygpKQotCQkJCQkJcmVzdWx0LmFkZChjb21wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKSByZXN1bHQudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSBjb250ZXh0IHJvb3QgZm9yIHRoZSBhc3NvY2lhdGVkIHdvcmtiZW5jaCBtb2R1bGUgd2hpY2ggaXMgdXNlZAotCSAqIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZS4gIFRoaXMgbWV0aG9kIGlzIG5vdCB5ZXQgY29tcGxldGVkIGFzIHRoZSBjb250ZXh0IHJvb3QgaGFzIHRvIGJlCi0JICogYWJzdHJhY3RlZCBhbmQgYWRkZWQgdG8gdGhlIHdvcmtiZW5jaE1vZHVsZSBtb2RlbC4gIFRoaXMgQVBJIHdpbGwgbm90IGNoYW5nZSB0aG91Z2guCi0JICogUmV0dXJucyBudWxsIGZvciBub3cuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIGNvbnRleHQgcm9vdCBmb3IgcnVudGltZSBvZiB0aGUgYXNzb2NpYXRlZCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJDb250ZXh0Um9vdChJUHJvamVjdCBwcm9qZWN0KSB7CQkKLQkJCi0JCWlmKCFDb250ZXh0Um9vdE1hcHBpbmcuaGFzQ2hhbmdlZChwcm9qZWN0KSkgewotCQkJLypTaW1wbHkgcmV0dXJuIHRoZSBjYWNoZWQgZGF0YSovCi0JCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCQlpZighQ29udGV4dFJvb3RNYXBwaW5nLmhhc0NhY2hlRXJyb3IocHJvamVjdCkgJiYgQ29udGV4dFJvb3RNYXBwaW5nLmhhc0NhY2hlRGF0YShwcm9qZWN0KSkKLQkJCQlkYXRhID0gKFN0cmluZykgQ29udGV4dFJvb3RNYXBwaW5nLmdldERhdGEocHJvamVjdCk7Ci0JCQlyZXR1cm4gZGF0YTsKLQkJfQotCQkKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJaWYgKG1vZHVsZUNvcmUgPT0gbnVsbCB8fCBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpID09IG51bGwpIHsKLQkJCQlDb250ZXh0Um9vdE1hcHBpbmcubWFya0Vycm9yKHByb2plY3QpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCUxpc3QgZXhpc3RpbmdQcm9wcyA9IHdiQ29tcG9uZW50LmdldFByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ1Byb3BzLnNpemUoKTsgaSsrKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBleGlzdGluZ1Byb3BzLmdldChpKTsKLQkJCWlmKHByb3AuZ2V0TmFtZSgpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkNPTlRFWFRST09UKSl7Ci0JCQkJQ29udGV4dFJvb3RNYXBwaW5nLm1hcmsocHJvamVjdCwgcHJvcC5nZXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm4gcHJvcC5nZXRWYWx1ZSgpOwotCQkJfQotCQl9CQkKLQkJQ29udGV4dFJvb3RNYXBwaW5nLm1hcmtFcnJvcihwcm9qZWN0KTsKLQkJLy8gSWYgYWxsIGVsc2UgZmFpbHMuLi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjb250ZXh0IHJvb3Qgb24gdGhlIGFzc29jaWF0ZWQgd29ya2JlbmNoIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBzdHJpbmcKLQkgKiB2YWx1ZSBwYXNzZWQgaW4uICBUaGlzIGNvbnRleHQgcm9vdCBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZS4gIFRoaXMgbWV0aG9kIGlzIG5vdCB5ZXQKLQkgKiBjb21wbGV0ZWQgYXMgdGhlIGNvbnRleHQgcm9vdCBzdGlsbCBuZWVkcyB0byBiZSBhYnN0cmFjdGVkIGFuZCBhZGRlZCB0byB0aGUgd29ya2JlbmNoIG1vZHVsZQotCSAqIG1vZGVsLiAgVGhpcyBBUEkgd2lsbCBub3QgY2hhbmdlIHRob3VnaC4KLQkgKiBEb2VzIG5vdGhpbmcgYXMgb2Ygbm93LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Um9vdCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5ld0NvbnRleHRSb290KSB7Ci0JCQotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVNlcnZlckNvbnRleHRSb290RGF0YU1vZGVsUHJvcGVydGllcy5jbGFzcyk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCwgcHJvamVjdCk7Ci0JCW1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElTZXJ2ZXJDb250ZXh0Um9vdERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09ULAotCQkJCW5ld0NvbnRleHRSb290KTsKLQkJCi0JCXRyeSB7Ci0JCQltb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RGVwbG95VXJpT2ZDb21wb25lbnQoSVZpcnR1YWxSZWZlcmVuY2UsIFN0cmluZyl9Ci0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXBsb3lVcmlPZlV0aWxDb21wb25lbnQoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKXsKLQkJcmV0dXJuIENvbXBvbmVudFV0aWxpdGllcy5nZXREZXBsb3lVcmlPZkNvbXBvbmVudChyZWZlcmVuY2UsICIuamFyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXBsb3lVcmlPZkNvbXBvbmVudChJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gcmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCk7Ci0JCVN0cmluZyB1cmkgPSBudWxsOwotCQlpZiggYXJjaGl2ZU5hbWUgIT0gbnVsbCAmJiAhYXJjaGl2ZU5hbWUuZXF1YWxzKCIiKSApeyAvLyROT04tTkxTLTEkCi0JCQl1cmkgPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSArICIvIiArIHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX1lbHNlewotCQkJdXJpID0gcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkgKyAiLyIgKyByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyBleHRlbnNpb247IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudGNvcmVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDkxODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkuamF2YSx2IDEuNi4yOC4xIDIwMTEvMDgvMDMgMTk6NDE6NTkgcnNhbmNoZXogRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudGNvcmVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnRjb3JlU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IENvbXBvbmVudGNvcmVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JrYmVuY2hDb21wb25lbnQoV29ya2JlbmNoQ29tcG9uZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrYmVuY2hDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50UmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRUeXBlKENvbXBvbmVudFR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBvbmVudFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWZlcmVuY2VkQ29tcG9uZW50KFJlZmVyZW5jZWRDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0Q29tcG9uZW50cyhQcm9qZWN0Q29tcG9uZW50cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvamVjdENvbXBvbmVudHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCA8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtiZW5jaENvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlIDxlbT5Db21wb25lbnQgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvbmVudFJlc291cmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50IDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMgPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvamVjdENvbXBvbmVudHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRjb3JlU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRjb3JlU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MjE1YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50Y29yZVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50Y29yZVN3aXRjaC5qYXZhLHYgMS43LjQuMSAyMDExLzA4LzAzIDE5OjQxOjU5IHJzYW5jaGV6IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRjb3JlU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvbmVudGNvcmVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Y29yZVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVDogewotCQkJCVdvcmtiZW5jaENvbXBvbmVudCB3b3JrYmVuY2hDb21wb25lbnQgPSAoV29ya2JlbmNoQ29tcG9uZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXb3JrYmVuY2hDb21wb25lbnQod29ya2JlbmNoQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRTogewotCQkJCUNvbXBvbmVudFJlc291cmNlIGNvbXBvbmVudFJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb21wb25lbnRSZXNvdXJjZShjb21wb25lbnRSZXNvdXJjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRTogewotCQkJCUNvbXBvbmVudFR5cGUgY29tcG9uZW50VHlwZSA9IChDb21wb25lbnRUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb21wb25lbnRUeXBlKGNvbXBvbmVudFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFk6IHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvcGVydHkocHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlQ6IHsKLQkJCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSAoUmVmZXJlbmNlZENvbXBvbmVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVmZXJlbmNlZENvbXBvbmVudChyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UUzogewotCQkJCVByb2plY3RDb21wb25lbnRzIHByb2plY3RDb21wb25lbnRzID0gKFByb2plY3RDb21wb25lbnRzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9qZWN0Q29tcG9uZW50cyhwcm9qZWN0Q29tcG9uZW50cyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtiZW5jaENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ29tcG9uZW50UmVzb3VyY2UoQ29tcG9uZW50UmVzb3VyY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvcGVydHkoUHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlZmVyZW5jZWRDb21wb25lbnQoUmVmZXJlbmNlZENvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0Q29tcG9uZW50cyhQcm9qZWN0Q29tcG9uZW50cyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NvbXBvbmVudGNvcmVTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGVuZGVuY3lUeXBlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTEyN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdUUE1vZHVsZXNYbWxNYXBwZXJJewotCQotCXB1YmxpYyBEZXBlbmRlbmN5VHlwZVRyYW5zbGF0b3IoKXsKLQkJc3VwZXIoREVQRU5ERU5DWV9UWVBFLENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVuY3lUeXBlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlTdHJpbmcgY29ycmVjdCA9IHN0clZhbHVlOwotCQlpZiAoc3RyVmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIkNPTlNVTUVTIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSBEZXBlbmRlbmN5VHlwZS5DT05TVU1FU19MSVRFUkFMLmdldE5hbWUoKTsgCi0JCWVsc2UgaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJVU0VTIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSBEZXBlbmRlbmN5VHlwZS5VU0VTX0xJVEVSQUwuZ2V0TmFtZSgpOyAKLQkJCQotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoY29ycmVjdCwgb3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwbG95ZWRQYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGxveWVkUGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjQyMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwbG95ZWRQYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXBsb3llZFBhdGhQcm92aWRlciBpbXBsZW1lbnRzIElQYXRoUHJvdmlkZXIgewotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGhQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBEZXBsb3llZFBhdGhQcm92aWRlcigpOwotCQotCXByaXZhdGUgRGVwbG95ZWRQYXRoUHJvdmlkZXIoKSB7fSAKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51dGlsLklQYXRoUHJvdmlkZXIjZ2V0UGF0aChvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgeyAKLQkJcmV0dXJuIGFNb2R1bGVSZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpOwotCX0KLQkKLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0VjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0VjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwOTUyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9FY2xpcHNlUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gRWNsaXBzZVJlc291cmNlQWRhcHRlci5jbGFzczsKLQlwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZTsgCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gYU5vdGlmaWNhdGlvbikgewotCQlpZiAoYU5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlX1NvdXJjZVBhdGgoKSkgewotCQkJaWYgKGFOb3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCXJlc291cmNlID0gbnVsbDsKLQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0RWNsaXBzZVJlc291cmNlKCkgeyAKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCi0JCQkJSVByb2plY3QgY29udGFpbmVyID0gbnVsbDsKLQkJCQlDb21wb25lbnRSZXNvdXJjZSBtb2R1bGVSZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgZ2V0VGFyZ2V0KCk7Ci0JCQkJaWYgKG1vZHVsZVJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJSVBhdGggc291cmNlUGF0aCA9IG1vZHVsZVJlc291cmNlLmdldFNvdXJjZVBhdGgoKTsKLQkJCQkJaWYgKG1vZHVsZVJlc291cmNlLmdldE93bmluZ1Byb2plY3QoKSAhPSBudWxsKQotCQkJCQkJY29udGFpbmVyID0gbW9kdWxlUmVzb3VyY2UuZ2V0T3duaW5nUHJvamVjdCgpOwotCQkJCQllbHNlCi0JCQkJCQljb250YWluZXIgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KG1vZHVsZVJlc291cmNlLmdldENvbXBvbmVudCgpKTsKLQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJcmVzb3VyY2UgPSBjb250YWluZXIuZmluZE1lbWJlcihzb3VyY2VQYXRoKTsgCi0JCQkJCWlmKHJlc291cmNlID09IG51bGwpCi0JCQkJCQlyZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihzb3VyY2VQYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgYVR5cGUpIHsKLQkJcmV0dXJuIEFEQVBURVJfVFlQRSA9PSBhVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9GYWNldGVkUHJvamVjdFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRmFjZXRlZFByb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyNjNjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9GYWNldGVkUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhY2V0ZWRQcm9qZWN0VXRpbGl0aWVzIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQkJcmV0dXJuIGdldFByb2plY3RGYWNldFZlcnNpb24ocHJvamVjdCwgdHlwZUlEKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlEKXsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKHR5cGVJRCkpIHsKLQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGVJRCk7Ci0JCQlpZihwcm9qZWN0RmFjZXQgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0RmFjZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgewotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCXJldHVybiBwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSFJlZlRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0hSZWZUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjdjN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSFJlZlRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotcHVibGljIGNsYXNzIEhSZWZUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwdWJsaWMgSFJlZlRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwKLQkJCUVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgSFJlZlRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yUGF0aFtdIHBhdGhzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aHMpOwotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwKLQkJCWludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHN0eWxlKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgewotCQlPYmplY3QgcmV0VmFsID0gbnVsbDsKLQkJaWYgKGFWYWx1ZSAhPSBudWxsKQotCQl7Ci0JCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnQgZWFyQ29tcCA9IChXb3JrYmVuY2hDb21wb25lbnQpYW5Pd25lci5lQ29udGFpbmVyKCk7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGVhckNvbXApKTsKLQkJCQlBcnRpZmFjdEVkaXQgZWRpdCA9IChBcnRpZmFjdEVkaXQpdmlydHVhbENvbXAuZ2V0QWRhcHRlcihBcnRpZmFjdEVkaXQuY2xhc3MpOwotCQkJCWlmIChlZGl0ICE9IG51bGwpCi0JCQkJewotCQkJCQlFT2JqZWN0IGNvbnRlbnRNb2RlbFJvb3QgPSBlZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsgCi0JCQkJCWlmKCBjb250ZW50TW9kZWxSb290ICE9IG51bGwgKQotCQkJCQl7Ci0JCQkJCQlyZXMgPSBjb250ZW50TW9kZWxSb290LmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcyBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkKLQkJCQkJCQlyZXRWYWwgPSByZXMuZ2V0RU9iamVjdChhVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKChyZXMgIT0gbnVsbCkgJiYgcmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotLy8JCQkJcmVzLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0vLwkJCQlyZXMudW5sb2FkKCk7Ci0vLwkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0VmFsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvciNjb252ZXJ0VmFsdWVUb1N0cmluZyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgYVZhbHVlLCBFT2JqZWN0IGFuT3duZXIpIHsgCi0JCVN0cmluZyBmcmFnID0gbnVsbDsKLQkJUmVzb3VyY2UgdGhlUmVzb3VyY2UgPSAoKEVPYmplY3QpYVZhbHVlKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHRoZVJlc291cmNlICE9IG51bGwpCi0JCXsKLQkJCWlmICh0aGVSZXNvdXJjZSBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkKLQkJCQlmcmFnID0gdGhlUmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQoKEVPYmplY3QpYVZhbHVlKTsKLQkJCWVsc2UKLQkJCQlmcmFnID0gbnVsbDsKLQkJfQotCQllbHNlCi0JCQlmcmFnID0gRWNvcmVVdGlsLmdldElEKChFT2JqZWN0KWFWYWx1ZSk7Ci0JCXJldHVybiBmcmFnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUFydGlmYWN0RWRpdEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lBcnRpZmFjdEVkaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNWY0NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUFydGlmYWN0RWRpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RFZGl0RmFjdG9yeSB7Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpOwotCQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lDb21wb25lbnRJbXBsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUNvbXBvbmVudEltcGxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzNiMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUNvbXBvbmVudEltcGxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudEltcGxGYWN0b3J5IHsKLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QpOwotCQotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBjcmVhdGVGb2xkZXIoSVByb2plY3QgYVByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCk7Ci0JCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGNyZWF0ZUFyY2hpdmVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBhcmNoaXZlTG9jYXRpb24sIElQYXRoIGFSdW50aW1lUGF0aCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lNb2R1bGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lNb2R1bGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzZDlkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JTW9kdWxlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfU0VUVElOR1MgPSAgIi5zZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT01QT05FTlRfRklMRV9OQU1FID0gIi5jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBQYXRoIENPTVBPTkVOVF9GSUxFX1BBVEggPSBuZXcgUGF0aChTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1RQTU9EVUxFX0ZJTEVfTkFNRSA9ICIud3RwbW9kdWxlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFBhdGggUjFfTU9EVUxFX01FVEFfRklMRV9QQVRIID0gbmV3IFBhdGgoIi5zZXR0aW5ncy8uY29tcG9uZW50Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFBhdGggV1RQTU9EVUxFX0ZJTEVfUEFUSCA9IG5ldyBQYXRoKFdUUE1PRFVMRV9GSUxFX05BTUUpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PRFVMRV9QTFVHX0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNT0RVTEVfTkFUVVJFX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9tb2R1bGVUeXBlcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX0VKQl9NT0RVTEUgPSAianN0LmVqYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfVVRJTElUWV9NT0RVTEUgPSAianN0LnV0aWxpdHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NUX1dFQl9NT0RVTEUgPSAid3N0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfRUFSX01PRFVMRSA9ICJqc3QuZWFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9BUFBDTElFTlRfTU9EVUxFID0gImpzdC5hcHBjbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX0NPTk5FQ1RPUl9NT0RVTEUgPSAianN0LmNvbm5lY3RvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfSkFWQSA9ICJqc3QuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfV0VCRlJBR01FTlRfTU9EVUxFID0gImpzdC53ZWJmcmFnbWVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBFeHRlbnNpb25zCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUFSX0VYVEVOU0lPTiA9ICIuZWFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdBUl9FWFRFTlNJT04gPSAiLndhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSQVJfRVhURU5TSU9OID0gIi5yYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFUEVOREVOVF9NT0RVTEUgPSAiZGVwZW5kZW50IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vUHJvcGVydHkgQ29uc3RhbnRzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPSl9SRUxfSkFWQV9PVVRQVVRfUEFUSCA9ICJqYXZhLW91dHB1dC1wYXRoIjsgLy8kTk9OLU5MUy0xJCAKLSAgICAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT05URVhUUk9PVCA9ICJjb250ZXh0LXJvb3QiOyAvLyROT04tTkxTLTEkCi0JIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODllZGQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lQYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUGF0aFByb3ZpZGVyIHsKLQkKLQlJUGF0aCBnZXRQYXRoKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSk7Ci0JCi0JRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JUGF0aFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxMmNiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JUGF0aFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBJUGF0aFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBJUGF0aFRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoYURvbVBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIElQYXRoVHJhbnNsYXRvcihTdHJpbmcgYURvbVBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggYVRyYW5zbGF0b3JQYXRoKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgbmV3IFRyYW5zbGF0b3JQYXRoW117YVRyYW5zbGF0b3JQYXRofSk7Ci0JfQotCQotCXB1YmxpYyBJUGF0aFRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gdGhlVHJhbnNsYXRvclBhdGhzKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgdGhlVHJhbnNsYXRvclBhdGhzKTsKLQl9Ci0JCi0JcHVibGljIElQYXRoVHJhbnNsYXRvcihTdHJpbmcgYURvbVBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IGFTdHlsZU1hc2spIHsKLQkJc3VwZXIoYURvbVBhdGgsIGFGZWF0dXJlLCBhU3R5bGVNYXNrKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIGFWYWx1ZSwgRU9iamVjdCBhbk93bmVyKSB7IAotCQlyZXR1cm4gbmV3IFBhdGgoYVZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhbk93bmVyKSB7IAotCQlpZihhVmFsdWUgaW5zdGFuY2VvZiBJUGF0aCkgCi0JCQlyZXR1cm4gKChJUGF0aClhVmFsdWUpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyhhVmFsdWUsIGFuT3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNlNjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVFY2xpcHNlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlRWNsaXBzZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBNT0RVTEVfQ09SRV9DTEFTUyA9IFN0cnVjdHVyZUVkaXQuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgVklSVFVBTF9DT01QT05FTlRfQ0xBU1MgPSBJVmlydHVhbENvbXBvbmVudC5jbGFzczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgTU9EVUxFX0NPUkVfQ0xBU1MsIFZJUlRVQUxfQ09NUE9ORU5UX0NMQVNTfTsKLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSwgQ2xhc3MgYW5BZGFwdGVyVHlwZSkgewotCQlpZihhbkFkYXB0ZXJUeXBlID09IE1PRFVMRV9DT1JFX0NMQVNTKQotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlRWRpdCgoTW9kdWxlU3RydWN0dXJhbE1vZGVsKWFkYXB0YWJsZSk7Ci0JCWlmKGFuQWRhcHRlclR5cGUgPT0gVklSVFVBTF9DT01QT05FTlRfQ0xBU1MpCi0JCQlyZXR1cm4gZ2V0Q29tcG9uZW50KChJUmVzb3VyY2UpYWRhcHRhYmxlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0Q29tcG9uZW50KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gbnVsbDsKLQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgcmV0dXJuIG51bGw7Ci0JCQkKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQlpZiAobW9kdWxlQ29yZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCVdvcmtiZW5jaENvbXBvbmVudFtdIGNvbXBzID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQkJaWYgKGNvbXBzLmxlbmd0aCA+IDApCi0JCQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbW9kdWxlID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50KHJlc291cmNlLmdldEZ1bGxQYXRoKCksUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7CQotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbW9kdWxlID09IG51bGwgPyBudWxsIDogQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsgCi0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Nb2R1bGVDb3JlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2UzOTVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAibW9kdWxlY29yZU5MUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIE1vZHVsZUNvcmVNZXNzYWdlcygpIHsKLQkJLy9kbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTW9kdWxlQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfUmVhZF9FeGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfV3JpdGVfRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvU291cmNlUGF0aFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Tb3VyY2VQYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjNGFiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Tb3VyY2VQYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VQYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJUGF0aFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgU291cmNlUGF0aFByb3ZpZGVyKCk7Ci0JCi0JcHJpdmF0ZSBTb3VyY2VQYXRoUHJvdmlkZXIoKSB7fSAKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51dGlsLklQYXRoUHJvdmlkZXIjZ2V0UGF0aChvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgewotCQlyZXR1cm4gYU1vZHVsZVJlc291cmNlLmdldFNvdXJjZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1VSSVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1VSSVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3NDNmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9VUklUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFVSSVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBVUklUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyBVUklUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBhVHJhbnNsYXRvclBhdGgpIHsKLQkJc3VwZXIoYURvbVBhdGgsIGFGZWF0dXJlLCBuZXcgVHJhbnNsYXRvclBhdGhbXXthVHJhbnNsYXRvclBhdGh9KTsKLQl9Ci0JCi0JcHVibGljIFVSSVRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gdGhlVHJhbnNsYXRvclBhdGhzKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgdGhlVHJhbnNsYXRvclBhdGhzKTsKLQl9Ci0JCi0JcHVibGljIFVSSVRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBhU3R5bGVNYXNrKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgYVN0eWxlTWFzayk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgeyAKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoYVZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhbk93bmVyKSB7IAotCQlpZihhVmFsdWUgaW5zdGFuY2VvZiBVUkkpIAotCQkJcmV0dXJuICgoVVJJKWFWYWx1ZSkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGFWYWx1ZSwgYW5Pd25lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9WaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9WaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMTJiNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvVmlydHVhbFJlZmVyZW5jZVV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzIGltcGxlbWVudHMgSU1vZHVsZUNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBWaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzIElOU1RBTkNFID0gbmV3IFZpcnR1YWxSZWZlcmVuY2VVdGlsaXRpZXMoKTsKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmc7Ci0JVmlydHVhbFJlZmVyZW5jZVV0aWxpdGllcygpIHsKLQkJbWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQltYXBwaW5nLnB1dChKU1RfQVBQQ0xJRU5UX01PRFVMRSwgSkFSX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwcGluZy5wdXQoSlNUX1dFQl9NT0RVTEUsIFdBUl9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCW1hcHBpbmcucHV0KEpTVF9FSkJfTU9EVUxFLCBKQVJfRVhURU5TSU9OKTsgLy8kTk9OLU5MUy0xJAotCQltYXBwaW5nLnB1dChXU1RfV0VCX01PRFVMRSwgV0FSX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwcGluZy5wdXQoSlNUX0VBUl9NT0RVTEUsIEVBUl9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCW1hcHBpbmcucHV0KEpTVF9DT05ORUNUT1JfTU9EVUxFLCBSQVJfRVhURU5TSU9OKTsgLy8kTk9OLU5MUy0xJAotCQltYXBwaW5nLnB1dChKU1RfVVRJTElUWV9NT0RVTEUsIEpBUl9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCW1hcHBpbmcucHV0KEpTVF9XRUJGUkFHTUVOVF9NT0RVTEUsIEpBUl9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEFkZCBhIG1hcHBpbmcgZm9yIHNvbWUgZmFjZXQgdHlwZSB0byBzb21lIGRlZmF1bHQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGZhY2V0IAotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmFjZXQsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJaWYoICFtYXBwaW5nLmNvbnRhaW5zS2V5KGZhY2V0KSkgewotCQkJaWYoIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChmYWNldCkpIHsKLQkJCQltYXBwaW5nLnB1dChmYWNldCwgZXh0ZW5zaW9uKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIFRoaXMgaXMgYSB1dGlsaXR5IG1ldGhvZCBjbGllbnRzIG1heSBvciBtYXkgbm90IGNob29zZSB0byBtYWtlIHVzZSBvZgotCSAqIHRvIGVuc3VyZSB0aGF0IGFsbCBQcm9qZWN0IHJlZmVyZW5jZXMgaGF2ZSBzb21lIGFyY2hpdmVOYW1lIGFzc29jaWF0ZWQgd2l0aCBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnN1cmVSZWZlcmVuY2VzSGF2ZU5hbWVzKElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcykgewotCQlmb3IoIGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiggcmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpID09IG51bGwgfHwgcmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlZnNbaV0uc2V0QXJjaGl2ZU5hbWUoZ2V0RGVmYXVsdEFyY2hpdmVOYW1lKHJlZnNbaV0pKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybiB3aGF0IHRoZSBzdWdnZXN0ZWQgYXJjaGl2ZU5hbWUgaXMgCi0JICogQHBhcmFtIHJlZgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRBcmNoaXZlTmFtZShJVmlydHVhbFJlZmVyZW5jZSByZWYpIHsKLQkJaWYoICFyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0UHJvamVjdEFyY2hpdmVOYW1lKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQl9IAotCQkvLyBiaW5hcnkKLQkJcmV0dXJuIG5ldyBQYXRoKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0RGVwbG95ZWROYW1lKCkpLmxhc3RTZWdtZW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFByb2plY3RBcmNoaXZlTmFtZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpID0gbWFwcGluZy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTdHJpbmcgZmFjZXQ7Ci0JCVN0cmluZyBuYW1lID0gKGNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSA9PSBudWxsID8gY29tcG9uZW50LmdldE5hbWUoKSA6IGNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSk7Ci0JCXdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0JCQlmYWNldCA9IGkubmV4dCgpOwotCQkJaWYoIEZhY2V0ZWRQcm9qZWN0VXRpbGl0aWVzLmlzUHJvamVjdE9mVHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBmYWNldCkpCi0JCQkJcmV0dXJuIG5hbWUgKyBtYXBwaW5nLmdldChmYWNldCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWUgKyBKQVJfRVhURU5TSU9OOyAKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9XVFBNb2R1bGVzVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvV1RQTW9kdWxlc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmYTY0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9XVFBNb2R1bGVzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkdlbmVyaWNUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLklEVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBXVFBNb2R1bGVzVHJhbnNsYXRvciBleHRlbmRzIFJvb3RUcmFuc2xhdG9yIGltcGxlbWVudHMgV1RQTW9kdWxlc1htbE1hcHBlckl7Ci0JcHVibGljIHN0YXRpYyBXVFBNb2R1bGVzVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBXVFBNb2R1bGVzVHJhbnNsYXRvcigpOwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRjb3JlUGFja2FnZSBNT0RVTEVfQ09SRV9QS0cgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBXVFBNb2R1bGVzVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoUFJPSkVDVF9NT0RVTEVTLCBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHMoKSk7Ci0JfQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gY3JlYXRlV1RQTW9kdWxlc1RyYW5zbGF0b3IoKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlV1RQTW9kdWxlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkJbmV3IFRyYW5zbGF0b3IoUFJPSkVDVF9WRVJTSU9OLCBNT0RVTEVfQ09SRV9QS0cuZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpLCBET01fQVRUUklCVVRFKSwgCi0JCQkJY3JlYXRlV0JNb2R1bGVUcmFuc2xhdG9yKE1PRFVMRV9DT1JFX1BLRy5nZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCkpCi0JCX07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlV0JNb2R1bGVUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV09SS0JFTkNIX0NPTVBPTkVOVCwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQkvL25ldyBUcmFuc2xhdG9yKEhBTkRMRSwgTU9EVUxFX0NPUkVfUEtHLmdldFdvcmtiZW5jaENvbXBvbmVudF9IYW5kbGUoKSwgRE9NX0FUVFJJQlVURSksIFJFTU9WRUQgU0lOQ0UgSEFORExFIFNIT1VMRCBOT1cgQkUgREVSSVZFRCAtTURFCi0JCQluZXcgVHJhbnNsYXRvcihSVU5USU1FX05BTUUsIE1PRFVMRV9DT1JFX1BLRy5nZXRXb3JrYmVuY2hDb21wb25lbnRfTmFtZSgpLCBET01fQVRUUklCVVRFKSwgCi0JCQljcmVhdGVNb2R1bGVUeXBlVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKSksCi0JCQljcmVhdGVXQlJlc291cmNlVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpKSwKLQkJCWNyZWF0ZURlcGVuZGVudE1vZHVsZVRyYW5zbGF0b3IoTU9EVUxFX0NPUkVfUEtHLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZWZlcmVuY2VkQ29tcG9uZW50cygpKSwKLQkJCW5ldyBJUGF0aFRyYW5zbGF0b3IoTUVUQV9SRVNPVVJDRVMsIE1PRFVMRV9DT1JFX1BLRy5nZXRXb3JrYmVuY2hDb21wb25lbnRfTWV0YWRhdGFSZXNvdXJjZXMoKSksCi0JCQljcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Byb3BlcnRpZXMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTW9kdWxlVHlwZVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihNT0RVTEVfVFlQRSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7CQkJCi0JCQluZXcgVHJhbnNsYXRvcihDT01QT05FTlRfVFlQRV9JRCwgTU9EVUxFX0NPUkVfUEtHLmdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IFRyYW5zbGF0b3IoTUVUQV9SRVNPVVJDRVMsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRUeXBlX01ldGFkYXRhUmVzb3VyY2VzKCkpLAotCQkJbmV3IFRyYW5zbGF0b3IoQ09NUE9ORU5UX1RZUEVfVkVSU0lPTiwgTU9EVUxFX0NPUkVfUEtHLmdldENvbXBvbmVudFR5cGVfVmVyc2lvbigpKSwKLQkJCWNyZWF0ZVByb3BlcnRpZXNUcmFuc2xhdG9yKE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKSkKLQkJCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUFJPUEVSVFksIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IFRyYW5zbGF0b3IoUFJPUEVSVFlfTkFNRSwgTU9EVUxFX0NPUkVfUEtHLmdldFByb3BlcnR5X05hbWUoKSwgRE9NX0FUVFJJQlVURSApLAotCQkJbmV3IFRyYW5zbGF0b3IoUFJPUEVSVFlfVkFMVUUsIE1PRFVMRV9DT1JFX1BLRy5nZXRQcm9wZXJ0eV9WYWx1ZSgpLCBET01fQVRUUklCVVRFICksCi0JCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlRGVwZW5kZW50TW9kdWxlVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFJFRkVSRU5DRURfQ09NUE9ORU5ULCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsgCi0JCQluZXcgSVBhdGhUcmFuc2xhdG9yKFJVTlRJTUVfUEFUSCwgTU9EVUxFX0NPUkVfUEtHLmdldFJlZmVyZW5jZWRDb21wb25lbnRfUnVudGltZVBhdGgoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVVJJVHJhbnNsYXRvcihIQU5ETEUsIE1PRFVMRV9DT1JFX1BLRy5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0hhbmRsZSgpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBIUmVmVHJhbnNsYXRvcihERVBfT0JKRUNULE1PRFVMRV9DT1JFX1BLRy5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKEFSQ0hJVkVfTkFNRSwgTU9EVUxFX0NPUkVfUEtHLmdldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yKCkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVdCUmVzb3VyY2VUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoQ09NUE9ORU5UX1JFU09VUkNFLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKLQkJCW5ldyBJUGF0aFRyYW5zbGF0b3IoU09VUkNFX1BBVEgsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IElQYXRoVHJhbnNsYXRvcihSVU5USU1FX1BBVEgsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFJFU09VUkNFX1RZUEUsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRSZXNvdXJjZV9SZXNvdXJjZVR5cGUoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihFWENMVVNJT05TLCBNT0RVTEVfQ09SRV9QS0cuZ2V0Q29tcG9uZW50UmVzb3VyY2VfRXhjbHVzaW9ucygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFRBRywgTU9EVUxFX0NPUkVfUEtHLmdldENvbXBvbmVudFJlc291cmNlX1RhZygpLERPTV9BVFRSSUJVVEUpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvV1RQTW9kdWxlc1htbE1hcHBlckkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1dUUE1vZHVsZXNYbWxNYXBwZXJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzU3ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvV1RQTW9kdWxlc1htbE1hcHBlckkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBXVFBNb2R1bGVzWG1sTWFwcGVySSB7Ci0JU3RyaW5nIFBST0pFQ1RfTU9EVUxFUyA9ICJwcm9qZWN0LW1vZHVsZXMiOy8vJE5PTi1OTFMtMSQgIAotCVN0cmluZyBXT1JLQkVOQ0hfQ09NUE9ORU5UID0gIndiLW1vZHVsZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRUZFUkVOQ0VEX0NPTVBPTkVOVCA9ICJkZXBlbmRlbnQtbW9kdWxlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTVBPTkVOVF9SRVNPVVJDRSA9ICJ3Yi1yZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTU9EVUxFX1RZUEUgPSAibW9kdWxlLXR5cGUiOy8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIE1FVEFfUkVTT1VSQ0VTID0gIm1ldGEtcmVzb3VyY2VzIjsvLyROT04tTkxTLTEkIAotCVN0cmluZyBDT01QT05FTlRfVFlQRV9WRVJTSU9OID0gInZlcnNpb24iOy8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIEhBTkRMRSA9ICJoYW5kbGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVQX09CSkVDVCA9ICJkZXBlbmRlbnQtb2JqZWN0IjsvLyROT04tTkxTLTEkIAotCVN0cmluZyBPQkpFQ1RSRUYgPSAiaHJlZiI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBERVBFTkRFTkNZX1RZUEUgPSAiZGVwZW5kZW5jeS10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNPVVJDRV9QQVRIID0gInNvdXJjZS1wYXRoIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSVU5USU1FX1BBVEggPSAiZGVwbG95LXBhdGgiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYQ0xVU0lPTlMgPSAiZXhjbHVzaW9ucyI7Ly8kTk9OLU5MUy0xJCAgCi0JU3RyaW5nIENPTVBPTkVOVF9UWVBFX0lEID0gIm1vZHVsZS10eXBlLWlkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSVU5USU1FX05BTUUgPSAiZGVwbG95LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUWV9OQU1FID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfVkFMVUUgPSAidmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZS10eXBlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFSQ0hJVkVfTkFNRT0iYXJjaGl2ZU5hbWUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPSkVDVF9WRVJTSU9OPSJwcm9qZWN0LXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBRz0idGFnIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9aaXBGaWxlRXhwb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1ppcEZpbGVFeHBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBhNWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1ppcEZpbGVFeHBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogRXhwb3J0cyByZXNvdXJjZXMgdG8gYSAuemlwIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIFppcEZpbGVFeHBvcnRlciB7Ci0JcHJpdmF0ZSBaaXBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNvbXByZXNzaW9uID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21wcmVzcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqIEBwYXJhbSBpbmNsdWRlTWFuaWZlc3RGaWxlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFppcEZpbGVFeHBvcnRlcihTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gY29tcHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVBhdGggZGlyZWN0b3J5UGF0aCA9IG5ldyBQYXRoKGZpbGVuYW1lKTsKLQkJZGlyZWN0b3J5UGF0aCA9IChQYXRoKSBkaXJlY3RvcnlQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJRmlsZSBuZXdaaXBGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5UGF0aC50b1N0cmluZygpKTsKLQkJbmV3WmlwRmlsZS5ta2RpcnMoKTsKLQkJb3V0cHV0U3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpOwotCQl1c2VDb21wcmVzc2lvbiA9IGNvbXByZXNzOwotCX0KLQotCS8qKgotCSAqIERvIGFsbCByZXF1aXJlZCBjbGVhbnVwIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnRseS1vcGVuIC56aXAKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBaaXBFbnRyeSB3aXRoIHRoZSBwYXNzZWQgcGF0aG5hbWUgYW5kIGNvbnRlbnRzLCBhbmQgd3JpdGUgaXQgdG8gdGhlIGN1cnJlbnQKLQkgKiBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShTdHJpbmcgcGF0aG5hbWUsIGJ5dGVbXSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwRW50cnkgbmV3RW50cnkgPSBuZXcgWmlwRW50cnkocGF0aG5hbWUpOwotCi0JCS8vIGlmIHRoZSBjb250ZW50cyBhcmUgYmVpbmcgY29tcHJlc3NlZCB0aGVuIHdlIGdldCB0aGUgYmVsb3cgZm9yIGZyZWUuCi0JCWlmICghdXNlQ29tcHJlc3Npb24pIHsKLQkJCW5ld0VudHJ5LnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOwotCQkJbmV3RW50cnkuc2V0U2l6ZShjb250ZW50cy5sZW5ndGgpOwotCQkJQ1JDMzIgY2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0JCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRlbnRzKTsKLQkJCW5ld0VudHJ5LnNldENyYyhjaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLndyaXRlKGNvbnRlbnRzKTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUZvbGRlcihTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWRlc3RpbmF0aW9uUGF0aC5lbmRzV2l0aCgiLyIpKQotCQkJZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb25QYXRoICsgJy8nOwotCQlaaXBFbnRyeSBuZXdFbnRyeSA9IG5ldyBaaXBFbnRyeShkZXN0aW5hdGlvblBhdGgpOwotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgcGFzc2VkIHJlc291cmNlIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uUGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShJRmlsZSByZXNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50U3RyZWFtID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoZmFsc2UpOwotCQkJd3JpdGUoY29udGVudFN0cmVhbSwgZGVzdGluYXRpb25QYXRoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb250ZW50U3RyZWFtICE9IG51bGwpCi0JCQkJY29udGVudFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWludCBjaHVua1NpemUgPSBjb250ZW50U3RyZWFtLmF2YWlsYWJsZSgpOwotCQkJYnl0ZVtdIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVtjaHVua1NpemVdOwotCQkJaW50IG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcik7Ci0KLQkJCXdoaWxlIChuID4gMCkgewotCQkJCW91dHB1dC53cml0ZShyZWFkQnVmZmVyKTsKLQkJCQluID0gY29udGVudFN0cmVhbS5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCW91dHB1dC5jbG9zZSgpOwotCQl9Ci0KLQkJd3JpdGUoZGVzdGluYXRpb25QYXRoLCBvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5MDRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5tb2R1bGVjb3JlIGFwaSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPgotICAgICAgICBUaGUgQ29tcG9uZW50Q29yZSBBUEkgYWxsb3dzIGNsaWVudHMgdG8gd29yayB3aXRoIHRoZSBTdHJ1Y3R1cmFsIAotICAgICAgICBNZXRhbW9kZWxzIHRoYXQgZGVmaW5lIGFic3RyYWN0IG1vZHVsZXMgd2l0aGluIEVjbGlwc2UgcHJvamVjdHMuIAotICAgICAgICBUaGVzZSBtZXRhbW9kZWxzIGFyZSBleHBvc2VkIHRocm91Z2ggdGhlIFZpcnR1YWwgUGF0aCBBUEkgbGF5ZXIgCi0gICAgICAgIChzZWUgPGEgaHJlZj0iQ29tcG9uZW50Q29yZS5odG1sIj5Db21wb25lbnRDb3JlPC9hPikuIENsaWVudHMgCi0gICAgICAgIHNob3VsZCBhbHNvIHJldmlldyB0aGUgPGI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczwvYj4KLSAgICAgICAgcGFja2FnZS4KLQkJPC9wPgotPGEgbmFtZT0idG9wIj48L2E+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLQkJCVRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzOgotCQkJPHVsPgotCQkJCQotPGxpPgotPGEgaHJlZj0iI3N0cnVjdHVyYWwtbWV0YW1vZGVsIj5Db21wb25lbnRDb3JlIE1ldGFtb2RlbCAoQ0NNKTwvYT4gCi0JCQkJCXVzZWQgdG8gdW5kZXJzdGFuZCB3aGljaCBmaWxlcyBzaG91bGQgb3Igc2hvdWxkIG5vdCBiZSAKLQkJCQkJaW5jbHVkZWQgd2l0aGluIGEgbW9kdWxlLjwvbGk+IAotCQkJCQotPGxpPgotPGEgaHJlZj0iI2NvbnN0cmFpbnRzIj5Db25zdHJhaW50czwvYT4gZW5mb3JjZWQgYnkgdGhlIAotCQkJCQlkZXNpZ248L2xpPiAKLQkJCQkKLTxsaT4KLTxhIGhyZWY9IiNtb2R1bGUtY29yZS1leGFtcGxlcyI+VGhlIEFQSSBlbnRyeS1wb2ludDwvYT4KLTwvbGk+Ci0JCQkKLTwvdWw+Ci0JCQotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGEgbmFtZT0ic3RydWN0dXJhbC1tZXRhbW9kZWwiPjwvYT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjMDA4MGMwIiBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiI+PGI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2ZmZmZmZiI+Q29tcG9uZW50Q29yZSBNZXRhbW9kZWwgKENDTSk8L2ZvbnQ+PC9iPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08QlI+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSBDb21wb25lbnRDb3JlIE1ldGFtb2RlbCAoQ0NNKSBpcyBhbiBFTUYgbW9kZWwgdGhhdCBhbGxvd3MgCi0JCQl0aGUgdG9vbGluZyB0byB1bmRlcnN0YW5kIG1vc3QgcHJvamVjdCBzdHJ1Y3R1cmVzLiBFYWNoIHByb2plY3QgCi0JCQloYXMgYSBzaW5nbGUgQ0NNIHdoaWNoIGlzIHN0b3JlZCB1bmRlciB0aGUgcHJvamVjdCByb290IG5hbWVkCi0gICAgICAgICAgICA8ST4ud3RwbW9kdWxlczwvST4KLSAgICAgICAgICAgIC4gVGhlIFhNTCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgCi0gICAgICAgICAgICA8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy9jb21wb25lbnRDb3JlLnhzZCI+Q29tcG9uZW50Q29yZSBzY2hlbWE8L2E+LgotICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaWFncmFtIGlzIGEgVU1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAKLQkJCUNvbXBvbmVudENvcmUgTWV0YW1vZGVsLiBUaGlzIGluZm9ybWF0aW9uIGlzIHB1Ymxpc2hlZCBmb3IgCi0JCQlwb3RlbnRpYWwgY29udHJpYnV0b3JzIG9mIGVkaXRvcnMsIGJ1dCB0aGUgRU1GIG1vZGVsIGlzIAotCQkJbm90IGV4cG9zZWQgZGlyZWN0bHkgYXMgQVBJLCBhbmQgY291bGQgY2hhbmdlIGluIHZpZXcgb2YgCi0JCQljaGFuZ2VzIGZvciBXVFAgMS4xLgotCQk8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMTAiPgotPHRyPgotPHRkPgotPHA+Ci08aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvY29tcG9uZW50Y29yZV9tb2RlbC5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMTogVGhlIENvbXBvbmVudCBDb3JlIE1ldGFtb2RlbDwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgRWFjaCBsb2dpY2FsIGNvbXBvbmVudCBjb250YWluZWQgaW4gdGhlIHByb2plY3QgaXMgcmVwcmVzZW50ZWQgYnkgYQotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBlbGVtZW50LiBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBkZWZpbmVzIAotICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgY29tcG9uZW50LCB0aGUgcmVzb3VyY2VzIGNvbnN1bWVkIGJ5IHRoZSAKLSAgICAgICAgICAgIG1vZHVsZSBmcm9tIHRoZSBwcm9qZWN0LCBhbmQgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50cy4gVGhlIAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBpcyB2ZXJ5IGdlbmVyaWMsIGFuZCBhcyBtb2RlbGVkLCBkb2VzIAotICAgICAgICAgICAgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gb25seSBKMkVFIGFydGlmYWN0cy4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBoYXMgYQotICAgICAgICAgICAgPGk+bmFtZTwvaT4KLSAgICAgICAgICAgICwgd2hpY2ggaXMgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgcnVudGltZSBmb3JtIG9mIHRoZQotICAgICAgICAgICAgY29tcG9uZW50IGlzIGNvbnN0cnVjdGVkLiBGb3IgYSB3ZWIgYXBwbGljYXRpb24sIHRoZQotICAgICAgICAgICAgPGk+bmFtZTwvaT4KLSAgICAgICAgICAgIG1pZ2h0IGJlICJNeVdlYkFwcGxpY2F0aW9uIi4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBtYXkgYmUgdW5pcXVlbHkgcmVmZXJlbmNlZCBieSBhIFVSSS4gVGhlIAotICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIFVSSSB0byBhbnkgY29tcG9uZW50IG11c3QgYmVnaW4gd2l0aCB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBwcm90b2NvbCAoImNvbXBvbmVudDoiKSwgc3BlY2lmeSBhIHN1YnByb3RvY29sICgicmVzb3VyY2V8Y2xhc3NwYXRoIikgYW5kCi0gICAgICAgICAgICB0aGVuIGEgcGF0aCB0byB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQuIEEgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiB3aXRoIHRoZQotICAgICAgICAgICAgbmFtZSAiTXlXZWJBcHBsaWNhdGlvbiIgZGVmaW5lZCBpbiBhIHByb2plY3QgbmFtZWQKLSAgICAgICAgICAgICJNeVdlYk1vZHVsZXNQcm9qZWN0IiB3b3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBmb2xsb3dpbmcgVVJJOgotICAgICAgICAgICAgImNvbXBvbmVudDovcmVzb3VyY2UvTXlXZWJNb2R1bGVzUHJvamVjdC9NeVdlYkFwcGxpY2F0aW9uIi4gQXMgYSBmdXR1cmUgCi0gICAgICAgICAgICBleHRlbnNpb24sIGEgY29tcG9uZW50IHJlZmVyZW5jZWQgb24gdGhlIGNsYXNzcGF0aCBvZiBhIHByb2plY3QgKHBlcmhhcHMgCi0gICAgICAgICAgICBhIFV0aWxpdHkgSmFyIG9yIGFuIEVKQiBDbGllbnQgSmFyKSwgdGhlIFVSSSBtaWdodCBiZSBzb21ldGhpbmcgbGlrZToKLSAgICAgICAgICAgICJjb21wb25lbnQ6L2NsYXNzcGF0aC9NeVdlYk1vZHVsZXNQcm9qZWN0L0N1c3RvbWVyRUpCQ2xpZW50LmphciIuIAotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGhhcyBhIDxiPkNvbXBvbmVudFR5cGU8L2I+LiBUaGUgCi0gICAgICAgICAgICA8Yj5Db21wb25lbnRUeXBlPC9iPiBkZWZpbmVzIGEgPGk+Y29tcG9uZW50VHlwZUlkPC9pPgotICAgICAgICAgICAgLCB3aGljaCBpbmRpY2F0ZXMgdGhlIHNwZWNpZmljIGtpbmQgb2YgY29tcG9uZW50LiBUaGUgV2ViIFRvb2xzIFBsYXRmb3JtCi0gICAgICAgICAgICB1c2VzIHRoZSA8aT5jb21wb25lbnRUeXBlSWQ8L2k+Ci0gICAgICAgICAgICB0byBkZXRlcm1pbmUgaG93IHRvIHdvcmsgd2l0aCB0aGUgY29udGVudCBjb21wb25lbnQgb2YgdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4KLSAgICAgICAgICAgIGFuZCBwcmVwYXJlIHRoZSBjb21wb25lbnQgZm9yIGRlcGxveW1lbnQuIFRoZSA8Yj5Db21wb25lbnRUeXBlPC9iPiBtYXkgCi0gICAgICAgICAgICBhbHNvIGRlZmluZSB0aGUgcnVudGltZS1wYXRocyBvZiBzcGVjaWFsIG1ldGFkYXRhIHJlc291cmNlcyB3aGljaCBhcmUgCi0gICAgICAgICAgICBpbXBvcnRhbnQgdG8gdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4uICJNZXRhZGF0YSIgcmVmZXJzIHRvIHJlc291cmNlcyAKLSAgICAgICAgICAgIHdoaWNoIGV4cGxhaW4gdGhlIGNvbnRlbnQgZGV0YWlscyBvZiB0aGUgc3BlY2lmaWMgbW9kdWxlcy4gQW4gZXhhbXBsZSBvZiAKLSAgICAgICAgICAgIHN1Y2ggYSBmaWxlIHdvdWxkIGJlIHRoZSAiV0VCLUlORi93ZWIueG1sIiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIAotICAgICAgICAgICAgV2ViIEFwcGxpY2F0aW9ucy4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBjb250YWlucyBhIGxpc3Qgb2YgQ29tcG9uZW50UmVzb3VyY2VzLiBFYWNoCi0gICAgICAgICAgICA8Yj5Db21wb25lbnRSZXNvdXJjZTwvYj4gaGFzICJzb3VyY2VQYXRoIiBhbmQgYSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAicnVudGltZVBhdGgiLiBUaGUgInNvdXJjZVBhdGgiIGNhbiByZWZlcmVuY2UgZWl0aGVyIGEgZmlsZSBvciBmb2xkZXIsCi0gICAgICAgICAgICBidXQgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UgbXVzdCBiZSBjb250YWluZWQgaW4gdGhlIHNhbWUgcHJvamVjdCBhcyB0aGUKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gZGVmaW5pdGlvbi4gVGhlICJydW50aW1lUGF0aCIgc3BlY2lmaWVzIGEgbG9jYXRpb24KLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBkZXBsb3llZCBzdHJ1Y3R1cmUgb2YgdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gd2hlcmUgdGhlCi0gICAgICAgICAgICBjb250ZW50cyBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSB3aWxsIGJlIHJlcHJlc2VudGVkIHdoZW4gdGhlIG1vZHVsZSBpcwotICAgICAgICAgICAgcHJlcGFyZWQgZm9yIHJ1bnRpbWUuCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gY29udGFpbnMgYSBsaXN0IG9mIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+cy4gCi0gICAgICAgICAgICBFYWNoIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+IHByb3ZpZGVzIGEgaGFuZGxlIHRoYXQgbXVzdCByZXNvbHZlIHRvIGEgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LCBhIHJ1bnRpbWVQYXRoIHRoYXQgZGVmaW5lcyB3aGVyZSB0aGUgY29uc3RydWN0ZWQgCi0gICAgICAgICAgICBjb21wb25lbnQgd2lsbCBiZSBwbGFjZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBydW50aW1lIAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiwgYW5kIGEgPGI+RGVwZW5kZW5jeVR5cGU8L2I+Ci0gICAgICAgICAgICB0aGF0IGNhbiBiZSBlaXRoZXIgImNvbnN1bWUiIG9yICJ1c2UiIHRvIGluZGljYXRlIGhvdyB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgIHRoYXQgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gc2hvdWxkIGJlIGFic29yYmVkIGJ5IHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LgotICAgICAgICAgICAgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj5zIG1heSByZWZlcmVuY2UgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPnMgaW4gCi0gICAgICAgICAgICBvdGhlciBwcm9qZWN0cyBhbmQgb24gY3VycmVudCBwcm9qZWN0J3MgY2xhc3NwYXRoIChOb3QgeWV0IGltcGxlbWVudGVkKS4gCi0gICAgICAgICAgICBUaGUgPGI+RGVwZW5kZW5jeVR5cGU8L2I+IHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnRlbnRzIG9mCi0gICAgICAgICAgICB0aGUgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gYXJlIGFic29yYmVkIGFzLWlzIG9yIGFyY2hpdmVkIGludG8gYSAqLnt3fGp8ZX1hcgotICAgICAgICAgICAgZmlsZS4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+UHJvamVjdENvbXBvbmVudHM8L2I+IG9iamVjdCBwcm92aWRlcyBhIHJvb3QgY29udGFpbmVyIGZvciBhbGwKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj5zIGRlZmluZWQgaW4gYSBnaXZlbiBwcm9qZWN0LgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIAotPGI+Q29tcG9uZW50Q29yZTwvYj4gcHJvdmlkZXMgYSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGZvcgotICAgICAgICAgICAgY2xpZW50cy4gU3RhdGljIG1ldGhvZHMKLSAgICAgICAgICAgIDxjb2RlPk1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvclJlYWQoKTwvY29kZT4KLSAgICAgICAgICAgIGFuZAotICAgICAgICAgICAgPGNvZGU+TW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoKTwvY29kZT4KLSAgICAgICAgICAgIG1heSBiZSB1c2VkIHRvIGFjcXVpcmUgYW4gTW9kdWxlQ29yZSBhZGFwdGVyLCBhbmQgY2xpZW50cyBhcmUgcmVzcG9uc2libGUKLSAgICAgICAgICAgIGZvciBpbnZva2luZwotICAgICAgICAgICAgPGNvZGU+ZGlzcG9zZSgpPC9jb2RlPgotICAgICAgICAgICAgd2hlbmV2ZXIgdGhleSBhcmUgZmluaXNoZWQgdXNpbmcgdGhlIG1vZGVsLgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08YSBocmVmPSIjdG9wIj50b3A8L2E+PGEgbmFtZT0iY29uc3RyYWludHMiPjwvYT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjMDA4MGMwIiBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiI+PGI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2ZmZmZmZiI+Q29uc3RyYWludHMgZW5mb3JjZWQgYnkgdGhlIENDTTwvZm9udD48L2I+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb25zdHJhaW50cyBhcmUgZW5mb3JjZWQgYnkgdGhlIG1vZGVsOgotICAgICAgICAgICAgPG9sPgotICAgICAgICAgICAgICAgIAotPGxpPgotICAgICAgICAgICAgICAgICAgICAKLTxwPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvbHV0aW9uIHdpbGwgbm90IGNoZWNrIGRlcGVuZGVuY2llcyBmb3IgY29tcG9uZW50cyB0aGF0IGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBzYW1lIHByb2plY3QuIFRvIGdldCB0aGUgZnVsbCBiZW5lZml0cyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXItY29tcG9uZW50IGRlcGVuZGVuY3kgY2hlY2tpbmcsIGNvbXBvbmVudHMgbXVzdCBiZSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gZGlmZmVyZW50IHByb2plY3RzLiBXZSBkbyBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGV4aWJpbGl0eSBpbiBjb25zdHJ1Y3RpbmcgYW5kIHNjb3BpbmcgY2xhc3NwYXRocyBvbiBhIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGdyYW51bGFyIHRoYW4gdGhlIHByb2plY3QgbGV2ZWwsIHdoaWNoIHdvdWxkIGJlIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAgICAgCi08bGk+Ci0gICAgICAgICAgICAgICAgICAgIAotPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc29sdXRpb24gd2lsbCBub3QgYWxsb3cgYSBzaW5nbGUgY29tcG9uZW50IHRvIHNwYW4gbW9yZSB0aGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBvbmUgcHJvamVjdC4gV2l0aGluIHRoYXQgcHJvamVjdCwgd2Ugd2lsbCBoYXZlIGZhaXJseSBicm9hZAotICAgICAgICAgICAgICAgICAgICAgICAgZmxleGliaWxpdHkgdG8gc3BlY2lmeSB3aGljaCByZXNvdXJjZXMgbWFwIHRvIHdoaWNoIGNvbXBvbmVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBFYWNoIGNvbXBvbmVudCB3aXRoaW4gYSBwcm9qZWN0IG11c3QgaGF2ZSBpdHMgb3duIHNvdXJjZSBmb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBidXQgYSBjb21wb25lbnQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBzb3VyY2UgZm9sZGVyLiBFYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZm9sZGVyIG1heSBiZSBjb250YWluZWQgYnkgYXQgbW9zdCBvbmUgY29tcG9uZW50LiBDb21wb25lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXkgcmVmZXJlbmNlIGRlcGVuZGVudCBjb21wb25lbnRzIGluIG90aGVyIHByb2plY3RzIChzbyBhIFdlYgotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gbWF5IHJlZmVyZW5jZSBhIFdlYiBMaWJyYXJ5IG91dHNpZGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIFdlYiBBcHBsaWNhdGlvbikuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAgICAgCi08bGk+Ci0gICAgICAgICAgICAgICAgICAgIAotPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc29sdXRpb24gd2lsbCBub3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBzZXJ2ZXIgdGFyZ2V0IHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IChhbmQgcmVhbGx5IHBlci1wcm9qZWN0KSBhdCBhIHRpbWUuIFRoZSBhYmlsaXR5IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggdGhpcyBzZXJ2ZXIgdGFyZ2V0ICh2aWEgc29tZSBhY3Rpb24gb3IgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpIHdpbGwgY29udGludWUgdG8gYmUgcG9zc2libGUuIFVzZXJzIHRoYXQgbmVlZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHkgdG8gZGV2ZWxvcCBmb3IgbXVsdGlwbGUgc2VydmVyIHRhcmdldHMgd2lsbCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBtYW51YWxseSBzd2l0Y2ggYW5kIHRlc3QgYXMgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgCi08L2xpPgotICAgICAgICAgICAgICAgIAotPGxpPgotICAgICAgICAgICAgICAgICAgICAKLTxwPgotICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBjb21wb25lbnQgaW4gYSBwcm9qZWN0IG1heSBoYXZlIGl0cyBvd24gb3V0cHV0IGZvbGRlcgotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0ZWQgZm9yIGl0LiBUaGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgd2lsbCBtYXRjaCB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uIG91dHB1dCBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0aGUgY29tcG9uZW50IHR5cGUgKGZvciBKMkVFIG1vZHVsZXMpLiBBIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciB3aWxsIGhhbmRsZSB0aGlzIHJlc3BvbnNpYmlsaXR5IGFuZCB3b3JrCi0gICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZWx5IHdpdGggdGhlIEphdmEgYnVpbGRlciB0byBjb25zdHJ1Y3QgYQotICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95YWJsZSwgb24tZGlzayByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kdWxlIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2lsbCBmb2xsb3cgdGhpcyBwYXR0ZXJuLCBidXQgCi0gICAgICAgICAgICAgICAgICAgICAgICBob29rcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHZhcnkgdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuZWNlc3NpdHkgZm9yIHRoaXMgb24tZGlzayBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYQotICAgICAgICAgICAgICAgICAgICAgICAgSjJFRS1jb21wbGlhbnQgbGF5b3V0IGlzIG1vdGl2YXRlZCBieSB0aGUgcmVxdWlyZW1lbnQgdG8gaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4td29ya2JlbmNoIHRlc3RpbmcsIHNvIHRoYXQgdXNlcnMgd2lsbCBub3QgaGF2ZSB0byBkZWFsCi0gICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZGVwbG95ZXIgYWN0dWFsbHkgY29uc3RydWN0aW5nIGEgZGVwbG95YWJsZSBtb2R1bGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZyBpdCBvZmYgdG8gYSBzZXJ2ZXIgdG8gdGVzdCB0aGVpciBjb2RlLiBUaGlzIGFwcHJvYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBjb25zaXN0ZW50IHdpdGggZXhpc3RpbmcgQW50LWJhc2VkIGFwcHJvYWNoZXMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBTZXJ2ZXJzIHdoaWNoIGNhbiBydW4gaW4gYSAiZGVidWciIG1vZGUgb24gZGlzay4KLSAgICAgICAgICAgICAgICAgICAgICAgIE91ciB2YWx1ZS1hZGQgd2lsbCBiZSBncmVhdGVyIGF1dG9tYXRpb24gYW5kIGludGVncmF0aW9uIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggLS0gcGFydGljdWxhcmx5IGZvciBpbmNyZW1lbnRhbCBiYXNlZCBzdXBwb3J0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWxpemVkIG1vZHVsZSBidWlsZGVyIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Ugd2FzIGFscmVhZHkgaW4gdGhlIGFwcHJvcHJpYXRlIEoyRUUgc3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxpYW50IHN0cnVjdHVyZS4gVGhlIGRlZmF1bHQgY3JlYXRpb24gd2lsbCBzdGlsbAotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb3VyYWdlIGEgc2luZ2xlIG1vZHVsZSBwZXIgcHJvamVjdCwgd2hpY2ggY29uZm9ybXMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0IEoyRUUgc3RydWN0dXJlLgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgCi08L2xpPgotICAgICAgICAgICAgICAgIAotPGxpPgotICAgICAgICAgICAgICAgICAgICAKLTxwPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50cyB3aWxsIGJlIGRlc2NyaWJlZCB1c2luZyBhIHNpbXBsZSBYTUwgZm9ybWF0LCBhbmQgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCB3aWxsIGNvbnRhaW4gb25lCi0gICAgICAgICAgICAgICAgICAgICAgICA8ST4ud3RwbW9kdWxlczwvST4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgdGhhdCB3aWxsIGRlc2NyaWJlIGFsbCBvZiB0aGUgY29tcG9uZW50cyBmb3IgdGhhdCBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxldmVsIG9mIHRvb2xpbmcgdG8gaGVscCB1c2VycyBjcmVhdGUgdGhlc2UgZmlsZXMgaXMgeWV0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBkZXRlcm1pbmVkIGZvciBXVFAgTTQuIFRoaXMgd291bGQgYmUgYSBncmVhdCBhcmVhIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgaW50ZXJlc3RlZCBkZXZlbG9wZXJzIHRvIHN1Z2dlc3QgYW5kIHByb3ZpZGUgdG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gYSBXaXphcmQgb3IgRWRpdG9yKSB0byBjcmVhdGUgdGhlc2UgZmlsZXMgZnJvbSBleGlzdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcy4gQSBzY2hlbWEgaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcnMgdGhhdCB3YW50IHRvIGJ1aWxkIHRoZWlyIG93bgotICAgICAgICAgICAgICAgICAgICAgICAgPEk+Lnd0cG1vZHVsZXM8L0k+Ci0gICAgICAgICAgICAgICAgICAgICAgICBieSBoYW5kIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBjb250ZW50IGFzc2lzdCBpbiB0aGUgWE1MCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAKLTwvb2w+Ci0gICAgICAgIAotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGEgaHJlZj0iI3RvcCI+dG9wPC9hPjxhIG5hbWU9Im1vZHVsZS1jb3JlLWV4YW1wbGVzIj48L2E+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSI1IiBjZWxscGFkZGluZz0iMiIgYm9yZGVyPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgYmdjb2xvcj0iIzAwODBjMCIgYWxpZ249ImxlZnQiIGNvbHNwYW49IjIiPjxiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgY29sb3I9IiNmZmZmZmYiPkNvbXBvbmVudENvcmUgQVBJOiBXb3JraW5nIHdpdGggdGhlIG1ldGFtb2RlbDwvZm9udD48L2I+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxCUj4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotCQkJQ29tcG9uZW50Q29yZSB1c2VzIGEgaGFuZGxlIGJhc2VkIG1vZGVsIG11Y2ggbGlrZSB0aGUgZXhpc3RpbmcgUGxhdGZvcm0gCi0JCQlSZXNvdXJjZSBtb2RlbC4gVGhlIENvbXBvbmVudENvcmUgZmFjYWRlIGlzIG5vdCB0aWVkIHRvIGFueSBwcm9qZWN0LCBhbmQgCi0JCQl0aGUgaGFuZGxlcyB0aGF0IGl0IHJldHVybnMgbWF5IG9yIG1heSBub3QgZXhpc3QuIFRoZSBjb21wbGV4aXR5IG9mIAotCQkJbWFuYWdpbmcgdGhlIHVuZGVybHlpbmcgRU1GIG1vZGVsIGlzIGhhbmRsZWQgdW5kZXIgdGhlIGNvdmVyIGZvciB1c2Vycy4gCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy9jb21wb25lbnRjb3JlX3BhY2thZ2UuanBnIj48L3A+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4KLTxwPgotPGk+RmlndXJlIDI6IFRoZSBDb21wb25lbnRDb3JlIEFQSTwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1YzAwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPm1vZHVsZWNvcmUgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoZSBDb21wb25lbnRDb3JlIEFQSSBhbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggdGhlIFN0cnVjdHVyYWwgCi0gICAgICAgIE1ldGFtb2RlbHMgdGhhdCBkZWZpbmUgYWJzdHJhY3QgbW9kdWxlcyB3aXRoaW4gRWNsaXBzZSBwcm9qZWN0cy4gCi0gICAgICAgIFRoZXNlIG1ldGFtb2RlbHMgYXJlIGV4cG9zZWQgdGhyb3VnaCB0aGUgVmlydHVhbCBQYXRoIEFQSSBsYXllciAKLSAgICAgICAgKHNlZSA8YSBocmVmPSJDb21wb25lbnRDb3JlLmh0bWwiPkNvbXBvbmVudENvcmU8L2E+KS4gQ2xpZW50cyAKLSAgICAgICAgc2hvdWxkIGFsc28gcmV2aWV3IHRoZSA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzPC9iPgotICAgICAgICBwYWNrYWdlLgotCQk8L2Fic3RyYWN0PgotCi0JCTxhIG5hbWU9InRvcCIvPgotCQk8cD4KLQkJCVRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzOgotCQkJPHVsPgotCQkJCTxsaT48YSBocmVmPSIjc3RydWN0dXJhbC1tZXRhbW9kZWwiPkNvbXBvbmVudENvcmUgTWV0YW1vZGVsIChDQ00pPC9hPiAKLQkJCQkJdXNlZCB0byB1bmRlcnN0YW5kIHdoaWNoIGZpbGVzIHNob3VsZCBvciBzaG91bGQgbm90IGJlIAotCQkJCQlpbmNsdWRlZCB3aXRoaW4gYSBtb2R1bGUuPC9saT4gCi0JCQkJPGxpPjxhIGhyZWY9IiNjb25zdHJhaW50cyI+Q29uc3RyYWludHM8L2E+IGVuZm9yY2VkIGJ5IHRoZSAKLQkJCQkJZGVzaWduPC9saT4gCi0JCQkJPGxpPjxhIGhyZWY9IiNtb2R1bGUtY29yZS1leGFtcGxlcyI+VGhlIEFQSSBlbnRyeS1wb2ludDwvYT48L2xpPgotCQkJPC91bD4KLQkJPC9wPgotCQk8YSBuYW1lPSJzdHJ1Y3R1cmFsLW1ldGFtb2RlbCIvPgotICAgICAgICA8aDI+Q29tcG9uZW50Q29yZSBNZXRhbW9kZWwgKENDTSk8L2gyPgotICAgICAgICA8QlIgLz4gCi0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIENvbXBvbmVudENvcmUgTWV0YW1vZGVsIChDQ00pIGlzIGFuIEVNRiBtb2RlbCB0aGF0IGFsbG93cyAKLQkJCXRoZSB0b29saW5nIHRvIHVuZGVyc3RhbmQgbW9zdCBwcm9qZWN0IHN0cnVjdHVyZXMuIEVhY2ggcHJvamVjdCAKLQkJCWhhcyBhIHNpbmdsZSBDQ00gd2hpY2ggaXMgc3RvcmVkIHVuZGVyIHRoZSBwcm9qZWN0IHJvb3QgbmFtZWQKLSAgICAgICAgICAgIDxJPi53dHBtb2R1bGVzPC9JPgotICAgICAgICAgICAgLiBUaGUgWE1MIGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSAKLSAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L2NvbXBvbmVudENvcmUueHNkIj5Db21wb25lbnRDb3JlIHNjaGVtYTwvYT4uCi0gICAgICAgICAgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaXMgYSBVTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIAotCQkJQ29tcG9uZW50Q29yZSBNZXRhbW9kZWwuIFRoaXMgaW5mb3JtYXRpb24gaXMgcHVibGlzaGVkIGZvciAKLQkJCXBvdGVudGlhbCBjb250cmlidXRvcnMgb2YgZWRpdG9ycywgYnV0IHRoZSBFTUYgbW9kZWwgaXMgCi0JCQlub3QgZXhwb3NlZCBkaXJlY3RseSBhcyBBUEksIGFuZCBjb3VsZCBjaGFuZ2UgaW4gdmlldyBvZiAKLQkJCWNoYW5nZXMgZm9yIFdUUCAxLjEuCi0JCTwvcD4JICAKLQkJPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L2NvbXBvbmVudGNvcmVfbW9kZWwuanBnIiBjYXB0aW9uPSJUaGUgQ29tcG9uZW50IENvcmUgTWV0YW1vZGVsIiAvPiAKLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBFYWNoIGxvZ2ljYWwgY29tcG9uZW50IGNvbnRhaW5lZCBpbiB0aGUgcHJvamVjdCBpcyByZXByZXNlbnRlZCBieSBhCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGVsZW1lbnQuIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGRlZmluZXMgCi0gICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBjb21wb25lbnQsIHRoZSByZXNvdXJjZXMgY29uc3VtZWQgYnkgdGhlIAotICAgICAgICAgICAgbW9kdWxlIGZyb20gdGhlIHByb2plY3QsIGFuZCB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnRzLiBUaGUgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGlzIHZlcnkgZ2VuZXJpYywgYW5kIGFzIG1vZGVsZWQsIGRvZXMgCi0gICAgICAgICAgICBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBvbmx5IEoyRUUgYXJ0aWZhY3RzLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gaGFzIGEKLSAgICAgICAgICAgIDxpPm5hbWU8L2k+Ci0gICAgICAgICAgICAsIHdoaWNoIGlzIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHJ1bnRpbWUgZm9ybSBvZiB0aGUKLSAgICAgICAgICAgIGNvbXBvbmVudCBpcyBjb25zdHJ1Y3RlZC4gRm9yIGEgd2ViIGFwcGxpY2F0aW9uLCB0aGUKLSAgICAgICAgICAgIDxpPm5hbWU8L2k+Ci0gICAgICAgICAgICBtaWdodCBiZSAiTXlXZWJBcHBsaWNhdGlvbiIuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBtYXkgYmUgdW5pcXVlbHkgcmVmZXJlbmNlZCBieSBhIFVSSS4gVGhlIAotICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIFVSSSB0byBhbnkgY29tcG9uZW50IG11c3QgYmVnaW4gd2l0aCB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBwcm90b2NvbCAoImNvbXBvbmVudDoiKSwgc3BlY2lmeSBhIHN1YnByb3RvY29sICgicmVzb3VyY2V8Y2xhc3NwYXRoIikgYW5kCi0gICAgICAgICAgICB0aGVuIGEgcGF0aCB0byB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQuIEEgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiB3aXRoIHRoZQotICAgICAgICAgICAgbmFtZSAiTXlXZWJBcHBsaWNhdGlvbiIgZGVmaW5lZCBpbiBhIHByb2plY3QgbmFtZWQKLSAgICAgICAgICAgICJNeVdlYk1vZHVsZXNQcm9qZWN0IiB3b3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBmb2xsb3dpbmcgVVJJOgotICAgICAgICAgICAgImNvbXBvbmVudDovcmVzb3VyY2UvTXlXZWJNb2R1bGVzUHJvamVjdC9NeVdlYkFwcGxpY2F0aW9uIi4gQXMgYSBmdXR1cmUgCi0gICAgICAgICAgICBleHRlbnNpb24sIGEgY29tcG9uZW50IHJlZmVyZW5jZWQgb24gdGhlIGNsYXNzcGF0aCBvZiBhIHByb2plY3QgKHBlcmhhcHMgCi0gICAgICAgICAgICBhIFV0aWxpdHkgSmFyIG9yIGFuIEVKQiBDbGllbnQgSmFyKSwgdGhlIFVSSSBtaWdodCBiZSBzb21ldGhpbmcgbGlrZToKLSAgICAgICAgICAgICJjb21wb25lbnQ6L2NsYXNzcGF0aC9NeVdlYk1vZHVsZXNQcm9qZWN0L0N1c3RvbWVyRUpCQ2xpZW50LmphciIuIAotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gaGFzIGEgPGI+Q29tcG9uZW50VHlwZTwvYj4uIFRoZSAKLSAgICAgICAgICAgIDxiPkNvbXBvbmVudFR5cGU8L2I+IGRlZmluZXMgYSA8aT5jb21wb25lbnRUeXBlSWQ8L2k+Ci0gICAgICAgICAgICAsIHdoaWNoIGluZGljYXRlcyB0aGUgc3BlY2lmaWMga2luZCBvZiBjb21wb25lbnQuIFRoZSBXZWIgVG9vbHMgUGxhdGZvcm0KLSAgICAgICAgICAgIHVzZXMgdGhlIDxpPmNvbXBvbmVudFR5cGVJZDwvaT4KLSAgICAgICAgICAgIHRvIGRldGVybWluZSBob3cgdG8gd29yayB3aXRoIHRoZSBjb250ZW50IGNvbXBvbmVudCBvZiB0aGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPgotICAgICAgICAgICAgYW5kIHByZXBhcmUgdGhlIGNvbXBvbmVudCBmb3IgZGVwbG95bWVudC4gVGhlIDxiPkNvbXBvbmVudFR5cGU8L2I+IG1heSAKLSAgICAgICAgICAgIGFsc28gZGVmaW5lIHRoZSBydW50aW1lLXBhdGhzIG9mIHNwZWNpYWwgbWV0YWRhdGEgcmVzb3VyY2VzIHdoaWNoIGFyZSAKLSAgICAgICAgICAgIGltcG9ydGFudCB0byB0aGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPi4gIk1ldGFkYXRhIiByZWZlcnMgdG8gcmVzb3VyY2VzIAotICAgICAgICAgICAgd2hpY2ggZXhwbGFpbiB0aGUgY29udGVudCBkZXRhaWxzIG9mIHRoZSBzcGVjaWZpYyBtb2R1bGVzLiBBbiBleGFtcGxlIG9mIAotICAgICAgICAgICAgc3VjaCBhIGZpbGUgd291bGQgYmUgdGhlICJXRUItSU5GL3dlYi54bWwiIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgCi0gICAgICAgICAgICBXZWIgQXBwbGljYXRpb25zLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gY29udGFpbnMgYSBsaXN0IG9mIENvbXBvbmVudFJlc291cmNlcy4gRWFjaAotICAgICAgICAgICAgPGI+Q29tcG9uZW50UmVzb3VyY2U8L2I+IGhhcyAic291cmNlUGF0aCIgYW5kIGEgY29ycmVzcG9uZGluZwotICAgICAgICAgICAgInJ1bnRpbWVQYXRoIi4gVGhlICJzb3VyY2VQYXRoIiBjYW4gcmVmZXJlbmNlIGVpdGhlciBhIGZpbGUgb3IgZm9sZGVyLAotICAgICAgICAgICAgYnV0IHRoZSByZWZlcmVuY2VkIHJlc291cmNlIG11c3QgYmUgY29udGFpbmVkIGluIHRoZSBzYW1lIHByb2plY3QgYXMgdGhlCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGRlZmluaXRpb24uIFRoZSAicnVudGltZVBhdGgiIHNwZWNpZmllcyBhIGxvY2F0aW9uCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgZGVwbG95ZWQgc3RydWN0dXJlIG9mIHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IHdoZXJlIHRoZQotICAgICAgICAgICAgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2Ugd2lsbCBiZSByZXByZXNlbnRlZCB3aGVuIHRoZSBtb2R1bGUgaXMKLSAgICAgICAgICAgIHByZXBhcmVkIGZvciBydW50aW1lLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gY29udGFpbnMgYSBsaXN0IG9mIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+cy4gCi0gICAgICAgICAgICBFYWNoIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+IHByb3ZpZGVzIGEgaGFuZGxlIHRoYXQgbXVzdCByZXNvbHZlIHRvIGEgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LCBhIHJ1bnRpbWVQYXRoIHRoYXQgZGVmaW5lcyB3aGVyZSB0aGUgY29uc3RydWN0ZWQgCi0gICAgICAgICAgICBjb21wb25lbnQgd2lsbCBiZSBwbGFjZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBydW50aW1lIAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiwgYW5kIGEgPGI+RGVwZW5kZW5jeVR5cGU8L2I+Ci0gICAgICAgICAgICB0aGF0IGNhbiBiZSBlaXRoZXIgImNvbnN1bWUiIG9yICJ1c2UiIHRvIGluZGljYXRlIGhvdyB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgIHRoYXQgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gc2hvdWxkIGJlIGFic29yYmVkIGJ5IHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LgotICAgICAgICAgICAgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj5zIG1heSByZWZlcmVuY2UgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPnMgaW4gCi0gICAgICAgICAgICBvdGhlciBwcm9qZWN0cyBhbmQgb24gY3VycmVudCBwcm9qZWN0J3MgY2xhc3NwYXRoIChOb3QgeWV0IGltcGxlbWVudGVkKS4gCi0gICAgICAgICAgICBUaGUgPGI+RGVwZW5kZW5jeVR5cGU8L2I+IHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnRlbnRzIG9mCi0gICAgICAgICAgICB0aGUgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gYXJlIGFic29yYmVkIGFzLWlzIG9yIGFyY2hpdmVkIGludG8gYSAqLnt3fGp8ZX1hcgotICAgICAgICAgICAgZmlsZS4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Qcm9qZWN0Q29tcG9uZW50czwvYj4gb2JqZWN0IHByb3ZpZGVzIGEgcm9vdCBjb250YWluZXIgZm9yIGFsbAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPnMgZGVmaW5lZCBpbiBhIGdpdmVuIHByb2plY3QuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICA8Yj5Db21wb25lbnRDb3JlPC9iPiBwcm92aWRlcyBhIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwgZm9yCi0gICAgICAgICAgICBjbGllbnRzLiBTdGF0aWMgbWV0aG9kcwotICAgICAgICAgICAgPGNvZGU+TW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yUmVhZCgpPC9jb2RlPgotICAgICAgICAgICAgYW5kCi0gICAgICAgICAgICA8Y29kZT5Nb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JXcml0ZSgpPC9jb2RlPgotICAgICAgICAgICAgbWF5IGJlIHVzZWQgdG8gYWNxdWlyZSBhbiBNb2R1bGVDb3JlIGFkYXB0ZXIsIGFuZCBjbGllbnRzIGFyZSByZXNwb25zaWJsZQotICAgICAgICAgICAgZm9yIGludm9raW5nCi0gICAgICAgICAgICA8Y29kZT5kaXNwb3NlKCk8L2NvZGU+Ci0gICAgICAgICAgICB3aGVuZXZlciB0aGV5IGFyZSBmaW5pc2hlZCB1c2luZyB0aGUgbW9kZWwuCi0gICAgICAgIDwvcD4gIAotCQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0JCTxhIG5hbWU9ImNvbnN0cmFpbnRzIi8+Ci0gICAgICAgIDxoMj5Db25zdHJhaW50cyBlbmZvcmNlZCBieSB0aGUgQ0NNPC9oMj4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBlbmZvcmNlZCBieSB0aGUgbW9kZWw6Ci0gICAgICAgICAgICA8b2w+Ci0gICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzb2x1dGlvbiB3aWxsIG5vdCBjaGVjayBkZXBlbmRlbmNpZXMgZm9yIGNvbXBvbmVudHMgdGhhdCBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgc2FtZSBwcm9qZWN0LiBUbyBnZXQgdGhlIGZ1bGwgYmVuZWZpdHMgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVyLWNvbXBvbmVudCBkZXBlbmRlbmN5IGNoZWNraW5nLCBjb21wb25lbnRzIG11c3QgYmUgc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGRpZmZlcmVudCBwcm9qZWN0cy4gV2UgZG8gbm90IGhhdmUgdGhlIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICAgICAgZmxleGliaWxpdHkgaW4gY29uc3RydWN0aW5nIGFuZCBzY29waW5nIGNsYXNzcGF0aHMgb24gYSBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBncmFudWxhciB0aGFuIHRoZSBwcm9qZWN0IGxldmVsLCB3aGljaCB3b3VsZCBiZSBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvbHV0aW9uIHdpbGwgbm90IGFsbG93IGEgc2luZ2xlIGNvbXBvbmVudCB0byBzcGFuIG1vcmUgdGhhbgotICAgICAgICAgICAgICAgICAgICAgICAgb25lIHByb2plY3QuIFdpdGhpbiB0aGF0IHByb2plY3QsIHdlIHdpbGwgaGF2ZSBmYWlybHkgYnJvYWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhpYmlsaXR5IHRvIHNwZWNpZnkgd2hpY2ggcmVzb3VyY2VzIG1hcCB0byB3aGljaCBjb21wb25lbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBjb21wb25lbnQgd2l0aGluIGEgcHJvamVjdCBtdXN0IGhhdmUgaXRzIG93biBzb3VyY2UgZm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGEgY29tcG9uZW50IG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgc291cmNlIGZvbGRlci4gRWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZvbGRlciBtYXkgYmUgY29udGFpbmVkIGJ5IGF0IG1vc3Qgb25lIGNvbXBvbmVudC4gQ29tcG9uZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgbWF5IHJlZmVyZW5jZSBkZXBlbmRlbnQgY29tcG9uZW50cyBpbiBvdGhlciBwcm9qZWN0cyAoc28gYSBXZWIKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uIG1heSByZWZlcmVuY2UgYSBXZWIgTGlicmFyeSBvdXRzaWRlIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBXZWIgQXBwbGljYXRpb24pLgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvbHV0aW9uIHdpbGwgbm90IGFsbG93IG1vcmUgdGhhbiBvbmUgc2VydmVyIHRhcmdldCBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCAoYW5kIHJlYWxseSBwZXItcHJvamVjdCkgYXQgYSB0aW1lLiBUaGUgYWJpbGl0eSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIHRoaXMgc2VydmVyIHRhcmdldCAodmlhIHNvbWUgYWN0aW9uIG9yIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKSB3aWxsIGNvbnRpbnVlIHRvIGJlIHBvc3NpYmxlLiBVc2VycyB0aGF0IG5lZWQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5IHRvIGRldmVsb3AgZm9yIG11bHRpcGxlIHNlcnZlciB0YXJnZXRzIHdpbGwgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFudWFsbHkgc3dpdGNoIGFuZCB0ZXN0IGFzIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVhY2ggY29tcG9uZW50IGluIGEgcHJvamVjdCBtYXkgaGF2ZSBpdHMgb3duIG91dHB1dCBmb2xkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdGVkIGZvciBpdC4gVGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHdpbGwgbWF0Y2ggdGhlIEoyRUUgc3BlY2lmaWNhdGlvbiBvdXRwdXQgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBmb3IgdGhlIGNvbXBvbmVudCB0eXBlIChmb3IgSjJFRSBtb2R1bGVzKS4gQSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgd2lsbCBoYW5kbGUgdGhpcyByZXNwb25zaWJpbGl0eSBhbmQgd29yawotICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVseSB3aXRoIHRoZSBKYXZhIGJ1aWxkZXIgdG8gY29uc3RydWN0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWFibGUsIG9uLWRpc2sgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHdpbGwgZm9sbG93IHRoaXMgcGF0dGVybiwgYnV0IAotICAgICAgICAgICAgICAgICAgICAgICAgaG9va3Mgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byB2YXJ5IHRoaXMgYmVoYXZpb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmVjZXNzaXR5IGZvciB0aGlzIG9uLWRpc2sgc3RydWN0dXJlIHRvIG1hdGNoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgIEoyRUUtY29tcGxpYW50IGxheW91dCBpcyBtb3RpdmF0ZWQgYnkgdGhlIHJlcXVpcmVtZW50IHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLXdvcmtiZW5jaCB0ZXN0aW5nLCBzbyB0aGF0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gZGVhbAotICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGRlcGxveWVyIGFjdHVhbGx5IGNvbnN0cnVjdGluZyBhIGRlcGxveWFibGUgbW9kdWxlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgc2hpcHBpbmcgaXQgb2ZmIHRvIGEgc2VydmVyIHRvIHRlc3QgdGhlaXIgY29kZS4gVGhpcyBhcHByb2FjaAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgY29uc2lzdGVudCB3aXRoIGV4aXN0aW5nIEFudC1iYXNlZCBhcHByb2FjaGVzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gU2VydmVycyB3aGljaCBjYW4gcnVuIGluIGEgImRlYnVnIiBtb2RlIG9uIGRpc2suCi0gICAgICAgICAgICAgICAgICAgICAgICBPdXIgdmFsdWUtYWRkIHdpbGwgYmUgZ3JlYXRlciBhdXRvbWF0aW9uIGFuZCBpbnRlZ3JhdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgd29ya2JlbmNoIC0tIHBhcnRpY3VsYXJseSBmb3IgaW5jcmVtZW50YWwgYmFzZWQgc3VwcG9ydC4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzcGVjaWFsaXplZCBtb2R1bGUgYnVpbGRlciB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHdhcyBhbHJlYWR5IGluIHRoZSBhcHByb3ByaWF0ZSBKMkVFIHNwZWNpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsaWFudCBzdHJ1Y3R1cmUuIFRoZSBkZWZhdWx0IGNyZWF0aW9uIHdpbGwgc3RpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY291cmFnZSBhIHNpbmdsZSBtb2R1bGUgcGVyIHByb2plY3QsIHdoaWNoIGNvbmZvcm1zIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdCBKMkVFIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudHMgd2lsbCBiZSBkZXNjcmliZWQgdXNpbmcgYSBzaW1wbGUgWE1MIGZvcm1hdCwgYW5kIGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Qgd2lsbCBjb250YWluIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgPEk+Lnd0cG1vZHVsZXM8L0k+Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHRoYXQgd2lsbCBkZXNjcmliZSBhbGwgb2YgdGhlIGNvbXBvbmVudHMgZm9yIHRoYXQgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBsZXZlbCBvZiB0b29saW5nIHRvIGhlbHAgdXNlcnMgY3JlYXRlIHRoZXNlIGZpbGVzIGlzIHlldAotICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZGV0ZXJtaW5lZCBmb3IgV1RQIE00LiBUaGlzIHdvdWxkIGJlIGEgZ3JlYXQgYXJlYSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGludGVyZXN0ZWQgZGV2ZWxvcGVycyB0byBzdWdnZXN0IGFuZCBwcm92aWRlIHRvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGEgV2l6YXJkIG9yIEVkaXRvcikgdG8gY3JlYXRlIHRoZXNlIGZpbGVzIGZyb20gZXhpc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMuIEEgc2NoZW1hIGlzIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJzIHRoYXQgd2FudCB0byBidWlsZCB0aGVpciBvd24KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJPi53dHBtb2R1bGVzPC9JPgotICAgICAgICAgICAgICAgICAgICAgICAgYnkgaGFuZCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY29udGVudCBhc3Npc3QgaW4gdGhlIFhNTAotICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDwvb2w+Ci0gICAgICAgIDwvcD4gIAotCQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0JCTxhIG5hbWU9Im1vZHVsZS1jb3JlLWV4YW1wbGVzIi8+Ci0gICAgICAgIDxoMj5Db21wb25lbnRDb3JlIEFQSTogV29ya2luZyB3aXRoIHRoZSBtZXRhbW9kZWw8L2gyPgotICAgICAgICA8QlIgLz4gIAotICAgICAgICA8cD4KLQkJCUNvbXBvbmVudENvcmUgdXNlcyBhIGhhbmRsZSBiYXNlZCBtb2RlbCBtdWNoIGxpa2UgdGhlIGV4aXN0aW5nIFBsYXRmb3JtIAotCQkJUmVzb3VyY2UgbW9kZWwuIFRoZSBDb21wb25lbnRDb3JlIGZhY2FkZSBpcyBub3QgdGllZCB0byBhbnkgcHJvamVjdCwgYW5kIAotCQkJdGhlIGhhbmRsZXMgdGhhdCBpdCByZXR1cm5zIG1heSBvciBtYXkgbm90IGV4aXN0LiBUaGUgY29tcGxleGl0eSBvZiAKLQkJCW1hbmFnaW5nIHRoZSB1bmRlcmx5aW5nIEVNRiBtb2RlbCBpcyBoYW5kbGVkIHVuZGVyIHRoZSBjb3ZlciBmb3IgdXNlcnMuIAotICAgICAgICA8L3A+IAotICAgICAgICA8aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvY29tcG9uZW50Y29yZV9wYWNrYWdlLmpwZyIgY2FwdGlvbj0iVGhlIENvbXBvbmVudENvcmUgQVBJIiAvPiAgCi0gICAgICAgIDwhLS0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBDbGllbnRzIHNob3VsZCB1c2Ugb25lIG9mCi0gICAgICAgICAgICA8Y29kZT5Nb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JSZWFkKCk8L2NvZGU+Ci0gICAgICAgICAgICBvcgotICAgICAgICAgICAgPGNvZGU+TW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoKTwvY29kZT4KLSAgICAgICAgICAgIHRvIGFjcXVpcmUgYW4gaW5zdGFuY2Ugb2YgTW9kdWxlQ29yZS4gICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQk8Y29kZXNuaXBwZXQgY2FwdGlvbj0iQWNxdWlyaW5nIGFuIGluc3RhbmNlIG9mIENvbXBvbmVudENvcmUgZm9yIHJlYWQtb25seSBhY2Nlc3MiPgotSVByb2plY3QgY3VycmVudFByb2plY3QgPSAuLi4gCi1Nb2R1bGVDb3JlIG1vZHVsZUNvcmVJbnN0YW5jZSA9IE1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvclJlYWQoY3VycmVudFByb2plY3QpOwotV29ya2JlbmNoQ29tcG9uZW50W10gbW9kdWxlcyA9IG1vZHVsZUNvcmVJbnN0YW5jZS5nZXRXb3JrYmVuY2hDb21wb25lbnRzKCk7IAotLi4uIHdvcmsgd2l0aCBtb2R1bGVzIC4uLiAKLW1vZHVsZUNvcmVJbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCQk8L2NvZGVzbmlwcGV0PiAKLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgICAgIEZvciBjbGllbnRzIHRoYXQgd291bGQgbGlrZSB0byBidWlsZCB1cCB0aGVpciBvd24gbW9kZWxzIGZvciBhIGdpdmVuCi0gICAgICAgICAgICBwcm9qZWN0LCBvciBtb2RpZnkgdGhlIGV4aXN0aW5nIG1ldGFtb2RlbCwgdGhlIE1vZHVsZUNvcmUgaW5zdGFuY2Ugc2hvdWxkCi0gICAgICAgICAgICBiZSBhY3F1aXJlZCBmb3Igd3JpdGUtYWNjZXNzLiAKLSAgICAgICAgPC9wPgotCQk8Y29kZXNuaXBwZXQgY2FwdGlvbj0iQ3JlYXRpbmcgYSBXb3JrYmVuY2hDb21wb25lbnQiPiAgICAgICAgICAgIAotLi4uCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsgCi0uLi4KLQotcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVdlYkFwcE1vZHVsZShJUHJvamVjdCBhVGFyZ2V0UHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBhSmF2YVNvdXJjZUZvbGRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBhV2ViQ29udGVudEZvbGRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIGFXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBhUHJvZ3Jlc3NNb25pdG9yKSAKLXsKLSAgICBNb2R1bGVDb3JlIG1vZHVsZUNvcmVJbnN0YW5jZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlID0gCi0gICAgICAgICAgICBNb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JXcml0ZShhVGFyZ2V0UHJvamVjdCk7Ci0KLSAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG1vZHVsZSB0aGF0IHdpbGwgYmUgCi0gICAgICAgICAgICBjb250YWluZWQgYnkgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSAqLwotICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQgbmV3TW9kdWxlID0gCi0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50KCJNeVdlYk1vZHVsZS53YXIiKTsKLQotICAgICAgICAvKiBBIEphdmEgc291cmNlIGZvbGRlciB0aGF0IGNvbnRhaW5zIAotICAgICAgICAgICAgICAgIHRoZSBjbGFzc2VzIGZvciB0aGUgY3VycmVudCBtb2R1bGUgKi8KLSAgICAgICAgQ29tcG9uZW50UmVzb3VyY2UgamF2YVNvdXJjZSA9IAotICAgICAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUphdmFTb3VyY2VGb2xkZXIpOwotICAgICAgICBqYXZhU291cmNlLnNldERlcGxveWVkUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlVVJJKCIvV0VCLUlORi9jbGFzc2VzIikpOwotICAgICAgICBuZXdNb2R1bGUuZ2V0UmVzb3VyY2VzKCkuYWRkKGphdmFTb3VyY2UpOwotCi0gICAgICAgIC8qIEEgcmVzb3VyY2UgZm9sZGVyIHRoYXQgY29udGFpbnMgCi0gICAgICAgICAgICB0aGUgKi5qc3AsICouaHRtbCwgLmltZywgLi4uIGZpbGVzICovCi0gICAgICAgIENvbXBvbmVudFJlc291cmNlIHdlYkNvbnRlbnQgPSAKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5jcmVhdGVDb21wb25lbnRSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhV2ViQ29udGVudEZvbGRlcik7Ci0gICAgICAgIHdlYkNvbnRlbnQuc2V0RGVwbG95ZWRQYXRoKFVSSS5jcmVhdGVVUkkoIi8iKSk7Ci0gICAgICAgIG5ld01vZHVsZS5nZXRSZXNvdXJjZXMoKS5hZGQod2ViQ29udGVudCk7Ci0KLSAgICAgICAgLyogQSByZXNvdXJjZSB0aGF0IHBvaW50cyB0byBhIHZhbGlkIHdlYi54bWwgCi0gICAgICAgICAgICAgICAgZmlsZSB0aGF0IGZvbGxvd3MgdGhlIEoyRUUgV2ViIERlcGxveW1lbnQKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIFNwZWNpZmljYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIENvbXBvbmVudFJlc291cmNlIGRlcGxveW1lbnREZXNjcmlwdG9yID0gCi0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IpOwotICAgICAgICBkZXBsb3ltZW50RGVzY3JpcHRvci5zZXREZXBsb3llZFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlVVJJKCIvV0VCLUlORi93ZWIueG1sIikpOwotICAgICAgICBuZXdNb2R1bGUuZ2V0UmVzb3VyY2VzKCkuYWRkKGRlcGxveW1lbnREZXNjcmlwdG9yKTsKLQotICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2Uuc2F2ZUlmTmVjZXNzYXJ5KGFQcm9ncmVzc01vbml0b3IpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGlmIChtb2R1bGVDb3JlSW5zdGFuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQkJPC9jb2Rlc25pcHBldD4gIAotICAgICAgICA8cD4KLSAgICAgICAgICAgIEZvciBjbGllbnRzIHRoYXQgd291bGQgbGlrZSB0byB0YWtlIGFuIGV4aXN0aW5nIHByb2plY3QgYW4gYWRkIEZsZXhpYmxlCi0gICAgICAgICAgICBQcm9qZWN0IFN1cHBvcnQsIHVzZSB0aGUgTW9kdWxlQ29yZU5hdHVyZS5hZGRNb2R1bGVDb3JlSWZOZWNlc3NhcnkoKSBBUEkKLSAgICAgICAgICAgIHRvIHByZXBhcmUgdGhlIHByb2plY3QgdG8gc3VwcG9ydCBmbGV4aWJsZSBtb2R1bGUgc3RydWN0dXJlcy4gdGhlCi0gICAgICAgICAgICBleGlzdGluZyBtZXRhbW9kZWwsIHRoZW4gYWNxdWlyZSB0aGUgTW9kdWxlQ29yZSBpbnN0YW5jZSBmb3IgbW9kaWZpY2F0aW9uLgotICAgICAgICA8L3A+Ci0JCTxjb2Rlc25pcHBldCBjYXB0aW9uPSJBZGQgRmxleGlibGUgUHJvamVjdCBzdXBwb3J0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIHByb2plY3QiPgotLi4uIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7IAotLi4uCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFrZUZsZXhpYmxlKElQcm9qZWN0IGFUYXJnZXRQcm9qZWN0KSB7Ci0gICAgTW9kdWxlQ29yZSBtb2R1bGVDb3JlSW5zdGFuY2UgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICAgIE1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlID0gTW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoYVRhcmdldFByb2plY3QpOwotICAgICAgICAuLi4gd29yayB3aXRoIG1vZHVsZUNvcmVJbnN0YW5jZSBhbmQgdW5kZXJseWluZyBtb2RlbCAuLi4KLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLnNhdmVJZk5lY2Vzc2FyeShhUHJvZ3Jlc3NNb25pdG9yKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICBpZiAobW9kdWxlQ29yZUluc3RhbmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0JCTwvY29kZXNuaXBwZXQ+IAotCQktLT4KLQkJPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc29sdmVycy9EZWZhdWx0UmVmZXJlbmNlUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvbHZlcnMvRGVmYXVsdFJlZmVyZW5jZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZmNkNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc29sdmVycy9EZWZhdWx0UmVmZXJlbmNlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlZmVyZW5jZVJlc29sdmVyIGltcGxlbWVudHMgSVJlZmVyZW5jZVJlc29sdmVyIHsKLQkvLyBEb2VzIG5vdCBuZWVkIHRvIGltcGxlbWVudCwgCi0JLy8gZGVmYXVsdCBpcyBhbHdheXMgY2FsbGVkIGFzIGxhc3QgcmVzb3J0Ci0JcHVibGljIGJvb2xlYW4gY2FuUmVzb2x2ZShJVmlydHVhbENvbXBvbmVudCBjb250ZXh0LAotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBEb2VzIG5vdCBuZWVkIHRvIGltcGxlbWVudCwgCi0JLy8gZGVmYXVsdCBpcyBhbHdheXMgY2FsbGVkIGFzIGxhc3QgcmVzb3J0Ci0JcHVibGljIGJvb2xlYW4gY2FuUmVzb2x2ZShJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZSByZXNvbHZlKElWaXJ0dWFsQ29tcG9uZW50IGNvbnRleHQsCi0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gbnVsbDsKLQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0JCVVSSSB1cmkgPSByZWZlcmVuY2VkQ29tcG9uZW50LmdldEhhbmRsZSgpOwotCQlpZiAodXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYm9vbGVhbiBpc0NsYXNzUGF0aFVSSSA9IE1vZHVsZVVSSVV0aWwuaXNDbGFzc1BhdGhVUkkodXJpKTsKLQkJaWYoICFpc0NsYXNzUGF0aFVSSSApewotCQkJdHJ5IHsgCi0JCQkJdGFyZ2V0UHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QodXJpKTsKLQkJCX0gY2F0Y2goVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB1dXJpZSkgewotCQkJCS8vSWdub3JlCi0JCQl9IAotCQkJLy8gaWYgdGhlIHByb2plY3QgY2Fubm90IGJlIHJlc29sdmVkLCBhc3N1bWUgaXQncyBsb2NhbCAtIHJlYWxseSBpdCBwcm9iYWJseSBkZWxldGVkIAotCQkJCi0JCQl0YXJnZXRDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCh0YXJnZXRQcm9qZWN0KTsgIAotCQkJCQotCi0JCX1lbHNlewotCQkJU3RyaW5nIGFyY2hpdmVUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcmNoaXZlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCWFyY2hpdmVUeXBlID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlVHlwZSh1cmkpOwotCQkJCWFyY2hpdmVOYW1lID0gTW9kdWxlVVJJVXRpbC5nZXRBcmNoaXZlTmFtZSh1cmkpOwotCQkJCQotCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJCXRhcmdldENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChjb250ZXh0LmdldFByb2plY3QoKSwgYXJjaGl2ZVR5cGUgKyBJUGF0aC5TRVBBUkFUT1IgKyBhcmNoaXZlTmFtZSApOyAKLQkJfQotCQlWaXJ0dWFsUmVmZXJlbmNlIHZSZWYgPSBuZXcgVmlydHVhbFJlZmVyZW5jZShjb250ZXh0LCB0YXJnZXRDb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0UnVudGltZVBhdGgoKSwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbmN5VHlwZSgpLmdldFZhbHVlKCkpOwotCQl2UmVmLnNldEFyY2hpdmVOYW1lKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCXJldHVybiB2UmVmOwotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50IHJlc29sdmUoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZkNvbXAgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKS5jcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCXJlZkNvbXAuc2V0UnVudGltZVBhdGgocmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkpOwotCQlyZWZDb21wLnNldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlLmdldChyZWZlcmVuY2UuZ2V0RGVwZW5kZW5jeVR5cGUoKSkpOwotCQlyZWZDb21wLnNldEFyY2hpdmVOYW1lKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJaWYoIHJlZmVyZW5jZWRDb21wb25lbnQgIT0gbnVsbCApIHsKLQkJCWlmKCAhcmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpKQotCQkJCXJlZkNvbXAuc2V0SGFuZGxlKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0UHJvamVjdCgpKSk7Ci0JCQllbHNlCi0JCQkJcmVmQ29tcC5zZXRIYW5kbGUoTW9kdWxlVVJJVXRpbC5hcmNoaXZlQ29tcG9uZW50ZnVsbHlRdWFsaWZ5VVJJKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpKSk7IAotCQl9Ci0JCXJldHVybiByZWZDb21wOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb2x2ZXJzL0lSZWZlcmVuY2VSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc29sdmVycy9JUmVmZXJlbmNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkY2QwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb2x2ZXJzL0lSZWZlcmVuY2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGludGVyZmFjZSBJUmVmZXJlbmNlUmVzb2x2ZXIgewotCXB1YmxpYyBib29sZWFuIGNhblJlc29sdmUoSVZpcnR1YWxDb21wb25lbnQgY29udGV4dCwgUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50KTsKLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2UgcmVzb2x2ZShJVmlydHVhbENvbXBvbmVudCBjb250ZXh0LCBSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpOwotCXB1YmxpYyBib29sZWFuIGNhblJlc29sdmUoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKTsKLQlwdWJsaWMgUmVmZXJlbmNlZENvbXBvbmVudCByZXNvbHZlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb2x2ZXJzL1JlZmVyZW5jZVJlc29sdmVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc29sdmVycy9SZWZlcmVuY2VSZXNvbHZlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5ZDNmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb2x2ZXJzL1JlZmVyZW5jZVJlc29sdmVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlUmVzb2x2ZXJVdGlsIHsKLQlwdWJsaWMgc3RhdGljIFJlZmVyZW5jZVJlc29sdmVyVXRpbCBpbnN0YW5jZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBSZWZlcmVuY2VSZXNvbHZlclV0aWwgZ2V0RGVmYXVsdCgpIHsKLQkJaWYoIGluc3RhbmNlID09IG51bGwgKQotCQkJaW5zdGFuY2UgPSBuZXcgUmVmZXJlbmNlUmVzb2x2ZXJVdGlsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgUmVmZXJlbmNlUmVzb2x2ZXJXcmFwcGVyPiByZXNvbHZlcnMgPSBudWxsOwotCXByaXZhdGUgQXJyYXlMaXN0PElSZWZlcmVuY2VSZXNvbHZlcj4gc29ydGVkID0gbnVsbDsKLQlwcml2YXRlIERlZmF1bHRSZWZlcmVuY2VSZXNvbHZlciBkZWZhdWx0UmVzb2x2ZXIgPSBuZXcgRGVmYXVsdFJlZmVyZW5jZVJlc29sdmVyKCk7Ci0JcHVibGljIElSZWZlcmVuY2VSZXNvbHZlcltdIGdldFJlc29sdmVycygpIHsKLQkJaWYoIHJlc29sdmVycyA9PSBudWxsIHx8IHNvcnRlZCA9PSBudWxsKQotCQkJbG9hZFJlc29sdmVycygpOwotCQlpZiAoc29ydGVkLmlzRW1wdHkoKSkgcmV0dXJuIG5ldyBJUmVmZXJlbmNlUmVzb2x2ZXJbMF07Ci0gICAgICAgIHJldHVybiAoSVJlZmVyZW5jZVJlc29sdmVyW10pIHNvcnRlZC50b0FycmF5KG5ldyBJUmVmZXJlbmNlUmVzb2x2ZXJbc29ydGVkLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgSVJlZmVyZW5jZVJlc29sdmVyIGdldFJlc29sdmVyKElWaXJ0dWFsQ29tcG9uZW50IGNvbnRleHQsIFJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlKSB7Ci0JCWdldFJlc29sdmVycygpOwotCQlJdGVyYXRvcjxJUmVmZXJlbmNlUmVzb2x2ZXI+IGkgPSBzb3J0ZWQuaXRlcmF0b3IoKTsKLQkJSVJlZmVyZW5jZVJlc29sdmVyIHJlc29sdmVyOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJcmVzb2x2ZXIgPSBpLm5leHQoKTsKLQkJCWlmKCByZXNvbHZlci5jYW5SZXNvbHZlKGNvbnRleHQsIHJlZmVyZW5jZSkpCi0JCQkJcmV0dXJuIHJlc29sdmVyOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0UmVzb2x2ZXI7Ci0JfQotCQotCXB1YmxpYyBJUmVmZXJlbmNlUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCWdldFJlc29sdmVycygpOwotCQlJdGVyYXRvcjxJUmVmZXJlbmNlUmVzb2x2ZXI+IGkgPSBzb3J0ZWQuaXRlcmF0b3IoKTsKLQkJSVJlZmVyZW5jZVJlc29sdmVyIHJlc29sdmVyOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJcmVzb2x2ZXIgPSBpLm5leHQoKTsKLQkJCWlmKCByZXNvbHZlci5jYW5SZXNvbHZlKHJlZmVyZW5jZSkpCi0JCQkJcmV0dXJuIHJlc29sdmVyOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0UmVzb2x2ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRSZXNvbHZlcnMoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBSZWZlcmVuY2VSZXNvbHZlcldyYXBwZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVmZXJlbmNlUmVzb2x2ZXJXcmFwcGVyPigpOwotCQkKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQsICJyZWZlcmVuY2VSZXNvbHZlciIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCWZvciggaW50IGogPSAwOyBqIDwgY2YubGVuZ3RoOyBqKysgKSB7Ci0JCQlpZCA9IGNmW2pdLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCXRyeSB7Ci0JCQkJbWFwLnB1dChpZCwgbmV3IFJlZmVyZW5jZVJlc29sdmVyV3JhcHBlcigKLQkJCQkJCWlkLCAoSVJlZmVyZW5jZVJlc29sdmVyKQotCQkJCQkJCWNmW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIiksCi0JCQkJCQljZltqXS5nZXRBdHRyaWJ1dGUoIndlaWdodCIpKSk7Ci0JCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlICkgewotCQkJCS8vIFRPRE8gZmlndXJlIGl0IG91dAotCQkJfQotCQl9Ci0JCQotCQkvLyBDYWNoZSB0aGUgc29ydGVkIG9uZXMKLQkJTGlzdDxSZWZlcmVuY2VSZXNvbHZlcldyYXBwZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0KG1hcC52YWx1ZXMoKSk7Ci0JCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgeyAKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCWlmKCAhKG8xIGluc3RhbmNlb2YgUmVmZXJlbmNlUmVzb2x2ZXJXcmFwcGVyKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWlmKCAhKG8yIGluc3RhbmNlb2YgUmVmZXJlbmNlUmVzb2x2ZXJXcmFwcGVyKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJcmV0dXJuICgoUmVmZXJlbmNlUmVzb2x2ZXJXcmFwcGVyKW8yKS5nZXRXZWlnaHQoKQotCQkJCSAJLSAoKFJlZmVyZW5jZVJlc29sdmVyV3JhcHBlcilvMSkuZ2V0V2VpZ2h0KCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIGNvbXBhcmF0b3IpOwotCQlBcnJheUxpc3Q8SVJlZmVyZW5jZVJlc29sdmVyPiBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0PElSZWZlcmVuY2VSZXNvbHZlcj4oKTsKLQkJSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpCi0JCQlzb3J0ZWQuYWRkKCgoUmVmZXJlbmNlUmVzb2x2ZXJXcmFwcGVyKWkubmV4dCgpKS5nZXRSZXNvbHZlcigpKTsKLQkJdGhpcy5zb3J0ZWQgPSBzb3J0ZWQ7Ci0JCXRoaXMucmVzb2x2ZXJzID0gbWFwOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUmVmZXJlbmNlUmVzb2x2ZXJXcmFwcGVyIHsKLQkJcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JCXByaXZhdGUgSVJlZmVyZW5jZVJlc29sdmVyIHJlc29sdmVyOwotCQlwcml2YXRlIGludCB3ZWlnaHQ7Ci0JCXB1YmxpYyBSZWZlcmVuY2VSZXNvbHZlcldyYXBwZXIoU3RyaW5nIGlkLCBJUmVmZXJlbmNlUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyB3ZWlnaHQpIHsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLQkJCXRyeSB7Ci0JCQkJdGhpcy53ZWlnaHQgPSBJbnRlZ2VyLnBhcnNlSW50KHdlaWdodCk7Ci0JCQl9IGNhdGNoKCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJdGhpcy53ZWlnaHQgPSAxMDAwOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0V2VpZ2h0KCkgewotCQkJcmV0dXJuIHdlaWdodDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJcmV0dXJuIGlkOwotCQl9Ci0JCXB1YmxpYyBJUmVmZXJlbmNlUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKSB7Ci0JCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lUYWdnZWRWaXJ0dWFsUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJjZjQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZSB7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gdGFnIHRvIHRoZSBwYXRoIGxpbmtlZCB0byB0aGlzIHJlc291cmNlIAotCSAqIEBwYXJhbSBhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24gLSBwYXRoIGxpbmtlZCB0byB0aGUgcmVzb3VyY2UKLQkgKiBAcGFyYW0gdGFnIC0gVGhlIHRhZyB0byBiZSBzZXQKLQkgKiBAcGFyYW0gbW9uaXRvciAtIGNhbiBiZSBudWxsCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXRoIHdhcyB0YWdnZWQgY29ycmVjdGx5LCBmYWxzZSBvdGhlcndpc2UgKGUuZy4gdGhlIHBhdGggaXMgbm90IGxpbmtlZCB0byB0aGUgcmVzb3VyY2UpICAKLQkgKi8KLQkKLQlib29sZWFuIHRhZ1Jlc291cmNlKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgU3RyaW5nIHRhZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBmaXJzdCBsaW5rIHRvIHRoaXMgcmVzb3VyY2UgdGFnZ2VkIHdpdGggdGhlIGdpdmVuIHRhZwotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIGxpbmtlZCB0byB0aGlzIHJlc291cmNlIHRhZ2dlZCB3aXRoIHRoZSBnaXZlbiB0YWcsIG9yIG51bGwgaWYgbm8gcGF0aCBjYW4gYmUgZm91bmQuCi0JICovCi0JSVBhdGggZ2V0Rmlyc3RUYWdnZWRSZXNvdXJjZShTdHJpbmcgdGFnKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRocyBvZiB0aGUgbGlua3MgdG8gdGhpcyByZXNvdXJjZSB0YWdnZWQgd2l0aCB0aGUgZ2l2ZW4gdGFnCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gdGhlIHBhdGhzIGxpbmtlZCB0byB0aGlzIHJlc291cmNlIHRhZ2dlZCB3aXRoIHRoZSBnaXZlbiB0YWcsIG9yIGVtcHR5IGFycmF5IGlmIG5vIHBhdGhzIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlJUGF0aFtdIGdldFRhZ2dlZFJlc291cmNlcyhTdHJpbmcgdGFnKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGY2YTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGNvbXBvbmVudCBhcyBkZWZpbmVkIGJ5IHRoZSAuY29tcG9uZW50IGZpbGUuCi0gKiA8cD4KLSAqIEEgY29tcG9uZW50IGlzIGEgY29udGFpbmVyIG9mIHZpcnR1YWwgcmVzb3VyY2VzIHdoaWNoIGhhcyBvdGhlciBmZWF0dXJlcyB0aGF0IGRlc2NyaWJlIHRoZQotICogY29tcG9uZW50IGluY2x1ZGluZzoKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkKLQlJUGF0aCBST09UID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDEpIHdoaWNoIGlkZW50aWZpZXMgY29tcG9uZW50IGJpbmFyeSBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZID0gMHgxOwotCQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHRoZSBwcm9wZXJ0eSBvZiB3aGljaCByZWZlcmVuY2UgdHlwZXMgd2UncmUgcmVxdWVzdGluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RFRF9SRUZFUkVOQ0VfVFlQRSA9ICJSRVFVRVNURURfUkVGRVJFTkNFX1RZUEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBUkRfUkVGRVJFTkNFUyA9ICJIQVJEX1JFRkVSRU5DRVMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9ERVJJVkVEX1JFRkVSRU5DRVMgPSAiTk9OX0RFUklWRURfUkVGRVJFTkNFUyI7Ci0JCi0JLyoqCi0JICogUmV0cmlldmUgYWxsIGNvbXBvbmVudCByZWZlcmVuY2VzIGRpc3BsYXlhYmxlIHRvIHRoZSB1c2VyLCBleGNsdWRpbmcgcmVmZXJlbmNlcyB0byBjb21wb25lbnRzIHRoYXQgbWlnaHQgbm90Ci0JICogZXhpc3QgKGkuZS4gY2FsbHMgdG8gdGhlc2UgY29tcG9uZW50J3Mge0BsaW5rIElWaXJ0dWFsQ29tcG9uZW50I2V4aXN0cygpfSByZXR1cm4gZmFsc2UpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUExBWUFCTEVfUkVGRVJFTkNFUyA9ICJESVNQTEFZQUJMRV9SRUZFUkVOQ0VTIjsKLQkKLQkvKioKLQkgKiBSZXRyaWV2ZSBhbGwgY29tcG9uZW50IHJlZmVyZW5jZXMgZGlzcGxheWFibGUgdG8gdGhlIHVzZXIsIGluY2x1ZGluZyByZWZlcmVuY2VzIHRvIGNvbXBvbmVudHMgdGhhdCBtaWdodCBub3QKLQkgKiBleGlzdCAoaS5lLiBjYWxscyB0byB0aGVzZSBjb21wb25lbnQncyB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnQjZXhpc3RzKCl9IHJldHVybiBmYWxzZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZQUJMRV9SRUZFUkVOQ0VTX0FMTCA9ICJESVNQTEFZQUJMRV9SRUZFUkVOQ0VTX0FMTCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFUVEVOQUJMRV9SRUZFUkVOQ0VTID0gIkZMQVRURU5BQkxFX1JFRkVSRU5DRVMiOwotCQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBpdHMgZW5jbG9zaW5nIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBUaGUgZGVwbG95ZWQgbmFtZSBvZiB0aGUgY29tcG9uZW50LgotCSAqLwotCVN0cmluZyBnZXREZXBsb3llZE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnRUeXBlSWQgaXMgdXNlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGNvbXBvbmVudCBzaG91bGQgYmUgZWRpdGVkIGFuZCBkZXBsb3llZC4KLQkgKiBFeGFtcGxlcyBpbmNsdWRlICJqc3Qud2ViIiBvciAianN0LnV0aWxpdHkiLiBUaGUgY29tcG9uZW50VHlwZUlkIGNhbiBiZSBzZXQgdG8gYW55IHZhbHVlIHdoZW4KLQkgKiBjcmVhdGVkIHNvIGxvbmcgYXMgdGhhdCB2YWx1ZSBtYWtlcyBzZW5zZSB0byB0aGUgY2xpZW50cy4gU3RhbmRhcmQgY29tcG9uZW50VHlwZUlkcyBtYXkgYmUKLQkgKiBhdmFpbGFibGUgZm9yIGNvbW1vbiBjb21wb25lbnQgdHlwZXMuCi0JICogCi0JICogQHJldHVybiBUaGUgY29tcG9uZW50VHlwZUlkLCBhIHN0cmluZyBiYXNlZCBpZGVudGlmaWVyIHRoYXQgaW5kaWNhdGVzIHRoZSBjb21wb25lbnQKLQkgKi8KLS8vCVN0cmluZyBnZXRDb21wb25lbnRUeXBlSWQoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byBpdHNlbGYuCi0JICogPHA+Ci0JICogIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSB2aXJ0dWFsIHJlc291cmNlCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpOwotCQotCi0JLyoqCi0JICogCi0JICogVGhlIGNvbXBvbmVudFR5cGVJZCBpcyB1c2VkIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgY29tcG9uZW50IHNob3VsZCBiZSBlZGl0ZWQgYW5kIGRlcGxveWVkLgotCSAqIEV4YW1wbGVzIGluY2x1ZGUgImpzdC53ZWIiIG9yICJqc3QudXRpbGl0eSIuIFRoZSBjb21wb25lbnRUeXBlSWQgY2FuIGJlIHNldCB0byBhbnkgdmFsdWUgd2hlbgotCSAqIGNyZWF0ZWQgc28gbG9uZyBhcyB0aGF0IHZhbHVlIG1ha2VzIHNlbnNlIHRvIHRoZSBjbGllbnRzLiBTdGFuZGFyZCBjb21wb25lbnRUeXBlSWRzIG1heSBiZQotCSAqIGF2YWlsYWJsZSBmb3IgY29tbW9uIGNvbXBvbmVudCB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbXBvbmVudFR5cGVJZAotCSAqICAgICAgICAgICAgQSB2YWx1ZSB3aGljaCBpcyBlaXRoZXIgc3RhbmRhcmQgZm9yIGEgY29tbW9uIGNvbXBvbmVudCB0eXBlIG9yIGNsaWVudC1kZWZpbmVkIGZvcgotCSAqICAgICAgICAgICAgYSBjdXN0b20gY29tcG9uZW50IHR5cGUKLQkgKi8KLS8vCXZvaWQgc2V0Q29tcG9uZW50VHlwZUlkKFN0cmluZyBhQ29tcG9uZW50VHlwZUlkKTsKLQotCS8qKgotCSAqIE1ldGFQcm9wZXJ0aWVzIGFyZSBTdHJpbmctYmFzZWQgbmFtZS12YWx1ZSBwYWlycyB0aGF0IGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcwotCSAqIGNvbXBvbmVudCB0aGF0IG1heSBiZSByZWxldmFudCB0byBjbGllbnRzIG9yIHRoZSB3YXkgdGhhdCBjbGllbnRzIGVkaXQgb3IgZGVwbG95IGNvbXBvbmVudHMuCi0JICogCi0JICogQHJldHVybiBBIGJ5LXJlZmVyZW5jZSBpbnN0YW5jZSBvZiB0aGUgcHJvcGVydGllcyBmb3IgdGhpcyBjb21wb25lbnQuCi0JICovCi0JUHJvcGVydGllcyBnZXRNZXRhUHJvcGVydGllcygpOwotCQotCS8qKgotCSAqIEFkZHMgYSBzaW5nbGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAJCUEgdmFsdWUgd2hpY2ggaXMgbmFtZSwgdmFsdWUgcGFpciwgc2VlIENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpCi0JICogCQkKLQkgKi8KLQl2b2lkIHNldE1ldGFQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBwcm9wZXJ0aWVzIHByb3ZpZGVkIGFzIGEgbGlzdAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0JICogCQkJQSBsaXN0IG9mIHByb3BlcnRpZXMKLQkgKi8KLQl2b2lkIHNldE1ldGFQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLQkvKioKLQkgKiBNZXRhUmVzb3VyY2VzIHByb3ZpZGUgYSBsb29zZSBtZWNoYW5pc20gZm9yIGNvbXBvbmVudHMgdGhhdCB3b3VsZCBsaWtlIHRvIGxpc3Qgb2ZmIHRoZQotCSAqIG1ldGFkYXRhLXJlc291cmNlcyBhdmFpbGFibGUgaW4gdGhlIGNvbXBvbmVudCB3aGljaCBjYW4gYWlkIG9yIGV4cGVkaXRlIHNlYXJjaGluZyBmb3IgdGhpcwotCSAqIHJlc291cmNlcy4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBub3QgcmVxdWlyZWQgdG8gZ2V0IG9yIHNldCB0aGUgTWV0YVJlc291cmNlcyBmb3IgYSBjb21wb25lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gQSBieS12YWx1ZSBjb3B5IG9mIHRoZSBNZXRhUmVzb3VyY2VzIGFycmF5Ci0JICogQHNlZSAjc2V0TWV0YVJlc291cmNlcyhJUGF0aFtdKQotCSAqLwotCUlQYXRoW10gZ2V0TWV0YVJlc291cmNlcygpOwotCi0JLyoqCi0JICogCi0JICogTWV0YVJlc291cmNlcyBwcm92aWRlIGEgbG9vc2UgbWVjaGFuaXNtIGZvciBjb21wb25lbnRzIHRoYXQgd291bGQgbGlrZSB0byBsaXN0IG9mZiB0aGUKLQkgKiBtZXRhZGF0YS1yZXNvdXJjZXMgYXZhaWxhYmxlIGluIHRoZSBjb21wb25lbnQgd2hpY2ggY2FuIGFpZCBvciBleHBlZGl0ZSBzZWFyY2hpbmcgZm9yIHRoaXMKLQkgKiByZXNvdXJjZXMuCi0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgbm90IHJlcXVpcmVkIHRvIGdldCBvciBzZXQgdGhlIE1ldGFSZXNvdXJjZXMgZm9yIGEgY29tcG9uZW50LiBUaGUgZXhpc3RpbmcKLQkgKiBNZXRhUmVzb3VyY2VzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0aGVNZXRhUmVzb3VyY2VQYXRocwotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGF0aHMgdGhhdCB3aWxsIGJlY29tZSB0aGUgbmV3IE1ldGFSZXNvdXJjZSBhcnJheS4KLQkgKi8KLQl2b2lkIHNldE1ldGFSZXNvdXJjZXMoSVBhdGhbXSB0aGVNZXRhUmVzb3VyY2VQYXRocyk7Ci0KLQotCS8qKgotCSAqIFZpcnR1YWwgY29tcG9uZW50cyBtYXkgcmVmZXJlbmNlIG90aGVyIHZpcnR1YWwgY29tcG9uZW50cyB0byBidWlsZCBsb2dpY2FsIGRlcGVuZGVuY3kgdHJlZXMuIAotCSAqIDxwPgotCSAqIEVhY2ggdmlydHVhbCByZWZlcmVuY2Ugd2lsbCBpbmRpY2F0ZSBob3cgdGhlIGNvbnRlbnQgb2YgdGhlIHJlZmVyZW5jZSB3aWxsIGJlIGFic29yYmVkIAotCSAqIGJ5IHRoaXMgY29tcG9uZW50LiBFYWNoIHZpcnR1YWwgcmVmZXJlbmNlIHdpbGwgYWx3YXlzIHNwZWNpZnkgYW4gZW5jbG9zaW5nIGNvbXBvbmVudCB0aGF0IHdpbGwKLQkgKiBiZSB0aGlzIGNvbXBvbmVudC4gICAKLQkgKiA8L3A+Ci0JICogQHJldHVybiBBIGJ5LXZhbHVlIGNvcHkgb2YgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIGFycmF5Ci0JICovCi0JSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBWaXJ0dWFsIGNvbXBvbmVudHMgbWF5IHJlZmVyZW5jZSBvdGhlciB2aXJ0dWFsIGNvbXBvbmVudHMgdG8gYnVpbGQgbG9naWNhbCBkZXBlbmRlbmN5IHRyZWVzLiAKLQkgKiA8cD4KLQkgKiBFYWNoIHZpcnR1YWwgcmVmZXJlbmNlIHdpbGwgaW5kaWNhdGUgaG93IHRoZSBjb250ZW50IG9mIHRoZSByZWZlcmVuY2Ugd2lsbCBiZSBhYnNvcmJlZCAKLQkgKiBieSB0aGlzIGNvbXBvbmVudC4gRWFjaCB2aXJ0dWFsIHJlZmVyZW5jZSB3aWxsIGFsd2F5cyBzcGVjaWZ5IGFuIGVuY2xvc2luZyBjb21wb25lbnQgdGhhdCB3aWxsCi0JICogYmUgdGhpcyBjb21wb25lbnQuICAKLQkgKiA8L3A+Ci0JICogQHBhcmFtIG9wdGlvbnMgQSBoYXNobWFwIGZ1bGwgb2Ygb3B0aW9ucwotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zKTsKLQotCS8qKgotCSAqIFZpcnR1YWwgY29tcG9uZW50cyBtYXkgcmVmZXJlbmNlIG90aGVyIHZpcnR1YWwgY29tcG9uZW50cyB0byBidWlsZCBsb2dpY2FsIGRlcGVuZGVuY3kgdHJlZXMuIAotCSAqIDxwPgotCSAqIEVhY2ggdmlydHVhbCByZWZlcmVuY2Ugd2lsbCBpbmRpY2F0ZSBob3cgdGhlIGNvbnRlbnQgb2YgdGhlIHJlZmVyZW5jZSB3aWxsIGJlIGFic29yYmVkIAotCSAqIGJ5IHRoaXMgY29tcG9uZW50LiBFYWNoIHZpcnR1YWwgcmVmZXJlbmNlIHdpbGwgYWx3YXlzIHNwZWNpZnkgYW4gZW5jbG9zaW5nIGNvbXBvbmVudCB0aGF0IHdpbGwKLQkgKiBiZSB0aGlzIGNvbXBvbmVudC4gICAKLQkgKiA8L3A+Ci0JICogQHJldHVybiBBIGJ5LXZhbHVlIGNvcHkgb2YgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIHdpdGggZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lIGV4aXN0IG1hdGNoaW5nIHRoaXMgbmFtZQotCSAqLwotCUlWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZShTdHJpbmcgYUNvbXBvbmVudE5hbWUpOwotCQotCi0JCi0JLyoqCi0JICogVmlydHVhbCBjb21wb25lbnRzIG1heSByZWZlcmVuY2Ugb3RoZXIgdmlydHVhbCBjb21wb25lbnRzIHRvIGJ1aWxkIGxvZ2ljYWwgZGVwZW5kZW5jeSB0cmVlcy4gCi0JICogPHA+Ci0JICogRWFjaCB2aXJ0dWFsIHJlZmVyZW5jZSB3aWxsIGluZGljYXRlIGhvdyB0aGUgY29udGVudCBvZiB0aGUgcmVmZXJlbmNlIHdpbGwgYmUgYWJzb3JiZWQgCi0JICogYnkgdGhpcyBjb21wb25lbnQuIEVhY2ggdmlydHVhbCByZWZlcmVuY2Ugd2lsbCBhbHdheXMgc3BlY2lmeSBhbiBlbmNsb3NpbmcgY29tcG9uZW50IHRoYXQgd2lsbAotCSAqIGJlIHRoaXMgY29tcG9uZW50LiBBbnkgcmVmZXJlbmNlcyBzcGVjaWZpZWQgaW4gdGhlIGFycmF5IHdoaWNoIGRvIG5vdCBzcGVjaWZ5IGFuIGVuY2xvc2luZwotCSAqIGNvbXBvbmVudCB0aGF0IG1hdGNoZXMgdGhpcyBjb21wb25lbnQgd2lsbCBiZSBtb2RpZmllZCB0byBzcGVjaWZ5IHRoaXMgdmlydHVhbCBjb21wb25lbnQuIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBFeGlzdGluZyB2aXJ0dWFsIHJlZmVyZW5jZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHRoZVJlZmVyZW5jZXMgQSBieS12YWx1ZSBjb3B5IG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBhcnJheQotCSAqLwotCXZvaWQgc2V0UmVmZXJlbmNlcyhJVmlydHVhbFJlZmVyZW5jZVtdIHRoZVJlZmVyZW5jZXMpOwotCQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaXMgb2YgYmluYXJ5IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBiaW5hcnkgc3RhdHVzLgotCSAqLwotCWJvb2xlYW4gaXNCaW5hcnkoKTsJCQotCQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBlbGVtZW50cyBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LiBSZXNvdXJjZXMKLQkgKiBtYXkgYmUgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpZiB0aGUgbWFwcGVkIHBhdGggZG9lcyBub3QgZXhpc3QuIAotCSAqIAotCSAqIEBwYXJhbSB1cGRhdGVGbGFncyBBbnkgb2YgSVZpcnR1YWxSZXNvdXJjZSBvciBJUmVzb3VyY2UgdXBkYXRlIGZsYWdzLiBJZiBhIAotCSAqIAkJCXJlc291cmNlIG11c3QgYmUgY3JlYXRlZCwgdGhlIHVwZGF0ZUZsYWdzIHdpbGwgYmUgc3VwcGxpZWQgdG8gdGhlIAotCSAqIAkJCXJlc291cmNlIGNyZWF0aW9uIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsgCi0JCi0JLyoqCi0JICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgcm9vdCBmb2xkZXIuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSBjb250YWluZXIKLQkgKiBub3IgdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG1lbWJlciBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSAoaGFuZGxlIG9mIHRoZSkgbWVtYmVyIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRSb290Rm9sZGVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgY29tcG9uZW50LiAKLQkgKiA8cD4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCBtYXkgbm90IChhbmQgbW9zdCBsaWtlbHkgd2lsbCBub3QpIGJlIHJlZmVyZW5jZWQgaW4gdGhlIAotCSAqIHJ1bnRpbWUgcGF0aCBvZiB0aGlzIHZpcnR1YWwgcGF0aCwgYnV0IHdpbGwgYmUgcmVmZXJlbmNlZCBieSB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGguIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yIHRoZSByZXN1bHRpbmcgcHJvamVjdCBuZWVkCi0JICogZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgaGFuZGxlCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21wb25lbnQgaXMgYmFja2VkIGJ5IGFuIGFjY2Vzc2libGUgQ29tcG9uZW50LiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb25lbnRzIHdoaWNoIHJlZmVyZW5jZSB0aGlzIGNvbXBvbmVudC4gIFRoaXMgaXMgb25seSBhIG9uZSBsYXllcgotCSAqIGRlZXAgc2VhcmNoIGFsZ29yaXRobS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIElWaXJ0dWFsQ29tcG9uZW50cwotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNDExYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBjb21wb25lbnQgYXMgZGVmaW5lZCBieSB0aGUgV1RQIE1vZHVsZXMgZmlsZS4gQSAKLSAqIHZpcnR1YWwgY29udGFpbmVyIHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBvbmVudC4gCi0gKiA8cD4KLSAqIFZpcnR1YWwgY29udGFpbmVycyBjYW4gcHJvdmlkZSBoYW5kbGVzIHRvIHZpcnR1YWwgZmlsZXMgYW5kIAotICogdmlydHVhbCBmb2xkZXJzIHRoYXQgaXQgY29udGFpbnMuIAotICogPC9wPgotICogPHA+Ci0gKiBUbyBhY3F1aXJlIGEgaGFuZGxlIHRvIGEgY29tcG9uZW50LCB1c2UgdGhlIGZvbGxvd2luZyBzbmlwcGV0Ojxicj4gCi0gKiA8Y29kZT5Nb2R1bGVDb3JlLmNyZWF0ZUNvbnRhaW5lcihjb250YWluaW5nUHJvamVjdCwgY29tcG9uZW50TmFtZSk8L2NvZGU+Ci0gKiB3aGljaCB3aWxsIGNyZWF0ZSBhIGhhbmRsZSB0byBhIHZpcnR1YWwgY29udGFpbmVyIGNvbnRhaW5lZCBieSAKLSAqIDxpPmNvbnRhaW5pbmdQcm9qZWN0PC9pPiB3aXRoIHRoZSBuYW1lIDxpPmNvbXBvbmVudE5hbWU8L2k+LiBJZiB0aGUgCi0gKiBhIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMsIHRoZW4gCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlI2V4aXN0cygpfQotICogd2lsbCByZXR1cm4gdHJ1ZS4gT3RoZXJ3aXNlLCB1c2Uge0BsaW5rICNjcmVhdGUoaW50LCBJUHJvZ3Jlc3NNb25pdG9yKX0gdG8gCi0gKiBjcmVhdGUgdGhlIHJlbGV2YW50IG1vZGVsIGVsZW1lbnRzLiBJZiBhIGNsaWVudCBuZWVkcyB0byBhZGQgYSAKLSAqIG1hcHBpbmcgZnJvbSBhIGZvbGRlciBpbiB0aGUgc2FtZSBwcm9qZWN0IHRvIHJvb3QsIHVzZSAKLSAqIHtAbGluayAjY3JlYXRlTGluayhJUGF0aCwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKX0gd2l0aCBhIAotICogcHJvamVjdC1yZWxhdGl2ZSBwYXRoLiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbENvbnRhaW5lciBleHRlbmRzIElWaXJ0dWFsUmVzb3VyY2UgeyAgCi0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgZWxlbWVudHMgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdC4gUmVzb3VyY2VzCi0JICogbWF5IGJlIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaWYgdGhlIG1hcHBlZCBwYXRoIGRvZXMgbm90IGV4aXN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgQW55IG9mIElWaXJ0dWFsUmVzb3VyY2Ugb3IgSVJlc291cmNlIHVwZGF0ZSBmbGFncy4gSWYgYSAKLQkgKiAJCQlyZXNvdXJjZSBtdXN0IGJlIGNyZWF0ZWQsIHRoZSB1cGRhdGVGbGFncyB3aWxsIGJlIHN1cHBsaWVkIHRvIHRoZSAKLQkgKiAJCQlyZXNvdXJjZSBjcmVhdGlvbiBvcGVyYXRpb24uCi0JICogQHBhcmFtIGFNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247IAotIAotIAotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhIHZpcnR1YWwgcmVzb3VyY2Ugb2Ygc29tZSB0eXBlIHdpdGggdGhlIGdpdmVuIHBhdGggCi0JICogZXhpc3RzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UuCi0JICogVGhlIHN1cHBsaWVkIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpbiBlaXRoZXIgY2FzZSwgaXQgaXMKLQkgKiBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlLiAgVHJhaWxpbmcgc2VwYXJhdG9ycyBhcmUgaWdub3JlZC4KLQkgKiBJZiB0aGUgcGF0aCBpcyBlbXB0eSB0aGlzIGNvbnRhaW5lciBpcyBjaGVja2VkIGZvciBleGlzdGVuY2UuCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcmVzb3VyY2Ugb2Ygc29tZSB0eXBlIHdpdGggdGhlIGdpdmVuIHBhdGggCi0JICogICAgIGV4aXN0cyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cyhJUGF0aCBwYXRoKTsKLQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIgdmlydHVhbCByZXNvdXJjZSAoZm9sZGVyIG9yIGZpbGUpCi0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGlzIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaAotCSAqIHJlc291cmNlIGV4aXN0cy4KLQkgKiAKLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbWVtYmVyIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgbWVtYmVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlyZXNvdXJjZSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIgcmVzb3VyY2UgKGZvbGRlciwgb3IgZmlsZSkKLQkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoaXMgY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKLQkgKiB0aGVyZSBpcyBubyBzdWNoIHJlc291cmNlLgotCSAqIDxwPgotCSAqIElmIHRoZSA8Y29kZT5pbmNsdWRlUGhhbnRvbXM8L2NvZGU+IGFyZ3VtZW50IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgCi0JICogb25seSBhIG1lbWJlciByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhpc3RzIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogSWYgdGhlIDxjb2RlPmluY2x1ZGVQaGFudG9tczwvY29kZT4gYXJndW1lbnQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogdGhlIG1ldGhvZCBhbHNvIHJldHVybnMgYSByZXNvdXJjZSBpZiB0aGUgd29ya3NwYWNlIGlzIGtlZXBpbmcgdHJhY2sgb2YgYQotCSAqIHBoYW50b20gd2l0aCB0aGF0IG5hbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBubyBhdHRlbXB0IGlzIG1hZGUgdG8gZXhjbHVkZSB0ZWFtLXByaXZhdGUgbWVtYmVyIHJlc291cmNlcwotCSAqIGFzIHdpdGggPGNvZGU+bWVtYmVyczwvY29kZT4uCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG5hbWUgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBtZW1iZXIgcmVzb3VyY2UKLQkgKiBAcGFyYW0gaW5jbHVkZVBoYW50b21zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBoYW50b20gcmVzb3VyY2VzIGFyZQotCSAqICAgb2YgaW50ZXJlc3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBwaGFudG9tIHJlc291cmNlcyBhcmUgbm90IG9mCi0JICogICBpbnRlcmVzdAotCSAqIEByZXR1cm4gdGhlIG1lbWJlciByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaAotCSAqIAkJcmVzb3VyY2UgZXhpc3RzCi0JICogQHNlZSAjbWVtYmVycygpCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2lzUGhhbnRvbSgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcgbmFtZSwgaW50IHNlYXJjaEZsYWdzKTsKLQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aCBpbgotCSAqIHRoaXMgY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLQkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwotCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UuICAgVHJhaWxpbmcgc2VwYXJhdG9ycyBhbmQgdGhlIHBhdGgncwotCSAqIGRldmljZSBhcmUgaWdub3JlZC4gSWYgdGhlIHBhdGggaXMgZW1wdHkgdGhpcyBjb250YWluZXIgaXMgcmV0dXJuZWQuICAKLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBkZXNpcmVkIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgbWVtYmVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlyZXNvdXJjZSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoIHBhdGgpOwotCi0JLyoqCi0JICogRmluZHMgYW5kIHJldHVybnMgdGhlIG1lbWJlciByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoIGluCi0JICogdGhpcyBjb250YWluZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggcmVzb3VyY2UuCi0JICogVGhlIHN1cHBsaWVkIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpbiBlaXRoZXIgY2FzZSwgaXQgaXMKLQkgKiBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlLiAgVHJhaWxpbmcgc2VwYXJhdG9ycyBhbmQgdGhlIHBhdGgncwotCSAqIGRldmljZSBhcmUgaWdub3JlZC4KLQkgKiBJZiB0aGUgcGF0aCBpcyBlbXB0eSB0aGlzIGNvbnRhaW5lciBpcyByZXR1cm5lZC4gCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgZGVzaXJlZCByZXNvdXJjZQotCSAqIEBwYXJhbSBpbmNsdWRlUGhhbnRvbXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGhhbnRvbSByZXNvdXJjZXMgYXJlCi0JICogICBvZiBpbnRlcmVzdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHBoYW50b20gcmVzb3VyY2VzIGFyZSBub3Qgb2YKLQkgKiAgIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgbWVtYmVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlyZXNvdXJjZSBleGlzdHMKLQkgKiBAc2VlICNtZW1iZXJzKGJvb2xlYW4pCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2lzUGhhbnRvbSgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCBwYXRoLCBpbnQgc2VhcmNoRmxhZ3MpOyAKLQotCS8qKgotCSAqIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGZpbGUgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGlzCi0JICogY29udGFpbmVyLgotCSAqIDxwPiAKLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yCi0JICogdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwotCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UgYW5kIGlzIGFwcGVuZGVkCi0JICogdG8gdGhpcyBjb250YWluZXIncyBmdWxsIHBhdGggdG8gZm9ybSB0aGUgZnVsbCBwYXRoIG9mIHRoZSByZXN1bHRhbnQgcmVzb3VyY2UuCi0JICogQSB0cmFpbGluZyBzZXBhcmF0b3IgaXMgaWdub3JlZC4gVGhlIHBhdGggb2YgdGhlIHJlc3VsdGluZyByZXNvdXJjZSBtdXN0IAotCSAqIGhhdmUgYXQgbGVhc3QgdHdvIHNlZ21lbnRzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBtZW1iZXIgZmlsZQotCSAqIEByZXR1cm4gdGhlIChoYW5kbGUgb2YgdGhlKSBtZW1iZXIgZmlsZQotCSAqIEBzZWUgI2dldEZvbGRlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxGaWxlIGdldEZpbGUoSVBhdGggcGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBmb2xkZXIgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGlzCi0JICogY29udGFpbmVyLgotCSAqIDxwPiAKLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yCi0JICogdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4gCi0JICogPHA+Ci0JICogVGhlIHN1cHBsaWVkIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpbiBlaXRoZXIgY2FzZSwgaXQgaXMKLQkgKiBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlIGFuZCBpcyBhcHBlbmRlZAotCSAqIHRvIHRoaXMgY29udGFpbmVyJ3MgZnVsbCBwYXRoIHRvIGZvcm0gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcmVzdWx0YW50IHJlc291cmNlLgotCSAqIEEgdHJhaWxpbmcgc2VwYXJhdG9yIGlzIGlnbm9yZWQuIFRoZSBwYXRoIG9mIHRoZSByZXN1bHRpbmcgcmVzb3VyY2UgbXVzdAotCSAqIGhhdmUgYXQgbGVhc3QgdHdvIHNlZ21lbnRzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBtZW1iZXIgZm9sZGVyCi0JICogQHJldHVybiB0aGUgKGhhbmRsZSBvZiB0aGUpIG1lbWJlciBmb2xkZXIKLQkgKiBAc2VlICNnZXRGaWxlKElQYXRoKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoSVBhdGggcGF0aCk7IAotCi0JLyoqCi0JICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoaXMgZm9sZGVyLgotCSAqIDxwPiAKLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yCi0JICogdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG1lbWJlciBmaWxlCi0JICogQHJldHVybiB0aGUgKGhhbmRsZSBvZiB0aGUpIG1lbWJlciBmaWxlCi0JICogQHNlZSAjZ2V0Rm9sZGVyKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxGaWxlIGdldEZpbGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgZm9sZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyBmb2xkZXIuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSBjb250YWluZXIKLQkgKiBub3IgdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG1lbWJlciBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSAoaGFuZGxlIG9mIHRoZSkgbWVtYmVyIGZvbGRlcgotCSAqIEBzZWUgI2dldEZpbGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgZXhpc3RpbmcgbWVtYmVyIHJlc291cmNlcyAocHJvamVjdHMsIGZvbGRlcnMgYW5kIGZpbGVzKQotCSAqIGluIHRoaXMgcmVzb3VyY2UsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZnVsbHkgZXF1aXZhbGVudCB0byA8Y29kZT5tZW1iZXJzKElWaXJ0dWFsUmVzb3VyY2UuTk9ORSk8L2NvZGU+LgotCSAqIFRlYW0tcHJpdmF0ZSBtZW1iZXIgcmVzb3VyY2VzIGFyZSA8Yj5ub3Q8L2I+IGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCi0JICogPC9wPjxwPgotCSAqIE5vdGUgdGhhdCB0aGUgbWVtYmVycyBvZiBhIHByb2plY3Qgb3IgZm9sZGVyIGFyZSB0aGUgZmlsZXMgYW5kIGZvbGRlcnMKLQkgKiBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGl0LiAgVGhlIG1lbWJlcnMgb2YgdGhlIHdvcmtzcGFjZSByb290Ci0JICogYXJlIHRoZSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWVtYmVycyBvZiB0aGlzIHJlc291cmNlCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgcmVxdWVzdCBmYWlscy4gUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+IFRoaXMgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QuPC9saT4KLQkgKiA8bGk+IFRoaXMgcmVzb3VyY2UgaXMgYSBwcm9qZWN0IHRoYXQgaXMgbm90IG9wZW4uPC9saT4KLQkgKiA8L3VsPgotCSAqIEBzZWUgI2ZpbmRNZW1iZXIoSVBhdGgpCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2lzQWNjZXNzaWJsZSgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbWVtYmVyIHJlc291cmNlcyAocHJvamVjdHMsIGZvbGRlcnMgYW5kIGZpbGVzKQotCSAqIGluIHRoaXMgcmVzb3VyY2UsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICogPHA+Ci0JICogSWYgdGhlIDxjb2RlPklOQ0xVREVfUEhBTlRPTVM8L2NvZGU+IGZsYWcgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgbWVtYmVyIAotCSAqIGZsYWdzIChyZWNvbW1lbmRlZCksIG9ubHkgbWVtYmVyIHJlc291cmNlcyB0aGF0IGV4aXN0IHdpbGwgYmUgcmV0dXJuZWQuCi0JICogSWYgdGhlIDxjb2RlPklOQ0xVREVfUEhBTlRPTVM8L2NvZGU+IGZsYWcgaXMgc3BlY2lmaWVkLAotCSAqIHRoZSByZXN1bHQgd2lsbCBhbHNvIGluY2x1ZGUgYW55IHBoYW50b20gbWVtYmVyIHJlc291cmNlcyB0aGUKLQkgKiB3b3Jrc3BhY2UgaXMga2VlcGluZyB0cmFjayBvZi4KLQkgKiA8L3A+PHA+Ci0JICogSWYgdGhlIDxjb2RlPklOQ0xVREVfVEVBTV9QUklWQVRFX01FTUJFUlM8L2NvZGU+IGZsYWcgaXMgc3BlY2lmaWVkIAotCSAqIGluIHRoZSBtZW1iZXIgZmxhZ3MsIHRlYW0gcHJpdmF0ZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgYWxvbmcgd2l0aAotCSAqIHRoZSBvdGhlcnMuIElmIHRoZSA8Y29kZT5JTkNMVURFX1RFQU1fUFJJVkFURV9NRU1CRVJTPC9jb2RlPiBmbGFnCi0JICogaXMgbm90IHNwZWNpZmllZCAocmVjb21tZW5kZWQpLCB0aGUgcmVzdWx0IHdpbGwgb21pdCBhbnkgdGVhbSBwcml2YXRlCi0JICogbWVtYmVyIHJlc291cmNlcy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIDxjb2RlPkVYQ0xVREVfREVSSVZFRDwvY29kZT4gZmxhZyBpcyBub3Qgc3BlY2lmaWVkLCBkZXJpdmVkIAotCSAqIHJlc291cmNlcyBhcmUgaW5jbHVkZWQuIElmIHRoZSA8Y29kZT5FWENMVURFX0RFUklWRUQ8L2NvZGU+IGZsYWcgaXMgCi0JICogc3BlY2lmaWVkIGluIHRoZSBtZW1iZXIgZmxhZ3MsIGRlcml2ZWQgcmVzb3VyY2VzIGFyZSBub3QgaW5jbHVkZWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1lbWJlckZsYWdzIGJpdC13aXNlIG9yIG9mIG1lbWJlciBmbGFnIGNvbnN0YW50cwotCSAqICAgKDxjb2RlPklOQ0xVREVfUEhBTlRPTVM8L2NvZGU+LCA8Y29kZT5JTkNMVURFX1RFQU1fUFJJVkFURV9NRU1CRVJTPC9jb2RlPgotCSAqICAgYW5kIDxjb2RlPkVYQ0xVREVfREVSSVZFRDwvY29kZT4pIGluZGljYXRpbmcgd2hpY2ggbWVtYmVycyBhcmUgb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1lbWJlcnMgb2YgdGhpcyByZXNvdXJjZQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIHJlcXVlc3QgZmFpbHMuIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPiBUaGlzIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LjwvbGk+Ci0JICogPGxpPiB0aGUgPGNvZGU+SU5DTFVERV9QSEFOVE9NUzwvY29kZT4gZmxhZyBpcyBub3Qgc3BlY2lmaWVkIGFuZAotCSAqICAgICB0aGlzIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LjwvbGk+Ci0JICogPGxpPiB0aGUgPGNvZGU+SU5DTFVERV9QSEFOVE9NUzwvY29kZT4gZmxhZyBpcyBub3Qgc3BlY2lmaWVkIGFuZAotCSAqICAgICB0aGlzIHJlc291cmNlIGlzIGEgcHJvamVjdCB0aGF0IGlzIG5vdCBvcGVuLjwvbGk+Ci0JICogPC91bD4KLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjZXhpc3RzKCkKLQkgKiBAcGxhbm5lZGZvciAyLjAKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoaW50IG1lbWJlckZsYWdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIGdldFJlc291cmNlcyhTdHJpbmcgYVJlc291cmNlVHlwZSk7CQotfQotIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbEZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDQ0NDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLS8qKgotICogUmVwcmVzZW50cyBhIGZpbGUgdGhhdCBjYW4gYmUgbmF2aWdhdGVkIHRocm91Z2ggCi0gKiBhbiBhYnN0cmFjdCAoInZpcnR1YWwiKSBwYXRoLiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbEZpbGUgZXh0ZW5kcyBJVmlydHVhbFJlc291cmNlIHsgIAotCS8qKgotCSAqIHJldHVybnMgdGhlIHVuZGVybHlpbmcgSUZpbGUsIHJldHVybnMgZmlyc3QgSUZpbGUgaWYgbXVsdGlwbGUgZXhpc3QuCi0JICogCi0JICogQHJldHVybiB0aGUgdW5kZXJseWluZyBJRmlsZQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRVbmRlcmx5aW5nRmlsZSgpOwotCS8qKgotCSAqIHJldHVybnMgdGhlIGFycmF5IG9mIHVuZGVybHlpbmcgSUZpbGVzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUgc2FtZSBydW50aW1lIHBhdGguCi0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdW5kZXJseWluZyBJRmlsZXMgbWFwcGVkIHRvIHRoZSBydW50aW1lIHBhdGgKLQkgKi8KLQlwdWJsaWMgSUZpbGVbXSBnZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxOWU4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLS8qKgotICogUmVwcmVzZW50cyBhIGZvbGRlciB0aGF0IGNhbiBiZSBuYXZpZ2F0ZWQgdGhyb3VnaCAKLSAqIGFuIGFic3RyYWN0ICgidmlydHVhbCIpIHBhdGguCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZpcnR1YWxGb2xkZXIgZXh0ZW5kcyBJVmlydHVhbENvbnRhaW5lciB7IAotCS8qKgotCSAqIHJldHVybnMgdGhlIHVuZGVybHlpbmcgSUZvbGRlciBtYXBwZWQgdG8gdGhlIHJ1bnRpbWUgcGF0aCwgCi0JICogcmV0dXJucyBmaXJzdCBJRm9sZGVyIGlmIG11bHRpcGxlIGV4aXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgSUZvbGRlcgotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkvKioKLQkgKiByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIElGb2xkZXJzIG1hcHBlZCB0byB0aGUgcnVudGltZSBwYXRoLiAKLQkgKiBNdWx0aXBsZSBJRm9sZGVycyBjYW4gYmUgbWFwcGVkIHRvIHRoZSBzYW1lIHJ1bnRpbWUgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB1bmRlcmx5aW5nIElGb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRVbmRlcmx5aW5nRm9sZGVycygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM3YzZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBjb21wb25lbnRzOiBFbmNsb3NpbmdDb21wb25lbnQtPlJlZmVyZW5jZWRDb21wb25lbnQuIAotICogPHA+Ci0gKiBUaGUgUmVmZXJlbmNlZENvbXBvbmVudCBtYXkgZXhpc3QgaW4gYW5vdGhlciBwcm9qZWN0IG9yIGFzIGEgYmluYXJ5IGZvcm0gb24gdGhlIGNsYXNzcGF0aCAKLSAqIG9mIHRoZSBwcm9qZWN0LgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZpcnR1YWxSZWZlcmVuY2UgewotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBkZXBlbmRlbmN5IHNob3VsZCBiZSBhcmNoaXZlZCBpbnRvIGEgKi4/YXIgZm9ybWF0IGJlZm9yZSBiZWluZyBhYnNvcmJlZC4KLQkgKi8KLQlpbnQgREVQRU5ERU5DWV9UWVBFX1VTRVMgPSBEZXBlbmRlbmN5VHlwZS5VU0VTOwotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBkZXBlbmRlbmN5IHdpbGwgYmUgYWJzb3JiZWQgYXMgaXMgd2l0aG91dCBhcmNoaXZpbmcuIAotCSAqLwotCWludCBERVBFTkRFTkNZX1RZUEVfQ09OU1VNRVMgPSBEZXBlbmRlbmN5VHlwZS5DT05TVU1FUzsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoaXMgdmlydHVhbCByZWZlcmVuY2UgaW4gbW9kZWwsIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgQ3VycmVudGx5IG5vIHVwZGF0ZSBmbGFncyBhcHBseS4gCi0JICogQHBhcmFtIGFNb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0cmFjayB0aGUgY29tcGxldGlvbiBvZiB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmVmZXJlbmNlIGFjdHVhbCBleGlzdHMgaW4gdGhlIG1vZGVsCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgcmVmZXJlbmNlIGFjdHVhbCBleGlzdHMgaW4gdGhlIG1vZGVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCk7Ci0JCi0JLyoqCi0JICogVGhlIHJ1bnRpbWUgcGF0aCBpbmRpY2F0ZXMgd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcmVuY2VkCi0JICogY29tcG9uZW50IHdpbGwgYmUgYWJzb3JiZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgY29tcG9uZW50LgotCSAqIEBwYXJhbSBhUnVudGltZVBhdGggQSB2YWx1ZSBjb21wb25lbnQtcmVsYXRpdmUgcGF0aC4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVBhdGgoSVBhdGggYVJ1bnRpbWVQYXRoKTsKLQkvKioKLQkgKiBUaGUgcnVudGltZSBwYXRoIGluZGljYXRlcyB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgKiBjb21wb25lbnQgd2lsbCBiZSBhYnNvcmJlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVuY2xvc2luZyBjb21wb25lbnQuCi0JICogQHJldHVybiBBIHZhbHVlIGNvbXBvbmVudC1yZWxhdGl2ZSBwYXRoLiAKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKTsKLQkKLQkvKioKLQkgKiBUaGUgZGVwZW5kZW5jeVR5cGUgaW5kaWNhdGVzIGhvdyB0aGUgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IHdpbGwgYmUgYWJzb3JiZWQuCi0JICogQHBhcmFtIGFEZXBlbmRlbmN5VHlwZSBPbmUgb2YgREVQRU5ERU5DWV9UWVBFX1VTRVMgb3IgREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTCi0JICogQHNlZSAjREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTCi0JICogQHNlZSAjREVQRU5ERU5DWV9UWVBFX1VTRVMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBlbmRlbmN5VHlwZShpbnQgYURlcGVuZGVuY3lUeXBlKTsKLQkKLQotCS8qKgotCSAqIEByZXR1cm4gT25lIG9mIERFUEVOREVOQ1lfVFlQRV9VU0VTIG9yIERFUEVOREVOQ1lfVFlQRV9DT05TVU1FUwotCSAqIEBzZWUgI0RFUEVOREVOQ1lfVFlQRV9DT05TVU1FUwotCSAqIEBzZWUgI0RFUEVOREVOQ1lfVFlQRV9VU0VTCi0JICovCi0JcHVibGljIGludCBnZXREZXBlbmRlbmN5VHlwZSgpOwotCQotCS8qKgotCSAqIFRoZSBlbmNsb3NpbmcgY29tcG9uZW50IGNvbnRhaW5zIHRoaXMgcmVmZXJlbmNlLCBhbmQgd2lsbCBhYnNvcmIgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudAotCSAqIEByZXR1cm4gVGhlIGVuY2xvc2luZyBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCk7Ci0JCi0JLyoqCi0JICogVGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IGlzICJ0YXJnZXRlZCIgYnkgdGhlIHJlZmVyZW5jZSwgYW5kIHdpbGwgYmUgYWJzb3JiZWQgYnkgdGhlIGVuY2xvc2luZyBjb21wb25lbnQuIAotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudCB0aGF0IGlzICJ0YXJnZXRlZCIgYnkgdGhlIHJlZmVyZW5jZSBhbmQgd2lsbCBiZSBhYnNvcmJlZCBieSB0aGUgZW5jbG9zaW5nIGNvbXBvbmVudC4gCi0JICogQHBhcmFtIHJlZmVyZW5jZWRDb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQsIEVPYmplY3QgZGVwZW5kZW50T2JqZWN0KTsKLQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGFyY2hpdmUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBhcmNoaXZlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50Ci0JICogQHBhcmFtIGFyY2hpdmVOYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZU5hbWUoU3RyaW5nIGFyY2hpdmVOYW1lKTsKLQkKLQkvKioKLQkgKiBJcyB0aGlzIHJlZmVyZW5jZSBhICdkZXJpdmVkJyByZWZlcmVuY2U/IEEgZGVyaXZlZCByZWZlcmVuY2UKLQkgKiBpcyBhIHJlZmVyZW5jZSB0aGF0J3Mgbm90IHBlcnNpc3RlZCBpbiB0aGUgcHJpbWFyeSBtb2RlbCAKLQkgKiBpbnNpZGUgdGhlIG9yZy5lY2xpcHNlLndzdC5jb21wb25lbnQgZmlsZS4gCi0JICogCi0JICogQHJldHVybiBpc0Rlcml2ZWQgZmFsc2UgaWYgcGVyc2lzdGVkLCB0cnVlIG90aGVyd2lzZSAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZThlMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLQotCi0vKioKLSAqIDxwPgotICogQWxsb3dzIGNsaWVudHMgdG8gd29yayB3aXRoIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlcyAKLSAqIHVzaW5nIEFQSSBzaW1pbGFyIHRvIHRoZSBFY2xpcHNlIFBsYXRmb3JtIElSZXNvdXJjZSBtb2RlbC4KLSAqIDwvcD4KLSAqIDxwPgotICogSVZpcnR1YWxSZXNvdXJjZSBhbGxvd3MgcmVzb3VyY2VzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYQotICogYWJzdHJhY3QgcGF0aCByZWZlcnJlZCB0byBhcyBhICJydW50aW1lIHBhdGgiLiAKLSAqIEEgdmlydHVhbCByZXNvdXJjZSBtYXkgcmVwcmVzZW50IG11bHRpcGxlIHVuZGVybHlpbmcgcmVzb3VyY2VzLgotICogQSB2aXJ0dWFsIHJlc291cmNlIGlzIGNvbnRhaW5lZCBieSBleGFjdGx5IG9uZSBjb21wb25lbnQuCi0gKiBBIHJlc291cmNlIG1heSBiZSByZXByZXNlbnRlZCBieSBtdWx0aXBsZSB2aXJ0dWFsIHJlc291cmNlcywgd2hpY2gKLSAqIG1heSBiZSBjb250YWluZWQgYnkgb25lIG9yIG1vcmUgY29tcG9uZW50cy4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElWaXJ0dWFsUmVzb3VyY2UgYWxsb3dzIGNsaWVudHMgdG8gYWNxdWlyZQotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaW5jbHVkaW5nIHRoZSBuYW1lLCAKLSAqIGFuZCB0aGUgcGF0aHMgd2hpY2ggYXJlIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IHJlc291cmNlLCBzdWNoCi0gKiBhcyB0aGUge0BsaW5rICNnZXRSdW50aW1lUGF0aCgpIHJ1bnRpbWUgcGF0aH0sIHRoZSAKLSAqIHtAbGluayAjZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGh9Ci0gKiBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSwgYW5kIHRoZSAKLSAqIHtAbGluayAjZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpIHByb2plY3QtcmVsYXRpdmUgcGF0aH0KLSAqIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICogPGEgbmFtZT0icmVmZXJlbmNlcyIgLz4KLSAqIDxwPkVhY2ggSVZpcnR1YWxSZXNvdXJjZSBjYW4gcmVwcmVzZW50IGFuIDxiPmltcGxpY2l0PC9iPiByZWZlcmVuY2Ugb3IKLSAqIGFuIDxiPmV4cGxpY2l0PC9iPiByZWZlcmVuY2UuIEFuIDxiPmV4cGxpY2l0PC9iPiByZWZlcmVuY2UgaXMgYSBmb3JtYWwKLSAqIG1hcHBpbmcgZnJvbSBzb21lIHBhdGggd2l0aGluIHRoZSBmaWxlIHN0cnVjdHVyZSB0byBhIHJ1bnRpbWUgcGF0aC4gQ2hhbmdpbmcKLSAqIG9yIHJlbW92aW5nIGFuIGV4cGxpY2l0IHJlZmVyZW5jZSBvbmx5IHJlcXVpcmVzIG1vZGVsIG1vZGlmaWNhdGlvbnMuIEFuIAotICogPGI+aW1wbGljaXQ8L2I+IHJlZmVyZW5jZSBoYXMgYSByb290IHdoaWNoIGlzIGRlcml2ZWQgZnJvbSBhbiBleHBsaWNpdCBwYXRoLAotICogYnV0IHNvbWUgZnJhZ21lbnQgb2YgdGhlIHBhdGggdG93YXJkcyB0aGUgZW5kIGlzIGRlcml2ZWQgZnJvbSB0aGUgbGl0ZXJhbCAKLSAqIHBhdGggd2l0aGluIHRoZSBmaWxlIHN0cnVjdHVyZS4gTW9kaWZpY2F0aW9ucyB0byBpbXBsaWNpdCBwYXRocyBtYXkgY2F1c2UgCi0gKiBjaGFuZ2VzIHRvIHN0cnVjdHVyZSBvbiBkaXNrLiBGb3IgcmVzb3VyY2UgbW9kaWZpY2F0aW9ucyB0aGF0IHNob3VsZCBub3QgbW9kaWZ5Ci0gKiBzdHJ1Y3R1cmVzIG9uIGRpc2ssIHVzZSB7QGxpbmsgI0lHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFfS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbFJlc291cmNlIGV4dGVuZHMgSVNjaGVkdWxpbmdSdWxlLCBJQWRhcHRhYmxlIHsgIAotCQkJCQkJCQkJCQkJCQkJCQkKLQotCS8qCi0JICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0JICogQ29uc3RhbnRzIGRlZmluaW5nIHJlc291cmNlIHR5cGVzOiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSByZXNvdXJjZSAKLQkgKiB0eXBlcyBhbmQgdGhlaXIgdHlwZSBjb25zdGFudHMgYXJlIGluIHRoZSBoZXggcmFuZ2UgMHgxMCB0byAweDgwIAotCSAqIGFzIGRlZmluZWQgYmVsb3cuCi0JICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkgKi8KLQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDE2KSB3aGljaCBpZGVudGlmaWVzIGZpbGUgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKiBAc2VlIElWaXJ0dWFsRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEUgPSAweDEwOwotCi0JLyoqCi0JICogVHlwZSBjb25zdGFudCAoYml0IG1hc2sgdmFsdWUgMzIpIHdoaWNoIGlkZW50aWZpZXMgZm9sZGVyIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSBJVmlydHVhbEZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPTERFUiA9IDB4MjA7Ci0KLQkvKioKLQkgKiBUeXBlIGNvbnN0YW50IChiaXQgbWFzayB2YWx1ZSA2NCkgd2hpY2ggaWRlbnRpZmllcyB0aGUgcm9vdCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSBJVmlydHVhbENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVCA9IDB4NDA7Ci0JCi0JLyoqCi0JICogR2VuZXJhbCBwdXJwb3NlIHplcm8tdmFsdWVkIGJpdCBtYXNrIGNvbnN0YW50LiBVc2VmdWwgd2hlbmV2ZXIgeW91IG5lZWQgdG8gc3VwcGx5IGEgYml0IG1hc2sKLQkgKiB3aXRoIG5vIGJpdHMgc2V0LgotCSAqIDxwPgotCSAqIEV4YW1wbGUgdXNhZ2U6IDxjb2RlPgotCSAqIDxwcmU+Ci0JICogZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuTk9ORSwgbnVsbCkKLQkgKiA8L3ByZT4KLQkgKiA8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwbGFubmVkZm9yIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCi0JLyoKLQkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb25zdGFudHMgZm9yIHVwZGF0ZQotCSAqIGZsYWdzIGZvciBkZWxldGUsIG1vdmUsIGNvcHksIG9wZW4sIGV0Yy46Ci0JICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkgKi8KLQotCS8qKgotCSAqIFVwZGF0ZSBmbGFnIGNvbnN0YW50IChiaXQgbWFzayB2YWx1ZSAyNTYpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uIHNob3VsZCBwcm9jZWVkIGV2ZW4gaWYKLQkgKiB0aGUgcmVzb3VyY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICogCi0JICogQHBsYW5uZWRmb3IgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SQ0UgPSAweDEwMDsgCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCBleGNsdXNpb25zIGVudW1lcmF0ZWQgaW4gdGhlIG1vZGVsIHNob3VsZCBiZSBpZ25vcmVkLiAoYml0IG1hc2sgdmFsdWUgNTEyKSAgCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0VYQ0xVU0lPTlMgPSAweDIwMDsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IG1vZGlmaWNhdGlvbnMgc2hvdWxkIG9ubHkgbW9kaWZ5IHRoZSBtZXRhbW9kZWwgYW5kIGlnbm9yZSB0aGUgdW5kZXJseWluZwotCSAqIHJlc291cmNlcyB3aGVyZSBhcHBsaWNhYmxlLiAgU2VlIHRoZSAKLQkgKiA8YSBocmVmPSJJVmlydHVhbFJlc291cmNlLmh0bWwjcmVmZXJlbmNlcyI+ZG9jdW1lbnRhdGlvbiBvbiByZWZlcmVuY2VzPC9hPiAKLQkgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aHkgdGhpcyBmbGFnIGlzIHJlbGV2YW50LiAoYml0IG1hc2sgdmFsdWUgMTAyNCkgIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFID0gMHg0MDA7ICAKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gdGhlIHN1cHBsaWVkIGxvY2F0aW9uIHRvIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyAKLQkgKiB2aXJ0dWFsIHJlc291cmNlLiBNb2RlbCBjaGFuZ2VzIHdpbGwgb2NjdXIgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QsIAotCSAqIGFuZCBwb3RlbnRpYWxseSByZXNvdXJjZS1sZXZlbCBjcmVhdGlvbnMgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uIEEgcHJvamVjdCByZWxhdGl2ZSBsb2NhdGlvbiB0aGF0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHJ1bnRpbWUgcGF0aCBhZnRlciB0aGlzIGNhbGwKLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgQSBiaXRtYXNrIG9mIGZsYWdzIHRvIHN1cHBseSB0byB0aGUgbWV0aG9kLiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUxpbmsoSVBhdGggYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBtYXBwaW5nLCBpZiBpdCBleGlzdHMsIGZyb20gdGhlIHN1cHBsaWVkIGxvY2F0aW9uIHRvIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyAKLQkgKiB2aXJ0dWFsIHJlc291cmNlLiBNb2RlbCBjaGFuZ2VzIHdpbGwgb2NjdXIgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QsIAotCSAqIGFuZCBwb3RlbnRpYWxseSByZXNvdXJjZS1sZXZlbCBjcmVhdGlvbnMgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uIEEgcHJvamVjdCByZWxhdGl2ZSBsb2NhdGlvbiB3aG9zZSBtYXBwaW5nIHRvIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIHJlbW92ZWQuCi0JICogQHBhcmFtIHVwZGF0ZUZsYWdzIEEgYml0bWFzayBvZiBmbGFncyB0byBzdXBwbHkgdG8gdGhlIG1ldGhvZC4gCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaW5rKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JCi0JLyoqICAgCi0JICogUmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBmbGV4aWJsZSBzdHJ1Y3R1cmUuIFJlbW92aW5nIHRoZSByZXNvdXJjZSBjb3VsZCByZXF1aXJlCi0JICogY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBtZXRhbW9kZWwgb3IgY2hhbmdlcyB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUuIFRvIGF2b2lkCi0JICogY2hhbmdlcyB0aGUgYWN0dWFsIGRpc2sgc3RydWN0dXJlLCB1c2Uge0BsaW5rICNJR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRX0uCi0JICogPHA+Ci0JICogVXBkYXRlIGZsYWdzIHN1cHBsaWVkIHRvIHRoaXMgbWV0aG9kIHdpbGwgYmUgcGFzc2VkIGludG8gYW55IElSZXNvdXJjZSBtb2RpZmljYXRpb24KLQkgKiBBUEkgd2hpY2ggaXMgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgbWV0aG9kJ3MgaW52b2NhdGlvbi4gIAotCSAqIDwvcD4KLQkgKiBAc2VlICNJR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRQotCSAqIEBzZWUgSVJlc291cmNlI2RlbGV0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHk7IGZvciByZXNvdXJjZXMsIGVxdWFsaXR5IGlzIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlaXIKLQkgKiBoYW5kbGVzOiBzYW1lIHJlc291cmNlIHR5cGUsIGVxdWFsIGZ1bGwgcGF0aHMsIGFuZCBpZGVudGljYWwgd29ya3NwYWNlcy4gUmVzb3VyY2VzIGFyZSBub3QKLQkgKiBlcXVhbCB0byBvYmplY3RzIG90aGVyIHRoYW4gcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBvdGhlcgotCSAqICAgICAgICAgICAgdGhlIG90aGVyIG9iamVjdAotCSAqIEByZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBvYmplY3RzIGFyZSBlcXVhbHMKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHZpcnR1YWwgcmVzb3VyY2UgaXMgYmFja2VkIGJ5IGFuIGFjY2Vzc2libGUgSVJlc291cmNlLiAKLQkgKiA8cD4KLQkgKiA8Y29kZT5JVmlydHVhbFJlc291cmNlPC9jb2RlPiBvYmplY3RzIGFyZSBsaWdodHdlaWdodCBoYW5kbGUgb2JqZWN0cyB1c2VkIHRvIGFjY2VzcwotCSAqIElSZXNvdXJjZXMuIEhvd2V2ZXIsIGhhdmluZyBhbiBJVmlydHVhbFJlc291cmNlIGhhbmRsZSBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoZQotCSAqIHVuZGVybHlpbmcgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhlIGhhbmRsZSBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZSwgb3IgaXMgYWNjZXNzaWJsZS4KLQkgKiBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSBleGlzdGVuY2Ugb3IgYWNjZXNzaWJpbGl0eSBvZiB0aGUgdW5kZXJseWluZyAKLQkgKiByZXNvdXJjZSwge0BsaW5rICNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKX0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UjZXhpc3RzKCkKLQkgKiBAc2VlICNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24gb2YgdGhpcyB2aXJ0dWFsIHJlc291cmNlJ3MgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcwotCSAqIG5vdCBoYXZlIG9uZS4gVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIHdpbGwgYmUgcmV0dXJuZWQsIHdoaWNoIG1heSBvciBtYXkgbm90IG1hdGNoCi0JICogdGhhdCBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4gCi0JICogPHA+Ci0JICogVGhlIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24gaXMgZGVmaW5lZCBhcyB0aGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdCBwZXJpb2QgKCIuIikgY2hhcmFjdGVyCi0JICogaW4gdGhlIG5hbWUuIElmIHRoZXJlIGlzIG5vIHBlcmlvZCBpbiB0aGUgbmFtZSwgdGhlIHBhdGggaGFzIG5vIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24uIElmCi0JICogdGhlIG5hbWUgZW5kcyBpbiBhIHBlcmlvZCwgdGhlIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24gaXMgdGhlIGVtcHR5IHN0cmluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IHRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHN0cmluZyBmaWxlIGV4dGVuc2lvbgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyB0aGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuIElmIHRoaXMgcmVzb3VyY2UgZG9lcwotCSAqIGV4aXN0LCBpdHMgcGF0aCBjYW4gYmUgc2FmZWx5IGFzc3VtZWQgdG8gYmUgdmFsaWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhpcyByZXNvdXJjZQotCSAqIEBzZWUgI2dldFByb2plY3RSZWxhdGl2ZVBhdGgoKQotCSAqIEBzZWUgSVJlc291cmNlI2dldEZ1bGxQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgYSByZWxhdGl2ZSBwYXRoIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHdpdGggcmVzcGVjdCB0byBpdHMgcHJvamVjdC4gIAotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyB0aGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuIElmIHRoaXMgcmVzb3VyY2UgZG9lcwotCSAqIGV4aXN0LCBpdHMgcGF0aCBjYW4gYmUgc2FmZWx5IGFzc3VtZWQgdG8gYmUgdmFsaWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFByb2plY3QtcmVsYXRpdmUgcGF0aHMgYXJlIHJlY29tbWVuZGVkIG92ZXIgYWJzb2x1dGUgcGF0aHMsIHNpbmNlIHRoZSBmb3JtZXIgYXJlIG5vdCBhZmZlY3RlZAotCSAqIGlmIHRoZSBwcm9qZWN0IGlzIHJlbmFtZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhpcyByZXNvdXJjZSB3aXRoIHJlc3BlY3QgdG8gaXRzIHByb2plY3QKLQkgKiBAc2VlICNnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBzZWUgSVJlc291cmNlI2dldFByb2plY3RSZWxhdGl2ZVBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyB2aXJ0dWFsIHJlc291cmNlLiBUaGUgcnVudGltZSBwYXRoCi0JICogaXMgZGV0ZXJtaW5lZCB0aHJvdWdoIHRoZSBtZXRhbW9kZWwgYW5kIHJlcHJlc2VudHMgdGhlIHBhdGggdGhhdCB0aGUKLQkgKiB1bmRlcmx5aW5nIHJlc291cmNlIHdpbGwgYmUgYWNjZXNzZWQgYXQgcnVudGltZS4gCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSBwYXRoIG9mIHRoaXMgdmlydHVhbCByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHZpcnR1YWwgcmVzb3VyY2UuIFRoZSBuYW1lIG9mIGEgdmlydHVhbCByZXNvdXJjZSAKLQkgKiBpcyBzeW5vbnltb3VzIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiBpdHMgcnVudGltZSBwYXRoLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyB0aGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoaXMgcmVzb3VyY2UgZXhpc3RzLCBpdHMgbmFtZSBjYW4gYmUgc2FmZWx5IGFzc3VtZWQgdG8gYmUgdmFsaWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UKLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjb250YWlucyB0aGlzIHZpcnR1YWwgcmVzb3VyY2UuCi0JICogPHA+Ci0JICogRWFjaCB2aXJ0dWFsIHJlc291cmNlIGlzIGNvbnRhaW5lZCBieSBhdCBsZWFzdCBvbmUgY29tcG9uZW50LiBBIGNvbXBvbmVudAotCSAqIHJlcHJlc2VudHMgYSBsb2dpY2FsIGNvbGxlY3Rpb24gb2YgZmlsZXMuIElmIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGlzIAotCSAqIGNvbnRhaW5lZCBieSBtdWx0aXBsZSBjb21wb25lbnRzLCB0aGVuIHRoZSBjb21wb25lbnQgbmFtZSByZXR1cm5lZCBieQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBob3cgdGhlIHZpcnR1YWwgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuIAotCSAqIEZvciBlYWNoIHZpcnR1YWwgcmVzb3VyY2UsIHRoZSBjb21wb25lbnQgbmFtZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSAKLQkgKiBjb21wb25lbnQgbmFtZSBvZiB0aGUgcGFyZW50LgotCSAqICAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjb250YWlucyB0aGUgdmlydHVhbCByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpcnR1YWwgcmVzb3VyY2Ugd2hpY2ggY29udGFpbnMgdGhpcyB2aXJ0dWFsIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMKLQkgKiBubyBwYXJlbnQgKHRoYXQgaXMsIHRoZSB2aXJ0dWFsIHJlc291cmNlIHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBvbmVudCkuCi0JICogPHA+Ci0JICogVGhlIGZ1bGwgcGF0aCBvZiB0aGUgcGFyZW50IHJlc291cmNlIGlzIHRoZSBzYW1lIGFzIHRoaXMgcmVzb3VyY2UncyBmdWxsIHBhdGggd2l0aCB0aGUgbGFzdAotCSAqIHNlZ21lbnQgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IG5laXRoZXIgdGhlIHJlc291cmNlIG5vciB0aGUgcmVzdWx0aW5nIHJlc291cmNlIG5lZWQKLQkgKiBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgY29udGFpbmVyIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZpcnR1YWwgcmVzb3VyY2UgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50Ci0JICovCi0JcHVibGljIElWaXJ0dWFsQ29udGFpbmVyIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgY29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIHRoaXMgdmlydHVhbCByZXNvdXJjZS4gCi0JICogPHA+Ci0JICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgbWF5IG5vdCAoYW5kIG1vc3QgbGlrZWx5IHdpbGwgbm90KSBiZSByZWZlcmVuY2VkIGluIHRoZSAKLQkgKiBydW50aW1lIHBhdGggb2YgdGhpcyB2aXJ0dWFsIHBhdGgsIGJ1dCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IG5laXRoZXIgdGhlIHJlc291cmNlIG5vciB0aGUgcmVzdWx0aW5nIHByb2plY3QgbmVlZAotCSAqIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGhhbmRsZQotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIG9uZSBvZiA8Y29kZT5GSUxFPC9jb2RlPiwKLQkgKiA8Y29kZT5GT0xERVI8L2NvZGU+LCA8Y29kZT5DT01QT05FTlQ8L2NvZGU+Ci0JICogPHA+Ci0JICogPHVsPgotCSAqIDxsaT4gQWxsIHJlc291cmNlcyBvZiB0eXBlIDxjb2RlPkZJTEU8L2NvZGU+IGltcGxlbWVudCA8Y29kZT5JVmlydHVhbEZpbGU8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVzb3VyY2VzIG9mIHR5cGUgPGNvZGU+Rk9MREVSPC9jb2RlPiBpbXBsZW1lbnQgPGNvZGU+SVZpcnR1YWxGb2xkZXI8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVzb3VyY2VzIG9mIHR5cGUgPGNvZGU+Q09NUE9ORU5UPC9jb2RlPiBpbXBsZW1lbnQgPGNvZGU+SVZpcnR1YWxDb250YWluZXI8L2NvZGU+LjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IHRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UKLQkgKiBAc2VlICNGSUxFCi0JICogQHNlZSAjRk9MREVSCi0JICogQHNlZSAjQ09NUE9ORU5UCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCk7Ci0JCi0JLyoqCi0JICogQSB2aXJ0dWFsIHJlc291cmNlIGlzIGEgcmVwcmVzZW50YXRpb24gb2Ygb25lIG9yIG1vcmUgRWNsaXBzZSBQbGF0Zm9ybSByZXNvdXJjZXMuIAotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlICJwcmltYXJ5IiB1bmRlcmx5aW5nIHJlc291cmNlLiBUaGUgcmVzb3VyY2UgbWF5IG9yIG1heSBub3QgZXhpc3QuIFRoZSByZXNvdXJjZQotCSAqIHdpbGwgYmUgY29udGFpbmVkIGJ5IHRoZSBwcm9qZWN0IHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvamVjdCgpfS4gIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBTaW5jZSBhIHZpcnR1YWwgcmVzb3VyY2UgY291bGQgcmVwcmVzZW50IG11bHRpcGxlIHJlc291cmNlcywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gCi0JICogdGhlICJwcmltYXJ5IiByZXNvdXJjZS4gRm9yIGNsaWVudHMgdGhhdCB3aXNoIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBtdWx0aXBsZSByZXNvdXJjZXMKLQkgKiBhdCBhIHNpbmdsZSBwYXRoLCB1c2Uge0BsaW5rICNnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCl9LiAKLQkgKiBAcmV0dXJuIFRoZSBwcmltYXJ5IHJlc291cmNlIHRoYXQgYmFja3MgdGhpcyB2aXJ0dWFsIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCi0JLyoqCi0JICogQSB2aXJ0dWFsIHJlc291cmNlIGlzIGEgcmVwcmVzZW50YXRpb24gb2Ygb25lIG9yIG1vcmUgRWNsaXBzZSBQbGF0Zm9ybSByZXNvdXJjZXMuIAotCSAqIDxwPgotCSAqIFJldHVybnMgYWxsIHVuZGVybHlpbmcgcmVzb3VyY2VzLiBUaGUgcmVzb3VyY2VzIG1heSBvciBtYXkgbm90IGV4aXN0LiBUaGUgcmVzb3VyY2VzCi0JICogd2lsbCBiZSBjb250YWluZWQgYnkgdGhlIHByb2plY3QgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0KCl9LiAgCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFNpbmNlIGEgdmlydHVhbCByZXNvdXJjZSBjb3VsZCByZXByZXNlbnQgbXVsdGlwbGUgcmVzb3VyY2VzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAKLQkgKiBhbGwgdW5kZXJseWluZyByZXNvdXJjZXMuIEZvciBjbGllbnRzIHRoYXQgcHJlZmVyIHRvIGFja25vd2xlZGdlIG9ubHkgb25lIHJlc291cmNlLCAKLQkgKiBhdCBhIHNpbmdsZSBwYXRoLCB1c2Uge0BsaW5rICNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKX0uIAotCSAqIEByZXR1cm4gQWxsIHJlc291cmNlcyB0aGF0IGJhY2sgdGhpcyB2aXJ0dWFsIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCk7IAotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmVzb3VyY2UgaXMgYWNjZXNzaWJsZS4gRm9yIGZpbGVzIGFuZCBmb2xkZXJzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KLQkgKiBleGlzdGluZzsgZm9yIHByb2plY3RzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gZXhpc3RpbmcgYW5kIGJlaW5nIG9wZW4uIFRoZSB3b3Jrc3BhY2Ugcm9vdCBpcwotCSAqIGFsd2F5cyBhY2Nlc3NpYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKiBAc2VlICNleGlzdHMoKQotCSAqIEBzZWUgSVByb2plY3QjaXNPcGVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2VUeXBlIHByb3ZpZGVzIG1ldGEtaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGVzIG9mIGNvbnRlbnQgdGhpcyB2aXJ0dWFsIHJlc291cmNlIG1heSByZXByZXNlbnQuIEV4YW1wbGVzCi0JICogaW5jbHVkZSAiamF2YSIsICJyZXNvdXJjZXMiLCAiYnBlbCIsIGV0Yy4gCi0JICogPHA+Ci0JICogVGhlIHJlc291cmNlVHlwZSBtYXkgYmUgbnVsbCwgYW5kIHtAbGluayBJVmlydHVhbENvbXBvbmVudH0gd2lsbCBhbHdheXMgcmV0dXJuIG51bGwgZm9yIHRoaXMgbWV0aG9kLiAKLQkgKiA8L3A+Ci0JICogQHJldHVybiBBIGNsaWVudC1zZXQgcmVzb3VyY2VUeXBlIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlVHlwZSBwcm92aWRlcyBtZXRhLWluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBvZiBjb250ZW50IHRoaXMgdmlydHVhbCByZXNvdXJjZSBtYXkgcmVwcmVzZW50LiBFeGFtcGxlcwotCSAqIGluY2x1ZGUgImphdmEiLCAicmVzb3VyY2VzIiwgImJwZWwiLCBldGMuIAotCSAqIDxwPgotCSAqIFRoZSByZXNvdXJjZVR5cGUgbWF5IGJlIG51bGwsIGFuZCB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnR9IHdpbGwgYWx3YXlzIHJldHVybiBudWxsIGZvciB0aGlzIG1ldGhvZC4gCi0JICogPC9wPgotCSAqIEBwYXJhbSBBIGNsaWVudC1zZXQgcmVzb3VyY2VUeXBlIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgYVJlc291cmNlVHlwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTFiYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+bW9kdWxlY29yZSByZXNvdXJjZXMgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+Ci0gICAgICAgIFRoZSBDb21wb25lbnRDb3JlIFZpcnR1YWwgUGF0aCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbmF2aWdhdGUgCi0gICAgICAgIGxvZ2ljYWwgY29sbGVjdGlvbnMgb2YgZmlsZXMgd2l0aGluIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgQVBJIAotICAgICAgICBzaW1pbGFyIHRvIHRoZSBFY2xpcHNlIElSZXNvdXJjZSBBUEkuIAotCQk8L3A+Ci08YSBuYW1lPSJ0b3AiPjwvYT48YSBuYW1lPSJ2aXJ0dWFsLXBhdGgiPjwvYT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjMDA4MGMwIiBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiI+PGI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2ZmZmZmZiI+VmlydHVhbCBQYXRoIEFQSTwvZm9udD48L2I+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxCUj4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotCSAgICAgICAgVGhlIFZpcnR1YWwgUGF0aCBBUEkgcHJvdmlkZXMgYSBmYWNhZGUgdG8gdGhlIGZsZXhpYmxlIHByb2plY3QgbW9kZWwuIAotCSAgICAgICAgRWFjaCBJVmlydHVhbFJlc291cmNlIHJlcHJlc2VudHMgYSByZXNvdXJjZSBmcm9tIHRoZSBydW50aW1lIGNvbXBvbmVudCAKLQkgICAgICAgIHVuZGVyIGEgdmlydHVhbCBydW50aW1lIHBhdGguIEVhY2ggSVZpcnR1YWxSZXNvdXJjZSBtYXkgcmVwcmVzZW50IG9uZSAKLQkgICAgICAgIG9yIG1vcmUgRWNsaXBzZSBQbGF0ZnJvbSByZXNvdXJjZXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBydW50aW1lIHBhdGguCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAJRWFjaCBJVmlydHVhbFJlc291cmNlIGlzIGNvbnRhaW5lZCBieSBleGFjdGx5IG9uZSBJVmlydHVhbENvbXBvbmVudC4gCi0gICAgICAgIAlIb3dldmVyLCB0aGUgdW5kZXJseWluZyByZXNvdXJjZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIAotICAgICAgICAJSVZpcnR1YWxSZXNvdXJjZSBtYXkgYmUgY29udGFpbmVkIGJ5IG11bHRpcGxlIElWaXJ0dWFsQ29tcG9uZW50cy4gCi0gICAgICAgIAlJVmlydHVhbENvbXBvbmVudHMgYXJlIGNvbnRhaW5lZCBieSBJRmxleGlibGVQcm9qZWN0cy4gRWFjaAotICAgICAgICAJSUZsZXhpYmxlUHJvamVjdCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBJVmlydHVhbENvbXBvbmVudHMuIAotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMTAiPgotPHRyPgotPHRkPgotPHA+Ci08aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvbWFwcGluZy5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMTogQSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBwb3NzaWJsZSBtYXBwaW5nIGJldHdlZW4gYSBWaXJ0dWFsIHN0cnVjdHVyZSBhbmQgYSBQbGF0Zm9ybSBSZXNvdXJjZSBzdHJ1Y3R1cmUuPC9pPgotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L3ZpcnR1YWxfcGF0aF9hcGkuanBnIj48L3A+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4KLTxwPgotPGk+RmlndXJlIDI6IFZpcnR1YWwgUGF0aCBNb2RlbDwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk5ZjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Y29tcG9uZW50IGNvcmUgcmVzb3VyY2VzIGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGUgQ29tcG9uZW50Q29yZSBWaXJ0dWFsIFBhdGggQVBJIGFsbG93cyBjbGllbnRzIHRvIG5hdmlnYXRlIAotICAgICAgICBsb2dpY2FsIGNvbGxlY3Rpb25zIG9mIGZpbGVzIHdpdGhpbiBFY2xpcHNlIHByb2plY3RzIHVzaW5nIEFQSSAKLSAgICAgICAgc2ltaWxhciB0byB0aGUgRWNsaXBzZSBJUmVzb3VyY2UgQVBJLiAKLQkJPC9hYnN0cmFjdD4KLQotCQk8YSBuYW1lPSJ0b3AiLz4KLQkJPCEtLQotCQk8cD4KLQkJCVRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzOgotCQkJPHVsPgotCQkJCTxsaT48YSBocmVmPSIjdmlydHVhbC1wYXRoIj5Qb2ludGVyIDE8L2E+IEEgZGVzY3JpcHRpb248L2xpPiAgCi0JCQk8L3VsPgotCQk8L3A+Ci0JCS0tPgotCQk8YSBuYW1lPSJ2aXJ0dWFsLXBhdGgiLz4KLSAgICAgICAgPGgyPlZpcnR1YWwgUGF0aCBBUEk8L2gyPgotICAgICAgICA8QlIgLz4gCi0gICAgICAgIDxwPgotCSAgICAgICAgVGhlIFZpcnR1YWwgUGF0aCBBUEkgcHJvdmlkZXMgYSBmYWNhZGUgdG8gdGhlIGZsZXhpYmxlIHByb2plY3QgbW9kZWwuIAotCSAgICAgICAgRWFjaCBJVmlydHVhbFJlc291cmNlIHJlcHJlc2VudHMgYSByZXNvdXJjZSBmcm9tIHRoZSBydW50aW1lIGNvbXBvbmVudCAKLQkgICAgICAgIHVuZGVyIGEgdmlydHVhbCBydW50aW1lIHBhdGguIEVhY2ggSVZpcnR1YWxSZXNvdXJjZSBtYXkgcmVwcmVzZW50IG9uZSAKLQkgICAgICAgIG9yIG1vcmUgRWNsaXBzZSBQbGF0ZnJvbSByZXNvdXJjZXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBydW50aW1lIHBhdGguCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgIAlFYWNoIElWaXJ0dWFsUmVzb3VyY2UgaXMgY29udGFpbmVkIGJ5IGV4YWN0bHkgb25lIElWaXJ0dWFsQ29tcG9uZW50LiAKLSAgICAgICAgCUhvd2V2ZXIsIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlcyB0aGF0IGFyZSByZXByZXNlbnRlZCBieSB0aGUgCi0gICAgICAgIAlJVmlydHVhbFJlc291cmNlIG1heSBiZSBjb250YWluZWQgYnkgbXVsdGlwbGUgSVZpcnR1YWxDb21wb25lbnRzLiAKLSAgICAgICAgCUlWaXJ0dWFsQ29tcG9uZW50cyBhcmUgY29udGFpbmVkIGJ5IElGbGV4aWJsZVByb2plY3RzLiBFYWNoCi0gICAgICAgIAlJRmxleGlibGVQcm9qZWN0IG1heSBjb250YWluIG9uZSBvciBtb3JlIElWaXJ0dWFsQ29tcG9uZW50cy4gCi0gICAgICAgIDwvcD4KLSAgICAgICAgPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L21hcHBpbmcuanBnIiAKLSAgICAgICAgCSBjYXB0aW9uPSJBIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBhIHBvc3NpYmxlIG1hcHBpbmcgYmV0d2VlbiBhIFZpcnR1YWwgc3RydWN0dXJlIGFuZCBhIFBsYXRmb3JtIFJlc291cmNlIHN0cnVjdHVyZS4iIAotICAgICAgICAJIHdpZHRoPSI2MDAiIGhlaWdodD0iNDY2IgotICAgICAgICAJIC8+Ci0gICAgICAgIDxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy92aXJ0dWFsX3BhdGhfYXBpLmpwZyIgY2FwdGlvbj0iVmlydHVhbCBQYXRoIE1vZGVsIiAvPgotICAgICAgICA8IS0tCi0gICAgICAgIDxjb2Rlc25pcHBldCBjYXB0aW9uPSJBbiBleGFtcGxlIHNuaXBwZXQuIj4KLS4uLiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOyAKLS4uLgotcHVibGljIHN0YXRpYyB2b2lkIG1ha2VGbGV4aWJsZShJUHJvamVjdCBhVGFyZ2V0UHJvamVjdCkgewotICAgIE1vZHVsZUNvcmUgbW9kdWxlQ29yZUluc3RhbmNlID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgICBNb2R1bGVDb3JlTmF0dXJlLmFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShhVGFyZ2V0UHJvamVjdCk7Ci0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZSA9IE1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvcldyaXRlKGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgLi4uIHdvcmsgd2l0aCBtb2R1bGVDb3JlSW5zdGFuY2UgYW5kIHVuZGVybHlpbmcgbW9kZWwgLi4uCi0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5zYXZlSWZOZWNlc3NhcnkoYVByb2dyZXNzTW9uaXRvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKG1vZHVsZUNvcmVJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfSAgICAgICAgCi0gICAgICAgIDwvY29kZXNuaXBwZXQ+Ci0gICAgICAgIDxjb2Rlc25pcHBldCBjYXB0aW9uPSJBbiBleGFtcGxlIHNuaXBwZXQuIj4KLS4uLiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOyAKLS4uLgotcHVibGljIHN0YXRpYyB2b2lkIG1ha2VGbGV4aWJsZShJUHJvamVjdCBhVGFyZ2V0UHJvamVjdCkgewotICAgIE1vZHVsZUNvcmUgbW9kdWxlQ29yZUluc3RhbmNlID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgICBNb2R1bGVDb3JlTmF0dXJlLmFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShhVGFyZ2V0UHJvamVjdCk7Ci0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZSA9IE1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvcldyaXRlKGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgLi4uIHdvcmsgd2l0aCBtb2R1bGVDb3JlSW5zdGFuY2UgYW5kIHVuZGVybHlpbmcgbW9kZWwgLi4uCi0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5zYXZlSWZOZWNlc3NhcnkoYVByb2dyZXNzTW9uaXRvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKG1vZHVsZUNvcmVJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfSAgICAgICAgCi0gICAgICAgIDwvY29kZXNuaXBwZXQ+Ci0gICAgICAgIC0tPgotCQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM0NzZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlcj1FY2xpcHNlLm9yZwotCi1CdW5kbGUtTmFtZS4wID0gTW9kdWxlY29yZSBQbHVnLWluCi1WYWxpZGF0aW9uTWFya2VyLm5hbWU9TW9kdWxlQ29yZSBWYWxpZGF0aW9uIE1hcmtlcgotVmFsaWRhdG9yLm5hbWU9TW9kdWxlQ29yZSBWYWxpZGF0b3IKLU5hdHVyZS5uYW1lPVdlYiBQcm9wZXJ0aWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNTczZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iY29tcG9uZW50Y29yZS54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPCEtLSBNb2R1bGUgQ29yZSBQcm9qZWN0IE5hdHVyZSBDb250cmlidXRpb25zLS0+Ci0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1vZHVsZUNvcmVOYXR1cmUiCi0gICAgICAgICBuYW1lPSIlTmF0dXJlLm5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubmF0dXJlcyI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvcnVudGltZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbCI+Ci0gICAgICA8ZWRpdE1vZGVsCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ib3JnLmVjbGlwc2Uud3N0Lm1vZHVsZWNvcmUuc3RydWN0dXJhbE1vZGVsIgotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5Ij4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgYXV0b2xvYWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgVVJJPSIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiLz4KLSAgICAgIDwvZWRpdE1vZGVsPiAKLSAgIDwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLSAJCQk8ZmlsZS1hc3NvY2lhdGlvbgotCQkJCWNvbnRlbnQtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCQlmaWxlLW5hbWVzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCIvPgotCQkJPGZpbGUtYXNzb2NpYXRpb24KLQkJCQljb250ZW50LXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQkJZmlsZS1uYW1lcz0iLmNvbXBvbmVudCIvPgotCQkJPGZpbGUtYXNzb2NpYXRpb24KLQkJCQljb250ZW50LXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQkJZmlsZS1uYW1lcz0iLnd0cG1vZHVsZXMiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5pZ25vcmUiPgotCQk8aWdub3JlCi0gICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgIHBhdHRlcm49Ii5kZXBsb3lhYmxlcyIvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9IkNvbXBvbmVudFByb2plY3RNaWdyYXRvciIgbmFtZT0iQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIiBzY2hlbWE9InNjaGVtYS9Db21wb25lbnRQcm9qZWN0TWlncmF0b3IuZXhzZCIvPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFydGlmYWN0ZWRpdCIgbmFtZT0iQ29tcG9uZW50IEFydGlmYWN0IEVkaXQiIHNjaGVtYT0ic2NoZW1hL2FydGlmYWN0ZWRpdC5leHNkIi8+Ci0gICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tcG9uZW50aW1wbCIgbmFtZT0iY29tcG9uZW50aW1wbCIgc2NoZW1hPSJzY2hlbWEvY29tcG9uZW50aW1wbC5leHNkIi8+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0icmVzb3VyY2VGYWN0b3JpZXMiIG5hbWU9IlJlc291cmNlIEZhY3RvcnkgQXNzb2NpYXRpb24gKEludGVybmFsKSIgc2NoZW1hPSJzY2hlbWEvcmVzb3VyY2VGYWN0b3JpZXMuZXhzZCIvPgotIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlZmVyZW5jZVJlc29sdmVyIiBuYW1lPSJyZWZlcmVuY2VSZXNvbHZlciIgc2NoZW1hPSJzY2hlbWEvcmVmZXJlbmNlUmVzb2x2ZXIuZXhzZCIvPgotCQotCTwhLS0gQ29udHJpYnV0ZSBhIFVSSVJlc29sdmVyRXh0ZW5zaW9uIGZvciBmbGV4aWJsZSBwcm9qZWN0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9ucyI+Ci0gICAgICA8cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAgIHN0YWdlPSJwcmVub3JtYWxpemF0aW9uIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlc29sdmVyIj4KLSAgICAgICAgICAgIDxwcm9qZWN0TmF0dXJlIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSIgLz4KLQkJCTxwcm9qZWN0TmF0dXJlIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud2ViLlN0YXRpY1dlYk5hdHVyZSIvPgotICAgICAgPC9yZXNvbHZlckV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIkRmFjdG9yeSIgCi0gICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwiPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQWN0aW9uQ29uZmlnIi8+Ci0gICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLSAgCi0gICA8IS0tIFJlZ2lzdGVyIHRoZSBuYXR1cmUgaWQgd2l0aCB0aGUgRU1GTmF0dXJlIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLm5hdHVyZV9yZWdpc3RyYXRpb24iPgotICAgICAgPG5hdHVyZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgIDwvbmF0dXJlPgotICAgPC9leHRlbnNpb24+IAotICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYWYxN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL0NvbXBvbmVudFByb2plY3RNaWdyYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIGlkPSJDb21wb25lbnRQcm9qZWN0TWlncmF0b3IiIG5hbWU9IkNvbXBvbmVudCBQcm9qZWN0IE1pZ3JhdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBXVFAgMy4xLjIgYW5kIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAzLjIuCi1TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjkzNAotQGRlcHJlY2F0ZWQgCi0KLVRoaXMgYWxsb3dzIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBvZiBjb21wb25lbnRzIHRvIGNvbnRyaWJ1dGUgbWlncmF0b3JzIFRob3NlIHBsdWdpbnMgaGF2ZSBkZXBlbmRlbmNpZXMgb24gdGhlIG1vZHVsZWNvcmUgcGx1Z2luLCBidXQgbm90IHZpY2UgdmVyc2EuIEluIG9yZGVyIGZvciBjb2RlIGRlZmluZWQgd2l0aGluIHRoZSBtb2R1bGVjb3JlIHBsdWdpbiB0byBleGVjdXRlIHRoZXNlIGFjdGlvbnMsIHdlIG5lZWQgdGhpcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtaWdyYXRvckV4dGVuc2lvbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1pZ3JhdG9yRXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIGZvciB0aGUgbWlncmF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIFdUUCAzLjEuMiBhbmQgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4KLVNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyOTM0Ci1AZGVwcmVjYXRlZCAKLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgV1RQIDMuMS4yIGFuZCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLgotU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI5MzQKLUBkZXByZWNhdGVkIAotCi0KLSZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgV1RQIDMuMS4yIGFuZCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLgotU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI5MzQKLUBkZXByZWNhdGVkIAotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBXVFAgMy4xLjIgYW5kIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAzLjIuCi1TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjkzNAotQGRlcHJlY2F0ZWQgCi0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2FydGlmYWN0ZWRpdC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2FydGlmYWN0ZWRpdC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDZmNzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9hcnRpZmFjdGVkaXQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgaWQ9ImFydGlmYWN0ZWRpdCIgbmFtZT0iQ29tcG9uZW50IEFydGlmYWN0IEVkaXQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBpcyBmb3IgSU5URVJOQUwgdXNlIG9ubHkhICBJdCBpcyB1c2VkIGZvciB0aGUgYmFzZSBhcnRpZmFjdCBlZGl0IHR5cGVzIG9ubHkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50IAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZSAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZSAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhcnRpZmFjdGVkaXQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgdGhpcyBhcnRpZmFjdEVkaXQgY29udHJpYnV0ZXMgdG8sIGZvciBleGFtcGxlLCB0aGUgZmFjZXQgaWQgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHByb2plY3RzIHdoaWNoIHNob3VsZCB1c2UgdGhpcyBhcnRpZmFjdEVkaXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGFjdHVhbCBhcnRpZmFjdCBlZGl0IGNsYXNzIGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2NvbXBvbmVudENvcmUueHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2NvbXBvbmVudENvcmUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmM4N2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9jb21wb25lbnRDb3JlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9tb2R1bGVDb3JlIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvbW9kdWxlQ29yZSI+DQotCTxlbGVtZW50IG5hbWU9InByb2plY3QtbW9kdWxlcyI+DQotCQk8Y29tcGxleFR5cGU+DQotCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLQkJCQk8ZWxlbWVudCBuYW1lPSJ3Yi1tb2R1bGUiPg0KLQkJCQkJPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTxlbGVtZW50IG5hbWU9Im1vZHVsZS10eXBlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQk8YXR0cmlidXRlIG5hbWU9Im1vZHVsZS10eXBlLWlkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQl0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJ3Yi1yZXNvdXJjZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9InNvdXJjZS1wYXRoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95LXBhdGgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJkZXBlbmRlbnQtbW9kdWxlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iaGFuZGxlIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iYXJjaGl2ZU5hbWUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ktcGF0aCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9ImRlcGVuZGVuY3ktdHlwZSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8L2VsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveS1uYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPjwvYXR0cmlidXRlPg0KLQkJCQkJPC9jb21wbGV4VHlwZT4NCi0JCQkJPC9lbGVtZW50Pg0KLQkJCTwvc2VxdWVuY2U+DQotCQkJPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj48L2F0dHJpYnV0ZT4NCi0JCTwvY29tcGxleFR5cGU+DQotCTwvZWxlbWVudD4NCi0NCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvY29tcG9uZW50aW1wbC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2NvbXBvbmVudGltcGwuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4Yjc4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvY29tcG9uZW50aW1wbC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIGlkPSJjb21wb25lbnRpbXBsIiBuYW1lPSJjb21wb25lbnRpbXBsIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21wb25lbnRpbXBsIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0ZW5kZWRUeXBlSUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuZGVkVHlwZUlEIiB0eXBlPSJzdHJpbmciPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL3JlZmVyZW5jZVJlc29sdmVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvcmVmZXJlbmNlUmVzb2x2ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkN2E5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvcmVmZXJlbmNlUmVzb2x2ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiBpZD0icmVmZXJlbmNlUmVzb2x2ZXIiIG5hbWU9InJlZmVyZW5jZVJlc29sdmVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJyZXNvbHZlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgcmVxdWlyZWQgaWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgcmVzb2x2ZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgdGhpcyBleHRlbnNpb24KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb2x2ZXJzLklSZWZlcmVuY2VSZXNvbHZlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndlaWdodCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgd2VpZ2h0IHVzZWQgZm9yIHNvcnRpbmcgdGhlIHJlc29sdmVycy4gTGlnaHRlciB3ZWlnaHRzIGZsb2F0IHRvIHRoZSB0b3AgYW5kIGFyZSB0cmllZCBmaXJzdC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9yZXNvdXJjZUZhY3Rvcmllcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL3Jlc291cmNlRmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjdhODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL3Jlc291cmNlRmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgaWQ9InJlc291cmNlRmFjdG9yaWVzIiBuYW1lPSJSZXNvdXJjZSBGYWN0b3J5IEFzc29jaWF0aW9uIChJbnRlcm5hbCkiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQW4gKmludGVybmFsKiBleHRlbnNpb24gcG9pbnQgdGhhdCBkZWNsYXJlcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgc2hvcnQtc2VnbWVudCBmaWxlbmFtZSBhbmQgYSBSZXNvdXJjZS5GYWN0b3J5LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb3VyY2VGYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQXNzb2NpYXRlcyBhIHNob3J0IG5hbWUgKGUuZy4gJnF1b3Q7d2ViLnhtbCZxdW90Oykgd2l0aCB0aGUgYXBwcm9wcmlhdGUgUmVzb3VyY2UuRmFjdG9yeSB0byBjcmVhdGUgdGhlIFJlc291cmNlIHR5cGUgd2hlbiBsb2FkaW5nIGZpbGVzIG9mIHRoZSBkZWNsYXJlZCBzaG9ydG5hbWUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlQmluZGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIERlY2xhcmVzIGFuIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5Jmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2hvcnRTZWdtZW50IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsbHkgZGVjbGFyZXMgdGhlIHNob3J0IHNlZ21lbnQgb2YgYSBmaWxlbmFtZSB0aGF0IHRoZSByZXNvdXJjZSBmYWN0b3J5IGFwcGxpZXMgdG8gKGUuZy4gJnF1b3Q7d2ViLnhtbCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNEZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiBtdWx0aXBsZSBmYWN0b3JpZXMgYXJlIGRlY2xhcmVkIGZvciB0aGUgc2FtZSBmaWxlTmFtZSAtIHRoZW4gdGhlICZxdW90O2RlZmF1bHQmcXVvdDsgaXMgdXNlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZXNGYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb25hbCBhdHRyaWJ1dGUgaXMgdG8gcmVzb2x2ZSBjb25mbGljdHMgYmV0d2VlbiBtdWx0aXBsZSBkZWZlYXVsdCBmYWN0b3JpZXMgcmVnaXN0ZXJlZCB0byB0aGUgc2FtZSBjb250ZW50IHR5cGUgYW5kIHNob3J0IHNlZ21lbnRzLiAgVGhlIHZhbHVlIHNob3VsZCBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGZhY3RvcnkgYmVpbmcgb3ZlcnJpZGRlbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OiIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50VHlwZUJpbmRpbmciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImNvbnRlbnRUeXBlSWQiLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWR2ZXJ0aXNlcyB0aGF0IHRoZSBjb250YWluaW5nIGVkaXRvciB1bmRlcnN0YW5kcyB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIGFuZCBpcyBzdWl0YWJsZSBmb3IgZWRpdGluZyBmaWxlcyBvZiB0aGF0IHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyLiBUaGlzIGlzIGFuIElEIGRlZmluZWQgYnkgdGhlICZhcG9zO29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMmYXBvczsgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4MzgzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXNlYXJjaCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmNzliMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi11aS5qYXIKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLndzdC5jb21tb24udWlfMS4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTU3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzMDM4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI01vbiBKYW4gMzAgMjM6NDE6NTggRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGE2YTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEphbiAzMCAyMzoxMTo0OSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTcwOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS41MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwubmF2aWdhdG9yLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7eC1pbnRlcm5hbDo9dHJ1ZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7IHZlcnNpb249IjMuOCIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zZWFyY2g7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzkzZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1VSSBVdGlsaXR5IGNsYXNzZXMgZm9yIGFjdGlvbnMsIGRyYWcnbidkcm9wIGFuZCB3aXphcmRzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmE4NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtc2VhcmNoLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q5Y2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JCi08IS0tCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9jb21tb24vb3ZlcnZpZXcuaHRtbCIgLz4gLS0+Ci0KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS52aWV3ZXJzIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RTaW5nbGVGaWxlVmlldyIgLz4gIC0tPiAgPCEtLSA/LCBkb2VzIGVjbGlwc2UgcHJvdmlkZSBiZXR0ZXIgc3VwcG9ydD8gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJSZXNvdXJjZUZpbHRlciIgLz4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RNdWx0aUZpbGVQYWdlIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlNlbGVjdFNpbmdsZUZpbGVQYWdlIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlRhYmxlTmF2aWdhdG9yIiAvPiAtLT4gICAgICAgPCEtLSBObywgc2hvdWxkIGJlIGluIGVjbGlwc2UgYmFzZSAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9Ik5hdmlnYWJsZVRhYmxlVmlld2VyIiAvPiAtLT4gPCEtLSBObywgc2hvdWxkIGJlIGluIGVjbGlwc2UgYmFzZSAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5hY3Rpb25oYW5kbGVyLmFjdGlvbiI+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iQ3V0QWN0aW9uIiAvPiAgLS0+ICAgIDwhLS0gTm8gdG8gdGhlc2UgZm91ciwgIHNob3VsZCBiZSByZW1vdmVkPyAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlBhc3RlQWN0aW9uIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkNvcHlBY3Rpb24iIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkVkaXRBY3Rpb24iIC8+IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSI+IC0tPgotPCEtLSAgCTx0eXBlIG5hbWU9IlVJUGx1Z2luIiAvPiAgLS0+ICAgIDwhLS0gTm8sIGRlbGV0ZSB0aGlzIC0tPgotPCEtLSAJPHR5cGUgbmFtZT0iT3ZlcmxheUljb25NYW5hZ2VyIiAvPiAgLS0+IDwhLS0gIE5vIC0tPgotPCEtLSAgCTx0eXBlIG5hbWU9IldpbmRvd1V0aWxpdHkiIC8+ICAtLT4gICA8IS0tIFJlbW92ZSBjbGFzcywgY2xlYW4gdXAgeHNkLnVpIC0tPgotPCEtLSAgICA8dHlwZSBuYW1lPSJJbWFnZUZhY3RvcnkiIC8+ICAtLT4gICA8IS0tIE5vIC0tPgotPCEtLQk8L3BhY2thZ2U+IC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLndpemFyZHMiPiAgLS0+Ci08IS0tICAJCTx0eXBlIG5hbWU9IkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24iIC8+ICAtLT4gIDwhLS0gcmVmZXJlbmNlZCBleHRlcm5hbGx5IG9ubHkgd2l0aGluIHBhY2thZ2UgKEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIC0tPgotPCEtLSAJCTx0eXBlIG5hbWU9IkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIiAvPiAtLT4gPCEtLSByZWZlcmVuY2VkIGV4dGVybmFsbHkgb25seSB3aXRoaW4gcGFja2FnZSAoRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCwgYW5kIE9wZXJhdGlvbiAtLT4KLTwhLS0gIAkJPHR5cGUgbmFtZT0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIgLz4gIC0tPiA8IS0tIHJlZmVyZW5jZWQgYnkgWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCwgd2hpY2ggaXMgZGVwcmVjYXRlZCBhbmQgZ29pbmcgdG8gYmUgcmVtb3ZlZCBpbiBNNCAgLS0+Ci08IS0tCTwvcGFja2FnZT4gLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZG5kIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJWaWV3ZXJEcm9wQWRhcHRlciIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iRHJhZ0FuZERyb3BDb21tYW5kIiAvPiAtLT4gIDwhLS0gcmVmZXJlbmNlZCBleHRlcm5hbGx5IG9ubHkgd2l0aGluIHBhY2thZ2UgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJEcmFnQW5kRHJvcE1hbmFnZXIiIC8+IC0tPiAgPCEtLSAgIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iT2JqZWN0VHJhbnNmZXIiIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQiIC8+ICAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlZpZXdlckRyYWdBZGFwdGVyIiAvPiAtLT4KLTwhLS0JPC9wYWNrYWdlPiAgLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucmVzb3VyY2UiPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlJlc291cmNlRGVsZXRlTGlzdGVuZXIiIC8+ICAtLT4gIDwhLS0gbm8gcmVmZXJlbmNlcyAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5kaWFsb2dzIj4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iU2VsZWN0U2luZ2xlRmlsZURpYWxvZyIgLz4gIC0tPiAgICA8IS0tIE5vLCBzaG91bGQgbG9vayBpbnRvIGJhc2UgZm9yIHN1cHBvcnQ/IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5hY3Rpb25oYW5kbGVyIj4KLQkJPHR5cGUgbmFtZT0iQWN0aW9uSGFuZGxlckxpc3RlbmVyIiAvPgotCTwvcGFja2FnZT4KLS0tPgotPCEtLSBwcm92aXNpb25hbCBBUElzIC0tPgotPCEtLQotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiPgotCQk8dHlwZSBuYW1lPSJVUklSZXNvbHZlclBsdWdpbiIgIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyRXh0ZW5zaW9uIiBpbXBsZW1lbnQ9InRydWUiLz4KLQk8L3BhY2thZ2U+Ci0tLT4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvY29sbGFwc2VBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRmZmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvZXhwYW5kQWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk5NDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3NhdmVhc193aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL3NhdmVhc193aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTIzZDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9zYXZlYXNfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhMjFlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvaWNvbnMvdHNlYXJjaF9kcGRuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTJmMzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLSEgUGx1Z2luIHByb3BlcnRpZXMKLXBsdWdpbk5hbWUgICAgICAgICAgICAgICA9IEVjbGlwc2UgQmFzZSBVSSBleHRlbnNpb25zCi1wbHVnaW5Qcm92aWRlciAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotCi0hIFNlbGVjdFNpbmdsZUZpbGVQYWdlIGFuZCBTZWxlY3RNdWx0aUZpbGVQYWdlCi1fVUlfTEFCRUxfU09VUkNFX0ZJTEVTICAgPSBXb3Jrc3BhY2UgRmlsZXMKLV9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyA9IFNlbGVjdGVkIEZpbGVzCi1fVUlfUE9QVVBfRVhQQU5EX0FMTAkgPSBFeHBhbmQgQWxsCi1fVUlfUE9QVVBfQ09MTEFQU0VfQUxMCSA9IENvbGxhcHNlIEFsbAotCQotX1VJX0lNUE9SVF9CVVRUT04gICAgICAgICAgPSBJbXBvcnQgRmlsZXMuLi4KLV9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQID0gSW1wb3J0IGZpbGVzIGZyb20gZmlsZSBzeXN0ZW0KLQotCi0hIFNlbGVjdE11bHRpRmlsZVBhZ2UKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiB0aGUgZm9sbG93aW5nIHRocmVlIGxpbmVzIHJlZmVycyB0byBfVUlfTEFCRUxfU0VMRUNURURfRklMRVMgbGFiZWwgYWJvdmUKLV9VSV9BRERfQlVUVE9OX1RPT0xfVElQICAgID0gQWRkIGZpbGVzIHRvIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUCA9IFJlbW92ZSBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVAgPSAgUmVtb3ZlIGFsbCBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi0KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBObyB0cmFuc2xhdGlvbiBuZWVkZWQgb2YgZm9sbG93aW5nIHRocmVlIGxpbmVzCi1fVUlfQUREX0JVVFRPTiAgICAgICAgICAgICA9ID4KLV9VSV9SRU1PVkVfQlVUVE9OICAgICAgICAgID0gPAotX1VJX1JFTU9WRV9BTExfQlVUVE9OICAgICAgPSA8PAotCi0hIFNlbGVjdEphdmFQcm9qZWN0VmlldwotX1VJX0xBQkVMX0NIT09TRV9GT0xERVIgPSBTZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlcjoKLQotISBTZWxlY3RKYXZhUHJvamVjdERpYWxvZwotX1VJX0xBQkVMX0ZPTERFUl9TRUxFQ1RJT04gPSBDb250YWluZXIgU2VsZWN0aW9uCi0KLSEgVGV4dFZpZXdlck9wZXJhdGlvbkFjdGlvbgotX1VJX01FTlVfQ09QWSAgICAgICAgID0gJkNvcHkKLV9VSV9NRU5VX0NVVCAgICAgICAgICA9IEN1JnQKLV9VSV9NRU5VX0RFTEVURSAgICAgICA9IERlbGV0ZQotX1VJX01FTlVfUEFTVEUgICAgICAgID0gJlBhc3RlCi1fVUlfTUVOVV9QUkVGSVggICAgICAgPSBQcmVmaXgKLV9VSV9NRU5VX1JFRE8gICAgICAgICA9IFJlZG8KLV9VSV9NRU5VX1NFTEVDVF9BTEwgICA9IFNlbGVjdCBBbGwKLV9VSV9NRU5VX1NISUZUX0xFRlQgICA9IFNoaWZ0IExlZnQKLV9VSV9NRU5VX1NISUZUX1JJR0hUICA9IFNoaWZ0IFJpZ2h0Ci1fVUlfTUVOVV9TVFJJUF9QUkVGSVggPSBTdHJpcCBQcmVmaXgKLV9VSV9NRU5VX1VORE8gICAgICAgICA9IFVuZG8KLQotISBTb3VyY2VWaWV3ZXJHb3RvTGluZUFjdGlvbgotX1VJX01FTlVfR09UT19MSU5FICAgICAgICAgICA9IEdvIFRvIExpbmUuLi4KLV9VSV9HT1RPX0xJTkVfRElBTE9HX1RJVExFICAgPSBHbyBUbyBMaW5lCi1fVUlfR09UT19MSU5FX0RJQUxPR19URVhUICAgID0gRW50ZXIgTGluZSBOdW1iZXIKLQotX1VJX0ZJTEVfQ0hBTkdFRF9USVRMRSA9IEZpbGUgQ2hhbmdlZAotX1VJX0ZJTEVfREVMRVRFRF9TQVZFX0NIQU5HRVMgPSBUaGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPwotX1VJX0ZJTEVfREVMRVRFRF9FRElUT1JfQ0xPU0VEID0gVGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gVGhpcyBlZGl0b3Igd2lsbCBiZSBjbG9zZWQuCi1fVUlfRklMRV9DSEFOR0VEX0xPQURfQ0hBTkdFUyA9IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBsb2FkIHRoZSBjaGFuZ2VzPwotX1VJX1NBVkVfQlVUVE9OID0gU2F2ZQotX1VJX0NMT1NFX0JVVFRPTiA9IENsb3NlCi0KLQotISBYU0wgUHJlZmVyZXJlbmNlCi1fVUlfWFNMVF9TRUxFQ1QgICAgID0gU2VsZWN0IHdoaWNoIGVsZW1lbnQgdG8gdXNlIGZvciB5b3VyIHN0eWxlc2hlZXQKLV9VSV9YU0xUX1NUWUxFU0hFRVQgPSAmVXNlIDx4c2w6c3R5bGVzaGVldD4KLV9VSV9YU0xUX1RSQU5TRk9STSAgPSBVJnNlIDx4c2w6dHJhbnNmb3JtPgotCi0hIFhTTCBEZWJ1ZyBQcmVmZXJlcmVuY2UKLV9VSV9YU0xfREVCVUdfU0VMRUNUX0xBVU5DSEVSID0gU2V0IHRoZSBkZWZhdWx0IFhTTCBsYXVuY2hlciBmb3IgdGhlIFhTTCBEZWJ1Z2dpbmcgYW5kIFRyYW5zZm9ybWF0aW9uIHRvb2wKLV9VSV9YU0xfREVCVUdfTE9DQUwgICAgICAgICAgID0gJlhTTCBhcHBsaWNhdGlvbgotX1VJX1hTTF9ERUJVR19SRU1PVEUgICAgICAgICAgPSBYUyZMIHJlbW90ZSBhcHBsaWNhdGlvbgotX1VJX1hTTF9USUxFX0VESVRPUiAgICAgICAgICAgPSAmU2hvdyBhbGwgZGVidWdnaW5nIGZpbGVzIGluIGEgdGlsZSBlZGl0b3IKLV9VSV9YU0xfREVCVUdfQU5EX1RSQU5TRk9STSAgID0gJlJ1biB0cmFuc2Zvcm1hdGlvbiBhbmQgb3BlbiBhIGRlYnVnZ2luZyBzZXNzaW9uCi1fVUlfWFNMX0NPTlRFWFRfVVJJICAgICAgICAgICA9IENvbnRleHQgUGF0aCAKLV9VSV9YU0xfQ09OVEVYVCAgICAgICAgICAgICAgID0gU3BlY2lmeSBhICZjb250ZXh0IHBhdGggZm9yIHJlc29sdmluZyBVUklzIGluIHhzbDppbXBvcnQsIHhzbDppbmNsdWRlIG9yIGRvY3VtZW50KCkKLQotCi1fVUlfT1ZFUlJJREVfRklMRSAgICA9IE92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcwotX1VJX0pBVkFfRVhJU1RfRklMRTEgPSBUaGUgZm9sbG93aW5nIEphdmEgY2xhc3NlcyBhbHJlYWR5IGV4aXN0LgotX1VJX0pBVkFfRVhJU1RfRklMRTIgPSBEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Ci0gICAgICAKLSEgc29tZSBvcHRpb25zIHN0cmluZ3MgY29tbW9uIHRvIHNldmVyYWwgcGx1Z2lucwotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfVElUTEUgPSBFcnJvciBDcmVhdGluZyBGaWxlCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9TSE9SVF9ERVNDID0gRXJyb3IgY3JlYXRpbmcgZmlsZSAiezB9IgotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfTE9OR19ERVNDID0gQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSB0aGUgZmlsZSAiezB9Ii4KLV9VSV9QQVJFTlRfRk9MREVSX0lTX1JFQURfT05MWSA9IFRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHJlYWQgb25seS4KLV9VSV9VTktOT1dOX0VSUk9SX1dJVEhfSElOVCA9IFVua25vd24gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHdyaXRlYWJsZS4KLV9VSV9VTktOT1dOX0VSUk9SID0gVW5rbm93biBlcnJvci4gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgd3JpdGVhYmxlLgotCi0hIHVzYWdlIC0gdGhpcyBsYWJlbCBpcyBmb2xsb3dlZCBieSB0d28gcmFkaW8gYnV0dG9uIG9wdGlvbnMgZm9yIHRoZSBmaWxlIGxvY2F0aW9uCi1fVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRSA9IFNlbGVjdCBmaWxlIGxvY2F0aW9uCi1fVUlfUkFESU9fRklMRSAgICAgICAgICAgICA9IFdvcmtzcGFjZSBwcm9qZWN0cwotX1VJX1JBRElPX1VSTCAgICAgICAgICAgICAgPSBIVFRQCi0KLV9VSV9MQUJFTF9DT01QT05FTlRTCQkJCSAgID0gQ29tcG9uZW50czoKLV9VSV9MQUJFTF9RVUFMSUZJRVIJCQkJCSAgID0gUXVhbGlmaWVyOgotCi0hLSBjb21wb25lbnQgc2VsZWN0aW9uIGRpYWxvZ3MgCi1fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUUJCQkgICA9IENvbXBvbmVudCBOYW1lOgotX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFMJCSAgID0gTWF0Y2hpbmcgQ29tcG9uZW50czoKLV9VSV9MQUJFTF9TUEVDSUZJRURfRklMRQkJCSAgID0gU3BlY2lmaWVkIEZpbGUKLV9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVAkJCSAgID0gRW5jbG9zaW5nIFByb2plY3QKLV9VSV9MQUJFTF9XT1JLU1BBQ0UJCQkJCSAgID0gV29ya3NwYWNlCi1fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRQkJCSAgID0gQ3VycmVudCBSZXNvdXJjZQotX1VJX0xBQkVMX1NFQVJDSF9TQ09QRQkJCQkgICA9IFNlYXJjaCBTY29wZQotX1VJX0xBQkVMX05BUlJPV19TRUFSQ0hfU0NPUEVfUkVTT1VSQ0UgPSBVc2UgcmVzb3VyY2UgdmlldyB0byBuYXJyb3cgc2VhcmNoIHNjb3BlCi1fVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTCQkJICAgPSBBdmFpbGFibGUgVHlwZXMKLV9VSV9MQUJFTF9XT1JLSU5HX1NFVFMgICAgICAgICAgICAgICAgID0gV29ya2luZyBTZXRzCi0KLV9VSV9MQUJFTF9OZXc9TmV3Li4uCi1fVUlfTEFCRUxfREVDTEFSQVRJT05fTE9DQVRJT049RGVjbGFyYXRpb24gTG9jYXRpb246Ci1fVUlfTEFCRUxfQ0hPT1NFPUNob29zZS4uLgotCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEKLSEgSGVyZSBpcyB0aGUgbGlzdCBvZiBFcnJvciBzdHJpbmcgdGhhdCBoYXZlIG1lc3NhZ2UgSURzIC0gbWFrZSBzdXJlIHRoZXkgYXJlIHVuaXF1ZQotISAgUmFuZ2UgZm9yIGIyYmd1aSBtZXNzYWdlSURzOiBJV0FYMTIwMSAtIElXQVgxNDAwCi0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotX0VSUk9SX1RIRV9DT05UQUlORVJfTkFNRSA9IFRoZSBzcGVjaWZpZWQgY29udGFpbmVyIG11c3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhbmQgaXRzIHBhdGggbXVzdCBzdGFydCBhdCB0aGUgd29ya3NwYWNlIHJvb3QuCi0KLV9FUlJPUl9MT0NBTF9MT0NBVElPTiAgICAgPSBUaGUgbG9jYWwgbG9jYXRpb24gb2YgdGhpcyBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkLgotX0VSUk9SX05PVF9KQVZBX1BST0pFQ1QgICA9IFRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBub3QgYSBKYXZhIHByb2plY3QuCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgZXJyb3IgbWVzc2FnZSB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbWVzc2FnZSBmcm9tIGFub3RoZXIgcGx1Z2luCi1fRVJST1JfSU5WQUxJRF9KQVZBX1BBQ0tBR0UgPSBJV0FYMTIwMUUgSW52YWxpZCBwYWNrYWdlIG5hbWUgZXJyb3I6Ci0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiArIHN0cmluZyArIF9VSV9MQUJFTF9PUiArIHN0cmluZykgb3IgKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OKQotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aAotX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMgICAgICAgICAgICA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLV9FUlJPUl9DT05UQUlORVJfTk9UX0pBVkFfQlVJTERQQVRIID0gVGhlIGNvbnRhaW5lciBpcyBub3QgYSBKYXZhIHNvdXJjZSBmb2xkZXIgZm9yIHRoaXMgcHJvamVjdAotX0VSUk9SX1VTRV9QUk9KRUNUX0pBVkFfU09VUkNFX0ZPTERFUiA9IFRoZSBwcm9qZWN0IGlzIG5vdCBvbiB0aGUgYnVpbGQgcGF0aC4gIFNlbGVjdCBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIHByb2plY3QuCi0KLV9VSV9FUlJPUiAgICAgICAgICAgICA9IEVycm9yCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgd2FybmluZyBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLV9XQVJOX0lOVkFMSURfSkFWQV9QQUNLQUdFID0gSW52YWxpZCBwYWNrYWdlIG5hbWUgd2FybmluZzoKLQotX0VSUk9SX1JPT1RfRUxFTUVOVCA9IFRoZSBYTUwgc2NoZW1hIGRvZXMgbm90IGNvbnRhaW4gYW55IGdsb2JhbCBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcm9vdCBlbGVtZW50LgotX0VSUk9SX1NBVklOR19GSUxFID0gRXJyb3Igc2F2aW5nIGZpbGUgInswfSIKLQotISBGaWxlIFZhbGlkYXRvcgotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfVElUTEUgPSBGYWlsZWQgdG8gY2hlY2sgb3V0IG5lY2Vzc2FyeSBmaWxlcwotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfTUVTU0FHRSA9IEdlbmVyYXRpb24gZmFpbGVkLiBOZWNlc3NhcnkgZmlsZXMgY291bGQgbm90IGJlIGNoZWNrZWQgb3V0LiAKLQotISBQcm9wZXJ0eURpcnR5Q2hhbmdlTGlzdGVuZXIgYW5kIFByb3BlcnR5UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotX1VJX0VSUk9SX1ZBTElEQVRFX0VESVRfRkFJTF9PTkVfRklMRSA9IEVycm9yCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQudGl0bGU9TmV3IEV4YW1wbGUgUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci50aXRsZT1Qcm9qZWN0IENyZWF0aW9uIEZhaWxlZAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci5tZXNzYWdlPVByb2plY3QgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3ZlcndyaXRlcXVlcnkudGl0bGU9T3ZlcndyaXRlCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm92ZXJ3cml0ZXF1ZXJ5Lm1lc3NhZ2U9RG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHswfT8KLQotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2M9Q3JlYXRpbmcgZXhhbXBsZSBwcm9qZWN0cy4uLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5vcF9kZXNjX3Byb2o9Q29uZmlndXJpbmcgcHJvamVjdC4uLgotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5lcnJvci5hbHJlYWR5ZXhpc3RzPVByb2plY3QgYWxyZWFkeSBleGlzdHMuCi1TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzPVNhdmUgQWxsIE1vZGlmaWVkIFJlc291cmNlcwotU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZT1BbGwgbW9kaWZpZWQgcmVzb3VyY2VzIG11c3QgYmUgc2F2ZWQgYmVmb3JlIHRoaXMgb3BlcmF0aW9uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwYjYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiIG5hbWU9IkV4YW1wbGUgUHJvamVjdCBDcmVhdGlvbiBXaXphcmQiIHNjaGVtYT0ic2NoZW1hL2V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuZXhzZCIvPgotICA8ZXh0ZW5zaW9uCi0JcG9pbnQ9Im9yZy5lY2xpcHNlLnNlYXJjaC5zZWFyY2hSZXN1bHRWaWV3UGFnZXMiPgotCTx2aWV3UGFnZQotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoUmVzdWx0UGFnZSIKLQkJc2VhcmNoUmVzdWx0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaFJlc3VsdCIKLQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaFJlc3VsdFBhZ2UiPgotCTwvdmlld1BhZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotIAotICA8IS0tCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9InRlc3QiIAotICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9InRlc3RpdCIgCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgIGxhYmVsPSJURVNUIFNFQVJDSCBESUFMT0ciIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuVGVzdCI+IAotICAgICAgICAgPC9hY3Rpb24+ICAgICAgICAgIAotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgICAgICAgCi0gICAgPC9leHRlbnNpb24+IAotICAgLS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zY2hlbWEvZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NjaGVtYS9leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGMzMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NjaGVtYS9leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIiBpZD0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIgbmFtZT0iRXhhbXBsZSBQcm9qZWN0IENyZWF0aW9uIFdpemFyZCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdG8gZXh0ZW5kIE5ldyBwcm9qZWN0IHdpdGhhcmQgd2l0aCB0aGUNCi1wYWdlIHNldCB1cCBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNyZWF0ZWQgcHJvamVjdCBhcyB3ZWxsIGFzIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQgb24gdGhlIHByb2plY3QgY3JlYXRpb24uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3RzZXR1cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBleHRlbnNpb24gaXMgaW50ZW5kZWQgZm9yLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYW5uZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUGx1Z2luIHJlbGF0aXZlIHBhdGggdG8gdGhlIGltYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYSBiYW5uZXIgb24gdGhlIHdpemFyZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3RzZXR1cCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhZGRpdGlvbmFsIHByb2plY3Qgc2V0dXAuDQotVGhlcmUgd2lsbCBiZSBhcyBtYW55IHBhZ2VzIGNyZWF0ZWQgZm9yIHRoZSB3aXphcmQgYXMgdGhlcmUgYXJlIHByb2plY3RzZXR1cCBlbGVtZW50cy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbXBvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5hdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVmZXJlbmNlcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWdldGl0bGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGl0bGUgb2YgdGhlIHdpemFyZCZhcG9zO3MgcGFnZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJbml0aWFsIHByb2plY3QgbmFtZSB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgb24gdGhlIHdpemFyZCBwYWdlLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBMYWJlbCBmb3IgdGhlIHByb2plY3QgbmFtZSBmaWVsZCBvbiB0aGUgd2l6YXJkIHBhZ2UuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2VkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgd2l6YXJkIHBhZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3BlbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBQbHVnaW4gcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgb3BlbmVkIHdoZW4gd2l6YXJkIGZpbmlzaGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iaW1wb3J0Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoYXQgdG8gaW1wb3J0IGludG8gdGhlIHByb2plY3Qgd2hlbiBpdCZhcG9zO3MgY3JlYXRlZC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUHJvamVjdCByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hlcmUgcHJvamVjdCBmaWxlcyB3aWxsIGJlIGltcG9ydGVkIHRvLCBpZiBub3Qgc3BlY2lmaWVkLCBpdCZhcG9zO3MgdGhlIHByb2plc3QgaXRzZWxmLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUGx1Z2luIHJlbGF0aXZlIHBhdGggb2YgdGhlIGltcG9ydCAuemlwIGZpbGUgd2l0aCB0aGUgZmlsZXMgdG8gYmUgaW1wb3J0ZWQgaW50byB0aGUgcHJvamVjdC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im5hdHVyZSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRWxlbWVudCB0aGF0IHNwZWNpZmllZCBFY2xpcHNlIG5hdHVyZSB0aGF0IGlzIGFwcGxpY2FibGUgdG8gdGhlIHByb2plY3QuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIG5hdHVyZSB0aGF0IHdpbGwgYmUgb3BlbmVkIHdoZW4gcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VzIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgc3BlY2lmaWVzIHJlZmVyZW5jZSBmb3IgdGhlIHByb2plY3QgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCZxdW90Ow0KLSAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZEV4dGVuc2lvbiZxdW90OyZndDsgDQotICAgICAgJmx0O3dpemFyZA0KLSAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkJnF1b3Q7DQotICAgICAgICAgICBiYW5uZXI9JnF1b3Q7aWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIuZ2lmJnF1b3Q7Jmd0Ow0KLSAgICAgICAgICZsdDtwcm9qZWN0c2V0dXANCi0gICAgICAgICAgICAgICBwYWdldGl0bGU9JnF1b3Q7JVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucGFnZXRpdGxlJnF1b3Q7DQotICAgICAgICAgICAgICAgbmFtZT0mcXVvdDslWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wcm9qZWN0bmFtZSZxdW90Ow0KLSAgICAgICAgICAgICAgIGxhYmVsPSZxdW90OyVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmxhYmVsJnF1b3Q7DQotICAgICAgICAgICAgICAgcGFnZWRlc2NyaXB0aW9uPSZxdW90OyVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2VkZXNjcmlwdGlvbiZxdW90Ow0KLSAgICAgICAgICAgICAgIG9wZW49JnF1b3Q7cmVhZG1lLmh0bWwmcXVvdDsmZ3Q7DQotICAgICAgICAgICAgJmx0O2ltcG9ydA0KLSAgICAgICAgICAgICAgICAgIGRlc3Q9JnF1b3Q7JnF1b3Q7DQotICAgICAgICAgICAgICAgICAgc3JjPSZxdW90O2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCZxdW90OyZndDsNCi0gICAgICAgICAgICAmbHQ7L2ltcG9ydCZndDsNCi0gICAgICAgICZsdDsvcHJvamVjdHNldHVwJmd0Ow0KLSAgICAgJmx0Oy93aXphcmQmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTk3ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvQWJzdHJhY3RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklRdWVyeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuTWVzc2FnZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VhcmNoUXVlcnkgaW1wbGVtZW50cyBJU2VhcmNoUXVlcnkgewotCQotCXByb3RlY3RlZCBTdHJpbmcgZlBhdHRlcm47Ci0JcHJvdGVjdGVkIFNlYXJjaFNjb3BlIGZTY29wZTsKLQlwcm90ZWN0ZWQgU2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU2NvcGVEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBBYnN0cmFjdFNlYXJjaFF1ZXJ5KFN0cmluZyBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoKTsKLQkJZlBhdHRlcm49IHBhdHRlcm47Ci0JCWZTY29wZT0gc2NvcGU7Ci0JCWZTY29wZURlc2NyaXB0aW9uPSBzY29wZURlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfbGFiZWw7IAotCX0KLQotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJaWYgKGZSZXN1bHQgPT0gbnVsbCkgewotCQkJZlJlc3VsdD0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzKTsKLQkJCW5ldyBTZWFyY2hSZXN1bHRVcGRhdGVyKGZSZXN1bHQpOwotCQl9Ci0JCXJldHVybiBmUmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdExhYmVsKGludCBuTWF0Y2hlcykgewotCQlpZiAobk1hdGNoZXMgPT0gMSkgewotCQkJaWYgKGZQYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJCU9iamVjdFtdIGFyZ3M9IHsgZlBhdHRlcm4sIGZTY29wZURlc2NyaXB0aW9uIH07Ci0JCQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbCwgYXJncyk7IAotCQkJfQotCQkJT2JqZWN0W10gYXJncz0geyAiIiwgZlNjb3BlRGVzY3JpcHRpb24gfTsKLQkJCXJldHVybiBNZXNzYWdlcy5mb3JtYXQoU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWxfZmlsZU5hbWVTZWFyY2gsIGFyZ3MpOyAKLQkJfQotCQlpZiAoZlBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBhcmdzPSB7IGZQYXR0ZXJuLCBuZXcgSW50ZWdlcihuTWF0Y2hlcyksIGZTY29wZURlc2NyaXB0aW9uIH07IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBNZXNzYWdlcy5mb3JtYXQoU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm4sIGFyZ3MpOyAKLQkJfQotCQlPYmplY3RbXSBhcmdzPSB7ICIiLCBuZXcgSW50ZWdlcihuTWF0Y2hlcyksIGZTY29wZURlc2NyaXB0aW9uIH07IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybl9maWxlTmFtZVNlYXJjaCwgYXJncyk7IAotCQotCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlmaW5hbCBTZWFyY2hSZXN1bHQgdGV4dFJlc3VsdD0gKFNlYXJjaFJlc3VsdCkgZ2V0U2VhcmNoUmVzdWx0KCk7Ci0JCXRleHRSZXN1bHQucmVtb3ZlQWxsKCk7Ci0JCVNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yIGNvbGxlY3Rvcj0gbmV3IFNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yKHRleHRSZXN1bHQpOwotCQlTdHJpbmcgc2VhcmNoU3RyaW5nPSBmUGF0dGVybjsKLQkJaWYgKHNlYXJjaFN0cmluZy50cmltKCkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKCcqJykpKSB7Ci0JCQlzZWFyY2hTdHJpbmc9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQlTdHJpbmcgbWVzc2FnZT0gU2VhcmNoTWVzc2FnZXMuVGV4dFNlYXJjaEVuZ2luZV9zdGF0dXNNZXNzYWdlOyAKLQkJTXVsdGlTdGF0dXMgc3RhdHVzPSBuZXcgTXVsdGlTdGF0dXMoTmV3U2VhcmNoVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKLQkJCi0JCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0JCi0JCVF1YWxpZmllZE5hbWUgdHlwZU5hbWUgPSBRdWFsaWZpZWROYW1lLnZhbHVlT2Yoc2VhcmNoU3RyaW5nKTsKLQkJCi0JCXRyeSB7Ci0gICAgICAgICAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBjcmVhdGVTZWFyY2hQYXR0ZXJuKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIHNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgY29sbGVjdG9yLCBmU2NvcGUsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkKLQkJcmV0dXJuIHN0YXR1czsKLQotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2VhcmNoUGF0dGVybiBjcmVhdGVTZWFyY2hQYXR0ZXJuKFF1YWxpZmllZE5hbWUgdHlwZU5hbWUpOwotCQotCXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRVcGRhdGVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElRdWVyeUxpc3RlbmVyIHsKLQkJU2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0KLQkJcHVibGljIFNlYXJjaFJlc3VsdFVwZGF0ZXIoU2VhcmNoUmVzdWx0IHJlc3VsdCkgewotCQkJZlJlc3VsdD0gcmVzdWx0OwotCQkJTmV3U2VhcmNoVUkuYWRkUXVlcnlMaXN0ZW5lcih0aGlzKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YT0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSAhPSBudWxsKQotCQkJCWhhbmRsZURlbHRhKGRlbHRhKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlbHRhKElSZXNvdXJjZURlbHRhIGQpIHsKLQkJCXRyeSB7Ci0JCQkJZC5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCQkJCQlJUmVzb3VyY2UgcmVzPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCQkJCU1hdGNoW10gbWF0Y2hlcz0gZlJlc3VsdC5nZXRNYXRjaGVzKHJlcyk7Ci0JCQkJCQkJCQlmUmVzdWx0LnJlbW92ZU1hdGNoZXMobWF0Y2hlcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQkJCQkJLy8gaGFuZGxlIGNoYW5nZWQgcmVzb3VyY2UKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5QWRkZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkvLyBkb24ndCBjYXJlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBxdWVyeVJlbW92ZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQlpZiAoZlJlc3VsdC5lcXVhbHMocXVlcnkuZ2V0U2VhcmNoUmVzdWx0KCkpKSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJTmV3U2VhcmNoVUkucmVtb3ZlUXVlcnlMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcXVlcnlTdGFydGluZyhJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCS8vIGRvbid0IGNhcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5RmluaXNoZWQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkvLyBkb24ndCBjYXJlCi0JCX0KLSAgICB9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmMxNDAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL0lTZWFyY2hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotcHVibGljIGludGVyZmFjZSBJU2VhcmNoQ29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBUaGUgc2VhcmNoIHJlc3VsdCBpcyBhIGRlY2xhcmF0aW9uLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBERUNMQVJBVElPTlM9IDA7Ci0KLQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgcmVmZXJlbmNlLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKiBSZWZlcmVuY2VzIGNhbiBjb250YWluIGltcGxlbWVudGVycyBzaW5jZSB0aGV5IGFyZSBtb3JlIGdlbmVyaWMga2luZAotCSAqIG9mIG1hdGNoZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgUkVGRVJFTkNFUz0gMTsKLQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgZGVjbGFyYXRpb24sIG9yIGEgcmVmZXJlbmNlLgotCSAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW55IG9mIHRoZSBuYXR1cmUgb2Ygc2VhcmNoZWQgZWxlbWVudHMKLQkgKiBzbyBhcyB0byBiZXR0ZXIgbmFycm93IGRvd24gdGhlIHNlYXJjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBBTExfT0NDVVJSRU5DRVM9IDI7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmZGZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNlYXJjaE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cF9yZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25BY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJbldvcmtpbmdTZXRBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFBhZ2VfbGltaXRlZF9mb3JtYXQ7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVTZWFyY2hQYWdlX2Vycm9yX21hcmtlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUGFnZV9zb3J0X2J5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5XaXRoTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlU2VhcmNoUXVlcnlfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3Npbmd1bGFyTGFiZWxfZmlsZU5hbWVTZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVNlYXJjaFF1ZXJ5X3BsdXJhbFBhdHRlcm5fZmlsZU5hbWVTZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dFNlYXJjaEVuZ2luZV9zdGF0dXNNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVMYWJlbFByb3ZpZGVyX2NvdW50X2Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTGFiZWxQcm92aWRlcl9yZW1vdmVkX3Jlc291cmNlX2xhYmVsOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOWY4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ncm91cF9yZWZlcmVuY2VzPSBSZSZmZXJlbmNlcwotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbD0gJldvcmtzcGFjZQotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw9ICZQcm9qZWN0Ci1TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbD0gV29ya2luZyAmU2V0Li4uCi1GaWxlU2VhcmNoUGFnZV9saW1pdGVkX2Zvcm1hdD17MH0gKHNob3dpbmcgezF9IG9mIHsyfSBmaWxlcykKLUZpbGVTZWFyY2hQYWdlX2Vycm9yX21hcmtlcj1Db3VsZCBub3QgY3JlYXRlIG1hcmtlcgotRmlsZVNlYXJjaFBhZ2Vfc29ydF9ieV9sYWJlbD1Tb3J0IEJ5Ci1PcGVuV2l0aE1lbnVfbGFiZWw9IE9wZW4gV2l0JmgKLQotRmlsZUxhYmVsUHJvdmlkZXJfY291bnRfZm9ybWF0PXswfSAoezF9IG1hdGNoZXMpCi1GaWxlTGFiZWxQcm92aWRlcl9yZW1vdmVkX3Jlc291cmNlX2xhYmVsPTxyZW1vdmVkIHJlc291cmNlPgotCi1GaWxlU2VhcmNoUXVlcnlfbGFiZWw9RmlsZSBTZWFyY2gKLQotIyBUaGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgcGF0dGVybiwgdGhlIHNlY29uZCBieSB0aGUgY291bnQgYW5kIHRoZSB0aGlyZCBieSB0aGUgc2NvcGUKLUZpbGVTZWFyY2hRdWVyeV9wbHVyYWxQYXR0ZXJuPSAnJ3swfScnIC0gezF9IG1hdGNoZXMgaW4gezJ9Ci0KLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHBhdHRlcm4sIHRoZSBzZWNvbmQgYnkgdGhlIHNjb3BlCi1GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbD0gJyd7MH0nJyAtIDEgbWF0Y2ggaW4gezF9Ci0KLUZpbGVTZWFyY2hRdWVyeV9zaW5ndWxhckxhYmVsX2ZpbGVOYW1lU2VhcmNoPTEgZmlsZSBuYW1lIG1hdGNoaW5nICcnezB9JycgaW4gezF9Ci1GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybl9maWxlTmFtZVNlYXJjaD17MX0gZmlsZSBuYW1lcyBtYXRjaGluZyAnJ3swfScnIGluIHsyfQotCi1UZXh0U2VhcmNoRW5naW5lX3N0YXR1c01lc3NhZ2U9IFByb2JsZW1zIGVuY291bnRlcmVkIGR1cmluZyB0ZXh0IHNlYXJjaC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hRdWVyeVJlc3VsdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWQyMzRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi1jbGFzcyBTZWFyY2hRdWVyeVJlc3VsdENvbGxlY3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JcHJpdmF0ZSBTZWFyY2hSZXN1bHQgZlNlYXJjaFJlc3VsdDsKLQotCQotCXByb3RlY3RlZCBTZWFyY2hRdWVyeVJlc3VsdENvbGxlY3RvcihTZWFyY2hSZXN1bHQgcmVzdWx0KXsKLQkJc3VwZXIoKTsKLQkJZlNlYXJjaFJlc3VsdD0gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIG1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU1hdGNoIGFNYXRjaCA9IG5ldyBNYXRjaChtYXRjaC5nZXRGaWxlKCksIG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCWZTZWFyY2hSZXN1bHQuYWRkTWF0Y2goYU1hdGNoKTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTQxZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGltcGxlbWVudHMgSUVkaXRvck1hdGNoQWRhcHRlciwgSUZpbGVNYXRjaEFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgTWF0Y2hbXSBFTVBUWV9BUlI9IG5ldyBNYXRjaFswXTsKLQkKLQlwcml2YXRlIEFic3RyYWN0U2VhcmNoUXVlcnkgZlF1ZXJ5OwotCi0JcHVibGljIFNlYXJjaFJlc3VsdChBYnN0cmFjdFNlYXJjaFF1ZXJ5IGpvYikgewotCQlmUXVlcnk9IGpvYjsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy90c2VhcmNoX2RwZG5fb2JqLmdpZiIpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZlF1ZXJ5LmdldFJlc3VsdExhYmVsKGdldE1hdGNoQ291bnQoKSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbHRpcCgpIHsKLQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0TWF0Y2hlcyhmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotCQkJcmV0dXJuIChJRmlsZSllbGVtZW50OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlJRWRpdG9ySW5wdXQgZWk9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoZWkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWk7Ci0JCQlyZXR1cm4gbWF0Y2guZ2V0RWxlbWVudCgpLmVxdWFscyhmaS5nZXRGaWxlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JJbnB1dCBlaT0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlaSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmk9IChJRmlsZUVkaXRvcklucHV0KSBlaTsKLQkJCXJldHVybiBnZXRNYXRjaGVzKGZpLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0FSUjsKLQl9Ci0KLQlwdWJsaWMgSVNlYXJjaFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gZlF1ZXJ5OwotCX0KLQkKLQlwdWJsaWMgSUZpbGVNYXRjaEFkYXB0ZXIgZ2V0RmlsZU1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBJRWRpdG9yTWF0Y2hBZGFwdGVyIGdldEVkaXRvck1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyNDdiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuRGVsZWdhdGluZ0RyYWdBZGFwdGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklDb250ZXh0TWVudUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdFZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbkZpbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuV2l0aE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5GaWxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuU29ydEFjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0UGFnZSBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWNvcmF0b3JJZ25vcmluZ1ZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXByaXZhdGUgZmluYWwgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0KLQkJcHVibGljIERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKG51bGwpOyAvLyBsYXp5IGluaXRpYWxpemF0aW9uCi0JCQlmTGFiZWxQcm92aWRlcj0gbGFiZWxQcm92aWRlcjsKLQkJfQotCQkKLQkgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JICAgICAgICBTdHJpbmcgbmFtZTE9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQoZTEpOwotCSAgICAgICAgU3RyaW5nIG5hbWUyPSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KGUyKTsKLQkgICAgICAgIGlmIChuYW1lMSA9PSBudWxsKQotCSAgICAgICAgICAgIG5hbWUxID0gIiI7Ly8kTk9OLU5MUy0xJAotCSAgICAgICAgaWYgKG5hbWUyID09IG51bGwpCi0JICAgICAgICAgICAgbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JICAgICAgICByZXR1cm4gZ2V0Q29sbGF0b3IoKS5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JICAgIH0KLQkgICAgCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNnZXRDb2xsYXRvcigpCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgQ29sbGF0b3IgZ2V0Q29sbGF0b3IoKSB7Ci0JCQlpZiAoY29sbGF0b3IgPT0gbnVsbCkgewotCQkJCWNvbGxhdG9yPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIGNvbGxhdG9yOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU09SVElORz0gIm9yZy5lY2xpcHNlLnNlYXJjaC5yZXN1bHRwYWdlLnNvcnRpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFjdGlvbkdyb3VwIGZBY3Rpb25Hcm91cDsKLQlwcml2YXRlIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRTb3J0T3JkZXI7Ci0JcHJpdmF0ZSBTb3J0QWN0aW9uIGZTb3J0QnlOYW1lQWN0aW9uOwotCXByaXZhdGUgU29ydEFjdGlvbiBmU29ydEJ5UGF0aEFjdGlvbjsKLQkKLQkvLyBuZXZlciB1c2VkCi0JLy9wcml2YXRlIEVkaXRvck9wZW5lciBmRWRpdG9yT3BlbmVyPSBuZXcgRWRpdG9yT3BlbmVyKCk7Ci0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0hPV19JTl9UQVJHRVRTPSBuZXcgU3RyaW5nW10geyBJUGFnZUxheW91dC5JRF9SRVNfTkFWIH07Ci0JcHJpdmF0ZSAgc3RhdGljIGZpbmFsIElTaG93SW5UYXJnZXRMaXN0IFNIT1dfSU5fVEFSR0VUX0xJU1Q9IG5ldyBJU2hvd0luVGFyZ2V0TGlzdCgpIHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBTSE9XX0lOX1RBUkdFVFM7Ci0JCX0KLQl9OwotCi0JLy8gcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQkKLQlwdWJsaWMgU2VhcmNoUmVzdWx0UGFnZSgpIHsKLQkJLy8gVE9ETwotCQkvL2ZTb3J0QnlOYW1lQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X25hbWVfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfTEFCRUxfUEFUSCk7IAotCQkvL2ZTb3J0QnlQYXRoQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X3BhdGhfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfUEFUSF9MQUJFTCk7IAotICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLyoKLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoU2VhcmNoUHJlZmVyZW5jZVBhZ2UuTElNSVRfVEFCTEUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpIHx8IFNlYXJjaFByZWZlcmVuY2VQYWdlLkxJTUlUX1RBQkxFX1RPLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkKLQkJCQkJaWYgKGdldFZpZXdlcigpIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLQkJCQkJCWdldFZpZXdQYXJ0KCkudXBkYXRlTGFiZWwoKTsKLQkJCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkqLwotfQotCQotCXB1YmxpYyBTdHJ1Y3R1cmVkVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZpZXdlcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRHJhZ0FkYXB0ZXJzKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzPSBuZXcgVHJhbnNmZXJbXSB7IFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQlpbnQgb3BzPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkJCi0JCURlbGVnYXRpbmdEcmFnQWRhcHRlciBhZGFwdGVyPSBuZXcgRGVsZWdhdGluZ0RyYWdBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuYWRkRHJhZ1NvdXJjZUxpc3RlbmVyKG5ldyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0JCQotCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQob3BzLCB0cmFuc2ZlcnMsIGFkYXB0ZXIpOwotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCUZpbGVMYWJlbFByb3ZpZGVyIGlubmVyTGFiZWxQcm92aWRlcj0gbmV3IEZpbGVMYWJlbFByb3ZpZGVyKHRoaXMsIGZDdXJyZW50U29ydE9yZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKGlubmVyTGFiZWxQcm92aWRlciwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcih0aGlzKSk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKGlubmVyTGFiZWxQcm92aWRlcikpOwotCQlmQ29udGVudFByb3ZpZGVyPSAoSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJYWRkRHJhZ0FkYXB0ZXJzKHZpZXdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJRmlsZUxhYmVsUHJvdmlkZXIgaW5uZXJMYWJlbFByb3ZpZGVyPSBuZXcgRmlsZUxhYmVsUHJvdmlkZXIodGhpcywgRmlsZUxhYmVsUHJvdmlkZXIuU0hPV19MQUJFTCk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihpbm5lckxhYmVsUHJvdmlkZXIsIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgRGVjb3JhdG9ySWdub3JpbmdWaWV3ZXJTb3J0ZXIoaW5uZXJMYWJlbFByb3ZpZGVyKSk7Ci0JCWZDb250ZW50UHJvdmlkZXI9IChJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlhZGREcmFnQWRhcHRlcnModmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGU9IChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpOwotCQlJV29ya2JlbmNoUGFnZSB3YlBhZ2U9IFVJUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yPSBJREUub3BlbkVkaXRvcih3YlBhZ2UsIChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpLCBhY3RpdmF0ZSk7Ci0JCWlmIChvZmZzZXQgIT0gMCAmJiBsZW5ndGggIT0gMCkgewotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvcj0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwob2Zmc2V0LCBsZW5ndGgpOwotCQkJfSBlbHNlIGlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCXNob3dXaXRoTWFya2VyKGVkaXRvciwgZmlsZSwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaG93V2l0aE1hcmtlcihJRWRpdG9yUGFydCBlZGl0b3IsIElGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXIgbWFya2VyPSBudWxsOwotCQl0cnkgewotCQkJbWFya2VyPSBmaWxlLmNyZWF0ZU1hcmtlcihOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSKTsKLQkJCUhhc2hNYXAgYXR0cmlidXRlcz0gbmV3IEhhc2hNYXAoNCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKG9mZnNldCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfZXJyb3JfbWFya2VyLCBlKTsgCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobWFya2VyICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1ncikgewotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWdyKTsKLQkJYWRkU29ydEFjdGlvbnMobWdyKTsKLQkJZkFjdGlvbkdyb3VwLnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJZkFjdGlvbkdyb3VwLmZpbGxDb250ZXh0TWVudShtZ3IpOwotLy8JCUZpbGVTZWFyY2hRdWVyeSBxdWVyeT0gKEZpbGVTZWFyY2hRdWVyeSkgZ2V0SW5wdXQoKS5nZXRRdWVyeSgpOwotCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBhZGRTb3J0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCWlmIChnZXRMYXlvdXQoKSAhPSBGTEFHX0xBWU9VVF9GTEFUKQotCQkJcmV0dXJuOwotCQlNZW51TWFuYWdlciBzb3J0TWVudT0gbmV3IE1lbnVNYW5hZ2VyKFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hQYWdlX3NvcnRfYnlfbGFiZWwpOyAKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlOYW1lQWN0aW9uKTsKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlQYXRoQWN0aW9uKTsKLQkJCi0JCWZTb3J0QnlOYW1lQWN0aW9uLnNldENoZWNrZWQoZkN1cnJlbnRTb3J0T3JkZXIgPT0gZlNvcnRCeU5hbWVBY3Rpb24uZ2V0U29ydE9yZGVyKCkpOwotCQlmU29ydEJ5UGF0aEFjdGlvbi5zZXRDaGVja2VkKGZDdXJyZW50U29ydE9yZGVyID09IGZTb3J0QnlQYXRoQWN0aW9uLmdldFNvcnRPcmRlcigpKTsKLQkJCi0JCW1nci5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9WSUVXRVJfU0VUVVAsIHNvcnRNZW51KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGFydChJU2VhcmNoUmVzdWx0Vmlld1BhcnQgcGFydCkgewotCQlzdXBlci5zZXRWaWV3UGFydChwYXJ0KTsKLQkJZkFjdGlvbkdyb3VwPSBuZXcgTmV3VGV4dFNlYXJjaEFjdGlvbkdyb3VwKHBhcnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmQWN0aW9uR3JvdXAuZGlzcG9zZSgpOwotCQkvLyBTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWZDb250ZW50UHJvdmlkZXIuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJZkNvbnRlbnRQcm92aWRlci5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvcnRPcmRlcihpbnQgc29ydE9yZGVyKSB7Ci0JCWZDdXJyZW50U29ydE9yZGVyPSBzb3J0T3JkZXI7Ci0JCURlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGxwV3JhcHBlcj0gKERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKSBnZXRWaWV3ZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCSgoRmlsZUxhYmVsUHJvdmlkZXIpIGxwV3JhcHBlci5nZXRMYWJlbFByb3ZpZGVyKCkpLnNldE9yZGVyKHNvcnRPcmRlcik7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJZ2V0U2V0dGluZ3MoKS5wdXQoS0VZX1NPUlRJTkcsIGZDdXJyZW50U29ydE9yZGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIucmVzdG9yZVN0YXRlKG1lbWVudG8pOwotCQl0cnkgewotCQkJZkN1cnJlbnRTb3J0T3JkZXI9IGdldFNldHRpbmdzKCkuZ2V0SW50KEtFWV9TT1JUSU5HKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vZkN1cnJlbnRTb3J0T3JkZXI9IGZTb3J0QnlOYW1lQWN0aW9uLmdldFNvcnRPcmRlcigpOwotCQl9Ci0JCWlmIChtZW1lbnRvICE9IG51bGwpIHsKLQkJCUludGVnZXIgdmFsdWU9IG1lbWVudG8uZ2V0SW50ZWdlcihLRVlfU09SVElORyk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlmQ3VycmVudFNvcnRPcmRlcj0gdmFsdWUuaW50VmFsdWUoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5zYXZlU3RhdGUobWVtZW50byk7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihLRVlfU09SVElORywgZkN1cnJlbnRTb3J0T3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSVNob3dJblRhcmdldExpc3QuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gU0hPV19JTl9UQVJHRVRfTElTVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nIGxhYmVsPSBzdXBlci5nZXRMYWJlbCgpOwotCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikgewotCQkJVGFibGVWaWV3ZXIgdHY9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCi0JCQlBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0PSBnZXRJbnB1dCgpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaW50IGl0ZW1Db3VudD0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgdHYuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKGdldElucHV0KCkpLmxlbmd0aDsKLQkJCQlpbnQgZmlsZUNvdW50PSBnZXRJbnB1dCgpLmdldEVsZW1lbnRzKCkubGVuZ3RoOwotCQkJCWlmIChpdGVtQ291bnQgPCBmaWxlQ291bnQpIHsKLQkJCQkJU3RyaW5nIGZvcm1hdD0gU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfbGltaXRlZF9mb3JtYXQ7IAotCQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W117bGFiZWwsIG5ldyBJbnRlZ2VyKGl0ZW1Db3VudCksIG5ldyBJbnRlZ2VyKGZpbGVDb3VudCl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQljbGFzcyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlNlbGVjdGlvblByb3ZpZGVyOwkJCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZlBhZ2U7Ci0JCXByaXZhdGUgT3BlbkZpbGVBY3Rpb24gZk9wZW5BY3Rpb247Ci0JCXByaXZhdGUgUHJvcGVydHlEaWFsb2dBY3Rpb24gZk9wZW5Qcm9wZXJ0aWVzRGlhbG9nOwotCi0JCXB1YmxpYyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAoSVZpZXdQYXJ0IHBhcnQpIHsKLQkJCUFzc2VydC5pc05vdE51bGwocGFydCk7Ci0JCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZT0gcGFydC5nZXRTaXRlKCk7Ci0JCQlmU2VsZWN0aW9uUHJvdmlkZXI9IHNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWZQYWdlPSBzaXRlLmdldFBhZ2UoKTsKLQkJCWZPcGVuUHJvcGVydGllc0RpYWxvZz0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKHNpdGUsIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCQlmT3BlbkFjdGlvbj0gbmV3IE9wZW5GaWxlQWN0aW9uKGZQYWdlKTsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJCWVsc2UKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkJLy8gdmlldyBtdXN0IGV4aXN0IGlmIHdlIGNyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgaXQuCi0JCQkKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlhZGRPcGVuV2l0aE1lbnUobWVudSwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCWlmIChmT3BlblByb3BlcnRpZXNEaWFsb2cgIT0gbnVsbCAmJiBmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNFbmFibGVkKCkgJiYgc2VsZWN0aW9uICE9IG51bGwgJiZmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNBcHBsaWNhYmxlRm9yU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSkKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9QUk9QRVJUSUVTLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwotCQkJfQotCQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYWRkT3BlbldpdGhNZW51KElNZW51TWFuYWdlciBtZW51LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQkJcmV0dXJuOwotCQkKLQkJCU9iamVjdCBvPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQkJaWYgKCEobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpKQotCQkJCXJldHVybjsgCi0JCQotCQkJZk9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBmT3BlbkFjdGlvbik7Ci0JCQotCQkJLy8gQ3JlYXRlIG1lbnUKLQkJCUlNZW51TWFuYWdlciBzdWJtZW51PSBuZXcgTWVudU1hbmFnZXIoU2VhcmNoTWVzc2FnZXMuT3BlbldpdGhNZW51X2xhYmVsKTsgCi0JCQlzdWJtZW51LmFkZChuZXcgT3BlbldpdGhNZW51KGZQYWdlLCAoSUFkYXB0YWJsZSlvKSk7Ci0JCQotCQkJLy8gQWRkIHRoZSBzdWJtZW51LgotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBzdWJtZW51KTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXIpIHsKLQkJCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcik7Ci0JCQlzZXRHbG9iYWxBY3Rpb25IYW5kbGVycyhhY3Rpb25CYXIpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0R2xvYmFsQWN0aW9uSGFuZGxlcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwkJCi0JCX0KLQl9CQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTdkMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGUuSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlI9IG5ldyBPYmplY3RbMF07Ci0JCi0JcHJpdmF0ZSBTZWFyY2hSZXN1bHRQYWdlIGZQYWdlOwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIoU2VhcmNoUmVzdWx0UGFnZSBwYWdlKSB7Ci0JCWZQYWdlPSBwYWdlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzPSAoKFNlYXJjaFJlc3VsdClpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0gICAJICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCQkvLyBFdmVuIG1vcmUgaW1wb3J0YW50bHkgd2UgbmVlZCB0byBkaXNjdXNzIHdpdGggdGhlIGJhc2UgZ3V5cyB0byBnZXQgQVBJIGxpbmVkIHVwIGZvciB0aGlzIChzZWUgYnVnIDE2MzE3NykuCi0JCQkvKgotCQkJaW50IHRhYmxlTGltaXQ9IFNlYXJjaFByZWZlcmVuY2VQYWdlLmdldFRhYmxlTGltaXQoKTsKLQkJCWlmIChTZWFyY2hQcmVmZXJlbmNlUGFnZS5pc1RhYmxlTGltaXRlZCgpICYmIGVsZW1lbnRzLmxlbmd0aCA+IHRhYmxlTGltaXQpIHsKLQkJCQlPYmplY3RbXSBzaG93bkVsZW1lbnRzPSBuZXcgT2JqZWN0W3RhYmxlTGltaXRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIHNob3duRWxlbWVudHMsIDAsIHRhYmxlTGltaXQpOwotCQkJCXJldHVybiBzaG93bkVsZW1lbnRzOwotCQkJfSovCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0FSUjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgewotCQkJZlJlc3VsdD0gKFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCQlUYWJsZVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcigpOwotCSAgICAvLyBjcyA6IEkndmUgY29tbWVudCAndGFibGVMaW1pdGVkJyByZWxhdGVkIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLy9ib29sZWFuIHRhYmxlTGltaXRlZD0gU2VhcmNoUHJlZmVyZW5jZVBhZ2UuaXNUYWJsZUxpbWl0ZWQoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmICh2aWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkKLQkJCQkJdmlld2VyLnVwZGF0ZSh1cGRhdGVkRWxlbWVudHNbaV0sIG51bGwpOwotCQkJCWVsc2UgewotCQkJCQkvL2lmICghdGFibGVMaW1pdGVkIHx8IHZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIDwgU2VhcmNoUHJlZmVyZW5jZVBhZ2UuZ2V0VGFibGVMaW1pdCgpKQotCQkJCQkJdmlld2VyLmFkZCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gKFRhYmxlVmlld2VyKSBmUGFnZS5nZXRWaWV3ZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzljZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUj0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0JcHJpdmF0ZSBBYnN0cmFjdFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBNYXAgZkNoaWxkcmVuTWFwOwotCQotCVNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcikgewotCQlmVHJlZVZpZXdlcj0gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSB7Ci0JCQlpbml0aWFsaXplKChTZWFyY2hSZXN1bHQpIG5ld0lucHV0KTsKLQkJfQotCX0KLQkKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQpIHsKLQkJZlJlc3VsdD0gcmVzdWx0OwotCQlmQ2hpbGRyZW5NYXA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHM9IHJlc3VsdC5nZXRFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5zZXJ0KGVsZW1lbnRzW2ldLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoT2JqZWN0IGNoaWxkLCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJT2JqZWN0IHBhcmVudD0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5zZXJ0Q2hpbGQocGFyZW50LCBjaGlsZCkpIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIucmVmcmVzaChwYXJlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkPSBwYXJlbnQ7Ci0JCQlwYXJlbnQ9IGdldFBhcmVudChjaGlsZCk7Ci0JCX0KLQkJaWYgKGluc2VydENoaWxkKGZSZXN1bHQsIGNoaWxkKSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJZlRyZWVWaWV3ZXIuYWRkKGZSZXN1bHQsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hpbGQgYWxyZWFkeSB3YXMgYSBjaGlsZCBvZiBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnllPC9jb2RlPiBpZiB0aGUgY2hpbGQgd2FzIGFkZGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGluc2VydENoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlTZXQgY2hpbGRyZW49IChTZXQpIGZDaGlsZHJlbk1hcC5nZXQocGFyZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuPSBuZXcgSGFzaFNldCgpOwotCQkJZkNoaWxkcmVuTWFwLnB1dChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQkvLyBwcmVjb25kaXRpb24gaGVyZTogIGZSZXN1bHQuZ2V0TWF0Y2hDb3VudChjaGlsZCkgPD0gMAotCQotCQlpZiAoaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKQotCQkJCWZUcmVlVmlld2VyLnJlZnJlc2goZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZlJlc3VsdC5nZXRNYXRjaENvdW50KGVsZW1lbnQpID09IDApIHsKLQkJCQlmQ2hpbGRyZW5NYXAucmVtb3ZlKGVsZW1lbnQpOwotCQkJCU9iamVjdCBwYXJlbnQ9IGdldFBhcmVudChlbGVtZW50KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHJlZnJlc2hWaWV3ZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZUZyb21TaWJsaW5ncyhlbGVtZW50LCBmUmVzdWx0KTsKLQkJCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0IHNpYmxpbmdzPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsKSB7Ci0JCQlzaWJsaW5ncy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJU2V0IGNoaWxkcmVuPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudEVsZW1lbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9BUlI7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkKLQkJCQlpbnNlcnQodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCWVsc2UKLQkJCQlyZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKGZSZXN1bHQpOwotCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgZWxlbWVudDsKLQkJCXJldHVybiByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9GaWxlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvRmlsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ZTI3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9GaWxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBEZXJpdmVkIGZyb20gb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLkZpbGVMYWJlbFByb3ZpZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guYmFzZWNvZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hNZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19MQUJFTD0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0xBQkVMX1BBVEg9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19QQVRIX0xBQkVMPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfUEFUSD0gNDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdTZXBhcmF0b3JGb3JtYXQ9ICJ7MH0gLSB7MX0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UgZlBhZ2U7Ci0JCQotCXByaXZhdGUgaW50IGZPcmRlcjsKLQlwcml2YXRlIFN0cmluZ1tdIGZBcmdzPSBuZXcgU3RyaW5nWzJdOwotCi0JcHVibGljIEZpbGVMYWJlbFByb3ZpZGVyKEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIHBhZ2UsIGludCBvcmRlckZsYWcpIHsKLQkJZkxhYmVsUHJvdmlkZXI9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCWZPcmRlcj0gb3JkZXJGbGFnOwotCQlmUGFnZT0gcGFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcihpbnQgb3JkZXJGbGFnKSB7Ci0JCWZPcmRlcj0gb3JkZXJGbGFnOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQlyZXR1cm4gZk9yZGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZT0gKElSZXNvdXJjZSllbGVtZW50OwotCQlTdHJpbmcgdGV4dD0gbnVsbDsKLQotCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKQotCQkJdGV4dD0gU2VhcmNoTWVzc2FnZXMuRmlsZUxhYmVsUHJvdmlkZXJfcmVtb3ZlZF9yZXNvdXJjZV9sYWJlbDsgCi0JCQotCQllbHNlIHsKLQkJCUlQYXRoIHBhdGg9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJaWYgKHBhdGguZ2V0RGV2aWNlKCkgPT0gbnVsbCkKLQkJCQlwYXRoPSBwYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJaWYgKGZPcmRlciA9PSBTSE9XX0xBQkVMIHx8IGZPcmRlciA9PSBTSE9XX0xBQkVMX1BBVEgpIHsKLQkJCQl0ZXh0PSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KHJlc291cmNlKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsICYmIGZPcmRlciA9PSBTSE9XX0xBQkVMX1BBVEgpIHsKLQkJCQkJZkFyZ3NbMF09IHRleHQ7Ci0JCQkJCWZBcmdzWzFdPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCXRleHQ9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZnU2VwYXJhdG9yRm9ybWF0LCBmQXJncyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCQl0ZXh0PSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0PSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChmT3JkZXIgPT0gU0hPV19QQVRIX0xBQkVMKSB7Ci0JCQkJCWZBcmdzWzBdPSB0ZXh0OwotCQkJCQlmQXJnc1sxXT0gZkxhYmVsUHJvdmlkZXIuZ2V0VGV4dChyZXNvdXJjZSk7Ci0JCQkJCXRleHQ9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZnU2VwYXJhdG9yRm9ybWF0LCBmQXJncyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpbnQgbWF0Y2hDb3VudD0gMDsKLQkJQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdD0gZlBhZ2UuZ2V0SW5wdXQoKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJbWF0Y2hDb3VudD0gcmVzdWx0LmdldE1hdGNoQ291bnQoZWxlbWVudCk7Ci0JCWlmIChtYXRjaENvdW50IDw9IDEpCi0JCQlyZXR1cm4gdGV4dDsKLQkJU3RyaW5nIGZvcm1hdD0gU2VhcmNoTWVzc2FnZXMuRmlsZUxhYmVsUHJvdmlkZXJfY291bnRfZm9ybWF0OyAKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGZvcm1hdCwgbmV3IE9iamVjdFtdIHsgdGV4dCwgbmV3IEludGVnZXIobWF0Y2hDb3VudCkgfSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVJlc291cmNlIHJlc291cmNlPSAoSVJlc291cmNlKWVsZW1lbnQ7Ci0JCUltYWdlIGltYWdlPSBmTGFiZWxQcm92aWRlci5nZXRJbWFnZShyZXNvdXJjZSk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWZMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXIuaXNMYWJlbFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZkxhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlmTGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL0lGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWY0MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gCi0gKgotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY2xlYXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOTFkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5NZXNzYWdlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBmb3JtYXQgbWVzc2FnZSBzdHJpbmdzLgotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7IG9iamVjdH0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0W10gb2JqZWN0cykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgb2JqZWN0cyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gTm90IGZvciBpbnN0YW50aWF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvYmFzZWNvZGUvUmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MjgxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICogRGVyaXZlZCBmcm9tIG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5SZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5iYXNlY29kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotCi0vKioKLSAqIEEgZHJhZyBhZGFwdGVyIHRoYXQgdHJhbnNmZXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhcyA8L2NvZGU+Ci0gKiBJUmVzb3VyY2U8L2NvZGU+LiBPbmx5IHRob3NlIGVsZW1lbnRzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHBhcnQgCi0gKiBvZiB0aGUgdHJhbnNmZXIgd2hpY2ggY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGFuIDxjb2RlPklSZXNvdXJjZQotICogPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVHJhbnNmZXJEcmFnQWRhcHRlciBleHRlbmRzIERyYWdTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHNlbGVjdGlvbiBwcm92aWRlciB0byBhY2Nlc3MgdGhlIHZpZXdlcidzIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWZQcm92aWRlcj0gcHJvdmlkZXI7Ci0JCUFzc2VydC5pc05vdE51bGwoZlByb3ZpZGVyKTsKLQl9Ci0JCi0JcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQlyZXR1cm4gUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWV2ZW50LmRvaXQ9IGNvbnZlcnRTZWxlY3Rpb24oKS5zaXplKCkgPiAwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCByZXNvdXJjZXM9IGNvbnZlcnRTZWxlY3Rpb24oKTsKLQkJZXZlbnQuZGF0YT0gcmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZVtyZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFldmVudC5kb2l0KQotCQkJcmV0dXJuOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY29udmVydFNlbGVjdGlvbigpIHsKLQkJSVNlbGVjdGlvbiBzPSBmUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghKHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHM7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KHNlbGVjdGlvbi5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50PSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1NvcnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2Jhc2Vjb2RlL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5MWVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9iYXNlY29kZS9Tb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqIERlcml2ZWQgZnJvbSBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwudWkuU29ydEFjdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmJhc2Vjb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hSZXN1bHRQYWdlOwotCi1wdWJsaWMgY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBpbnQgZlNvcnRPcmRlcjsKLQlwcml2YXRlIFNlYXJjaFJlc3VsdFBhZ2UgZlBhZ2U7Ci0JCi0JcHVibGljIFNvcnRBY3Rpb24oU3RyaW5nIGxhYmVsLCBTZWFyY2hSZXN1bHRQYWdlIHBhZ2UsIGludCBzb3J0T3JkZXIpIHsKLQkJc3VwZXIobGFiZWwpOwotCQlmUGFnZT0gcGFnZTsKLQkJZlNvcnRPcmRlcj0gc29ydE9yZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZlBhZ2Uuc2V0U29ydE9yZGVyKGZTb3J0T3JkZXIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U29ydE9yZGVyKCkgewotCQlyZXR1cm4gZlNvcnRPcmRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWVkNTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgIHByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlOwotCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0gICAgcHJpdmF0ZSBMaXN0IGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQ7Ci0gICAgcHJpdmF0ZSBMaXN0IG1hc3RlckNvbXBvbmVudExpc3Q7Ci0gICAgCi0gICAgLy8gd2lkZ2V0cwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlOwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgYm90dG9tQ29tcG9zaXRlOyAKLSAgICBwcml2YXRlIFRleHQgdGV4dEZpbHRlcjsKLSAgICBwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29tcG9uZW50VGFibGVWaWV3ZXI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTG9jYXRpb25MYWJlbCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTjsKLSAgICBwcm90ZWN0ZWQgVmlld0Zvcm0gZmlsZUxvY2F0aW9uVmlldzsgICAgCi0gICAgcHJvdGVjdGVkIENMYWJlbCBsb2NhdGlvbkxhYmVsOwotCi0gICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgaXRlbSBwcmV2aW91c2x5IHNlbGVjdGVkIGluIHRoZSB0YWJsZQotCXByaXZhdGUgVGFibGVJdGVtIHByZXZJdGVtOwotCXByaXZhdGUgU3RyaW5nIHByZXZJdGVtVGV4dDsKLQotCXByb3RlY3RlZCBPYmplY3QgY29tcG9uZW50U2VsZWN0aW9uOwotICAgIHByb3RlY3RlZCBPYmplY3QgcXVhbGlmaWVyVGV4dFNlbGVjdGlvbjsKLSAgICAKLQlwcm90ZWN0ZWQgVG9vbEJhciBmaWx0ZXJUb29sQmFyOwotCXByb3RlY3RlZCBUb29sSXRlbSB0b29sSXRlbTsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZk1lbnVNYW5hZ2VyOwotCQotCXByb3RlY3RlZCBIYXNoTWFwIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sID0gbmV3IEhhc2hNYXAoKTsgIAotICAgIHByaXZhdGUgQnV0dG9uIG5ld0J1dHRvbjsKLSAKLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgc3VwZXIoc2hlbGwpOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgICAgICB0aGlzLmRpYWxvZ1RpdGxlID0gZGlhbG9nVGl0bGU7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uaW5pdCh0aGlzKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBzdXBlci5jcmVhdGUoKTsKLSAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXRUZXh0RmlsdGVyRm9jdXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGV4dEZpbHRlckZvY3VzKCkgewotICAgICAgICB0ZXh0RmlsdGVyLnNldEZvY3VzKCk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZ2V0U2hlbGwoKS5zZXRUZXh0KGRpYWxvZ1RpdGxlKTsKLQotICAgICAgICBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSAoR3JpZERhdGEpIG1haW5Db21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBnRGF0YS5oZWlnaHRIaW50ID0gNTAwOwotICAgICAgICAKLSAgICAgICAgY29uZmlndXJhdGlvbi5jcmVhdGVXaWRnZXRBYm92ZVF1YWxpZmllckJveChtYWluQ29tcG9zaXRlKTsgICAgICAgIAotICAgICAgICAvLyBTdWJjbGFzc2VzIG1heSB1c2UgdGhpcyBDb21wb3NpdGUgdG8gYWRkIGRlc2lyZWQgd2lkZ2V0cwotICAgICAgICAvL3RvcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAvL3RvcENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgICAgLy90b3BDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0gICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gaW50cm9kdWNlIGEgbWV0aG9kIGhlcmUgdG8gY29udGFpbiB0aGlzCi0gICAgICAgIC8vIHNvIHdlIGNhbiBhZGQgZGlmZmVyZW50IHBhcmVudCBvdGhlciB0aGFuICd0b3BDb21wb3NpdGUnCi0gICAgICAgIENvbXBvc2l0ZSBmaWx0ZXJMYWJlbEFuZFRleHQgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXRGaWx0ZXJMYWJlbEFuZFRleHQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGxheW91dEZpbHRlckxhYmVsQW5kVGV4dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgIGxheW91dEZpbHRlckxhYmVsQW5kVGV4dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBmaWx0ZXJMYWJlbEFuZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGZpbHRlckxhYmVsQW5kVGV4dC5zZXRMYXlvdXQobGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0KTsKLQotICAgICAgICAvLyBDcmVhdGUgVGV4dCB0ZXh0RmlsdGVyCi0gICAgICAgIAotICAgICAgICBMYWJlbCBmaWx0ZXJMYWJlbCA9IG5ldyBMYWJlbChmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5OT05FKTsKLSAgICAgICAgZmlsdGVyTGFiZWwuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldEZpbHRlckxhYmVsVGV4dCgpKTsvLyArICIoPyA9IGFueSBjaGFyYWN0ZXIsICogPSBhbnkgc3RyaW5nKToiKTsKLSAgICAgICAgR3JpZERhdGEgZmlsdGVyTGFiZWxEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIGZpbHRlckxhYmVsRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGZpbHRlckxhYmVsLnNldExheW91dERhdGEoZmlsdGVyTGFiZWxEYXRhKTsKLQotICAgICAgICB0ZXh0RmlsdGVyID0gbmV3IFRleHQoZmlsdGVyTGFiZWxBbmRUZXh0LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHRleHRGaWx0ZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7ICAgICAgICAKLSAgICAgICAgdGV4dEZpbHRlci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgVGV4dEZpbHRlck1vZGlmeUFkYXB0ZXIoKSk7Ci0gICAgICAgIEdyaWREYXRhIHRleHRGaWx0ZXJEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICAgIHRleHRGaWx0ZXJEYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICB0ZXh0RmlsdGVyRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgdGV4dEZpbHRlci5zZXRMYXlvdXREYXRhKHRleHRGaWx0ZXJEYXRhKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElOZXdDb21wb25lbnRIYW5kbGVyIGhhbmRsZXIgPSBjb25maWd1cmF0aW9uLmdldE5ld0NvbXBvbmVudEhhbmRsZXIoKTsKLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24oZmlsdGVyTGFiZWxBbmRUZXh0LCBTV1QuTk9ORSk7Ci0gICAgICAgICAgIG5ld0J1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OZXcpOyAgCi0gICAgICAgICAgIG5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBoYW5kbGVyLm9wZW5OZXdDb21wb25lbnREaWFsb2coKTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBoYW5kbGVyLm9wZW5OZXdDb21wb25lbnREaWFsb2coKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIENvbXBvbmVudCBUYWJsZVZpZXdlcgotICAgICAgICBjcmVhdGVDb21wb25lbnRUYWJsZVZpZXdlcihtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVdpZGdldEFib3ZlUXVhbGlmaWVyQm94KG1haW5Db21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIFF1YWxpZmllciBMaXN0IHdpZGdldAotICAgICAgICBMYWJlbCBxdWFsaWZpZXJMYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHF1YWxpZmllckxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1FVQUxJRklFUik7Ci0JCXF1YWxpZmllckxhYmVsLnNldFRleHQoZmlsZUxvY2F0aW9uTGFiZWwpOwotCi0gICAgICAgIGZpbGVMb2NhdGlvblZpZXcgPSBuZXcgVmlld0Zvcm0obWFpbkNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5GTEFUICk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gMjI7Ci0gICAgICAgIGZpbGVMb2NhdGlvblZpZXcuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgCi0gICAgCWxvY2F0aW9uTGFiZWwgPSBuZXcgQ0xhYmVsKGZpbGVMb2NhdGlvblZpZXcsIFNXVC5GTEFUKTsKLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldy5zZXRDb250ZW50KGxvY2F0aW9uTGFiZWwpOwotICAgIAlsb2NhdGlvbkxhYmVsLnNldEZvbnQoZmlsZUxvY2F0aW9uVmlldy5nZXRGb250KCkpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uY3JlYXRlV2lkZ2V0QmVsb3dRdWFsaWZpZXJCb3gobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICBib3R0b21Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgYm90dG9tQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0gICAgICAgIC8vIFBvcHVsYXRlIHRoZSBDb21wb25lbnQgVGFibGVWaWV3ZXIgdmlhIHRoZSBwcm92aWRlcgotICAgICAgICAvLyBUT0RPOiBJcyB0aGlzIHRoZSByaWdodCB3YXkgdG8gc2V0L2dldCB0aGUgQ29udGVudFByb3ZpZGVyPwotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbXBvbmVudFRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpLmdldExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5zZXRJbnB1dChjb21wb25lbnRUYWJsZVZpZXdlcklucHV0KTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBUT0RPIChjcykgbmVlZCB0byBkbyBzb21lIHdvcmsgdG8gbWFrZSB0aGUgZGVmYXVsdCBzZWFyY2ggc2NvcGUKLSAgICAgICAgLy8gbW9yZSB3ZWxsIGRlZmluZWQsIGN1cnJlbnRseSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gcGFzcyBhIG51bGwKLSAgICAgICAgLy8gYXJndW1lbnQgaW4gdG8gcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0IGJ1dCB3ZSBzaG91bGQgcHJvdmlkZQotICAgICAgICAvLyBnZXR0ZXJzL3NldHRlcnMgdG8gYWxsb3cgdGhlIGRlZmF1bHQgdG8gYmUgY29udHJvbGxlZAotICAgICAgICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QobnVsbCk7Ci0gICAgICAgIHJlZnJlc2hUYWJsZVZpZXdlcigiIik7Ci0KLSAgICAgICAgcmV0dXJuIG1haW5Db21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogQ3JlYXRlcyB0aGUgQ29tcG9uZW50IFRhYmxlVmlld2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb21wb25lbnRUYWJsZVZpZXdlcihDb21wb3NpdGUgYmFzZSkgewotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlciA9IGNyZWF0ZUZpbHRlck1lbnVBbmRUYWJsZVZpZXdlcihiYXNlKTsgICAgCi0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy9MaXN0IHF1YWxpZmllcnMgPSBzZWFyY2hMaXN0UHJvdmlkZXIuZ2V0UXVhbGlmaWVycyhzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAvL3VwZGF0ZVF1YWxpZmllckxpc3QocXVhbGlmaWVycyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ2FuRmluaXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLSAgICAgICAgCS8vIENoYW5naW5nIHRoZSB0ZXh0IGZvciB0aGUgY29tcG9uZW50IHNlbGVjdGVkIGFuZCBkaXNwbGF5IGl0cyBzb3VyY2UKLSAgICAgICAgCS8vIGZpbGUgaW4gdGhlIGJveCB1bmRlciB0aGUgdGFibGUgdmlld2VyCi0gICAgICAgICAgCi0gICAgICAgIAlJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCk7ICAgICAgICAJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkJCQotCQkJCXJ1bigpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAvLyBidWcgMTQ0NTQ4IC0gdW5uZWNlc3NhcnkKLSAgICAgICAgLy8gcnVuKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBydW4oKSB7Ci0JCQkJLy8gcmVzdG9yZXMgdGhlIHRleHQgb2YgcHJldmlvdXMgaXRlbQotCQkJCWlmIChwcmV2SXRlbSAhPSBudWxsICYmICFwcmV2SXRlbS5pc0Rpc3Bvc2VkKCkpewotCQkJCQlwcmV2SXRlbS5zZXRUZXh0KHByZXZJdGVtVGV4dCk7Ci0JCQkJfQotCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3QgY29tcG9uZW50ID0gaXRlbXNbMF0uZ2V0RGF0YSgpOwotCi0JCQkJcHJldkl0ZW0gPSBpdGVtc1swXTsKLQkJCQlwcmV2SXRlbVRleHQgPSBpdGVtc1swXS5nZXRUZXh0KCk7Ci0KLQkJCQkvLyBhZGQgY2xhcmlmaWNhdGlvbiBmb3IgdGhlIGZpcnN0IHNlbGVjdGVkIGl0ZW0KLQkJCQlpdGVtc1swXS5zZXRUZXh0KCAgZGVzY3JpcHRpb25Qcm92aWRlci5nZXROYW1lKGNvbXBvbmVudCkgKyAiIC0gIiArIAotICAgIAkJCQkJZGVzY3JpcHRpb25Qcm92aWRlci5nZXRRdWFsaWZpZXIoY29tcG9uZW50KSk7Ci0KLQkJCQl1cGRhdGVMb2NhdGlvblZpZXcoY29tcG9uZW50LCBkZXNjcmlwdGlvblByb3ZpZGVyKTsKLQkJCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCW9rUHJlc3NlZCgpOwotCQkJfQotICAgICAgICAJCi0gICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY3JlYXRlRmlsdGVyTWVudUFuZFRhYmxlVmlld2VyKENvbXBvc2l0ZSBjb21wKSB7Ci0gICAgCUNvbXBvc2l0ZSBsYWJlbEFuZEZpbHRlciA9IG5ldyBDb21wb3NpdGUoY29tcCwgU1dULk5PTkUpOwotICAgIAlsYWJlbEFuZEZpbHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IDA7IGxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0gICAgCWxhYmVsQW5kRmlsdGVyLnNldExheW91dChsYXlvdXQpOwotICAgIAkKLSAgICAgICAgTGFiZWwgdGFibGVMYWJlbCA9IG5ldyBMYWJlbChsYWJlbEFuZEZpbHRlciwgU1dULk5PTkUpOwotICAgICAgICB0YWJsZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICB0YWJsZUxhYmVsLnNldFRleHQoY29uZmlndXJhdGlvbi5nZXRMaXN0TGFiZWxUZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgZmlsdGVyVG9vbEJhciA9IG5ldyBUb29sQmFyKGxhYmVsQW5kRmlsdGVyLFNXVC5GTEFUKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5jcmVhdGVUb29sQmFySXRlbXMoZmlsdGVyVG9vbEJhcik7Ci0KLSAgICAgICAgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIobmV3IFRhYmxlKGxhYmVsQW5kRmlsdGVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUikpOwotICAgICAgICBDb250cm9sIFRhYmxlV2lkZ2V0ID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBUYWJsZVdpZGdldC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgICAgICByZXR1cm4gdGFibGVWaWV3ZXI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMb2NhdGlvblZpZXcoT2JqZWN0IGNvbXBvbmVudCwgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgbHApIHsKLSAgICAJSUZpbGUgZmlsZSA9IGxwLmdldEZpbGUoY29tcG9uZW50KTsKLSAgICAJCi0gICAgCWlmICggZmlsZSA9PSBudWxsICl7Ci0gICAgCQlsb2NhdGlvbkxhYmVsLnNldFRleHQoIiIpOwotICAgIAkJbG9jYXRpb25MYWJlbC5zZXRJbWFnZShudWxsKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAlTdHJpbmcgZmlsZVBhdGggPSAiIjsKLSAgICAJZmlsZVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgLy9sb2NhdGlvblZpZXcucmVkcmF3KCk7Ci0gICAgICAgIAotICAgICAgICBsb2NhdGlvbkxhYmVsLnNldFRleHQoVGV4dFByb2Nlc3Nvci5wcm9jZXNzKGZpbGVQYXRoKSk7Ci0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0SW1hZ2UobHAuZ2V0RmlsZUljb24oY29tcG9uZW50KSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2VkIGZpbHRlciB0ZXh0IGZvciB0aGUgVGV4dCBmaWVsZC4gIEluc2VydHMgYSAiLiIKLSAgICAgKiBiZWZvcmUgZWFjaCBzdXBwb3J0ZWQgbWV0YS1jaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzRmlsdGVyU3RyaW5nKHRleHRGaWx0ZXIuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHN1cHBvcnRlZCBtZXRhY2hhcmFjdGVycyBhcmUgdXNlZCBpbiB0aGUgZmlsdGVyIHN0cmluZywgd2UgbmVlZCB0bwotICAgICAqIGluc2VydCBhICIuIiBiZWZvcmUgZWFjaCBtZXRhY2hhcmFjdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NGaWx0ZXJTdHJpbmcoU3RyaW5nIGlucHV0U3RyaW5nKSB7Ci0gICAgICAgIGlmICghKGlucHV0U3RyaW5nLmVxdWFscygiIikpKSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9IGluc2VydFN0cmluZygiKiIsICIuIiwgaW5wdXRTdHJpbmcpOwotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSBpbnNlcnRTdHJpbmcoIj8iLCAiLiIsIGlucHV0U3RyaW5nKTsKLSAgICAgICAgICAgIGlucHV0U3RyaW5nID0gaW5wdXRTdHJpbmcgKyAiLioiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSAiLioiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlucHV0U3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnNlcnQgYSAiLiIgYmVmb3JlIGVhY2ggbWV0YWNoYXJhY3RlciBpbiB0aGUKLSAgICAgKiBzZWFyY2gvZmlsdGVyIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpbnNlcnRTdHJpbmcoU3RyaW5nIHRhcmdldCwgU3RyaW5nIG5ld1N0cmluZywgU3RyaW5nIHN0cmluZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcpOwotCi0gICAgICAgIGludCBpbmRleCA9IHN0cmluZ0J1ZmZlci5pbmRleE9mKHRhcmdldCk7Ci0gICAgICAgIHdoaWxlIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgc3RyaW5nQnVmZmVyID0gc3RyaW5nQnVmZmVyLmluc2VydChpbmRleCwgbmV3U3RyaW5nKTsKLSAgICAgICAgICAgIGluZGV4ID0gc3RyaW5nQnVmZmVyLmluZGV4T2YodGFyZ2V0LCBpbmRleCArIG5ld1N0cmluZy5sZW5ndGgoKSArIHRhcmdldC5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotCi0KLSAgICAvKgotICAgICAqIExpc3RlbnMgdG8gY2hhbmdlcyBtYWRlIGluIHRoZSB0ZXh0IGZpbHRlciB3aWRnZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFRleHRGaWx0ZXJNb2RpZnlBZGFwdGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLndpZGdldCA9PSB0ZXh0RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbGF5ZWRFdmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5ZWRFdmVudC5DQU5DRUwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlbGF5ZWRFdmVudCA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS50aW1lckV4ZWMoNDAwLCBkZWxheWVkRXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9UT0RPLi4uIGRvIHdlIHJlYWxseSBuZWVkIG9uZSBpbnN0YW5jZT8KLSAgICBwcml2YXRlIERlbGF5ZWRFdmVudCBkZWxheWVkRXZlbnQ7Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgY29tcG9uZW50IFRhYmxlVmlld2VyIHdoZW4gdGhlIHRleHQgZmlsdGVyIGlzIG1vZGlmaWVkLgotICAgICAqIFVzZSBhIERlbGF5ZWRFdmVudCBzbyB3ZSBkb24ndCB1cGRhdGUgb24gZXZlcnkga2V5c3Ryb2tlLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBDQU5DRUwgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAoIUNBTkNFTCkgewotICAgICAgICAgICAgICAgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IGZpcnN0IG1hdGNoCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpWzBdOwotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbXNbXSA9IG5ldyBUYWJsZUl0ZW1bMV07Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zWzBdID0gaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcXVhbGlmaWVyTGlzdAotICAgICAgICAgICAgICAgIC8vSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAuLi4gbWFuYWdlIHF1YWxpZmllcnMKLSAgICAgICAgICAgICAgICAvL0xpc3QgcXVhbGlmaWVycyA9IHNlYXJjaExpc3RQcm92aWRlci5nZXRRdWFsaWZpZXJzKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIENvbXBvbmVudExpc3QgaW1wbGVtZW50cyBJQ29tcG9uZW50TGlzdCB7Ci0gICAgICAgIHByaXZhdGUgVmVjdG9yIG9iamVjdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRDaGFuZ2VDb3VudGVyID0gMDsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGxhc3RVcGRhdGVUaW1lID0gMDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotICAgICAgICAgICAgb2JqZWN0VmVjdG9yLmFkZChvKTsKLSAgICAgICAgICAgIGN1cnJlbnRDaGFuZ2VDb3VudGVyKys7Ci0gICAgICAgICAgICBkb1ZpZXdlclVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0VmVjdG9yLmFkZEFsbChjb2xsZWN0aW9uKTsKLSAgICAgICAgICBjdXJyZW50Q2hhbmdlQ291bnRlciArPSBjb2xsZWN0aW9uLnNpemUoKTsKLSAgICAgICAgICBkb1ZpZXdlclVwZGF0ZSgpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRvVmlld2VyVXBkYXRlKCkgewotICAgICAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2Ugc2hvdWxkIGFsc28gYWRkIGEgdGltZXIgY29uZGl0aW9uPz8KLSAgICAgICAgICAvLyAgaWYgKGN1cnJlbnRDaGFuZ2VDb3VudGVyID49IDEwKSB7Ci0gICAgICAgICAgLy8gICAgICBjdXJyZW50Q2hhbmdlQ291bnRlciA9IDA7Ci0gICAgICAgICAgLy8gICAgICBmaXJlVXBkYXRlTGlzdCh0aGlzKTsKLSAgICAgICAgICAvLyAgfQotICAgICAgICAgIAotICAgICAgICAgIC8vIGNzOiB5ZXAgSSB0aGluayB3ZSByZWFsbHkgZG8gbmVlZCB0byB1c2UgYSB0aW1lIGJhc2VkIGFwcHJvYWNoCi0gICAgICAgICAgLy8gICAgICAgICAgCi0gICAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VXBkYXRlVGltZSA+IDMwMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgbGFzdFVwZGF0ZVRpbWUgPSB0aW1lOwotICAgICAgICAgICAgIGZpcmVVcGRhdGVMaXN0KENvbXBvbmVudExpc3QudGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3Iuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3Iuc3ViTGlzdChzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3IuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8vIHRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGZyb20gYSBub24tdWkgdGhyZWFkIHNvIG5lZWRzIHRvIGNhbGwKLSAgICAvLyBhc3luY0V4ZWMgdG8gZW5zdXJlIHRoZSBVSSB1cGRhdGVzIGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkCi0gICAgLy8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlVXBkYXRlTGlzdChmaW5hbCBDb21wb25lbnRMaXN0IGxpc3QpIHsgICAgCi0gICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBvYmplY3RzCi0gICAgICAgICAgICAgICAgaW50IGdyb3dpbmdMaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGludCBjdXJyZW50U2l6ZSA9IG1hc3RlckNvbXBvbmVudExpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChncm93aW5nTGlzdFNpemUgPiBjdXJyZW50U2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0LmFkZEFsbChsaXN0LnN1Ykxpc3QoY3VycmVudFNpemUsIGdyb3dpbmdMaXN0U2l6ZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsgICAgICAgIAotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUZvckZpbHRlckNoYW5nZSgpCi0gICAgewotICAgICAgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KG51bGwpOwotICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLSAgICB9ICAKLSAgICAKLSAgICAvKgotICAgICAqIFBvcHVsYXRlIHRoZSBDb21wb25lbnQgVHJlZVZpZXdlciB3aXRoIGl0ZW1zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChmaW5hbCBTZWFyY2hTY29wZSBzZWFyY2hTY29wZSkgewotICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0LmNsZWFyKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QgPSBuZXcgQ29tcG9uZW50TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETyAoY3MpIGl0IGRvZXNuJ3Qgc2VlbSB0byBtYWtlIHNlbm5zZSB0byBkbyBhbnkgb2YgdGhlIHdvcmsgb24gdGhlIFVJIHRocmVhZAotICAgICAgICAvLyBJJ3ZlIGNoYW5nZSB0aGUgYmVoYXZpb3VyIGhlcmUgdG8gZG8gYWxsIG9mIHRoZSB3b3JrIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIC8vCi0gICAgICAgIC8vc2VhcmNoTGlzdFByb3ZpZGVyLl9wb3B1bGF0ZUNvbXBvbmVudExpc3RRdWljayhjb21wb25lbnRMaXN0LCAwKTsgICAgICAgIAotICAgICAgICBKb2Igam9iID0gbmV3IEpvYigicmVhZCBjb21wb25lbnRzIikgewotICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIC8vIHRoaXMgc3R1ZmYgZ2V0cyBleGVjdXRlZCBvbiBhIG5vbi1VSSB0aHJlYWQKLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRTZWFyY2hMaXN0UHJvdmlkZXIoKS5wb3B1bGF0ZUNvbXBvbmVudExpc3QoY29tcG9uZW50TGlzdCwgc2VhcmNoU2NvcGUsIG51bGwpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIC8vIERvIGEgZmluYWwgdXBkYXRlIG9mIG91ciBJbnB1dCBmb3IgdGhlIGNvbXBvbmVudCB0cmVlIHZpZXdlci4KLSAgICAgICAgICAgICAgZmlyZVVwZGF0ZUxpc3QoY29tcG9uZW50TGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hUYWJsZVZpZXdlcihTdHJpbmcgZmlsdGVyVGV4dCkgewotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmNsZWFyKCk7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldERlc2NyaXB0aW9uUHJvdmlkZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIFBhdHRlcm4gcmVnZXggPSBQYXR0ZXJuLmNvbXBpbGUoZmlsdGVyVGV4dCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFzdGVyQ29tcG9uZW50TGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBpdGVtU3RyaW5nID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KGl0ZW0pOyAgICAgICAgICAgCi0gICAgICAgICAgICBNYXRjaGVyIG0gPSByZWdleC5tYXRjaGVyKGl0ZW1TdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICBpZiAoaXRlbVN0cmluZy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoZmlsdGVyVGV4dCkgfHwgbS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBkZWNvcmF0ZVRhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvb2tpbmcgYXQgZWFjaCBpdGVtIGluIHRoZSBUYWJsZS4gSWYgdGhlcmUgYXJlIG90aGVyIGl0ZW1zIHdpdGggc2FtZSBuYW1lCi0gICAgICogLCB0aGVuIGFkZCBleHRyYSBpbmZvIChuYW1lc3BhY2UsIGZpbGUpIGludG8gdGhlIHRoZSB0ZXh0IGxhYmVsIG9mIGFsbCB0aGVzZQotICAgICAqIGR1cGxpY2F0ZWQgaXRlbXMuCi0gICAgICogLSBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZXZlcnl0aW1lIHRoZSBUYWJsZSB2aWV3ZXIgaXMgcmVmcmVzaGVkLi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVRhYmxlKCl7Ci0gICAgCVRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmNsZWFyKCk7Ci0gICAgCQotICAgIAlJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBscCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpOwotCi0gICAgCS8vIGluaXQgdGhlIG5hbWUtZHVwbGljYXRlcyBjb3VudGVyCi0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50VGFibGVWaWV3ZXJJbnB1dC5zaXplKCk7IGkrKyl7Ci0gICAgCQlPYmplY3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmdldChpKTsKLSAgICAJCVN0cmluZyBuYW1lID0gbHAuZ2V0TmFtZShjdXJyZW50SXRlbSk7Ci0gICAgCQlJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmdldChuYW1lKTsKLQkJCWlmICggY291bnQgPT0gbnVsbCl7Ci0gICAgCQkJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wucHV0KG5hbWUsIG5ldyBJbnRlZ2VyKDEpKTsKLSAgICAJCX0KLSAgICAJCWVsc2V7Ci0gICAgCQkJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wucHV0KAotICAgIAkJCQkJbmFtZSwgbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpKTsKLSAgICAJCX0KLSAgICAJfQotCi0gICAgCS8vIE1vZGlmeS9kZWNvcmF0ZSB0aG9zZSBpdGVtcyBpbiB0aGUgVGFibGUgdGhhdCBoYXZlIGR1cGxpY2F0ZWQgbmFtZQotICAgIAlUYWJsZUl0ZW1bXSBpdGVtcyA9IGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAJZm9yIChpbnQgaSA9MCA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyl7Ci0gICAgCQlPYmplY3QgY3VycmVudEl0ZW0gPSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0gICAgCQlJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmdldChscC5nZXROYW1lKGN1cnJlbnRJdGVtKSk7Ci0gICAgCQlpZiAoIGNvdW50ICE9IG51bGwgJiYgY291bnQuaW50VmFsdWUoKSA+IDEpewkKLSAgICAJCQlpdGVtc1tpXS5zZXRUZXh0KGxwLmdldE5hbWUoY3VycmVudEl0ZW0pICsgIiAtICIgKyAKLSAgICAJCQkJCWxwLmdldFF1YWxpZmllcihjdXJyZW50SXRlbSkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotCi0gICAgCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB0aGUgQ29tcG9uZW50VHJlZVZpZXdlciwgZW5hYmxlIE9LCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FuRmluaXNoKCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgY29tcG9uZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgY2xhc3MgQ29tcG9uZW50VGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoTGlzdCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoY29tcG9uZW50U2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oKTsKLSAgICAgICAgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpOwotICAgICAgICByZXN1bHQuc2V0TmFtZShjb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmdldE5hbWUoY29tcG9uZW50U2VsZWN0aW9uKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWFsaWZpZXIoY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5nZXRRdWFsaWZpZXIoY29tcG9uZW50U2VsZWN0aW9uKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRGaWxlKGNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RmlsZShjb21wb25lbnRTZWxlY3Rpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChjb21wb25lbnRTZWxlY3Rpb24pOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzExMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbgotewotICBwcml2YXRlIFN0cmluZyBmaWx0ZXJMYWJlbFRleHQgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUU7Ci0gIHByaXZhdGUgU3RyaW5nIGxpc3RMYWJlbFRleHQgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UUzsKLSAgcHJpdmF0ZSBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlcjsgCi0gIHByaXZhdGUgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlcjsKLSAgcHJpdmF0ZSBJTmV3Q29tcG9uZW50SGFuZGxlciBuZXdDb21wb25lbnRIYW5kbGVyOwotICBwcml2YXRlIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nOwotCi0gIHB1YmxpYyB2b2lkIGluaXQoQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cpCi0gIHsKLSAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVdpZGdldEF0VG9wKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgCi0gIH0gICAgCi0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVXaWRnZXRBYm92ZVF1YWxpZmllckJveChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVXaWRnZXRCZWxvd1F1YWxpZmllckJveChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVUb29sQmFySXRlbXMoVG9vbEJhciB0b29sQmFyKQotICB7ICAgIAotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldERlc2NyaXB0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblByb3ZpZGVyKElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uUHJvdmlkZXIgPSBkZXNjcmlwdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgZ2V0U2VhcmNoTGlzdFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBzZWFyY2hMaXN0UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWFyY2hMaXN0UHJvdmlkZXIoSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLnNlYXJjaExpc3RQcm92aWRlciA9IHNlYXJjaExpc3RQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGdldERpYWxvZygpCi0gIHsKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0KLSAgcHVibGljIElOZXdDb21wb25lbnRIYW5kbGVyIGdldE5ld0NvbXBvbmVudEhhbmRsZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ld0NvbXBvbmVudEhhbmRsZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROZXdDb21wb25lbnRIYW5kbGVyKElOZXdDb21wb25lbnRIYW5kbGVyIG5ld0NvbXBvbmVudEhhbmRsZXIpCi0gIHsKLSAgICB0aGlzLm5ld0NvbXBvbmVudEhhbmRsZXIgPSBuZXdDb21wb25lbnRIYW5kbGVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlckxhYmVsVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gZmlsdGVyTGFiZWxUZXh0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldExpc3RMYWJlbFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGxpc3RMYWJlbFRleHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJMYWJlbFRleHQoU3RyaW5nIGZpbHRlckxhYmVsVGV4dCkKLSAgewotICAgIHRoaXMuZmlsdGVyTGFiZWxUZXh0ID0gZmlsdGVyTGFiZWxUZXh0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGlzdExhYmVsVGV4dChTdHJpbmcgbGlzdExhYmVsVGV4dCkKLSAgewotICAgIHRoaXMubGlzdExhYmVsVGV4dCA9IGxpc3RMYWJlbFRleHQ7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTcGVjaWZpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYWJkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi0vLyBUT0RPLi4gdXNlIFF1YWxpZmllZE5hbWUgY29uc2lzdGVudGx5IGZvciBuYW1lIGFuZCBtZXRhTmFtZQotLy8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTcGVjaWZpY2F0aW9uCi17Ci0gIFN0cmluZyBxdWFsaWZpZXI7Ci0gIFN0cmluZyBuYW1lOwotICBJRmlsZSBmaWxlOwotICBPYmplY3Qgb2JqZWN0OwotICBib29sZWFuIGlzTmV3OwotICBRdWFsaWZpZWROYW1lIG1ldGFOYW1lOwotICAKLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24oKQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgSUZpbGUgZmlsZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpCi0gIHsKLSAgICByZXR1cm4gcXVhbGlmaWVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFN0cmluZyBxdWFsaWZpZXIpCi0gIHsKLSAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNOZXcoKQotICB7Ci0gICAgcmV0dXJuIGlzTmV3OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmV3KGJvb2xlYW4gaXNOZXcpCi0gIHsKLSAgICB0aGlzLmlzTmV3ID0gaXNOZXc7Ci0gIH0KLQotICBwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRNZXRhTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbWV0YU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNZXRhTmFtZShRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotICB7Ci0gICAgdGhpcy5tZXRhTmFtZSA9IG1ldGFOYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODlmZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLXsKLSAgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IGNvbXBvbmVudCk7Ci0gIAotICBTdHJpbmcgZ2V0UXVhbGlmaWVyKE9iamVjdCBjb21wb25lbnQpOwotCi0gIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpOwotCi0gIElGaWxlIGdldEZpbGUoT2JqZWN0IGNvbXBvbmVudCk7Ci0gIAotICBJbWFnZSBnZXRGaWxlSWNvbihPYmplY3QgY29tcG9uZW50KTsKLQotICBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTI0OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRMaXN0IHsKLSAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgbyk7Ci0gICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTc5YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlcgotewotICB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTA5M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JTmV3Q29tcG9uZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdDb21wb25lbnRIYW5kbGVyCi17Ci0gIHZvaWQgb3Blbk5ld0NvbXBvbmVudERpYWxvZygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9TY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjYTYxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Qcm9qZWN0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtpbmdTZXRTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtzcGFjZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZwotewotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX05BTUVfRklFTERfVElUTEUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUU7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTElTVF9USVRMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NQVRDSElOR19DT01QT05FTlRTOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9TUEVDSUZJRURfRklMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9TUEVDSUZJRURfRklMRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1QgPSBNZXNzYWdlcy5fVUlfTEFCRUxfRU5DTE9TSU5HX1BST0pFQ1Q7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1dPUktTUEFDRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9XT1JLU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0UgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfV09SS0lOR19TRVRTID0gTWVzc2FnZXMuX1VJX0xBQkVMX1dPUktJTkdfU0VUUzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRTZWFyY2hTY29wZSA9IFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0U7Ci0gIHByb3RlY3RlZCBCdXR0b24gY2hvb3NlQnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uWzRdOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlckxhYmVsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGxpc3RUaXRsZTsKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2U7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgc2VsZWN0V29ya2luZ1NldHNHcm91cDsKLSAgcHJvdGVjdGVkIFRleHQgd29ya2luZ1NldHNUZXh0OwotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdmFsdWVGb3JXb3JraW5nU2V0c1RleHQ7Ci0gIC8vIFNob3cgKGRlZmF1bHQvdHJ1ZSkgb3IgaGlkZSAoZmFsc2UpIHRoZSBjdXJyZW50IHJlc291cmNlIHNjb3BlIGJ1dHRvbgotICBwcml2YXRlIGJvb2xlYW4gc2hvd0N1cnJlbnRSZXNvdXJjZVNjb3BlID0gdHJ1ZTsKLSAgCi0gIC8vIHdvcmtpbmcgc2V0cyBjdXJyZW50bHkgY2hvc2VuIGJ5IHRoZSB1c2VyCi0gIHByaXZhdGUgc3RhdGljIElXb3JraW5nU2V0W10gd29ya2luZ1NldHM7Ci0KLSAgcHVibGljIFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLSAgewotICAgIHN1cGVyKHNoZWxsLCBkaWFsb2dUaXRsZSwgY29uZmlndXJhdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZpbHRlckxhYmVsKFN0cmluZyBmaWx0ZXJMYWJlbCkKLSAgewotICAgIHRoaXMuZmlsdGVyTGFiZWwgPSBmaWx0ZXJMYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TGlzdFRpdGxlKFN0cmluZyBsaXN0VGl0bGUpCi0gIHsKLSAgICB0aGlzLmxpc3RUaXRsZSA9IGxpc3RUaXRsZTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy9zdXBlci5zZXRGaWx0ZXJMYWJlbChmaWx0ZXJMYWJlbCAhPSBudWxsID8gZmlsdGVyTGFiZWwgOiBERUZBVUxUX05BTUVfRklFTERfVElUTEUpOwotICAgIC8vc2V0TGlzdExhYmVsVGV4dChsaXN0VGl0bGUgIT0gbnVsbCA/IGxpc3RUaXRsZSA6IERFRkFVTFRfTElTVF9USVRMRSk7Ci0gICAgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIC8vIFdlIHVzZSB0aGUgQ29tcG9zaXRlIHRvcENvbXBvc2l0ZSB0byBjcmVhdGUgYWRkaXRpb25hbCB3aWRnZXRzCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYm90dG9tQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGJvdHRvbUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICBncm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU0VBUkNIX1NDT1BFKTsKLSAgICBTY29wZUNoYW5nZUxpc3RlbmVyIHNjb3BlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgU2NvcGVDaGFuZ2VMaXN0ZW5lcigpOwotICAgIHJhZGlvQnV0dG9uWzBdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblswXS5zZXRUZXh0KFNDT1BFX1dPUktTUEFDRSk7Ci0gICAgcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1QpOwotICAgIHJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblsyXS5zZXRUZXh0KFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0UpOwotICAgIHJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblszXS5zZXRUZXh0KFNDT1BFX1dPUktJTkdfU0VUUyk7Ci0gICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MDgxNSAKLSAgICAvLyBJZiB0aGUgY3VycmVudCByZXNvdXJjZSBzY29wZSBidXR0b24gaXMgaGlkZGVuLCBpdCBubyBsb25nZXIgaXMgdGhlIGRlZmF1bHQgc2NvcGUuICBXZSBtdXN0IHNlbGVjdCBvbmUgb2YgdGhlIHJlbWFpbmluZyAKLSAgICAvLyB2aXNpYmxlIHJhZGlvIGJ1dHRvbnMgKEVuY2xvc2luZyBQcm9qZWN0KSBhbmQgbWFrZSBpdCB0aGUgZGVmYXVsdC4gICAgCi0gICAgcmFkaW9CdXR0b25bMl0uc2V0VmlzaWJsZShzaG93Q3VycmVudFJlc291cmNlU2NvcGUpOwotICAgIGlmICghc2hvd0N1cnJlbnRSZXNvdXJjZVNjb3BlKQotICAgIHsKLSAgICAgIGN1cnJlbnRTZWFyY2hTY29wZSA9IFNDT1BFX0VOQ0xPU0lOR19QUk9KRUNUOwotICAgICAgaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IG9uY2UgdGhlIGRpYWxvZyBpcyBpbnZva2VkLCB0aGUgbGlzdCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUKLSAgICAgICAgLy8gYXBwcm9wcmlhdGUgY29tcG9uZW50cyBiYXNlZCBvbiB0aGlzIHNlYXJjaCBzY29wZS4KLSAgICAgICAgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KG5ldyBQcm9qZWN0U2VhcmNoU2NvcGUoY3VycmVudFJlc291cmNlLmdldEZ1bGxQYXRoKCkpKTsKLSAgICAgIH0gCi0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b24ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHJhZGlvQnV0dG9uW2ldLmdldFRleHQoKS5lcXVhbHMoY3VycmVudFNlYXJjaFNjb3BlKSkKLSAgICAgIHsKLSAgICAgICAgcmFkaW9CdXR0b25baV0uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgfQotICAgICAgcmFkaW9CdXR0b25baV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2NvcGVDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotICAgIAotICAgIHNlbGVjdFdvcmtpbmdTZXRzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgc2VsZWN0V29ya2luZ1NldHNHcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBHcmlkTGF5b3V0IHdvcmtpbmdTZXRHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICB3b3JraW5nU2V0R3JvdXBMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIHdvcmtpbmdTZXRHcm91cExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIHNlbGVjdFdvcmtpbmdTZXRzR3JvdXAuc2V0TGF5b3V0KHdvcmtpbmdTZXRHcm91cExheW91dCk7Ci0gICAgCi0gICAgd29ya2luZ1NldHNUZXh0ID0gbmV3IFRleHQoc2VsZWN0V29ya2luZ1NldHNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdvcmtpbmdTZXRzVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBpZiAodmFsdWVGb3JXb3JraW5nU2V0c1RleHQgIT0gbnVsbCApCi0gICAgCXdvcmtpbmdTZXRzVGV4dC5zZXRUZXh0KHZhbHVlRm9yV29ya2luZ1NldHNUZXh0KTsKLSAgICAKLSAgICBjaG9vc2VCdXR0b24gPSBuZXcgQnV0dG9uKHNlbGVjdFdvcmtpbmdTZXRzR3JvdXAsIFNXVC5OT05FKTsKLSAgICBjaG9vc2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQ0hPT1NFKTsKLSAgICBjaG9vc2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJCUlXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKS5jcmVhdGVXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCB0cnVlKTsKLQkJCWlmICggZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spewotCQkJCXdvcmtpbmdTZXRzID0gZGlhbG9nLmdldFNlbGVjdGlvbigpOwotCQkJCXZhbHVlRm9yV29ya2luZ1NldHNUZXh0ID0gIiI7Ci0JCQkJaWYgKHdvcmtpbmdTZXRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JraW5nU2V0cy5sZW5ndGg7IGkrKyl7Ci0JCQkJCQl2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCArPSB3b3JraW5nU2V0c1tpXS5nZXRMYWJlbCgpOwotCQkJCQkJLy8gaWYgbm90IHRoZSBsYXN0IGl0ZW0sIHdlIGFkZCBhIGNvbW1hCi0JCQkJCQlpZiAoIGkgIT0gd29ya2luZ1NldHMubGVuZ3RoIC0gMSkgCi0JCQkJCQkJdmFsdWVGb3JXb3JraW5nU2V0c1RleHQgKz0gIiwgIjsKLQkJCQkJfQotCQkJCX0KLQkJCQl3b3JraW5nU2V0c1RleHQuc2V0VGV4dCh2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCk7Ci0JCQl9Ci0JCQkvLyBTZXQgd29ya2luZyBzZXRzIHJhZGlvIGJ1dHRvbiBlbmFibGVkLCBkaXNhYmxlIG90aGVyIGJ1dHRvbnMKLQkJCXJhZGlvQnV0dG9uWzJdLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlyYWRpb0J1dHRvblsxXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXJhZGlvQnV0dG9uWzNdLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCQkJc2NvcGVDaGFuZ2VIYW5kbGVyKHJhZGlvQnV0dG9uWzNdKTsKLQkJfQotICAgIH0pOwotCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfSAvKgotICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHNlYXJjaCBzY29wZS4KLSAgICAgKi8KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlYXJjaFNjb3BlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50U2VhcmNoU2NvcGU7Ci0gIH0KLQotcHJpdmF0ZSB2b2lkIHNjb3BlQ2hhbmdlSGFuZGxlcihCdXR0b24gYikgewkgIAotCSAgaWYgKChiLmdldFN0eWxlKCkgJiBTV1QuUkFESU8pICE9IDApCi0JICB7Ci0JCSAgY3VycmVudFNlYXJjaFNjb3BlID0gYi5nZXRUZXh0KCk7Ci0JCSAgCi0JCSAgLy8gVE9ETyAoY3MpIG5lZWQgdG8gZG8gc29tZSB3b3JrIHRvIG1ha2UgdGhlIGRlZmF1bHQgc2VhcmNoIHNjb3BlCi0JCSAgLy8gbW9yZSB3ZWxsIGRlZmluZWQsIGN1cnJlbnRseSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gcGFzcyBhIG51bGwKLQkJICAvLyBhcmd1bWVudCBpbiB0byBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QgYnV0IHdlIHNob3VsZCBwcm92aWRlCi0JCSAgLy8gZ2V0dGVycy9zZXR0ZXJzIHRvIGFsbG93IHRoZSBkZWZhdWx0IHRvIGJlIGNvbnRyb2xsZWQgICAgICAgICAgCi0JCSAgU2VhcmNoU2NvcGUgc2NvcGUgPSBudWxsOwotCQkgIGlmIChjdXJyZW50U2VhcmNoU2NvcGUgPT0gU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1QgJiYKLQkJCQkgIGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7IAotCQkJICBzY29wZSA9IG5ldyBQcm9qZWN0U2VhcmNoU2NvcGUoY3VycmVudFJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQkgIH0gCi0JCSAgZWxzZSBpZiAoY3VycmVudFNlYXJjaFNjb3BlID09IFNDT1BFX1dPUktTUEFDRSl7Ci0JCQkgIHNjb3BlID0gbmV3IFdvcmtzcGFjZVNlYXJjaFNjb3BlKCk7Ci0JCSAgfQotCQkgIGVsc2UgaWYgKGN1cnJlbnRTZWFyY2hTY29wZSA9PSBTQ09QRV9XT1JLSU5HX1NFVFMpewotCQkJICAKLQkJCSAgLy8gQ29uc3RydWN0cyB0aGUgd29ya2luZyBzZXRzIHNjb3BlIGZyb20gdGhlIHdvcmtpbmcgc2V0cyB0aGUgdXNlcgotCQkJICAvLyBzZWxlY3RlZAotCQkJICBXb3JraW5nU2V0U2VhcmNoU2NvcGUgd29ya2luZ1NldHNTY29wZSA9IG5ldyBXb3JraW5nU2V0U2VhcmNoU2NvcGUoKTsKLQkJCSAgaWYgKHdvcmtpbmdTZXRzICE9IG51bGwpIHsKLQkJCQkgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspewotCQkJCQkgIHdvcmtpbmdTZXRzU2NvcGUuYWRkQVdvcmtpbmdTZXRUb1Njb3BlKHdvcmtpbmdTZXRzW2ldLmdldEVsZW1lbnRzKCkpOwotCQkJCSAgfQotCQkJICB9Ci0JCQkgIHNjb3BlID0gd29ya2luZ1NldHNTY29wZTsKLQkJICB9Ci0JCSAgCi0JCSAgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KHNjb3BlKTsKLQkJICByZWZyZXNoVGFibGVWaWV3ZXIoZ2V0UHJvY2Vzc2VkRmlsdGVyU3RyaW5nKCkpOwotCQkgIC8vIFNlbGVjdCB0aGUgZmlyc3QgbWF0Y2hpbmcgY29tcG9uZW50LiBUaG91Z2ggd2Ugc2hvdWxkIGJlCi0JCSAgLy8gc21hcnRlciBoZXJlCi0JCSAgLy8gYW5kIGRldGVybWluZSBpZiB0aGVyZSB3YXMgYSBzZWxlY3Rpb24gYmVmb3JlIHRoZSBzY29wZQotCQkgIC8vIHN3aXRjaCAoYW5kIGlmCi0JCSAgLy8gdGhlIGNvbXBvbmVudCBpcyBzdGlsbCBhdmFpbGFibGUuCi0JCSAgVGFibGUgdGFibGUgPSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQkgIFRhYmxlSXRlbSBpdGVtc1tdID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJICBpZiAoaXRlbXMubGVuZ3RoID4gMCkKLQkJICB7Ci0JCQkgIFRhYmxlSXRlbSBzZWxlY3RbXSA9IG5ldyBUYWJsZUl0ZW1bMV07Ci0JCQkgIHNlbGVjdFswXSA9IGl0ZW1zWzBdOwotCQkJICB0YWJsZS5zZXRTZWxlY3Rpb24oc2VsZWN0KTsKLQkJICB9Ci0JCSAgdXBkYXRlQ2FuRmluaXNoKCk7Ci0JICB9Ci0gIH0KLQotcHJpdmF0ZSBjbGFzcyBTY29wZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBCdXR0b24pICAgICAgIAotICAgICAgeyAgICAgICAgCi0gICAgICAgIEJ1dHRvbiBiID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0gICAgICAgIGlmIChiLmdldFNlbGVjdGlvbigpKQotICAgICAgICB7ICAKLSAgICAgICAgICBzY29wZUNoYW5nZUhhbmRsZXIoYik7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJUmVzb3VyY2UgZ2V0Q3VycmVudFJlc291cmNlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50UmVzb3VyY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UmVzb3VyY2UoSVJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSkKLSAgewotICAgIHRoaXMuY3VycmVudFJlc291cmNlID0gY3VycmVudFJlc291cmNlOwotICB9Ci0gCi0gIC8qKgotICAgKiBUaGlzIGlzIG5vbi1BUEkuICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MDgxNQotICAgKiBTaG93IChieSBkZWZhdWx0KSwgb3IgaGlkZSB0aGUgY3VycmVudCByZXNvdXJjZSBzZWFyY2ggc2NvcGUgYnV0dG9uCi0gICAqIEBwYXJhbSBzaG93Q3VycmVudFJlc291cmNlU2NvcGUuICBmYWxzZSB0byBoaWRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd0N1cnJlbnRSZXNvdXJjZVNlYXJjaFNjb3BlQnVnMjUwODE1KGJvb2xlYW4gc2hvd0N1cnJlbnRSZXNvdXJjZVNjb3BlKQotICB7Ci0gICAgdGhpcy5zaG93Q3VycmVudFJlc291cmNlU2NvcGUgPSBzaG93Q3VycmVudFJlc291cmNlU2NvcGU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Rlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg4M2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLQotcHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZQotewotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uKCk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldExpc3RMYWJlbFRleHQoIkxpc3Q6Iik7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldEZpbHRlckxhYmVsVGV4dCgiRmlsdGVyOiIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihuZXcgQmFzZUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoImZvbyIpKTsKLSAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coc2hlbGwsICJ0ZXN0IiwgY29uZmlndXJhdGlvbik7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLSAgY2xhc3MgQmFzZUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLSAgewotICAgIFN0cmluZyBwcmVmaXg7Ci0KLSAgICBCYXNlQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcihTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBjb21wb25lbnQ7Ci0gICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcihPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBnZXROYW1lKGVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFN0cmluZykgY29tcG9uZW50KS5zdGFydHNXaXRoKHByZWZpeCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0JcHVibGljIEltYWdlIGdldEZpbGVJY29uKE9iamVjdCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotICB9Ci0gIAotICBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlciA9IG5ldyBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyKCkKLSAgewotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSGVsbG8hIik7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSGV5ISIpOwotICAgICAgbGlzdC5hZGQoImZvbzoiICsgIkhvdy1hcmUteW91PyIpOwotICAgICAgbGlzdC5hZGQoImZvbzoiICsgIldoYXQtaXMtdGhhdC1zbWVsbD8iKTsKLSAgICB9Ci0gIH07Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvQ29tbW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL0NvbW1vblVJTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyZTM1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvQ29tbW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSEgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgYW5kIFNlbGVjdE11bHRpRmlsZVBhZ2UKLV9VSV9MQUJFTF9TT1VSQ0VfRklMRVMgICA9IFdvcmtzcGFjZSBGaWxlcwotX1VJX0xBQkVMX1NFTEVDVEVEX0ZJTEVTID0gU2VsZWN0ZWQgRmlsZXMKLV9VSV9QT1BVUF9FWFBBTkRfQUxMCSA9IEV4cGFuZCBBbGwKLV9VSV9QT1BVUF9DT0xMQVBTRV9BTEwJID0gQ29sbGFwc2UgQWxsCi0JCi1fVUlfSU1QT1JUX0JVVFRPTiAgICAgICAgICA9IEltcG9ydCBGaWxlcy4uLgotX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVAgPSBJbXBvcnQgZmlsZXMgZnJvbSBmaWxlIHN5c3RlbQotCi0KLSEgU2VsZWN0TXVsdGlGaWxlUGFnZQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IHRoZSBmb2xsb3dpbmcgdGhyZWUgbGluZXMgcmVmZXJzIHRvIF9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyBsYWJlbCBhYm92ZQotX1VJX0FERF9CVVRUT05fVE9PTF9USVAgICAgPSBBZGQgZmlsZXMgdG8gU2VsZWN0ZWQgRmlsZXMgbGlzdC4KLV9VSV9SRU1PVkVfQlVUVE9OX1RPT0xfVElQID0gUmVtb3ZlIGZpbGVzIGZyb20gU2VsZWN0ZWQgRmlsZXMgbGlzdC4KLV9VSV9SRU1PVkVfQUxMX0JVVFRPTl9UT09MX1RJUCA9ICBSZW1vdmUgYWxsIGZpbGVzIGZyb20gU2VsZWN0ZWQgRmlsZXMgbGlzdC4KLQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IE5vIHRyYW5zbGF0aW9uIG5lZWRlZCBvZiBmb2xsb3dpbmcgdGhyZWUgbGluZXMKLV9VSV9BRERfQlVUVE9OICAgICAgICAgICAgID0gPgotX1VJX1JFTU9WRV9CVVRUT04gICAgICAgICAgPSA8Ci1fVUlfUkVNT1ZFX0FMTF9CVVRUT04gICAgICA9IDw8Ci0KLSEgU2VsZWN0SmF2YVByb2plY3RWaWV3Ci1fVUlfTEFCRUxfQ0hPT1NFX0ZPTERFUiA9IFNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyOgotCi0hIFNlbGVjdEphdmFQcm9qZWN0RGlhbG9nCi1fVUlfTEFCRUxfRk9MREVSX1NFTEVDVElPTiA9IENvbnRhaW5lciBTZWxlY3Rpb24KLQotISBUZXh0Vmlld2VyT3BlcmF0aW9uQWN0aW9uCi1fVUlfTUVOVV9DT1BZICAgICAgICAgPSAmQ29weQotX1VJX01FTlVfQ1VUICAgICAgICAgID0gQ3UmdAotX1VJX01FTlVfREVMRVRFICAgICAgID0gRGVsZXRlCi1fVUlfTUVOVV9QQVNURSAgICAgICAgPSAmUGFzdGUKLV9VSV9NRU5VX1BSRUZJWCAgICAgICA9IFByZWZpeAotX1VJX01FTlVfUkVETyAgICAgICAgID0gUmVkbwotX1VJX01FTlVfU0VMRUNUX0FMTCAgID0gU2VsZWN0IEFsbAotX1VJX01FTlVfU0hJRlRfTEVGVCAgID0gU2hpZnQgTGVmdAotX1VJX01FTlVfU0hJRlRfUklHSFQgID0gU2hpZnQgUmlnaHQKLV9VSV9NRU5VX1NUUklQX1BSRUZJWCA9IFN0cmlwIFByZWZpeAotX1VJX01FTlVfVU5ETyAgICAgICAgID0gVW5kbwotCi0hIFNvdXJjZVZpZXdlckdvdG9MaW5lQWN0aW9uCi1fVUlfTUVOVV9HT1RPX0xJTkUgICAgICAgICAgID0gR28gVG8gTGluZS4uLgotX1VJX0dPVE9fTElORV9ESUFMT0dfVElUTEUgICA9IEdvIFRvIExpbmUKLV9VSV9HT1RPX0xJTkVfRElBTE9HX1RFWFQgICAgPSBFbnRlciBMaW5lIE51bWJlcgotCi1fVUlfRklMRV9DSEFOR0VEX1RJVExFID0gRmlsZSBDaGFuZ2VkCi1fVUlfRklMRV9ERUxFVEVEX1NBVkVfQ0hBTkdFUyA9IFRoZSBmaWxlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIHNhdmUgeW91ciBjaGFuZ2VzIG9yIGNsb3NlIHRoZSBlZGl0b3Igd2l0aG91dCBzYXZpbmc/Ci1fVUlfRklMRV9ERUxFVEVEX0VESVRPUl9DTE9TRUQgPSBUaGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBUaGlzIGVkaXRvciB3aWxsIGJlIGNsb3NlZC4KLV9VSV9GSUxFX0NIQU5HRURfTE9BRF9DSEFOR0VTID0gVGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci1fVUlfU0FWRV9CVVRUT04gPSBTYXZlCi1fVUlfQ0xPU0VfQlVUVE9OID0gQ2xvc2UKLQotCi0hIFhTTCBQcmVmZXJlcmVuY2UKLV9VSV9YU0xUX1NFTEVDVCAgICAgPSBTZWxlY3Qgd2hpY2ggZWxlbWVudCB0byB1c2UgZm9yIHlvdXIgc3R5bGVzaGVldAotX1VJX1hTTFRfU1RZTEVTSEVFVCA9ICZVc2UgPHhzbDpzdHlsZXNoZWV0PgotX1VJX1hTTFRfVFJBTlNGT1JNICA9IFUmc2UgPHhzbDp0cmFuc2Zvcm0+Ci0KLSEgWFNMIERlYnVnIFByZWZlcmVyZW5jZQotX1VJX1hTTF9ERUJVR19TRUxFQ1RfTEFVTkNIRVIgPSBTZXQgdGhlIGRlZmF1bHQgWFNMIGxhdW5jaGVyIGZvciB0aGUgWFNMIERlYnVnZ2luZyBhbmQgVHJhbnNmb3JtYXRpb24gdG9vbAotX1VJX1hTTF9ERUJVR19MT0NBTCAgICAgICAgICAgPSAmWFNMIGFwcGxpY2F0aW9uCi1fVUlfWFNMX0RFQlVHX1JFTU9URSAgICAgICAgICA9IFhTJkwgcmVtb3RlIGFwcGxpY2F0aW9uCi1fVUlfWFNMX1RJTEVfRURJVE9SICAgICAgICAgICA9ICZTaG93IGFsbCBkZWJ1Z2dpbmcgZmlsZXMgaW4gYSB0aWxlIGVkaXRvcgotX1VJX1hTTF9ERUJVR19BTkRfVFJBTlNGT1JNICAgPSAmUnVuIHRyYW5zZm9ybWF0aW9uIGFuZCBvcGVuIGEgZGVidWdnaW5nIHNlc3Npb24KLV9VSV9YU0xfQ09OVEVYVF9VUkkgICAgICAgICAgID0gQ29udGV4dCBQYXRoIAotX1VJX1hTTF9DT05URVhUICAgICAgICAgICAgICAgPSBTcGVjaWZ5IGEgJmNvbnRleHQgcGF0aCBmb3IgcmVzb2x2aW5nIFVSSXMgaW4geHNsOmltcG9ydCwgeHNsOmluY2x1ZGUgb3IgZG9jdW1lbnQoKQotCi0KLV9VSV9PVkVSUklERV9GSUxFICAgID0gT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzCi1fVUlfSkFWQV9FWElTVF9GSUxFMSA9IFRoZSBmb2xsb3dpbmcgSmF2YSBjbGFzc2VzIGFscmVhZHkgZXhpc3QuCi1fVUlfSkFWQV9FWElTVF9GSUxFMiA9IERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZT8KLSAgICAgIAotISBzb21lIG9wdGlvbnMgc3RyaW5ncyBjb21tb24gdG8gc2V2ZXJhbCBwbHVnaW5zCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9USVRMRSA9IEVycm9yIENyZWF0aW5nIEZpbGUKLV9VSV9FUlJPUl9DUkVBVElOR19GSUxFX1NIT1JUX0RFU0MgPSBFcnJvciBjcmVhdGluZyBmaWxlICJ7MH0iCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9MT05HX0RFU0MgPSBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIHRoZSBmaWxlICJ7MH0iLgotX1VJX1BBUkVOVF9GT0xERVJfSVNfUkVBRF9PTkxZID0gVGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgcmVhZCBvbmx5LgotX1VJX1VOS05PV05fRVJST1JfV0lUSF9ISU5UID0gVW5rbm93biBlcnJvci4gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgd3JpdGVhYmxlLgotX1VJX1VOS05PV05fRVJST1IgPSBVbmtub3duIGVycm9yLiBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSAiezB9IiBpcyB3cml0ZWFibGUuCi0KLSEgdXNhZ2UgLSB0aGlzIGxhYmVsIGlzIGZvbGxvd2VkIGJ5IHR3byByYWRpbyBidXR0b24gb3B0aW9ucyBmb3IgdGhlIGZpbGUgbG9jYXRpb24KLV9VSV9MQUJFTF9JTkNMVURFX1VSTF9GSUxFID0gU2VsZWN0IGZpbGUgbG9jYXRpb24KLV9VSV9SQURJT19GSUxFICAgICAgICAgICAgID0gV29ya3NwYWNlIHByb2plY3RzCi1fVUlfUkFESU9fVVJMICAgICAgICAgICAgICA9IEhUVFAKLQotX1VJX0xBQkVMX0NPTVBPTkVOVFMJCQkJICAgPSBDb21wb25lbnRzOgotX1VJX0xBQkVMX1FVQUxJRklFUgkJCQkJICAgPSBRdWFsaWZpZXI6Ci0KLSEtIGNvbXBvbmVudCBzZWxlY3Rpb24gZGlhbG9ncyAKLV9VSV9MQUJFTF9DT01QT05FTlRfTkFNRQkJCSAgID0gQ29tcG9uZW50IE5hbWU6Ci1fVUlfTEFCRUxfTUFUQ0hJTkdfQ09NUE9ORU5UUwkJICAgPSBNYXRjaGluZyBDb21wb25lbnRzOgotX1VJX0xBQkVMX1NQRUNJRklFRF9GSUxFCQkJICAgPSBTcGVjaWZpZWQgRmlsZQotX1VJX0xBQkVMX0VOQ0xPU0lOR19QUk9KRUNUCQkJICAgPSBFbmNsb3NpbmcgUHJvamVjdAotX1VJX0xBQkVMX1dPUktTUEFDRQkJCQkJICAgPSBXb3Jrc3BhY2UKLV9VSV9MQUJFTF9DVVJSRU5UX1JFU09VUkNFCQkJICAgPSBDdXJyZW50IFJlc291cmNlCi1fVUlfTEFCRUxfU0VBUkNIX1NDT1BFCQkJCSAgID0gU2VhcmNoIFNjb3BlCi1fVUlfTEFCRUxfTkFSUk9XX1NFQVJDSF9TQ09QRV9SRVNPVVJDRSA9IFVzZSByZXNvdXJjZSB2aWV3IHRvIG5hcnJvdyBzZWFyY2ggc2NvcGUKLV9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVMJCQkgICA9IEF2YWlsYWJsZSBUeXBlcwotX1VJX0xBQkVMX1dPUktJTkdfU0VUUyAgICAgICAgICAgICAgICAgPSBXb3JraW5nIFNldHMKLQotX1VJX0xBQkVMX05ldz1OZXcuLi4KLV9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTj1EZWNsYXJhdGlvbiBMb2NhdGlvbjoKLV9VSV9MQUJFTF9DSE9PU0U9Q2hvb3NlLi4uCi0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISBIZXJlIGlzIHRoZSBsaXN0IG9mIEVycm9yIHN0cmluZyB0aGF0IGhhdmUgbWVzc2FnZSBJRHMgLSBtYWtlIHN1cmUgdGhleSBhcmUgdW5pcXVlCi0hICBSYW5nZSBmb3IgYjJiZ3VpIG1lc3NhZ2VJRHM6IElXQVgxMjAxIC0gSVdBWDE0MDAKLSEKLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1fRVJST1JfVEhFX0NPTlRBSU5FUl9OQU1FID0gVGhlIHNwZWNpZmllZCBjb250YWluZXIgbXVzdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGFuZCBpdHMgcGF0aCBtdXN0IHN0YXJ0IGF0IHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQotX0VSUk9SX0xPQ0FMX0xPQ0FUSU9OICAgICA9IFRoZSBsb2NhbCBsb2NhdGlvbiBvZiB0aGlzIGNvbnRhaW5lciBjYW5ub3QgYmUgcmVzb2x2ZWQuCi1fRVJST1JfTk9UX0pBVkFfUFJPSkVDVCAgID0gVGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIG5vdCBhIEphdmEgcHJvamVjdC4KLQotIU5PVEUgVE8gVFJBTlNMQVRPUjogdGhpcyBlcnJvciBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLV9FUlJPUl9JTlZBTElEX0pBVkFfUEFDS0FHRSA9IElXQVgxMjAxRSBJbnZhbGlkIHBhY2thZ2UgbmFtZSBlcnJvcjoKLQotIU5PVEUgVE8gVFJBTlNMQVRPUjogKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OICsgc3RyaW5nICsgX1VJX0xBQkVMX09SICsgc3RyaW5nKSBvciAoX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04pCi1fRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiAgICAgICAgID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgICAgICAgID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLQotX0VSUk9SX0NPTlRBSU5FUl9OT1RfSkFWQV9CVUlMRFBBVEggPSBUaGUgY29udGFpbmVyIGlzIG5vdCBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhpcyBwcm9qZWN0Ci1fRVJST1JfVVNFX1BST0pFQ1RfSkFWQV9TT1VSQ0VfRk9MREVSID0gVGhlIHByb2plY3QgaXMgbm90IG9uIHRoZSBidWlsZCBwYXRoLiAgU2VsZWN0IGEgSmF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4KLQotX1VJX0VSUk9SICAgICAgICAgICAgID0gRXJyb3IKLQotIU5PVEUgVE8gVFJBTlNMQVRPUjogdGhpcyB3YXJuaW5nIG1lc3NhZ2UgdGV4dCBpcyBmb2xsb3dlZCBieSBhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHBsdWdpbgotX1dBUk5fSU5WQUxJRF9KQVZBX1BBQ0tBR0UgPSBJbnZhbGlkIHBhY2thZ2UgbmFtZSB3YXJuaW5nOgotCi1fRVJST1JfUk9PVF9FTEVNRU5UID0gVGhlIFhNTCBzY2hlbWEgZG9lcyBub3QgY29udGFpbiBhbnkgZ2xvYmFsIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSByb290IGVsZW1lbnQuCi1fRVJST1JfU0FWSU5HX0ZJTEUgPSBFcnJvciBzYXZpbmcgZmlsZSAiezB9IgotCi0hIEZpbGUgVmFsaWRhdG9yCi1fVUlfRVJST1JfVkFMSURBVEVfRkFJTF9USVRMRSA9IEZhaWxlZCB0byBjaGVjayBvdXQgbmVjZXNzYXJ5IGZpbGVzCi1fVUlfRVJST1JfVkFMSURBVEVfRkFJTF9NRVNTQUdFID0gR2VuZXJhdGlvbiBmYWlsZWQuIE5lY2Vzc2FyeSBmaWxlcyBjb3VsZCBub3QgYmUgY2hlY2tlZCBvdXQuIAotCi0hIFByb3BlcnR5RGlydHlDaGFuZ2VMaXN0ZW5lciBhbmQgUHJvcGVydHlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyCi1fVUlfRVJST1JfVkFMSURBVEVfRURJVF9GQUlMX09ORV9GSUxFID0gRXJyb3IKLQotU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlcz1TYXZlIEFsbCBNb2RpZmllZCBSZXNvdXJjZXMKLVNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmU9QWxsIG1vZGlmaWVkIHJlc291cmNlcyBtdXN0IGJlIHNhdmVkIGJlZm9yZSB0aGlzIG9wZXJhdGlvbi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZDgxNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLkNvbW1vblVJTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0vLwkgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgYW5kIFNlbGVjdE11bHRpRmlsZVBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU09VUkNFX0ZJTEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QT1BVUF9FWFBBTkRfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QT1BVUF9DT0xMQVBTRV9BTEw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNUE9SVF9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVA7Ci0JCi0vLwkgU2VsZWN0TXVsdGlGaWxlUGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BRERfQlVUVE9OX1RPT0xfVElQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQlVUVE9OX1RPT0xfVElQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQUxMX0JVVFRPTl9UT09MX1RJUDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BRERfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRU1PVkVfQUxMX0JVVFRPTjsKLQotLy8JIFNlbGVjdEphdmFQcm9qZWN0VmlldwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DSE9PU0VfRk9MREVSOwotCi0vLwkgU2VsZWN0SmF2YVByb2plY3REaWFsb2cKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRk9MREVSX1NFTEVDVElPTjsKLQotLy8JIFRleHRWaWV3ZXJPcGVyYXRpb25BY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9DT1BZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0NVVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUEFTVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFRE87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfU0VMRUNUX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9TSElGVF9MRUZUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1NISUZUX1JJR0hUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1NUUklQX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9VTkRPOwotCi0vLwkgU291cmNlVmlld2VyR290b0xpbmVBY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9HT1RPX0xJTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dPVE9fTElORV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dPVE9fTElORV9ESUFMT0dfVEVYVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0NIQU5HRURfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVfREVMRVRFRF9TQVZFX0NIQU5HRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVfREVMRVRFRF9FRElUT1JfQ0xPU0VEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0NIQU5HRURfTE9BRF9DSEFOR0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TQVZFX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0xPU0VfQlVUVE9OOwotCi0KLS8vCSBYU0wgUHJlZmVyZXJlbmNlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTFRfU0VMRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xUX1NUWUxFU0hFRVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTFRfVFJBTlNGT1JNOwotCi0vLwkgWFNMIERlYnVnIFByZWZlcmVyZW5jZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfREVCVUdfU0VMRUNUX0xBVU5DSEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfREVCVUdfTE9DQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9ERUJVR19SRU1PVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9USUxFX0VESVRPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0RFQlVHX0FORF9UUkFOU0ZPUk07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9DT05URVhUX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0NPTlRFWFQ7Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PVkVSUklERV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9KQVZBX0VYSVNUX0ZJTEUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9KQVZBX0VYSVNUX0ZJTEUyOwotCSAgICAgIAotLy8JIHNvbWUgb3B0aW9ucyBzdHJpbmdzIGNvbW1vbiB0byBzZXZlcmFsIHBsdWdpbnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9TSE9SVF9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9DUkVBVElOR19GSUxFX0xPTkdfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUEFSRU5UX0ZPTERFUl9JU19SRUFEX09OTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1VOS05PV05fRVJST1JfV0lUSF9ISU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9VTktOT1dOX0VSUk9SOwotCi0vLwkgdXNhZ2UgLSB0aGlzIGxhYmVsIGlzIGZvbGxvd2VkIGJ5IHR3byByYWRpbyBidXR0b24gb3B0aW9ucyBmb3IgdGhlIGZpbGUgbG9jYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fVVJMOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTVBPTkVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1FVQUxJRklFUjsKLQotLy8JLSBjb21wb25lbnQgc2VsZWN0aW9uIGRpYWxvZ3MgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTVBPTkVOVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NQVRDSElOR19DT01QT05FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TUEVDSUZJRURfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5DTE9TSU5HX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1dPUktTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VBUkNIX1NDT1BFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OQVJST1dfU0VBUkNIX1NDT1BFX1JFU09VUkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1dPUktJTkdfU0VUUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OZXc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RFQ0xBUkFUSU9OX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DSE9PU0U7Ci0KLQotCi0KLQotCi0JLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCSEKLQkhIEhlcmUgaXMgdGhlIGxpc3Qgb2YgRXJyb3Igc3RyaW5nIHRoYXQgaGF2ZSBtZXNzYWdlIElEcyAtIG1ha2Ugc3VyZSB0aGV5IGFyZSB1bmlxdWUKLQkhICBSYW5nZSBmb3IgYjJiZ3VpIG1lc3NhZ2VJRHM6IElXQVgxMjAxIC0gSVdBWDE0MDAKLQkhCi0JIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVEhFX0NPTlRBSU5FUl9OQU1FOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0xPQ0FMX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9OT1RfSkFWQV9QUk9KRUNUOwotCi0vLwkgTk9URSBUTyBUUkFOU0xBVE9SOiB0aGlzIGVycm9yIG1lc3NhZ2UgdGV4dCBpcyBmb2xsb3dlZCBieSBhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHBsdWdpbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0pBVkFfUEFDS0FHRTsKLQotLy8JIE5PVEUgVE8gVFJBTlNMQVRPUjogKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OICsgc3RyaW5nICsgX1VJX0xBQkVMX09SICsgc3RyaW5nKSBvciAoX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04pCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfQ09OVEFJTkVSX05PVF9KQVZBX0JVSUxEUEFUSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVVNFX1BST0pFQ1RfSkFWQV9TT1VSQ0VfRk9MREVSOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fSU5WQUxJRF9KQVZBX1BBQ0tBR0U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1JPT1RfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfU0FWSU5HX0ZJTEU7Ci0KLS8vCSBGaWxlIFZhbGlkYXRvcgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9WQUxJREFURV9GQUlMX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9WQUxJREFURV9GQUlMX01FU1NBR0U7Ci0KLS8vCSBQcm9wZXJ0eURpcnR5Q2hhbmdlTGlzdGVuZXIgYW5kIFByb3BlcnR5UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9WQUxJREFURV9FRElUX0ZBSUxfT05FX0ZJTEU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmU7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZjMjc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYVJlc291cmNlQnVuZGxlID0gZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGFSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSA/IGFSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsgICAgIAotICAgIH0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyBvbmUgc3Vic3RpdHV0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpCi0JewotCSAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIG5ldyBPYmplY3QgW10geyBzMSB9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyB0d28gc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIpCi0JewotCSAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFJlc291cmNlU3RyaW5nKGtleSksIG5ldyBPYmplY3QgW10geyBzMSwgczIgfSk7Ci0JfSAgICAgCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShwbHVnaW4uZ2V0QnVuZGxlKCkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJbG9nKHgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsPSBuZXcgVVJMKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIiksIG5hbWUpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCX0KLQkKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKQotICAgIHsKLSAgICAgIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLSAgICAgIAotICAgICAgaWYgKGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbWFnZVJlZ2lzdHJ5LnB1dChpY29uTmFtZSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKGdldENsYXNzKCksIGljb25OYW1lKSk7Ci0gICAgICAgIHJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0JCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5FUlJPUiwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHQoKS5pbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBpbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKSB7Ci0gICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgaWYgKHdpbmRvdyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NhdmVEaXJ0eUZpbGVzRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZGlhbG9ncy9TYXZlRGlydHlGaWxlc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTE4MGZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NhdmVEaXJ0eUZpbGVzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3M7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIEEgZ2VuZXJpYyBzYXZlIGZpbGVzIGRpYWxvZy4gVGhlIGJ1bGsgb2YgdGhlIGNvZGUgZm9yIHRoaXMgZGlhbG9nIHdhcyB0YWtlbgotICogZnJvbSB0aGUgSkRUIHJlZmFjdG9yaW5nIHN1cHBvcnQgaW4KLSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1NhdmVIZWxwZXIuIFRoaXMgY2xhc3MgaXMKLSAqIGEgZ29vZCBjYW5kaWRhdGUgZm9yIHJldXNlIGFtb3VuZyBjb21wb25lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZURpcnR5RmlsZXNEaWFsb2cgZXh0ZW5kcyBMaXN0RGlhbG9nCi17Ci0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlRGlydHlGaWxlcygpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgLy8gVE9ETyAoY3MpIGFkZCBzdXBwb3J0IGZvciBzYXZlIGF1dG9tYXRpY2FsbHkKLSAgICBTaGVsbCBzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICBJRWRpdG9yUGFydFtdIGRpcnR5RWRpdG9ycyA9IGdldERpcnR5RWRpdG9ycygpOwotICAgIGlmIChkaXJ0eUVkaXRvcnMubGVuZ3RoID4gMCkKLSAgICB7ICAKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgU2F2ZURpcnR5RmlsZXNEaWFsb2cgc2F2ZURpcnR5RmlsZXNEaWFsb2cgPSBuZXcgU2F2ZURpcnR5RmlsZXNEaWFsb2coc2hlbGwpOwotICAgICAgc2F2ZURpcnR5RmlsZXNEaWFsb2cuc2V0SW5wdXQoQXJyYXlzLmFzTGlzdChkaXJ0eUVkaXRvcnMpKTsKLSAgICAgIC8vIFNhdmUgYWxsIG9wZW4gZWRpdG9ycy4KLSAgICAgIGlmIChzYXZlRGlydHlGaWxlc0RpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOyAgICAgICAgCi0gICAgICAgIGludCBudW1EaXJ0eUVkaXRvcnMgPSBkaXJ0eUVkaXRvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bURpcnR5RWRpdG9yczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgZGlydHlFZGl0b3JzW2ldLmRvU2F2ZShudWxsKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgSUVkaXRvclBhcnRbXSBnZXREaXJ0eUVkaXRvcnMoKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDApOwotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0gICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydFtdIGVkaXRvcnMgPSBwYWdlc1t4XS5nZXREaXJ0eUVkaXRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCBlZGl0b3JzLmxlbmd0aDsgeisrKQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZXAgPSBlZGl0b3JzW3pdOwotICAgICAgICAgIHJlc3VsdC5hZGQoZXApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoSUVkaXRvclBhcnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElFZGl0b3JQYXJ0W3Jlc3VsdC5zaXplKCldKTsKLSAgfQotCi0gIHB1YmxpYyBTYXZlRGlydHlGaWxlc0RpYWxvZyhTaGVsbCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIHNldFRpdGxlKE1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXMpOwotICAgIHNldEFkZENhbmNlbEJ1dHRvbih0cnVlKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKSk7Ci0gICAgc2V0TWVzc2FnZShNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlKTsKLSAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBjb250YWluZXIpCi0gIHsKLSAgICBDb21wb3NpdGUgcmVzdWx0ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotICAgIC8vIFRPRE8uLi4gcHJvdmlkZSBwcmVmZXJlbmNlIHRoYXQgc3VwcG9ydHMgJ2Fsd2F5cyBzYXZlJwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBjcmVhdGVEaWFsb2dMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGVJbWFnZSgpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotICAgICAgfQotICAgIH07Ci0gIH0KLSAgCi0gIC8qKiAKLSAgICogQSBzcGVjaWFsaXplZCBjb250ZW50IHByb3ZpZGVyIHRvIHNob3cgYSBsaXN0IG9mIGVkaXRvciBwYXJ0cy4KLSAgICogVGhpcyBjbGFzcyBoYXMgYmVlbiBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuTGlzdENvbnRlbnRQcm92aWRlcgotICAgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgYSBnZW5lcmljIHNvbHV0aW9uIGlzIG1hZGUgYXZhaWxhYmxlLgotICAgKi8gICAKLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBMaXN0IGZDb250ZW50czsKLQotICAgIHB1YmxpYyBMaXN0Q29udGVudFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkKLSAgICB7Ci0gICAgICBpZiAoZkNvbnRlbnRzICE9IG51bGwgJiYgZkNvbnRlbnRzID09IGlucHV0KQotICAgICAgICByZXR1cm4gZkNvbnRlbnRzLnRvQXJyYXkoKTsKLSAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgICBpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgICBmQ29udGVudHMgPSAoTGlzdCkgbmV3SW5wdXQ7Ci0gICAgICBlbHNlCi0gICAgICAgIGZDb250ZW50cyA9IG51bGw7Ci0gICAgICAvLyB3ZSB1c2UgYSBmaXhlZCBzZXQuCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgbykKLSAgICB7Ci0gICAgICByZXR1cm4gZkNvbnRlbnRzICE9IG51bGwgJiYgIWZDb250ZW50cy5jb250YWlucyhvKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1MDNlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RTaW5nbGVGaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRGV2aWNlUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldzsKLQotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0JcHVibGljIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCX0KLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcoc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cudGhpcy5jcmVhdGVGaWx0ZXJDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCS8vIFRPRE8uLiBlbmFibGUgY29udGV4dCBoZWxwCi0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2dBcmVhLAotCQkvLyBCMkJHVUlDb250ZXh0SWRzLkJUQkdfU0VMRUNUX1NJTkdMRV9GSUxFX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCWdkLmhlaWdodEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpIHsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGlzQ29tcGxldGUpOwotCQkJfQotCQl9OwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRWaXNpYmxlSGVscGVyKHRydWUpOwotCQlpbWFnZSA9IGdldFNhdmVBc0ltYWdlKCk7Ci0JCXNldFRpdGxlSW1hZ2UoaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaW1hZ2Ugd2FzIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLmlkZS9pY29ucy9mdWxsL3dpemJhbi8gd2hlcmUKLQkgKiBpdCBpcyBhIG5vbi1BUEkgaW1hZ2UsIGRlbm90ZWQgYnkKLQkgKiBJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRExHQkFOX1NBVkVBU19ETEcuCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBnZXRTYXZlQXNJbWFnZSgpIHsKLQkJSW1hZ2UgbG9jYWxpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9zYXZlYXNfd2l6LnBuZyIpOwotCQkJfQotCQkJbG9jYWxpbWFnZSA9IChJbWFnZSkgaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZVJlc291cmNlKGdldENvbnRlbnRzKCkuZ2V0RGlzcGxheSgpKTsKLQkJfQotCQljYXRjaCAoRGV2aWNlUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgaW1hZ2Ugbm90IGZvdW5kCi0JCQlsb2NhbGltYWdlID0gKEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkpLmNyZWF0ZUltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29tYm8oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucywgSUZpbGVbXSBleGNsdWRlZEZpbGVzKSB7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucywgZXhjbHVkZWRGaWxlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsICYmIGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IuZGVzdHJveVJlc291cmNlKGltYWdlKTsKLQkJCWltYWdlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjMxZTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgaW1wbGVtZW50cyBEcmFnQW5kRHJvcENvbW1hbmQKLXsKLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG93bmVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgZHJhZyBhbmQgZHJvcC4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3QgdGFyZ2V0OwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgZHJhZyBhbmQgZHJvcC4KLSAgICovCi0gIHByb3RlY3RlZCBmbG9hdCBsb2NhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgbG93ZXIgcmFuZ2Ugb2YgbG9jYXRpb25zIGluIHdoaWNoIHRoZSBlZmZlY3Qgb2YgdGhpcyBjb21tYW5kIHJlbWFpbnMgdW5jaGFuZ2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIGZsb2F0IGxvd2VyTG9jYXRpb25Cb3VuZDsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgdXBwZXIgcmFuZ2Ugb2YgbG9jYXRpb25zIGluIHdoaWNoIHRoZSBlZmZlY3Qgb2YgdGhpcyBjb21tYW5kIHJlbWFpbnMgdW5jaGFuZ2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIGZsb2F0IHVwcGVyTG9jYXRpb25Cb3VuZDsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcGVybWl0dGVkIG9wZXJhdGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbnM7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldE9wZXJhdGlvbn0uCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZmVlZGJhY2sgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0RmVlZGJhY2t9LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBmZWVkYmFjazsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY29sbGVjdGlvbiBvZiBkcmFnZ2VkIHNvdXJjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzb3VyY2VzOwotCi0gIHB1YmxpYyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKQotICB7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgdGhpcy5zb3VyY2VzID0gbmV3IEFycmF5TGlzdChzb3VyY2VzKTsKLSAgICBpZiAoIWNhbkV4ZWN1dGUoKSkgCi0gICAgewotICAgICAgdGhpcy5vcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RmVlZGJhY2soKQotICB7Ci0gICAgaWYgKGlzQWZ0ZXIoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICByZXR1cm4gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0gICAgfQotICB9ICAgIAotCi0gIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXIoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uID4gMC41OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZShPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykKLSAgewotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOwotICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgIHRoaXMuc291cmNlcyA9IG5ldyBBcnJheUxpc3Qoc291cmNlcyk7Ci0gICAgaWYgKCFjYW5FeGVjdXRlKCkpIAotICAgIHsKLSAgICAgIHRoaXMub3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKLSAgICB9Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlYjQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIERyYWdBbmREcm9wQ29tbWFuZAotewotICAvLyAgcHVibGljIERyYWdBbmREcm9wQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcyk7Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpOwotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKTsKLQotICBwdWJsaWMgaW50IGdldEZlZWRiYWNrKCk7Ci0gIAotICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbigpOwotCi0gIHB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZShPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzYTViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIERyYWdBbmREcm9wTWFuYWdlcgotewotICBwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL09iamVjdFRyYW5zZmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL09iamVjdFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NGVhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9PYmplY3RUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci0KLQotLyoqCi0gKiBUaGlzIGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBieXRlIGFycmF5IHRyYW5zZmVyIHNob3J0IGNpcmN1aXRzIHRoZSB0cmFuc2ZlciBwcm9jZXNzCi0gKiBzbyB0aGF0IGEgbG9jYWwgdHJhbnNmZXIgZG9lcyBub3Qgc2VyaWFsaXplIHRoZSBvYmplY3QKLSAqIGFuZCBoZW5jZSBjYW4gYW5kIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBvYmplY3QsIG5vdCBqdXN0IGEgY2xvbmUuCi0gKiBZb3Ugb25seSByZWFsbHkgbmVlZCBldmVyIGtub3cgYWJvdXQge0BsaW5rICNnZXRJbnN0YW5jZSBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSwKLSAqIHNvIHRoYXQgeW91IGNhbiBpbmNsdWRlIGl0IGluIHdoZW4gYWRkaW5nIGRyYWcgc3VwcG9ydCB0byBhIHZpZXdlci4KLSAqIFNlZSB7QGxpbmsgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyfSBhbmQge0BsaW5rIFZpZXdlckRyYWdBZGFwdGVyfSBmb3IgbW9yZSBkZXRhaWxzLgotICogPHA+Ci0gKiBBcyBhbiBhZGRkZWQgZ3VhcmQsIHRoZSB0aW1lIGlzIHJlY29yZGVkIGFuZCBzZXJpYWxpemVkIGluIGphdmFUb05hdGl2ZQotICogdG8gdGhhdCBuYXZpdmUgdG8gamF2YSBjYW4gZW5zdXJlIHRoYXQgaXQncyByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFsbHkgdG8gaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlcgotewotICAvKioKLSAgICogVGhpcyBpcyB0aGUgcmVnaXN0ZXIgdHJhbnNmZXIgdHlwZSBuYW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gImxvY2FsLXRyYW5zZmVyLWZvcm1hdCI7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIElEIHRoYXQgaXMgcmVnaXN0ZXJlZCB0byB0aGUgbmFtZS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEVfSUQgPSByZWdpc3RlclR5cGUoVFlQRV9OQU1FKTsKLQotICAvKioKLSAgICogVGhpcyBpcyBpbml0aWFsaXplZCBhbmQgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRJbnN0YW5jZX0uCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFRyYW5zZmVyIGluc3RhbmNlOwotCi0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgdGhlIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHRyYW5zZmVyIGFnZW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBPYmplY3RUcmFuc2ZlciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBPYmplY3RUcmFuc2ZlcigpOwotICAgIH0KLQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlY29yZHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHRyYW5zZmVyIGRhdGEgd2FzIHJlY29yZGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGxvbmcgc3RhcnRUaW1lOwotCi0gIC8qKgotICAgKiBUaGlzIHJlY29yZHMgdGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsKLQotICAvKioKLSAgICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlOyB0eXBpY2FsbHkgeW91IGdldCBvbmUgZnJvbSB7QGxpbmsgI2dldEluc3RhbmNlfS4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3RUcmFuc2ZlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgdGhlIHRyYW5zZmVyIGlkcyB0aGF0IHRoaXMgYWdlbnQgc3VwcG9ydHMuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBpbnRbXSB7IFRZUEVfSUQgfTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgdGhlIHRyYW5zZmVyIG5hbWVzIHRoYXQgdGhpcyBhZ2VudCBzdXBwb3J0cy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSAKLSAgewotICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBUWVBFX05BTUUgfTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlY29yZHMgdGhlIG9iamVjdCBhbmQgY3VycmVudCB0aW1lIGFuZCBlbmNvZGVzIG9ubHkgdGhlIGN1cnJlbnQgdGltZSBpbnRvIHRoZSB0cmFuc2ZlciBkYXRhLgotICAgKi8KLSAgcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIAotICB7Ci0gICAgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgaWYgKHRyYW5zZmVyRGF0YSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmphdmFUb05hdGl2ZShTdHJpbmcudmFsdWVPZihzdGFydFRpbWUpLmdldEJ5dGVzKCksIHRyYW5zZmVyRGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZGVjb2RlcyB0aGUgdGltZSBvZiB0aGUgdHJhbnNmZXIgYW5kIHJldHVybnMgdGhlIHJlY29yZGVkIHRoZSBvYmplY3QgaWYgdGhlIHJlY29yZGVkIHRpbWUgYW5kIHRoZSBkZWNvZGVkIHRpbWUgbWF0Y2guCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSAKLSAgewotICAgIGxvbmcgc3RhcnRUaW1lICA9IExvbmcudmFsdWVPZihuZXcgU3RyaW5nKChieXRlW10pc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSkpKS5sb25nVmFsdWUoKTsKLSAgICByZXR1cm4KLSAgICAgIHRoaXMuc3RhcnRUaW1lID09IHN0YXJ0VGltZSA/Ci0gICAgICAgIG9iamVjdCA6Ci0gICAgICAgIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhYTM0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGFuIGltcGxlbWVudGlvbiBvZiB7QGxpbmsgRHJhZ1NvdXJjZUxpc3RlbmVyfS4KLSAqIEl0IGFsbG93cyB0aGUgc2VsZWN0aW9uIGluIGVmZmVjdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRyYWcgYW5kIGRyb3AgaW50ZXJhY3Rpb24gdG8gYmUgcmVjb3JkZWQsCi0gKiB3aGljaCBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgYSBkcmFnIGFuZCBkcm9wIGludGVyYWN0aW9uIHdpdGhpbiBhIHNpbmdsZSB2aWV3LgotICogVGhpcyBpcyBob3cgb25lIG9mIHRoZXNlIGFkYXB0ZXJzIGlzIHR5cGljYWxseSBob29rZWQgdXA6Ci0gKiA8cHJlPgotICogICB2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQKLSAqICAgICAoRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LLCAKLSAqICAgICAgbmV3IFRyYW5zZmVyIFtdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0sCi0gKiAgICAgIFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOwotICogPC9wcmU+Ci0gKiBEb2luZyBzbyBzaW1wbHkgYWxsb3dzIGEgZHJhZyBvcGVyYXRpb24gdG8gYmUgaW5pdGlhdGVkIGZyb20gdGhlIHZpZXdlcgotICogc3VjaCB0aGF0IHRoZSB2aWV3ZXIncyBzZWxlY3Rpb24gaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGRyb3AgdGFyZ2V0LgotICogU2VlIHtAbGluayBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXJ9IGFuZCB7QGxpbmsgTG9jYWxUcmFuc2Zlcn0gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotcHVibGljIGNsYXNzIFZpZXdlckRyYWdBZGFwdGVyIGltcGxlbWVudHMgRHJhZ1NvdXJjZUxpc3RlbmVyCi17Ci0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSB2aWV3ZXIgdG8gd2hpY2ggd2UgYXJlIGxpc3RlbmluZy4KLSAgICovCi0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gdGhhdCBpcyBpbiBlZmZlY3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkcmFnIG9wZXJhdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB2aWV3ZXIuCi0gICAqLwotICBwdWJsaWMgVmlld2VyRHJhZ0FkYXB0ZXIoVmlld2VyIHZpZXdlcikKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICAvLyBSZW1lbWJlciB0aGUgdmlld2VyIGFuZCBsaXN0ZW4gdG8gU1dULkRyYWdEZXRlY3QgdG8gYWxlcnQgdGhlIHN0YXJ0IG9mIHRoZSBkcmFnIG9wZXJhdGlvbi4KLSAgICAvLwotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgaXMgaW5pdGlhdGVkOyBpdCByZWNvcmRzIHRoZSB7QGxpbmsgI3NlbGVjdGlvbn0gb2Yge0BsaW5rICN2aWV3ZXJ9LgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkKLSAgewotICAgIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRyYWdnaW5nIGlzIGNvbXBsZXRlZDsgaXQgZm9yZ2V0cyB0aGUge0BsaW5rICNzZWxlY3Rpb259LgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkKLSAgewotICAgIHNlbGVjdGlvbiA9IG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB0byB0cmFuc2ZlciB0aGUgZGF0YS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkKLSAgewotICAgIGlmIChPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpCi0gICAgewotICAgICAgZXZlbnQuZGF0YSA9IHNlbGVjdGlvbjsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJvcEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJvcEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkMDNmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGEgZHJvcCB0YXJnZXQgbGlzdGVuZXIgCi0gKiBpcyBkZXNpZ25lZCB0byB0dXJuIGEgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gaW50byBhIHtAbGluayBDb21tYW5kfSBiYXNlZCBvbiB0aGUgbW9kZWwgb2JqZWN0cyBvZiBhbiB7QGxpbmsgRWRpdGluZ0RvbWFpbn0KLSAqIGFuZCBjcmVhdGVkIGJ5IHtAbGluayBEcmFnQW5kRHJvcE1hbmFnZXIjY3JlYXRlfS4KLSAqIEl0IGlzIGRlc2lnbmVkIHRvIGRvIGVhcmx5IGRhdGEgdHJhbnNmZXIgc28gdGhlIHRoZSBlbmFibGVtZW50IGFuZCBmZWVkYmFjayBvZiB0aGUgZHJhZyBhbmQgZHJvcCBpbnRlcmFjdGlvbgotICogY2FuIGludGltYXRlbHkgZGVwZW5kIG9uIHRoZSBzdGF0ZSBvZiB0aGUgbW9kZWwgb2JqZWN0cyBpbnZvbGVkLgotICogPHA+Ci0gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucy4KLSAqIEFueSBjaGFuZ2UgaW4gYmVoYXZpb3VyIGlzIHR5cGljYWxseSBhY2NvbXBsaXNoZWQgYnkgb3ZlcnJpZGluZyAKLSAqIHtAbGluayBJdGVtUHJvdmlkZXJBZGFwdGVyfS5jcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQKLSAqIHRvIHJldHVybiBhIGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERyYWdBbmREcm9wQ29tbWFuZH0uCi0gKiBUaGlzIGlzIGhvdyBvbmUgdGhlc2UgYWRhcHRlcnMgaXMgdHlwaWNhbGx5IGhvb2tlZCB1cDoKLSAqIDxwcmU+Ci0gKiAgIHZpZXdlci5hZGREcm9wU3VwcG9ydAotICogICAgIChETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkssCi0gKiAgICAgIG5ldyBUcmFuc2ZlciBbXSB7IE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSwKLSAqICAgICAgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKHZpZXdlcikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcHJlZmVycyB0byB1c2UgYSB7QGxpbmsgT2JqZWN0VHJhbnNmZXJ9LCAKLSAqIHdoaWNoIHNob3J0LWNpcmN1aXRzIHRoZSB0cmFuc2ZlciBwcm9jZXNzIGZvciBzaW1wbGUgdHJhbnNmZXJzIHdpdGhpbiB0aGUgd29ya2JlbmNoLAotICogdGhlIG1ldGhvZCB7QGxpbmsgI2dldERyYWdTb3VyY2V9IGNhbiBiZSBvdmVycmlkZW4gdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIuCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gYWxzbyBvbmx5IGhhbmRsZXMgYW4ge0BsaW5rIElTdHJ1Y3R1cmVkU2VsZWN0aW9ufSwKLSAqIGJ1dCB0aGUgbWV0aG9kIHtAbGluayAjZXh0cmFjdERyYWdTb3VyY2V9IGNhbiBiZSBvdmVycmlkZW4gdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIuCi0gKiA8cD4KLSAqIFlvdSBjYW4gY2FsbCB7QGxpbmsgI3NldEhvdmVyVGhyZXNob2xkfSB0byBzZXQgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIAotICogdG8gaG92ZXIgb3ZlciBhbiBpdGVtIGJlZm9yZSB7QGxpbmsgI2hvdmVyfSBpcyBjYWxsZWQ7Ci0gKiB0aGUgZGVmYXVsdCBpcyAxNTAwIG1pbGxpc2Vjb25kcy4KLSAqLwotcHVibGljIGNsYXNzIFZpZXdlckRyb3BBZGFwdGVyIGV4dGVuZHMgRHJvcFRhcmdldEFkYXB0ZXIKLXsKLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIHZpZXdlciBmb3Igd2hpY2ggdGhpcyBpcyBhIGRyb3AgdGFyZ2V0IGxpc3RlbmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gb2Ygc291cmNlIG9iamVjdHMgYmVpbmcgZHJhZ2dlZC4KLSAgICovCi0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIHNvdXJjZTsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgY29tbWFuZCBjcmVhdGVkIGR1cmluZyBkcmFnZ2luZyB3aGljaCBwcm92aWRlcyB0aGUgZmVlZGJhY2sgYW5kIHdpbGwgY2Fycnkgb3V0IHRoZSBhY3Rpb24gdXBvbiBjb21wbGV0aW9uLgotICAgKi8KLSAgLy8gIHByb3RlY3RlZCBDb21tYW5kIGNvbW1hbmQ7Ci0gIHByb3RlY3RlZCBEcmFnQW5kRHJvcENvbW1hbmQgY29tbWFuZDsKLSAKLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgb2JqZWN0IGZvciB3aGljaCB0aGUge0BsaW5rICNjb21tYW5kfSB3YXMgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3QgY29tbWFuZFRhcmdldDsKLQotICAvKioKLSAgICogVGhlIGFtb3VudCBvZiB0aW1lIHRvIGhvdmVyIG92ZXIgYSB0cmVlIGl0ZW0gYmVmb3JlIGV4cGFuZGluZyBpdAotICAgKi8KLSAgcHJvdGVjdGVkIGludCBob3ZlclRocmVzaG9sZCA9IDE1MDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBpcyB0aGUgdGltZSB0aGUgbW91c2UgZmlyc3Qgc3RhcnRlZCBob3ZlcmluZyBvdmVyIHRoZSBjdXJyZW50IGl0ZW0uCi0gICAqLwotICBwcm90ZWN0ZWQgbG9uZyBob3ZlclN0YXJ0ID0gMDsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgbW9zdCByZWNlbnQgaXRlbSBmb3IgdGhlIHtAbGluayAjaG92ZXJTdGFydH0uCi0gICAqLwotICBwcm90ZWN0ZWQgV2lkZ2V0IHByZXZpb3VzSXRlbTsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIHRoYXQgd2FzIGluIGVmZmVjdCBiZWZvcmUgd2Ugc2V0IHRoZSBldmVudC5kZXRhaWwgaW4gaGVyZS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgb3JpZ2luYWxPcGVyYXRpb247Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IGNvbW1hbmQuCi0gICAqLwotICBwcm90ZWN0ZWQgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb247Ci0KLSAgcHJvdGVjdGVkIERyYWdBbmREcm9wTWFuYWdlciBkcmFnQW5kRHJvcE1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIFRoaXMgY3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGRvbWFpbiBhbmQgdmlld2VyLgotICAgKi8KLSAgcHVibGljIFZpZXdlckRyb3BBZGFwdGVyKFZpZXdlciB2aWV3ZXIsIERyYWdBbmREcm9wTWFuYWdlciBkcmFnQW5kRHJvcE1hbmFnZXIpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB0aGlzLmRyYWdBbmREcm9wTWFuYWdlciA9IGRyYWdBbmREcm9wTWFuYWdlcjsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb3VzZSBmaXJzdCBlbnRlcnMgb3Igc3RhcnRzIGRyYWdnaW5nIGluIHRoZSB2aWV3ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgb3JpZ2luYWxPcGVyYXRpb24gPSBldmVudC5kZXRhaWw7Ci0gICAgaGVscGVyKGV2ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgb3Igc3RvcHMgZHJhZ2dpbmcgaW4gdGhlIHZpZXdlcgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIC8vIENsZWFuIHVwIHRoZSBjb21tYW5kIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAvLwotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotLy8gICAgICAgIGNvbW1hbmQuZGlzcG9zZSgpOwotICAgICAgY29tbWFuZCA9IG51bGw7Ci0gICAgICBjb21tYW5kVGFyZ2V0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCB0aGUgb3RoZXIgdmFsdWVzLgotICAgIC8vCi0gICAgcHJldmlvdXNJdGVtID0gbnVsbDsKLSAgICBob3ZlclN0YXJ0ID0gMDsKLSAgICBzb3VyY2UgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgY2hhbmdlZCBpbiBzb21lIHdheSwgdHlwaWNhbGx5IGJlY2F1c2UgdGhlIHVzZXIgY2hhbmdlcyBrZXlib2FyZCBtb2RpZmllcnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBvcmlnaW5hbE9wZXJhdGlvbiA9IGV2ZW50LmRldGFpbDsKLSAgICBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHJlcGVhdGVkIHdoZW4gdGhlIG1vdXNlIG92ZXIgdGhlIHZpZXdlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgCi0gIHsKLSAgICBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIGp1c3QgYXMgdGhlIG1vdXNlIGlzIHJlbGVhc2VkIG92ZXIgdGhlIHZpZXdlciB0byBpbml0aWF0ZSBhIGRyb3AuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgCi0gIHsKLSAgICAvLyBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBTV1QgdGhhdCB0aGUgdmlldyBtYXkgaGF2ZSBzY3JvbGxlZC4KLSAgICAvLyBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHRvIGluZGF0ZSB0aGF0IHRoZSBkcm9wIGFjdGlvbiBzaG91bGQgYmUgaW52b2tlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gVGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gU1dUIHRoYXQgdGhlIHZpZXcgbWF5IGhhdmUgc2Nyb2xsZWQuCi0gICAgLy8gaGVscGVyKGV2ZW50KTsKLSAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCi0gICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLQotICAgICAgLy8gQ2xlYW4gdXAgdGhlIHN0YXRlLgotICAgICAgLy8KLSAgICAgIGNvbW1hbmQgPSBudWxsOwotICAgICAgY29tbWFuZFRhcmdldCA9IG51bGw7Ci0gICAgICBwcmV2aW91c0l0ZW0gPSBudWxsOwotICAgICAgaG92ZXJTdGFydCA9IDA7Ci0gICAgICBzb3VyY2UgPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdGhlIHNhbWUgd2F5IGZvciBlYWNoIG9mIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXJ9IG1ldGhvZHMsIGV4Y2VwdCBkdXJpbmcgbGVhdmUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBoZWxwZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gVHJ5IHRvIGdldCB0aGUgc291cmNlIGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgICAvLwotICAgIGlmIChzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzb3VyY2UgPSBnZXREcmFnU291cmNlKGV2ZW50KTsKLSAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKGV2ZW50LmN1cnJlbnREYXRhVHlwZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHNldEN1cnJlbnREYXRhVHlwZShldmVudCk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlcmUncyBzdGlsbCBubyBzb3VyY2UsIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB0byB0cnkgYWdhaW4uCi0gICAgLy8KLSAgICBpZiAoc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLSAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICB9Ci0gICAgLy8gT3RoZXJ3aXNlLCBpZiB3ZSBuZWVkIHRvIHNjcm9sbC4uLgotICAgIC8vCi0gICAgZWxzZSBpZiAoc2Nyb2xsSWZOZWVkZWQoZXZlbnQpKQotICAgIHsKLSAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2Ugc2Nyb2xsLCB3ZSBqdXN0IGRvIGFsbCB0aGUgd29yayBvbiB0aGUgbmV4dCBldmVudCBhbmQgb25seSBqdXN0IHNjcm9sbCBub3cuCi0gICAgICAvLwotICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBkYXRhIGZyb20gdGhlIGl0ZW0sIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgIC8vCi0gICAgICBPYmplY3QgdGFyZ2V0ID0gZXZlbnQuaXRlbSA9PSBudWxsID8gbnVsbCA6IGV2ZW50Lml0ZW0uZ2V0RGF0YSgpOwotICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRhYmxlVHJlZUl0ZW0pCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9ICgoVGFibGVUcmVlSXRlbSl0YXJnZXQpLmdldERhdGEoKTsKLSAgICAgIH0KLQotICAgICAgLy8gRG8gdGhlIGxvZ2ljIHRvIGRldGVybWluZSB0aGUgaG92ZXIgaW5mb3JtYXRpb24uCi0gICAgICAvLyBJZiB3ZSdyZSBvdmVyIGEgbmV3IGl0ZW0gZnJvbSBiZWZvcmUuCi0gICAgICAvLwotICAgICAgaWYgKGV2ZW50Lml0ZW0gIT0gcHJldmlvdXNJdGVtKQotICAgICAgewotICAgICAgICAvLyBSZW1lbWJlciB0aGUgaXRlbSBhbmQgdGhlIHRpbWUuCi0gICAgICAgIC8vCi0gICAgICAgIHByZXZpb3VzSXRlbSA9IGV2ZW50Lml0ZW07Ci0gICAgICAgIGhvdmVyU3RhcnQgPSBldmVudC50aW1lOwotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKHRhcmdldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZXZlbnQudGltZSAtIGhvdmVyU3RhcnQgPiBob3ZlclRocmVzaG9sZCkKLSAgICAgICAgewotICAgICAgICAgIGhvdmVyKHRhcmdldCk7Ci0KLSAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGhvdmVyIG92ZXIgdGhpcyBndXkgYWdhaW4uCi0gICAgICAgICAgLy8KLSAgICAgICAgICBob3ZlclN0YXJ0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIGNhbiBjcmVhdGUgYSB2YWxpZCBjb21tYW5kIGF0IHRoZSBjdXJyZW50IG1vdXNlIGxvY2F0aW9uLgotICAgICAgLy8KLSAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIGNhY2hlZCBjb21tYW5kLi4uCi0gICAgICAvLwotICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tYW5kIGFuZCB0ZXN0IGlmIGl0IGlzIGV4ZWN1dGFibGUuCi0gICAgICAgIC8vCi0gICAgICAgIGNvbW1hbmRUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIGNvbW1hbmQgPSBkcmFnQW5kRHJvcE1hbmFnZXIuY3JlYXRlQ29tbWFuZCh0YXJnZXQsIGdldExvY2F0aW9uKGV2ZW50KSwgZXZlbnQub3BlcmF0aW9ucywgZXZlbnQuZGV0YWlsLCBzb3VyY2UpOwotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgIAl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGludCBvcGVyYXRpb24gPSBvcmlnaW5hbE9wZXJhdGlvbiAhPSBldmVudC5kZXRhaWwgPyBvcmlnaW5hbE9wZXJhdGlvbiA6IGV2ZW50LmRldGFpbDsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2FjaGVkIGNvbW1hbmQgaXMgYWJsZSB0byBwcm92aWRlIGRyYWcgYW5kIGRyb3AgZmVlZGJhY2suCi0gICAgICAgIC8vCi0gICAgICAgIGlmICh0YXJnZXQgPT0gY29tbWFuZFRhcmdldCkvLyAmJiBjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BGZWVkYmFjaykKLSAgICAgICAgewotICAgICAgICAgIGZsb2F0IGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oZXZlbnQpOwotCi0gICAgICAgICAgZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSAKLSAgICAgICAgICAgIG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbih0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0KLSAgICAgICAgICAvLyBJZiBzbywgcmV2YWxpZGF0ZSB0aGUgY29tbWFuZC4KLSAgICAgICAgICAvLwotICAgICAgICAgIGNvbW1hbmQucmVpbml0aWFsaXplKHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLSAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICB2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiBub3QsIGRpc3Bvc2UgdGhlIGN1cnJlbnQgY29tbWFuZCBhbmQgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgICAvLwotICAgICAgICAgIC8vICAgICAgICAgIGNvbW1hbmQuZGlzcG9zZSgpOwotICAgICAgICAgIGNvbW1hbmRUYXJnZXQgPSB0YXJnZXQ7Ci0KLSAgICAgICAgICBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IAotICAgICAgICAgICAgbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKHRhcmdldCwgZ2V0TG9jYXRpb24oZXZlbnQpLCBldmVudC5vcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0KLSAgICAgICAgICAvLyBEcmFnQW5kRHJvcE1hbmFnZXIuY3JlYXRlKGRvbWFpbiwgdGFyZ2V0LCBnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLSAgICAgICAgICAvLwotICAgICAgICAgIGNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0KLSAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhpcyBjb21tYW5kIGNhbiBwcm92aWRlIGRldGFpbGVkIGRyYWcgYW5kIGRyb3AgZmVlZGJhY2suLi4KLSAgICAgIC8vCi0gICAgICAvL2lmIChjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BDb21tYW5kKQotICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVXNlIHRoZSBmZWVkYmFjayBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgbW91c2UgcG9pbnQgZnJvbSB0aGUgY29tbWFuZC4KLSAgICAgICAgLy8KLSAgICAgICAgZXZlbnQuZGV0YWlsID0gY29tbWFuZC5nZXRPcGVyYXRpb24oKTsKLSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBjb21tYW5kLmdldEZlZWRiYWNrKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh2YWxpZCkKLSAgICAgIHsKLSAgICAgICAgLy8gQWxsIHdlIGNhbiBrbm93IGlzIHRvIHByb3ZpZGUgc2VsZWN0aW9uIGZlZWRiYWNrLgotICAgICAgICAvLwotICAgICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vIGV4ZWN1dGFibGUgY29tbWFuZCwgc28gd2UnZCBiZXR0ZXIgbml4IHRoZSB3aG9sZSBkZWFsLgotICAgICAgICAvLwotICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotICAgICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudERhdGFUeXBlKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0VHJhbnNmZXIgb2JqZWN0VHJhbnNmZXIgPSBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgIFRyYW5zZmVyRGF0YSBbXSBkYXRhVHlwZXMgPSBldmVudC5kYXRhVHlwZXM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhVHlwZXMubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSA9IGRhdGFUeXBlc1tpXTsKLSAgICAgIC8vIElmIHRoZSBsb2NhbCB0YW5zZmVyIHN1cHBvcnRzIHRoaXMgZGF0YXR5cGUsIHN3aXRjaCB0byB0aGF0IGRhdGEgdHlwZQotICAgICAgLy8KLSAgICAgIGlmIChvYmplY3RUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkKLSAgICAgIHsKLSAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlID0gdHJhbnNmZXJEYXRhOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogVGhpcyAgYXR0ZW1wdHMgdG8gZXh0cmFjdCB0aGUgZHJhZyBzb3VyY2UgZnJvbSB0aGUgZXZlbnQgZWFybHksIGkuZS4sIGJlZm9yZSB0aGUgZHJvcCBtZXRob2QuCi0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdHJpZXMgdG8gdXNlIGEge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLk9iamVjdFRyYW5zZmVyfS4KLSAgICovCi0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldERyYWdTb3VyY2UoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBkYXRhIHR5cGUgY2FuIGJlIHRyYW5zZmVyZWQgbG9jYWxseS4KLSAgICAvLwotICAgIE9iamVjdFRyYW5zZmVyIG9iamVjdFRyYW5zZmVyID0gT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoIW9iamVjdFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKQotICAgIHsKLSAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZGF0YSB0eXBlcyB0byBzZWUgaWYgdGhlcmUgaXMgYSBkYXRhdHlwZSB0aGF0IHN1cHBvcnRzIGEgbG9jYWwgdHJhbnNmZXIuCi0gICAgICAvLwotICAgICAgc2V0Q3VycmVudERhdGFUeXBlKGV2ZW50KTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVHJhbnNmZXIgdGhlIGRhdGEgYW5kIGV4dHJhY3QgaXQuCi0gICAgICAvLwotICAgICAgT2JqZWN0IG9iamVjdCA9IG9iamVjdFRyYW5zZmVyLm5hdGl2ZVRvSmF2YShldmVudC5jdXJyZW50RGF0YVR5cGUpOwotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgewotICAgICAgCXJldHVybiBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCXJldHVybiBleHRyYWN0RHJhZ1NvdXJjZShvYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGV4dHJhY3RzIGEgY29sbGVjdGlvbiBvZiBkcmFnZ2VkIHNvdXJjZSBvYmplY3RzIGZyb20gdGhlIGdpdmVuIG9iamVjdCByZXRyaWV2ZWQgZnJvbSB0aGUgdHJhbnNmZXIgYWdlbnQuCi0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb252ZXJ0cyBhIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGludG8gYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZXh0cmFjdERyYWdTb3VyY2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIC8vIFRyYW5zZmVyIHRoZSBkYXRhIGFuZCBjb252ZXJ0IHRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiB0byBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4KLSAgICAvLwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgZWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW9iamVjdCkuaXRlcmF0b3IoKTsgZWxlbWVudHMuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudHMubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBnZXRzIHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBob3ZlciBvdmVyIGFuIGl0ZW0gYmVmb3JlIHtAbGluayAjaG92ZXJ9IGlzIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SG92ZXJUaHJlc2hvbGQoKQotICB7Ci0gICAgcmV0dXJuIGhvdmVyVGhyZXNob2xkOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgc2V0IHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBob3ZlciBvdmVyIGFuIGl0ZW0gYmVmb3JlIHtAbGluayAjaG92ZXJ9IGlzIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhvdmVyVGhyZXNob2xkKGludCBob3ZlclRocmVzaG9sZCkKLSAgewotICAgIHRoaXMuaG92ZXJUaHJlc2hvbGQgPSBob3ZlclRocmVzaG9sZDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjdXJzb3IgaGFzIGhvdmVyZWQgb3ZlciB0aGUgZ2l2ZW4gdGFyZ2V0IGZvciBsb25nZXIgdGhhbiB7QGxpbmsgI2hvdmVyVGhyZXNob2xkfS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGhvdmVyKE9iamVjdCB0YXJnZXQpCi0gIHsKLSAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKQotICAgIHsKLSAgICAgICgoQWJzdHJhY3RUcmVlVmlld2VyKXZpZXdlcikuZXhwYW5kVG9MZXZlbCh0YXJnZXQsIDEpOwotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogVGhpcyByZXR1cm5zIHdoZXRoZXIgYSBzY3JvbGwgd2FzIHBlcmZvcm1lZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZHJhZyBjb29yZGluYXRlcy4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNjcm9sbElmTmVlZGVkKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIC8vIEJ5IGRlZmF1bHQgd2UnbGwgbm90IHNjcm9sbAotICAgIC8vCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotICAgIC8vIFdlIG9ubHkgaGFuZGxlIGEgdHJlZSBpdGVtIHJpZ2h0IG5vdy4KLSAgICAvLwotICAgIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pCi0gICAgewotICAgICAgLy8gVHJlZSBpdGVtcyBoYXZlIHNwZWNpYWwgZGF0YSB0aGF0IHdpbGwgaGVscC4KLSAgICAgIC8vCi0gICAgICBUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCi0gICAgICAvLyBXZSBuZWVkIG5lZWQgdGhlIHBvaW50IGluIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY29udHJvbCBhbmQgdGhlIGNvbnRyb2wncyBib3VuZHMuCi0gICAgICAvLwotICAgICAgVHJlZSB0cmVlID0gdHJlZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IHRyZWUudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdHJlZS5nZXRDbGllbnRBcmVhKCk7Ci0KLSAgICAgIC8vIFRoaXMgaXMgdGhlIGRpc3RhbmNlIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb3IgYm90dG9tIHRoYXQgd2lsbCBjYXVzZSBzY3JvbGxpbmcuCi0gICAgICAvLwotICAgICAgaW50IHNjcm9sbEVwc2lsb24gPSBNYXRoLm1pbih0cmVlSXRlbS5nZXRCb3VuZHMoKS5oZWlnaHQsIGJvdW5kcy5oZWlnaHQgLyAzKTsKLQotICAgICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBpdGVtIHRoYXQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdGhlIHZpZXcuCi0gICAgICAvLwotICAgICAgVHJlZUl0ZW0gc2Nyb2xsVHJlZUl0ZW0gPSBudWxsOwotCi0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIHVwLgotICAgICAgLy8KLSAgICAgIGlmIChwb2ludC55IDwgc2Nyb2xsRXBzaWxvbikKLSAgICAgIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBwYXJlbnQgdG8gZmluZCB0aGUgc2libGluZy4KLSAgICAgICAgLy8KLSAgICAgICAgVHJlZUl0ZW0gcGFyZW50ID0gdHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHNpYmxpbmdzLgotICAgICAgICAvLwotICAgICAgICBUcmVlSXRlbSBbXSBjaGlsZHJlbiA9IHBhcmVudCA9PSBudWxsID8gdHJlZS5nZXRJdGVtcygpIDogcGFyZW50LmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJcyB0aGlzIGEgbWF0Y2guCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gdHJlZUl0ZW0pCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwcmV2aW91cyBzaWJsaW5nLi4uCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IGNoaWxkcmVuW2kgLSAxXTsKLQotICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhc3QgZGVlcGVzdCBkZXNjZW5kZW50IG9mIHRoaXMgcHJldmlvdXMgc2libGluZy4KLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gc2Nyb2xsVHJlZUl0ZW0uZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggIT0gMCAmJiBzY3JvbGxUcmVlSXRlbS5nZXRFeHBhbmRlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gVGhlIHBhcmVudCBtdXN0IGJlIHRoZSBwcmV2aW91cy4KLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBwYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgYWZ0ZXIgdGhlIG1hdGNoLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbCBkb3duLi4uCi0gICAgICAvLwotICAgICAgZWxzZSBpZiAoYm91bmRzLmhlaWdodCAtIHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGlzIHRoaW5nIGhhcyB2aXNpYmxlIGNoaWxkcmVuLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCBtdXN0IGJlIG5leHQuCi0gICAgICAgIC8vCi0gICAgICAgIFRyZWVJdGVtIFtdIGNoaWxkcmVuID0gdHJlZUl0ZW0uZ2V0SXRlbXMoKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoICE9IDAgJiYgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5bMF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gV2UgbmVlZCB0aGUgcGFyZW50IHRvIGRldGVybWluZSBzaWJsaW5ncyBhbmQgd2lsbCB3YWxrIHVwIHRoZSB0cmVlIGlmIHdlIGFyZSB0aGUgbGFzdCBzaWJsaW5nLgotICAgICAgICAgIC8vCi0gICAgICAgICAgd2hpbGUgKHNjcm9sbFRyZWVJdGVtID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgVHJlZUl0ZW0gcGFyZW50ID0gdHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgICAgLy8gV2FsayB0aGUgY2hpbGRyZW4uCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQgPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbXMoKSA6IHBhcmVudC5nZXRJdGVtcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBmaW5kIHRoZSBjaGlsZC4KLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IHRyZWVJdGVtKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5leHQgaW5kZXggaXMgYSB2YWxpZCBpbmRleC4uLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgaWYgKCsraSA8IGNoaWxkcmVuLmxlbmd0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBmb3VuZCB0aGUgaXRlbS4KLSAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHBhcmVudC4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdhbGsgdXAuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgdHJlZUl0ZW0gPSBwYXJlbnQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwuCi0gICAgICAvLwotICAgICAgaWYgKHNjcm9sbFRyZWVJdGVtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIE9ubHkgc2Nyb2xsIGlmIHdlJ3JlIG9uIGFuIGl0ZW0gZm9yIGEgd2hpbGUuCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChwcmV2aW91c0l0ZW0gIT0gbnVsbCAmJiBldmVudC50aW1lIC0gaG92ZXJTdGFydCA+IDIwMCkKLSAgICAgICAgewotICAgICAgICAgIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbEJhciA9IHRyZWUuZ2V0VmVydGljYWxCYXIoKTsKLSAgICAgICAgICBpZiAodmVydGljYWxTY3JvbGxCYXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYmVmb3JlID0gdmVydGljYWxTY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaXRlbSBpcyBzY3JvbGxlZCBpbiBwbGFjZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICB0cmVlLnNob3dJdGVtKHNjcm9sbFRyZWVJdGVtKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNjcm9sbCBhZ2FpbiBxdWlja2x5LgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UndmUgZG9uZSBhIHNjcm9sbCBhbmQgbm90aGluZyBlbHNlIHNob3VsZCBiZSBkb25lLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZSAhPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gY2hhbmdlcywgcmVzZXQgdGhlIHRpbWVyIGluZm9ybWF0aW9uLgotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKGV2ZW50Lml0ZW0gIT0gcHJldmlvdXNJdGVtKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBob3ZlclN0YXJ0ID0gZXZlbnQudGltZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkKLSAgICB7Ci0gICAgICAvLyBUYWJsZSBpdGVtcyBoYXZlIHNwZWNpYWwgZGF0YSB0aGF0IHdpbGwgaGVscC4KLSAgICAgIC8vCi0gICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCi0gICAgICAvLyBXZSBuZWVkIG5lZWQgdGhlIHBvaW50IGluIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY29udHJvbCBhbmQgdGhlIGNvbnRyb2wncyBib3VuZHMuCi0gICAgICAvLwotICAgICAgVGFibGUgdGFibGUgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IHRhYmxlLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKLSAgICAgIGlmICh0YWJsZS5nZXRIZWFkZXJWaXNpYmxlKCkpCi0gICAgICB7Ci0gICAgICAgIGludCBvZmZzZXQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCk7Ci0gICAgICAgIGJvdW5kcy55ICs9IG9mZnNldDsKLSAgICAgICAgYm91bmRzLmhlaWdodCAtPSBvZmZzZXQ7Ci0gICAgICAgIHBvaW50LnkgLT0gb2Zmc2V0OwotICAgICAgfQotCi0gICAgICAvLyBUaGUgcG9zaXRpb24gb2YgdGhpcyBpdGVtLgotICAgICAgLy8KLSAgICAgIGludCBpbmRleCA9IHRhYmxlLmluZGV4T2YodGFibGVJdGVtKTsKLQotICAgICAgLy8gVGhpcyBpcyB0aGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIHRvcCBvciBib3R0b20gdGhhdCB3aWxsIGNhdXNlIHNjcm9sbGluZy4KLSAgICAgIC8vCi0gICAgICBpbnQgc2Nyb2xsRXBzaWxvbiA9IE1hdGgubWluKHRhYmxlSXRlbS5nZXRCb3VuZHMoMCkuaGVpZ2h0LCBib3VuZHMuaGVpZ2h0IC8gMyk7Ci0KLSAgICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgaXRlbSB0aGF0IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3LgotICAgICAgLy8KLSAgICAgIFRhYmxlSXRlbSBzY3JvbGxUYWJsZUl0ZW0gPSBudWxsOwotCi0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIHVwLgotICAgICAgLy8KLSAgICAgIGlmIChwb2ludC55IDwgc2Nyb2xsRXBzaWxvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHNjcm9sbFRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW1zKClbaW5kZXggLSAxXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbCBkb3duLi4uCi0gICAgICAvLwotICAgICAgZWxzZSBpZiAoYm91bmRzLmhlaWdodCAtIHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICBpZiAoaW5kZXggKyAxIDwgdGFibGUuZ2V0SXRlbXMoKS5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICBzY3JvbGxUYWJsZUl0ZW0gPSAgdGFibGUuZ2V0SXRlbXMoKVtpbmRleCArIDFdOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwuCi0gICAgICAvLwotICAgICAgaWYgKHNjcm9sbFRhYmxlSXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBPbmx5IHNjcm9sbCBpZiB3ZSdyZSBvbiBhbiBpdGVtIGZvciBhIHdoaWxlLgotICAgICAgICAvLwotICAgICAgICBpZiAocHJldmlvdXNJdGVtICE9IG51bGwgJiYgZXZlbnQudGltZSAtIGhvdmVyU3RhcnQgPiAyMDApCi0gICAgICAgIHsKLSAgICAgICAgICBTY3JvbGxCYXIgdmVydGljYWxTY3JvbGxCYXIgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICAgIGlmICh2ZXJ0aWNhbFNjcm9sbEJhciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBiZWZvcmUgPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBpdGVtIGlzIHNjcm9sbGVkIGluIHBsYWNlLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHRhYmxlLnNob3dJdGVtKHNjcm9sbFRhYmxlSXRlbSk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzY3JvbGwgYWdhaW4gcXVpY2tseS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBwcmV2aW91c0l0ZW0gPSBudWxsOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlJ3ZlIGRvbmUgYSBzY3JvbGwgYW5kIG5vdGhpbmcgZWxzZSBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICByZXN1bHQgPSBiZWZvcmUgIT0gdmVydGljYWxTY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGNoYW5nZXMsIHJlc2V0IHRoZSB0aW1lciBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAvLwotICAgICAgICAgIGlmIChldmVudC5pdGVtICE9IHByZXZpb3VzSXRlbSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2aW91c0l0ZW0gPSBldmVudC5pdGVtOwotICAgICAgICAgICAgaG92ZXJTdGFydCA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmxvYXQgZ2V0TG9jYXRpb24oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSAKLSAgewotICAgIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pCi0gICAgewotICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLSAgICAgIENvbnRyb2wgY29udHJvbCA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotICAgICAgUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotICAgICAgcmV0dXJuIChmbG9hdCkocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdClib3VuZHMuaGVpZ2h0OwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0gICAgICBDb250cm9sIGNvbnRyb2wgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLSAgICAgIHJldHVybiAoZmxvYXQpKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpYm91bmRzLmhlaWdodDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAwLjBGOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbgotICB7Ci0gICAgLy8gICAgcHJvdGVjdGVkIEVkaXRpbmdEb21haW4gZG9tYWluOwotICAgIHByb3RlY3RlZCBPYmplY3QgdGFyZ2V0OwotICAgIHByb3RlY3RlZCBmbG9hdCBsb2NhdGlvbjsKLSAgICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbnM7Ci0gICAgcHJvdGVjdGVkIGludCBvcGVyYXRpb247Ci0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gc291cmNlOwotICAgIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbgotICAgICAgKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpCi0gICAgewotICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOwotICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgICB0aGlzLnNvdXJjZSA9IG5ldyBBcnJheUxpc3Qoc291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKQotICAgIHsKLSAgICAgIHJldHVybiBkcmFnQW5kRHJvcE1hbmFnZXIuY3JlYXRlQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0lMb2FkaW5nREROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0lMb2FkaW5nREROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMzEwZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL25hdmlnYXRvci9JTG9hZGluZ0RETm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIAotICogQW4gaW50ZXJmYWNlIHVzZWQgYnkgbmF2aWdhdG9yIGNvbnRyaWJ1dGlvbiB0byBkaXNwbGF5IHRleHQgYW5kIGltYWdlCi0gKiB3aGlsZSBsb2FkaW5nIHRoZSBtb2RlbCAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9hZGluZ0RETm9kZSB7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUltYWdlIGdldEltYWdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvTmF2aWdhYmxlVGFibGVWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL05hdmlnYWJsZVRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDNkM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvTmF2aWdhYmxlVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyCi17Ci0gICBUYWJsZU5hdmlnYXRvciBuYXZpZ2F0b3I7Ci0KLSAgIHB1YmxpYyBOYXZpZ2FibGVUYWJsZVZpZXdlcihUYWJsZSBwYXJlbnQpCi0gICB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgbmF2aWdhdG9yID0gbmV3IFRhYmxlTmF2aWdhdG9yKGdldFRhYmxlKCksIHRoaXMpOwotICAgfQotCi0gICAvL292ZXJyaWRlIHNldENlbGxFZGl0b3JzIHRvIHB1dCBpbiBjYWxsIHRvIG1vdmVBYm92ZUNlbGxFZGl0b3JzIGZvciBUYWJsZU5hdmlnYXRvcgotICAgcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvcnMoQ2VsbEVkaXRvcltdIGVkaXRvcnMpCi0gICB7Ci0gICAgIHN1cGVyLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotICAgICBuYXZpZ2F0b3IubW92ZUNlbGxFZGl0b3JzQWJvdmUoZWRpdG9ycyk7Ci0KLSAgIH0KLQotICAgLy9vdmVycmlkZSByZWZyZXNoIHNvIHRoYXQgVGFibGVOYXZpZ2F0b3IgaXMgcmVmcmVzaGVkIGZvciBhbGwgbW9kZWwgY2hhbmdlcwotICAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gICB7Ci0gICAJaWYoICF0aGlzLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpICkKLSAgIAl7Ci0gICAgICAJc3VwZXIucmVmcmVzaCgpOwotICAgICAgCW5hdmlnYXRvci5yZWZyZXNoKCk7Ci0gICAJfQotICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9SZXNvdXJjZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvUmVzb3VyY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhM2Y1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9SZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLQotcHVibGljIGNsYXNzIFJlc291cmNlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIAotewotICBwcm90ZWN0ZWQgU3RyaW5nW10gZkV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJRmlsZVtdIGZFeGNsdWRlZEZpbGVzOwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBmRXhjbHVkZXM7Ci0JCi0gIHB1YmxpYyBSZXNvdXJjZUZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zLCBDb2xsZWN0aW9uIGV4Y2x1ZGUpIAotICB7Ci0gICAgZkV4dGVuc2lvbnM9IGV4dGVuc2lvbnM7Ci0gICAgZkV4Y2x1ZGVzPSBleGNsdWRlOwotICAgIGZFeGNsdWRlZEZpbGVzID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zLCBJRmlsZVtdIGV4Y2x1ZGVkRmlsZXMsIENvbGxlY3Rpb24gZXhjbHVkZSkgCi0gIHsKLSAgICBmRXh0ZW5zaW9ucz0gZXh0ZW5zaW9uczsKLSAgICBmRXhjbHVkZXM9IGV4Y2x1ZGU7Ci0gICAgZkV4Y2x1ZGVkRmlsZXMgPSBleGNsdWRlZEZpbGVzOwotICB9Ci0JCi0gIHB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQkKLSAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSAKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIAotICAgIHsKLSAgICAgIGlmIChmRXhjbHVkZXMgIT0gbnVsbCAmJiBmRXhjbHVkZXMuY29udGFpbnMoZWxlbWVudCkpIAotICAgICAgewotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBuYW1lPSAoKElGaWxlKWVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAgIGlmIChmRXhjbHVkZWRGaWxlcyAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaj0gMDsgaiA8IGZFeGNsdWRlZEZpbGVzLmxlbmd0aDsgaisrKSAKLSAgICAgICAgewotICAgICAgICAgIGlmICggKChJRmlsZSllbGVtZW50KS5nZXRMb2NhdGlvbigpLgotICAgICAgICAgICAgICAgdG9PU1N0cmluZygpLmNvbXBhcmVUbygoZkV4Y2x1ZGVkRmlsZXNbal0pLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKSA9PSAwICkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKGZFeHRlbnNpb25zLmxlbmd0aCA9PSAwKSAKLSAgICAgIHsKLSAgICAgICAgLy8gYXNzdW1lIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBmaWx0ZXIgYW55IGZpbGVzIGJhc2VkIG9uIAotICAgICAgICAvLyBleHRlbnNpb24KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotICAgICAgewotICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChmRXh0ZW5zaW9uc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSAKLSAgICB7IC8vIElQcm9qZWN0LCBJRm9sZGVyCi0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAJSVJlc291cmNlW10gcmVzb3VyY2VzPSAoKElDb250YWluZXIpZWxlbWVudCkubWVtYmVycygpOwotCWZvciAoaW50IGk9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIAotICAgICAgICB7Ci0JICAvLyByZWN1cnNpdmUhCi0JICBpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50LCByZXNvdXJjZXNbaV0pKSAKLSAgICAgICAgICB7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgfQotCX0KLSAgICAgIH0gCi0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSAKLSAgICAgIHsKLSAgICAgIH0JCQkJCi0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0TXVsdGlGaWxlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0TXVsdGlGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGE5MDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdE11bHRpRmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLQotLy8gUGFnZSB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgZmlsZXMKLXB1YmxpYyBjbGFzcyBTZWxlY3RNdWx0aUZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0gIElXb3JrYmVuY2ggd29ya2JlbmNoOwotICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0gIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5OwotICBUcmVlVmlld2VyIHNvdXJjZUZpbGVWaWV3ZXI7Ci0gIEJ1dHRvbiBhZGRCdXR0b247Ci0gIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0gIEJ1dHRvbiByZW1vdmVBbGxCdXR0b247Ci0gIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Qgc2VsZWN0ZWRMaXN0Qm94OwotICBCdXR0b24gaW1wb3J0QnV0dG9uOwotICBwcml2YXRlIFZlY3RvciBmRmlsdGVyczsKLSAgcHJvdGVjdGVkIElGaWxlW10gZmlsZU5hbWVzOwotICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290OwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfTElTVFNfSEVJR0hUID0gMjAwOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX0xJU1RTX1dJRFRIID0gMTUwOwotCi0gIC8vIHBhcmFtZXRlciBpc0ZpbGVNYW5kYXRvcnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYXQgbGVhc3Qgb25lIGZpbGUgbXVzdCBiZSBzZWxlY3RlZCAgCi0gIC8vIGJlZm9yZSBiZWluZyBhYmxlIHRvIHByb2NlZWQgdG8gdGhlIG5leHQgcGFnZQotICBwdWJsaWMgU2VsZWN0TXVsdGlGaWxlUGFnZSgKLSAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoLAotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLSAgICBzdXBlcigiU2VsZWN0TXVsdGlGaWxlUGFnZSIpOwotICAgIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIHRoaXMuaXNGaWxlTWFuZGF0b3J5ID0gaXNGaWxlTWFuZGF0b3J5OwotICAgIHRoaXMud29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgdGhpcy5maWxlTmFtZXMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHBhZ2VDb250ZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIHBhZ2VDb250ZW50LnNldExheW91dChsYXlvdXQpOwotICAgIHBhZ2VDb250ZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgLy8gdmFyaWFibGUgbmV2ZXIgdXNlZCAuLi4gaXMgcGFnZUNvbnRlbnQuZ2V0TGF5b3V0RGF0YSgpIG5lZWRlZD8KLSAgICAvL0dyaWREYXRhIG91dGVyRnJhbWVHcmlkRGF0YSA9IChHcmlkRGF0YSkgCi0gICAgcGFnZUNvbnRlbnQuZ2V0TGF5b3V0RGF0YSgpOwotICAgIAotICAgIC8vCQlvdXRlckZyYW1lR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLSAgICAvLwkJb3V0ZXJGcmFtZUdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTDsKLQotICAgIC8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLSAgICAvLyAgICAgICAgcGFnZUNvbnRlbnQsCi0gICAgLy8gICAgICAgIEIyQkdVSUNvbnRleHRJZHMuQlRCR19TRUxFQ1RfTVVMVElfRklMRV9QQUdFKTsKLQotICAgIGNyZWF0ZUxhYmVscyhwYWdlQ29udGVudCk7Ci0gICAgY3JlYXRlU291cmNlVmlld2VyKHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVCdXR0b25QYW5lbChwYWdlQ29udGVudCk7Ci0gICAgY3JlYXRlU2VsZWN0ZWRMaXN0Qm94KHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVJbXBvcnRCdXR0b24ocGFnZUNvbnRlbnQpOwotCi0gICAgc2V0Q29udHJvbChwYWdlQ29udGVudCk7Ci0gICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgfQotCi0gIHB1YmxpYyBJRmlsZVtdIGdldEZpbGVzKCkgewotICAgIHJldHVybiBmaWxlTmFtZXM7Ci0gIH0KLQotICAvLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotICAvLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotICAvLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0gIC8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0gICAgLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9Ci0gICAgICBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIC8vIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoIGEgJy4nLCB0aGVuIGFkZCBvbmUuCi0gICAgICBpZiAoZmlsdGVyRXh0ZW5zaW9uc1tpXS5zdGFydHNXaXRoKCIuIikpCi0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgZWxzZQotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gIi4iICsgZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICB9Ci0KLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyID0KLSAgICAgIG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBudWxsKTsKLSAgICBhZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRTb3VyY2VGaWxlVmlld2VyU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotICAgIGlmICh2aXNpYmxlID09IHRydWUpIHsKLSAgICAgIGlmIChmRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVzZXRGaWx0ZXJzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZGaWx0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICBzb3VyY2VGaWxlVmlld2VyLmFkZEZpbHRlcigoVmlld2VyRmlsdGVyKSBpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgIH0KLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsZXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0gICAgaW50IHNpemUgPSBBcnJheXMuYXNMaXN0KGZpbGVOYW1lcykuc2l6ZSgpOwotICAgIFZlY3RvciBpRmlsZU5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmZpbmRNZW1iZXIoZmlsZU5hbWVzW2ldKTsKLSAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgICBpRmlsZU5hbWVzLmFkZEVsZW1lbnQocmVzb3VyY2UpOwotICAgIH0KLSAgICBJRmlsZVtdIGR1bW15QXJyYXkgPSBuZXcgSUZpbGVbaUZpbGVOYW1lcy5zaXplKCldOwotICAgIHRoaXMuZmlsZU5hbWVzID0gKElGaWxlW10pIChpRmlsZU5hbWVzLnRvQXJyYXkoZHVtbXlBcnJheSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkgewotICAgIGZGaWx0ZXJzID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgaWYgKGZGaWx0ZXJzID09IG51bGwpCi0gICAgICBmRmlsdGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFkZEJ1dHRvbkVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlTGFiZWxzKENvbXBvc2l0ZSBwYWdlQ29udGVudCkgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhZ2VDb250ZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU09VUkNFX0ZJTEVTKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChwYWdlQ29udGVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NFTEVDVEVEX0ZJTEVTKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNoZWNrSWZGaWxlSW5UYXJnZXQoSUZpbGUgZmlsZVRvQ2hlY2spIHsKLSAgICBTdHJpbmdbXSBzdHJpbmdzID0gc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1zKCk7Ci0gICAgaW50IHNpemUgPSBzZWxlY3RlZExpc3RCb3guZ2V0SXRlbUNvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChzdHJpbmdzW2ldLmNvbXBhcmVUbyhmaWxlVG9DaGVjay5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgPT0gMCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIHNvdXJjZUZpbGVWaWV3ZXIgPQotICAgICAgbmV3IFRyZWVWaWV3ZXIoCi0gICAgICAgICAgbmV3IFRyZWUoCi0gICAgICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICAgICAgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUikpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCkpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIKLSAgICAuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgamF2YS51dGlsLkxpc3QgbGlzdDsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgYm9vbGVhbiBuZXdGaWxlc1NlbGVjdGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgaWYgKGNoZWNrSWZGaWxlSW5UYXJnZXQoKElGaWxlKSByZXNvdXJjZSkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgbmV3RmlsZXNTZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHNldEFkZEJ1dHRvbkVuYWJsZWQobmV3RmlsZXNTZWxlY3RlZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBhZGRTZWxlY3RlZEZpbGVzVG9UYXJnZXRMaXN0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBDb250cm9sIHRyZWVXaWRnZXQgPSBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLndpZHRoSGludCA9IFNJWklOR19MSVNUU19XSURUSDsKLSAgICBnZC5oZWlnaHRIaW50ID0gU0laSU5HX0xJU1RTX0hFSUdIVDsKLSAgICB0cmVlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvblBhbmVsKENvbXBvc2l0ZSBwYWdlQ29udGVudCkgewotICAgIENvbXBvc2l0ZSBidXR0b25QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFnZUNvbnRlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvblBhbmVsLnNldExheW91dChsYXlvdXQpOwotICAgIAotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGJ1dHRvblBhbmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lbCwgU1dULlBVU0gpOwotICAgIGFkZEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9BRERfQlVUVE9OKTsKLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJ1dHRvblNlbGVjdExpc3RlbmVyKCkpOwotICAgIGFkZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfQUREX0JVVFRPTl9UT09MX1RJUCk7Ci0gICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lbCwgU1dULlBVU0gpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9SRU1PVkVfQlVUVE9OKTsKLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJ1dHRvblNlbGVjdExpc3RlbmVyKCkpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUCk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgcmVtb3ZlQWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25QYW5lbCwgU1dULlBVU0gpOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9SRU1PVkVfQUxMX0JVVFRPTik7Ci0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICByZW1vdmVBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgcmVtb3ZlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCdXR0b25TZWxlY3RMaXN0ZW5lcigpKTsKLSAgICByZW1vdmVBbGxCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1JFTU9WRV9BTExfQlVUVE9OX1RPT0xfVElQKTsKLSAgICByZW1vdmVBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlU2VsZWN0ZWRMaXN0Qm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBzZWxlY3RlZExpc3RCb3ggPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgIHNlbGVjdGVkTGlzdEJveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApCi0gICAgICAgICAgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHNldFJlbW92ZUJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLndpZHRoSGludCA9IFNJWklOR19MSVNUU19XSURUSDsKLSAgICBnZC5oZWlnaHRIaW50ID0gU0laSU5HX0xJU1RTX0hFSUdIVDsKLSAgICBzZWxlY3RlZExpc3RCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gIH0KLQotICB2b2lkIGNyZWF0ZUltcG9ydEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgaW1wb3J0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICBpbXBvcnRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfSU1QT1JUX0JVVFRPTik7Ci0gICAgCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGltcG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBpbXBvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBGaWxlU3lzdGVtSW1wb3J0V2l6YXJkIGltcG9ydFdpemFyZCA9Ci0gICAgICAgICAgbmV3IEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQoKTsKLSAgICAgICAgaW1wb3J0V2l6YXJkLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPQotICAgICAgICAgIG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGltcG9ydFdpemFyZCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgaW1wb3J0QnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkRmlsZXNUb1RhcmdldExpc3QoKSB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0gICAgaWYgKGlzVmFsaWRTb3VyY2VGaWxlVmlld2VyU2VsZWN0aW9uKHNlbGVjdGlvbikpIHsKLSAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPSBudWxsOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotCi0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdHMgaW4gdGhlIGxpc3QuIERvbid0IGFkZCBpdCBpZiBpdCBpcy4KLSAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmluZGV4T2YocmVzb3VyY2VOYW1lKSA9PSAtMSkKLSAgICAgICAgICAgICAgICBzZWxlY3RlZExpc3RCb3guYWRkKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHNldEZpbGVzKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEFkZEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgcmVtb3ZlQWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKQotICAgICAgICAgICAgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZXRSZW1vdmVCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGNsYXNzIEJ1dHRvblNlbGVjdExpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikgewotICAgICAgICBhZGRTZWxlY3RlZEZpbGVzVG9UYXJnZXRMaXN0KCk7Ci0gICAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikgewotICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc2VsZWN0ZWRMaXN0Qm94LmdldFNlbGVjdGlvbigpOwotICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGVkTGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgIHNlbGVjdGVkTGlzdEJveC5yZW1vdmUoc3RyaW5nc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBpZiAoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICByZW1vdmVBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RmlsZXMoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1zKCkpOwotICAgICAgfSBlbHNlIGlmIChlLndpZGdldCA9PSByZW1vdmVBbGxCdXR0b24pIHsKLSAgICAgICAgc2VsZWN0ZWRMaXN0Qm94LnJlbW92ZUFsbCgpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgaWYgKGlzRmlsZU1hbmRhdG9yeSkKLSAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICBzZXRGaWxlcyhzZWxlY3RlZExpc3RCb3guZ2V0SXRlbXMoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZjI5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIHByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLSAgcHJvdGVjdGVkIFNlbGVjdFNpbmdsZUZpbGVWaWV3IHNlbGVjdFNpbmdsZUZpbGVWaWV3OwotICAKLSAgLy8gcGFyYW1ldGVyIGlzRmlsZU1hbmRhdG9yeSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGZpbGUgbXVzdCBiZSBzZWxlY3RlZCAgCi0gIC8vIGJlZm9yZSBiZWluZyBhYmxlIHRvIHByb2NlZWQgdG8gdGhlIG5leHQgcGFnZQotICBwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpCi0gIHsKLSAgICBzdXBlcigiU2VsZWN0U2luZ2xlRmlsZVBhZ2UiKTsKLSAgICB0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsgICAgICAgICAgIAotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3KHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KTsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgewotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldFZpc2libGVIZWxwZXIodmlzaWJsZSk7Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpCi0gICAgICB7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShpc0NvbXBsZXRlKTsKLSAgICAgIH0KLSAgICB9OwotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzZWxlY3RTaW5nbGVGaWxlVmlldy5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0vLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29udHJvbCwgQjJCR1VJQ29udGV4dElkcy5CVEJHX1NFTEVDVF9TSU5HTEVfRklMRV9QQUdFKTsKLSAgICBzZXRDb250cm9sKGNvbnRyb2wpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgCi0gIHsgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyKGZpbHRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpCi0gIHsgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLSAgfSAgICAgCi0KLSAgcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkKLSAgeyAgICAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5yZXNldEZpbHRlcnMoKTsKLSAgfQotICAKLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7ICAKLSAgICByZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNlbGVjdFNpbmdsZUZpbGVWaWV3LgotICAgKiBAcmV0dXJuIFNlbGVjdFNpbmdsZUZpbGVWaWV3Ci0gICAqLwotICBwdWJsaWMgVHJlZVZpZXdlciBnZXRTb3VyY2VGaWxlVmlld2VyKCkgewotICAgIHJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldy5zb3VyY2VGaWxlVmlld2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNlbGVjdFNpbmdsZUZpbGVWaWV3LgotICAgKiBAcmV0dXJuIFNlbGVjdFNpbmdsZUZpbGVWaWV3Ci0gICAqLwotICBwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZVZpZXcgZ2V0U2VsZWN0U2luZ2xlRmlsZVZpZXcoKSB7Ci0gICAgcmV0dXJuIHNlbGVjdFNpbmdsZUZpbGVWaWV3OwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzNjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuRmlsZVN5c3RlbUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuVUlQbHVnaW47Ci0KLSAgICAKLQotcHVibGljIGNsYXNzIFNlbGVjdFNpbmdsZUZpbGVWaWV3Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSAgICAgICAgICAgIGNvbXBvc2l0ZTsKLSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gICAgICAgICAgICAgIGlzRmlsZU1hbmRhdG9yeTsKLSAgcHJvdGVjdGVkIFRyZWVWaWV3ZXIgICAgICAgICAgIHNvdXJjZUZpbGVWaWV3ZXI7Ci0gIHByb3RlY3RlZCBCdXR0b24gICAgICAgICAgICAgICBpbXBvcnRCdXR0b247Ci0gIHByb3RlY3RlZCBWZWN0b3IgICAgICAgICAgICAgICBmRmlsdGVyczsKLSAgcHJvdGVjdGVkIElGaWxlICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsZTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gICAgICAgICAgIGRlZmF1bHRTZWxlY3Rpb247ICAKLSAgcHJvdGVjdGVkIExpc3RlbmVyICAgICAgICAgICAgIGxpc3RlbmVyOwotICAKLSAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpOyAKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlVmlldyhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIHRoaXMuaXNGaWxlTWFuZGF0b3J5ID0gaXNGaWxlTWFuZGF0b3J5OwotICAgIHRoaXMuc2VsZWN0ZWRGaWxlPSBudWxsOwotICAgIHRoaXMuZGVmYXVsdFNlbGVjdGlvbiA9IG51bGw7ICAgICAgCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBDb21wb3NpdGUgc21hbGxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHNtYWxsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIHNtYWxsQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzbWFsbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NPVVJDRV9GSUxFUyk7CQotCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HLCBHcmlkRGF0YS5FTkQsIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgLy9Db2xsYXBzZSBhbmQgRXhwYW5kIGFsbCBidXR0b25zCi0gICAgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIoc21hbGxDb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICB0b29sQmFyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuRU5ELCB0cnVlLCBmYWxzZSkpOwotICAgIAotICAgIFRvb2xJdGVtIHRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5OT05FKTsKLSAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXhwYW5kQWxsLmdpZiIpOwotICAgIEltYWdlIGltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgdG9vbEl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotICAgIHRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9QT1BVUF9FWFBBTkRfQUxMKTsKLSAgICB0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLSAgICAJCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXNvdXJjZUZpbGVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQotCX19KTsKLSAgICAKLSAgICAKLSAgICB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuTk9ORSk7Ci0gICAgaW1hZ2VEZXNjcmlwdG9yID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvY29sbGFwc2VBbGwuZ2lmIik7Ci0gICAgaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICB0b29sSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0gICAgdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1BPUFVQX0NPTExBUFNFX0FMTCk7Ci0gICAgdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJc291cmNlRmlsZVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCQkKLQl9fSk7Ci0KLSAgICBjcmVhdGVTb3VyY2VWaWV3ZXIoY29tcG9zaXRlKTsKLSAgICBjcmVhdGVGaWx0ZXJDb250cm9sKGNvbXBvc2l0ZSk7ICAgCi0gICAgY3JlYXRlSW1wb3J0QnV0dG9uKGNvbXBvc2l0ZSk7ICAKLSAgICBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgCi0gIHsJCi0gIH0gCi0KLXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHNvdXJjZUZpbGVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSAKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgCi0gICAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIGphdmEudXRpbC5MaXN0IGxpc3Q7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWxlY3RlZEZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotICAgICAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KSAKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWxlY3RlZEZpbGUgPSBudWxsOwotICAgICAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KSAKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlzQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgICBsaXN0ZW5lci5zZXRDb250cm9sQ29tcGxldGUoaXNDb21wbGV0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9CQotICAgIH0pOwotICAgIENvbnRyb2wgdHJlZVdpZGdldCA9IHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgdHJlZVdpZGdldC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgfQotICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlSW1wb3J0QnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAKLSAgICBpbXBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGltcG9ydEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OKTsKLSAgICAKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOyAgICAKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGltcG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBpbXBvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBUaGlzIGxpc3RlbmVyIGlzIGlmIHRoZSBJbXBvcnQgV2l6YXJkIGFkZHMgYSBuZXcgZmV3LCB3ZSB3YW50Ci0gICAgICAgIC8vIGl0IHRvIGJlIHNlbGVjdGVkIHdoZW4gd2UgY29tZSBiYWNrIGZyb20gaXQKLSAgICAgICAgSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lciBpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyPSBuZXcgSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcigpOwotICAgICAgICAKLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoaW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcik7Ci0gICAgICAgICAgCi0gICAgICAgIEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQgaW1wb3J0V2l6YXJkID0gbmV3IEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQoKTsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc291cmNlRmlsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaW1wb3J0V2l6YXJkLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24gIT0gbnVsbCA/IHNlbGVjdGlvbiA6IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBpbXBvcnRXaXphcmQpOwotICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5vcGVuKCk7Ci0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKTsKLSAgICAgICAgSUZpbGUgaW1wb3J0ZWRGaWxlID0gaW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lci5nZXRJbXBvcnRlZEZpbGUoKTsKLSAgICAgICAgaWYgKGltcG9ydGVkRmlsZSAhPSBudWxsKSAKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbXBvcnRlZEZpbGUpOwotICAgICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7ICAgICAgICAgICAgICAgICAgCi0gICAgaW1wb3J0QnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQKTsKLSAgfSAKLQotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWRGaWxlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHRoaXMuZGVmYXVsdFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCByZXNldEZpbHRlcnMoKQotICB7Ci0gICAgZkZpbHRlcnM9bnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSAKLSAgewotICAgIGlmIChmRmlsdGVycyA9PSBudWxsKQotICAgIHsKLSAgICAgIGZGaWx0ZXJzPSBuZXcgVmVjdG9yKCk7Ci0gICAgfQotICAgIGZGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICB9Ci0KLSAgLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdpdmVuIGZpbGUKLSAgLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLSAgLy8gY2xhc3MgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1Y3Qgb25lLgotICAvLyBJZiB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlZCBkb24ndCBoYXZlICcuJywgb25lIHdpbGwgYmUgYWRkZWQuCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgewotICAgIC8vIEZpcnN0IGFkZCB0aGUgJy4nIHRvIHRoZSBmaWx0ZXJFeHRlbnNpb25zIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotICAgIFN0cmluZ1tdIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpPTA7IGkgPCBmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSAKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICcuJywgdGhlbiBhZGQgb25lLgotICAgICAgaWYgKGZpbHRlckV4dGVuc2lvbnNbaV0uc3RhcnRzV2l0aCgiLiIpKQotICAgICAgewotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9ICIuIiArIGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBudWxsKTsKLSAgICBhZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotCi0vLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLS8vIGNsYXNzIGRvbid0IGhhdmUgdG8gY29uc3RydWN0IG9uZS4KLS8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zLCBJRmlsZSBbXSBleGNsdWRlZEZpbGVzKQotICB7Ci0gICAgLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8gSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSAnLicsIHRoZW4gYWRkIG9uZS4KLSAgICAgIGlmIChmaWx0ZXJFeHRlbnNpb25zW2ldLnN0YXJ0c1dpdGgoIi4iKSkKLSAgICAgIHsKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgfQotICAgIH0KLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyOwotICAgIGlmIChleGNsdWRlZEZpbGVzICE9IG51bGwpCi0gICAgewotICAgICAgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIGV4Y2x1ZGVkRmlsZXMsIG51bGwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIH0KLSAgICBhZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfQotICAKLSAgLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdpdmVuIGZpbGUKLSAgLy8gZXhlbnNpb25zLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBSZXNvdXJjZUZpbHRlciBzbyB0aGF0IHVzZXJzIG9mIHRoaXMKLSAgLy8gY2xhc3MgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1Y3Qgb25lLgotICAvLyBJZiB0aGUgZXh0ZW5zaW9ucyBwcm92aWRlZCBkb24ndCBoYXZlICcuJywgb25lIHdpbGwgYmUgYWRkZWQuCi0gIHB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgewotCS8vIEZpcnN0IGFkZCB0aGUgJy4nIHRvIHRoZSBmaWx0ZXJFeHRlbnNpb25zIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotCVN0cmluZ1tdIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2ZpbHRlckV4dGVuc2lvbnMubGVuZ3RoXTsKLQlmb3IgKGludCBpPTA7IGkgPCBmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSAKLQl7CQkKLQkgIC8vIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoIGEgJy4nLCB0aGVuIGFkZCBvbmUuCi0JICBpZiAoZmlsdGVyRXh0ZW5zaW9uc1tpXS5zdGFydHNXaXRoKCIuIikpCi0JICB7Ci0JCWNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSBmaWx0ZXJFeHRlbnNpb25zW2ldOwotCSAgfQotCSAgZWxzZQotCSAgewotCQljb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gIi4iICsgZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLQkgIH0KLQl9Ci0JVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zLCBudWxsKTsKLSAgICBmRmlsdGVycz0gbmV3IFZlY3RvcigpOwotCWZGaWx0ZXJzLmFkZChmaWx0ZXIpOwotCWlmIChzb3VyY2VGaWxlVmlld2VyICE9IG51bGwpCi0JewkKLQkgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLnJlc2V0RmlsdGVycygpOwotICAgICAgZm9yIChJdGVyYXRvciBpPWZGaWx0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsgICAgIAotCSAgICBzb3VyY2VGaWxlVmlld2VyLmFkZEZpbHRlcigoVmlld2VyRmlsdGVyKWkubmV4dCgpKTsKLSAJICB9Ci0JICBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JICBzb3VyY2VGaWxlVmlld2VyLmdldFRyZWUoKS5yZWRyYXcoKTsKLQl9CQotICB9ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGEgV2l6YXJkIHBhZ2Ugb3IgRGlhbG9nIHdoZW4gaXQgYmVjb21lcyB2aXNpYmxlCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiB2aXNpYmxlKQotICB7ICAgIAotICAgIGlmICh2aXNpYmxlID09IHRydWUpIAotICAgIHsKLSAgICAgIGlmIChmRmlsdGVycyAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZXNldEZpbHRlcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpPWZGaWx0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgCi0gICAgICAgCSAgc291cmNlRmlsZVZpZXdlci5hZGRGaWx0ZXIoKFZpZXdlckZpbHRlcilpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgc291cmNlRmlsZVZpZXdlci5leHBhbmRUb0xldmVsKDEpOwotCi0gICAgICBpZiAoZGVmYXVsdFNlbGVjdGlvbiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5zZXRTZWxlY3Rpb24oZGVmYXVsdFNlbGVjdGlvbiwgdHJ1ZSk7ICAgICAgICAKLSAgICAgIH0gICAKLSAgICAgIGVsc2UgaWYgKCFzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLSAgICAgIHsgICAgIAotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnNldFNlbGVjdGlvbihzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5ICYmIGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIGxpc3RlbmVyLnNldENvbnRyb2xDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAKLSAgY2xhc3MgSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IKLSAgewotCVZlY3RvciBpbXBvcnRlZEZpbGVzOwotCi0JSW1wb3J0QWRkUmVzb3VyY2VMaXN0ZW5lcigpCi0JewotCSAgaW1wb3J0ZWRGaWxlcyA9IG5ldyBWZWN0b3IoKTsgCi0JfQotICAKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0JewotCSAgSVJlc291cmNlRGVsdGEgcmVzb3VyY2VEZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgCi0JICB0cnkKLQkgIHsKLQkJaWYgKHJlc291cmNlRGVsdGEgIT0gbnVsbCkgCi0JCXsKLQkJICByZXNvdXJjZURlbHRhLmFjY2VwdCh0aGlzKTsKLQkJfQotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgewotCQkvL1RPRE8uLi4gbG9nIGV4Y2VwdGlvbgotCQkvL1VJUGx1Z2luLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFeGNlcHRpb24gY2F1Z2h0IGR1cmluZyByZXNvdXJjZSBjaGFuZ2UiICsgZSk7Ci0JCS8vVUlQbHVnaW4uZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7IAotCSAgfSAgICAgIAotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKQotCXsKLQkgIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQURERUQpCi0JICB7Ci0JCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpIAotCQkgIGltcG9ydGVkRmlsZXMuYWRkKGRlbHRhLmdldFJlc291cmNlKCkpOwotCSAgfQotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0SW1wb3J0ZWRGaWxlcygpCi0JewotCSAgcmV0dXJuIGltcG9ydGVkRmlsZXM7Ci0JfQotICAgIAotCS8vIFRoaXMgcmV0dXJucyB0aGUgZmlyc3QgaW1wb3J0ZWQgZmlsZSBpbiB0aGUgbGlzdCBvZiBpbXBvcnRlZCBmaWxlcwotCXB1YmxpYyBJRmlsZSBnZXRJbXBvcnRlZEZpbGUoKQotCXsKLQkgIGlmIChpbXBvcnRlZEZpbGVzLmlzRW1wdHkoKSA9PSBmYWxzZSkgCi0JCXJldHVybiAoSUZpbGUpaW1wb3J0ZWRGaWxlcy5maXJzdEVsZW1lbnQoKTsKLSAgCi0JICByZXR1cm4gbnVsbDsKLQl9Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZFRyZWVMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHRyZWVMaXN0ZW5lcikgewotICAJc291cmNlRmlsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZUxpc3RlbmVyKTsKLSAgfQotfSAgICAgICAgICAgICAgCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmxlTmF2aWdhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9UYWJsZU5hdmlnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDAzN2EwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmxlTmF2aWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVDdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLQotCi0gIC8qKgotICAgKiBBZGRzIGEgVGFibGVDdXJzb3IgdG8gYSBTdHJ1Y3R1cmVkVmlld2VyIC0gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gb2YgdGhlIHRhYmxlCi0gICAqIFRoZSBpbnRlbnQgb2YgdGhpcyBjbGFzcyBpcyB0byBwcm92aWRlIHRoZSBzdGFuZGFyZCBsaXN0ZW5lcnMgZm9yIHVzaW5nIEYyIHRvCi0gICAqIGFjdGl2YXRlIGNlbGwgZWRpdG9ycy4KLSAgICoKLSAgICogRHVlIHRvIGEgY3VycmVudCBidWcgaW4gdGhlIFRhYmxlQ3Vyc29yLCBUYWJsZVZpZXdlcnMgdXNpbmcgdGhpcyBjbGFzcyBtdXN0IG1ha2UKLSAgICogYSBjYWxsIHNpbWlsYXIgdG8gdGhlIFRhYmxlTmF2aWdhdG9yIG1ldGhvZCBtb3ZlQ2VsbEVkaXRvcnNBYm92ZShjZWxsRWRpdG9ycykKLSAgICogd2hlbmV2ZXIgYSBzZXRDZWxsRWRpdG9ycyBjYWxsIGlzIG1hZGUgaW4gdGhlIFN0cnVjdHVyZWRWaWV3ZXIuICBUaGlzIGlzIHNvIHRoYXQgdGhlCi0gICAqIGNlbGwgZWRpdG9yIGNvbnRyb2wgc2hvd3MgdXAgYWJvdmUgdGhlIHRhYmxlIGN1cnNvciBjb250cm9sLgotICAgKi8KLQotcHVibGljIGNsYXNzIFRhYmxlTmF2aWdhdG9yIGV4dGVuZHMgVGFibGVDdXJzb3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFVFJFRUlURU1fSUQgPSAiVGFibGVUcmVlSXRlbUlEIjsKLQotICAgZmluYWwgVGFibGUgdGFibGU7Ci0KLSAgIHB1YmxpYyBUYWJsZU5hdmlnYXRvcihUYWJsZSB0YWJsZSwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICB7Ci0gICAgICBzdXBlcih0YWJsZSwgU1dULk5PTkUpOwotICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOwotICAgICAgZmluYWwgVGFibGUgY3VycmVudFRhYmxlID0gdGFibGU7Ci0gICAgICBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHNWaWV3ZXIgPSB2aWV3ZXI7Ci0KLSAgICAgIC8vIExpbnV4IGluZGV4IG91dCBvZiBib3VuZHMgZml4LiAgU2VlIGRlZmVjdCAyNTM0MjksIDI1MzQzMywgYW5kIG1vcmUKLSAgICAgIHNldFZpc2libGUoZmFsc2UpOwotCi0gICAgICBhZGRQYWludExpc3RlbmVyKHZpZXdlcik7Ci0gICAgICBhZGRLZXlMaXN0ZW5lcnModmlld2VyKTsKLSAgICAgIGFkZE1vdXNlTGlzdGVuZXJzKHZpZXdlcik7Ci0gICAgICBhZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkgICAgIGlmIChzVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pZ2V0Um93KCkuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICBzVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotICAgICAgICAgICAgICAgICB9Ci0JCX0KLQotCi0gICAgICB9KTsKLSAgICAgIGFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpewotICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKQotICAgICAgICAgewotICAgICAgICAgCS8vIGlmIGUuc291cmNlIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSB0YWJsZSB0aGVuIHNldCBzZWxlY3Rpb24gLSB0aGlzIGlzIGZvciB0YWIgaW50byB2aWV3ZXIKLSAgICAgICAgIAlPYmplY3QgZXZlbnRTb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotICAgICAgICAgCWlmIChldmVudFNvdXJjZSBpbnN0YW5jZW9mIENvbnRyb2wpCi0gICAgICAgICAJewotICAgICAgICAgCWlmICghaXNDaGlsZChjdXJyZW50VGFibGUsIChDb250cm9sKWV2ZW50U291cmNlKSkKLSAgICAgICAgIAl7Ci0gICAgICAgICAJICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCAmJiBjdXJyZW50VGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSA8PSAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGlmIChzVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pZ2V0Um93KCkuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICBzVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgCSAgIGN1cnJlbnRUYWJsZS5zZXRTZWxlY3Rpb24oMCk7IAotICAgICAgICAgICAgICAgCSAgIHNldFNlbGVjdGlvbigwLDApOwotICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgCSAgICB9Ci0gICAgICAgCSAgICBlbHNlIAotICAgICAgIAkgICAgewotICAgICAgIAkgICAgICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1zKCkubGVuZ3RoID4gMCkKLSAgICAgICAJICAgICAgewotICAgICAgIAkgICAgICAJIC8vIGN1cnNvciBjYW4gZW5kIHVwIG9uIGEgbm9uLWV4aXN0ZW50IHRhYmxlIHJvdyAKLSAgICAgICAJICAgICAgICAgLy8gICBjdXJyZW50bHkgbm8gd2F5IHRvIGdldCB0aGUgY3VycmVudCB0YWJsZSBjdXJzb3Igcm93IAotICAgICAgIAkgICAgICAJIC8vICAgc28gZm9yIG5vdyBqdXN0IGNhdGNoIHRoZSBleGNlcHRpb24gc2luY2UgaXQgZG9lc24ndAotICAgICAgIAkgICAgICAJIC8vICAgY2F1c2UgYW55IHNpZGUgZWZmZWN0cy4KLSAgICAgICAJICAgICAgCSB0cnkKLSAgICAgICAJICAgICAgCSB7Ci0gICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAJICAgICAgCSB9Ci0gICAgICAgCSAgICAgIAkgY2F0Y2ggKEV4Y2VwdGlvbiBlZSkKLSAgICAgICAJICAgICAgCSB7ICAgICAJICAgICAgICAgICAgCSAgICAgIAkKLSAgICAgICAJICAgICAgCQljdXJyZW50VGFibGUuc2V0U2VsZWN0aW9uKDApOyAgICAgICAJICAgICAgCQkgICAgICAgICAKLSAgICAgICAJICAgICAgCQlzZXRTZWxlY3Rpb24oMCwwKTsKLSAgICAgICAJICAgICAgCSB9Ci0gICAgICAgCSAgICAgICB9ICAgICAgIAkgICAgCi0gICAgICAgCSAgICAgICBlbHNlICAvLyBkbyBub3Qgc2hvdyB0YWJsZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAtIGF2b2lkIHJlcGFpbnQKLSAgICAgICAJICAgICAgIHsKLSAgICAgICAJICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgCSAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgIAl9ICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NoaWxkKENvbnRyb2wgcGFyZW50LCBDb250cm9sIGNoaWxkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbnRyb2wgdGVtcENoaWxkID0gY2hpbGQ7Ci0gICAgICAgICAgICB3aGlsZSAodGVtcENoaWxkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICh0ZW1wQ2hpbGQgPT0gcGFyZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdGVtcENoaWxkID0gdGVtcENoaWxkLmdldFBhcmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyI2ZvY3VzTG9zdChGb2N1c0V2ZW50KQotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gU2V0IHRoZSB0YWJsZSBuYXZpZ2F0b3IgdG8gYmUgbm90IHZpc2libGUgaWYgdGhlIHRoZSB0YWJsZQotICAgICAgICAgICAgLy8gaXMgbm90IGluIGZvY3VzIGFuZCBhIGNoaWxkIG9mIHRoZSB0YWJsZSBpcyBub3QgaW4gZm9jdXMKLSAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBkbyB0aGlzIGFzeW5jaHJvbm91c2x5IHNvIHdlIGRvbid0IG1lc3MgdXAgdGhlCi0gICAgICAgICAgICAvLyBjdXJyZW50IGZvY3VzIGhhbmRsaW5nLgotICAgICAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRhYmxlICE9IG51bGwgJiYgIWN1cnJlbnRUYWJsZS5pc0Rpc3Bvc2VkKCkgJiYgIWN1cnJlbnRUYWJsZS5pc0ZvY3VzQ29udHJvbCgpICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0NoaWxkKGN1cnJlbnRUYWJsZSwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0Rm9jdXNDb250cm9sKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgfQotCi0gICAgICB9KTsgCi0gICAgICAKLSAgICAgCi0gICAgICAKLQotICAgICAgdGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzR2FpbmVkKEZvY3VzRXZlbnQpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgbmF2aWdhdG9yIGlmIHRoZXJlIGFyZSBpdGVtcyBpbiB0aGUgdGFibGUgCi0gICAgICAgICAgLy8gYW5kIGlmIHRoZSBmb2N1cyB3YXNuJ3QgZ2FpbmVkIGZyb20gb3VyIG93biB0YWJsZSBuYXZpZ2F0b3IKLSAgICAgICAgICAvLyAoaWUgZm9jdXMgY2FtZSBmcm9tIG91dHNpZGUpCi0gICAgICAgICAgaWYgKGN1cnJlbnRUYWJsZS5nZXRJdGVtQ291bnQoKSA+IDAgJiYKLSAgICAgICAgICAgICAgKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEZvY3VzQ29udHJvbCgpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICFEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRGb2N1c0NvbnRyb2woKS5lcXVhbHMoVGFibGVOYXZpZ2F0b3IudGhpcykpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvIHRoaXMgYXN5bmNocm9ub3VzbHkgc28gd2UgZG9uJ3QgbWVzcyB1cCB0aGUKLSAgICAgICAgICAgIC8vIGN1cnJlbnQgZm9jdXMgaGFuZGxpbmcuCi0gICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1Zpc2libGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25zIGhlcmUgLSBpbmRleCBvdXQgb2YgYm91bmRzIG9uIHRhYmxldmlld2VyCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUYWJsZS5nZXRJdGVtQ291bnQoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWJsZS5zZXRTZWxlY3Rpb24oMCk7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKDAsMCk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlICAvLyBkbyBub3Qgc2hvdyB0YWJsZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSB0YWJsZSAtIGF2b2lkIHJlcGFpbnQKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOyAgICAgICAgICAgCi0gICB9Ci0KLSAgIHB1YmxpYyBUYWJsZSBnZXRUYWJsZSgpCi0gICB7Ci0gICAgIHJldHVybiB0YWJsZTsKLSAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhaW50TGlzdGVuZXIoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAKLSAgICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSAKLSAgICAgIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpCi0gICAgICAgICB7Ci0gICAgICAgICAJVGFibGVJdGVtW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBmaW5hbCBUYWJsZUl0ZW0gcm93ID0gKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgPyB0YWJsZS5nZXRJdGVtKHRhYmxlLmdldFRvcEluZGV4KCkpIDogc2VsZWN0aW9uWzBdOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNlbGxUZXh0ID0gcm93LmdldFRleHQoZ2V0Q29sdW1uKCkpOwotICAgICAgICAgICAgZmluYWwgSW1hZ2UgY2VsbEltYWdlID0gcm93LmdldEltYWdlKGdldENvbHVtbigpKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2wgPSBnZXRDb2x1bW4oKTsKLQotICAgICAgICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCFyb3cuaXNEaXNwb3NlZCgpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByb3cuZ2V0VGV4dChnZXRDb2x1bW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1RleHQuZXF1YWxzKGNlbGxUZXh0KSB8fCAhKHJvdy5nZXRJbWFnZShjb2wpID09IGNlbGxJbWFnZSkpIAotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTZWxlY3Rpb25LZXlBZGFwdGVyIGdldEtleUFkYXB0ZXIoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgICBpZiAoa2V5QWRhcHRlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uS2V5QWRhcHRlcih2aWV3ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgcmV0dXJuIGtleUFkYXB0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5QWRhcHRlcihTZWxlY3Rpb25LZXlBZGFwdGVyIGtBZGFwdGVyKQotICAgIHsKLSAgICAgICBrZXlBZGFwdGVyID0ga0FkYXB0ZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNlbGVjdGlvbktleUFkYXB0ZXIga2V5QWRhcHRlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgY2xhc3MgU2VsZWN0aW9uS2V5QWRhcHRlciBleHRlbmRzIEtleUFkYXB0ZXIKLSAgICB7Ci0gICAgICAgU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyOwotCi0gICAgICAgcHVibGljIFNlbGVjdGlvbktleUFkYXB0ZXIoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgICAgewotICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVkVmlld2VyID0gdmlld2VyOwotICAgICAgIH0KLQotICAgICAgIGludCBsYXN0S2V5UHJlc3NlZCA9IC0xOyAgLy8gdXNlZCB0byBjYWNoZSB0aGUgbGFzdCBrZXkgZm9yIGtleSBjb21ib3MKLQotICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgCi0gICAgICAgeyAgICAgICAJCi0gICAgICAgICAgICAgICBUYWJsZUl0ZW0gcm93ID0gZ2V0Um93KCk7Ci0gICAgICAgICAgICAgICBpbnQgY29sdW1uID0gZ2V0Q29sdW1uKCk7ICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAvLyBoYWNrIHRvIGVtdWxhdGUgU0hJRlQrRjEwIHBvcHVwIG1lbnUgLSBvdGhlcndpc2UgdGFibGUgY3Vyc29yCi0gICAgICAgICAgICAgICAvLyAgIG9ic2N1cmVzIHRoZSB0YWJsZSBwb3B1cCBtZWNoYW5pc20gYW5kIGl0IGRvZXNuJ3Qgd29yay4KLSAgICAgICAgICAgICAgIGlmIChsYXN0S2V5UHJlc3NlZCA9PSBTV1QuU0hJRlQgJiYgZS5rZXlDb2RlID09IFNXVC5GMTApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBNZW51IHBvcHVwID0gZ2V0VGFibGUoKS5nZXRNZW51KCk7Ci0gICAgICAgICAgICAgICAgICBwb3B1cC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgbGFzdEtleVByZXNzZWQgPSBlLmtleUNvZGU7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIC8vanZoIC0gbG9vayBmb3IgKyBvciAtIGtleQotICAgICAgICAgICAgICAgLy8gY29sdW1uID09IDAKLSAgICAgICAgICAgICAgIGlmIChyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKSBpbnN0YW5jZW9mIFRhYmxlVHJlZUl0ZW0pCi0gICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSAwICYmIGUuY2hhcmFjdGVyID09ICcrJykgCi0JICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgCSAgCSAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7CSAgICAgICAgICAgICAgIAkKLQkgICAgICAgICAgICAgICAJICAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5zZXRFeHBhbmRlZFN0YXRlKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgICAgIAkgIHJlZnJlc2goKTsKLQkgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uID09IDAgJiYgZS5jaGFyYWN0ZXIgPT0gJy0nKSAKLQkgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgCSAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7CSAgICAgICAgICAgICAgIAkKLQkgICAgICAgICAgICAgICAJICAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5zZXRFeHBhbmRlZFN0YXRlKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0JICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgLy8gdXNlIEYyIHRvIGludm9rZSBlZGl0aW5nIGZvciBhIGNlbGwKLSAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gU1dULkYyKSAgICAgCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAJICBpZiAoc3RydWN0dXJlZFZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVmlld2VyKQotICAgICAgICAgICAgICAgCSAgewotICAgICAgICAgICAgICAgICAgICAoKFRhYmxlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLmVkaXRFbGVtZW50KHJvdy5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAJICBlbHNlIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyKQotICAgICAgICAgICAgICAgCSAgeyAgCi0gICAgICAgICAgICAgICAJICAJICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgIAkgIAkgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcnMoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgZmluYWwgU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyID0gdmlld2VyOwotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBhZGRLZXlMaXN0ZW5lcihnZXRLZXlBZGFwdGVyKHN0cnVjdHVyZWRWaWV3ZXIpKTsKLSAgICB9ICAgICAgCi0gICAgCi0gICBwdWJsaWMgdm9pZCBhZGRNb3VzZUxpc3RlbmVycyhTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgIHsKLSAgICAgIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgc3RydWN0dXJlZFZpZXdlciA9IHZpZXdlcjsKLQotICAgICAgYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkKLSAgICAgIHsKLQotICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIAotICAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgICAgICBUYWJsZUl0ZW0gcm93ID0gZ2V0Um93KCk7Ci0gICAgICAgICAgICAgICBpbnQgY29sdW1uID0gZ2V0Q29sdW1uKCk7IAotICAgICAgICAgCi0gICAgICAgICAgICAgICAvLyB1c2UgbW91c2UgYnV0dG9uIDEgdG8gaW52b2tlIGVkaXRpbmcgZm9yIGEgY2VsbAotICAgICAgICAgICAgICAgaWYgKGUuYnV0dG9uID09IDEpICAgICAKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAoKFRhYmxlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLmVkaXRFbGVtZW50KHJvdy5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVUcmVlVmlld2VyICYmIGNvbHVtbiA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLmVkaXRFbGVtZW50KHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW4pOyAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIgJiYgcm93LmdldERhdGEoVEFCTEVUUkVFSVRFTV9JRCkgaW5zdGFuY2VvZiBUYWJsZVRyZWVJdGVtKQotICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBhbmRTdGF0ZSA9IHRhYmxlVHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuc2V0RXhwYW5kZWRTdGF0ZSh0YWJsZVRyZWVJdGVtLmdldERhdGEoKSwgIWV4cGFuZFN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgfQotCi0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IGNlbGwgZWRpdG9yIGNvbnRyb2wgc2hvd3MgdXAgYWJvdmUgdGhlIHRhYmxlIGN1cnNvciBjb250cm9sLgotICAgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSB0YWJsZSB2aWV3ZXIgbWFrZXMgYSBuZXcgY2FsbCB0byBzZXRDZWxsRWRpdG9ycwotICAgKiBpLmUuIGluIGNvbnN0cnVjdG9yIGFuZCBpbiByZWZyZXNoQ2VsbEVkaXRvcnMKLSAgICoKLSAgICogQHBhcmFtIC0gYXJyYXkgb2YgY2VsbCBlZGl0b3JzIGZvciB0aGUgU3RydWN0dXJlZFZpZXdlcgotICAgKi8KLQotICBwdWJsaWMgdm9pZCBtb3ZlQ2VsbEVkaXRvcnNBYm92ZShDZWxsRWRpdG9yW10gZWRpdG9yQXJyYXkpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvckFycmF5Lmxlbmd0aCA7IGkrKykKLSAgICB7Ci0gICAgICBDZWxsRWRpdG9yIGNFZCA9IGVkaXRvckFycmF5W2ldOwotICAgICAgaWYgKGNFZCAhPSBudWxsICYmIGNFZC5nZXRDb250cm9sKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY0VkLmdldENvbnRyb2woKS5tb3ZlQWJvdmUobnVsbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICBpZiAoIWlzRGlzcG9zZWQoKSAmJiBpc1Zpc2libGUoKSkKLSAgICAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotICAgICB9KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQzMzYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXVyaXJlc29sdmVyLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcl8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5YjY5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGEwZDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxOTo0ODowNyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4Y2NhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjQwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9SRUFETUUudHh0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWY1MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUEkgZm9yIGFuIFVSSSByZXNvbHZlci4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFhOThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU2YzJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLXBsdWdpbk5hbWU9Q29tbW9uIFVSSSBSZXNvbHZlciBGcmFtZXdvcmsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcmVzb2x2ZXJFeHRlbnNpb25zPVVSSSBSZXNvbHZlciBFeHRlbnNpb25zIFBvaW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhOTljNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJyZXNvbHZlckV4dGVuc2lvbnMiIG5hbWU9IiVyZXNvbHZlckV4dGVuc2lvbnMiIHNjaGVtYT0ic2NoZW1hL3Jlc29sdmVyRXh0ZW5zaW9ucy5leHNkIi8+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc2NoZW1hL3Jlc29sdmVyRXh0ZW5zaW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NjaGVtYS9yZXNvbHZlckV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1NjU4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc2NoZW1hL3Jlc29sdmVyRXh0ZW5zaW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiIGlkPSJyZXNvbHZlckV4dGVuc2lvbnMiIG5hbWU9IlVSSSBSZXNvbHZlciBFeHRlbnNpb25zIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBVUkkgUmVzb2x2ZXIgRXh0ZW5zaW9ucyBwb2ludCBhbGxvd3MgY2xpZW50cyB0byByZWdpc3RlciBjdXN0b20gVVJJIHJlc29sdmVycyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcmVzb2x1dGlvbiBvZiByZXNvdXJjZXMgYnkgdG9vbHMgc3VjaCBhcyBlZGl0b3JzLCBnZW5lcmF0b3JzLCB2YWxpZGF0b3JzLCBhbmQgd2l6YXJkcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb2x2ZXJFeHRlbnNpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc29sdmVyRXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdE5hdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhZ2UiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHN0YWdlIGluIHdoaWNoIHRvIHJ1biB0aGlzIGV4dGVuc2lvbiByZXNvbHZlcjogcHJlbm9ybWFsaXphdGlvbiwgcG9zdG5vcm1hbGl6YXRpb24sIG9yIHBoeXNpY2FsLiBEZWZhdWx0cyB0byBwb3N0bm9ybWFsaXphdGlvbi4mbHQ7YnImZ3Q7Ci1wcmVub3JtYWxpemF0aW9uOiAgcnVuIGJlZm9yZSBub3JtYWxpemF0aW9uIG9mIHRoZSBpbnB1dCZsdDticiZndDsKLXBvc3Rub3JtYWxpemF0aW9uOiBydW4gYWZ0ZXIgbm9ybWFsaXphdGlvbiBvZiB0aGUgaW5wdXQmbHQ7YnImZ3Q7Ci1waHlzaWNhbDogICAgICAgICAgcnVuIGFmdGVyIGFsbCBwcmUgYW5kIHBvc3Rub3JtYWxpemF0aW9uIHJlc29sdmVycwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwcmlvcml0eSBvZiB0aGlzIHJlc29sdmVyOiBoaWdoLCBtZWRpdW0sIG9yIGxvdy4gRGVmYXVsdHMgdG8gbWVkaXVtLiBUaGUgcHJpb3JpdHkgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoZW4gdGhpcyByZXNvbHZlciBzaG91bGQgcnVuIHdpdGggcmVzcGVjdCB0byBvdGhlciByZXNvbHZlcnMgZGVmaW5lZCBmb3IgdGhlIHNhbWUgc3RhZ2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3ROYXR1cmUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIElmIGEgcHJvamVjdCBuYXR1cmUgaXMgc3BlY2lmaWVkIHRoZSBVUkkgcmVzb2x2ZXIgd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHByb2plY3RzIHRoYXQgY29udGFpbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IG5hdHVyZXMuIElmIG5vIHByb2plY3QgbmF0dXJlcyBhcmUgc3BlY2lmaWVkIHRoZSBVUkkgcmVzb2x2ZXIgd2lsbCBiZSB1c2VkIGZvciBhbGwgcHJvamVjdHMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgcHJvamVjdCBuYXR1cmUgSUQgZm9yIHdoaWNoIHRoZSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gVVJJIHJlc29sdmVyIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9ucyZxdW90OyZndDsKLSAgICAgICZsdDtyZXNvbHZlckV4dGVuc2lvbgotICAgICAgICAgICAgc3RhZ2U9JnF1b3Q7cGh5c2ljYWwmcXVvdDsKLSAgICAgICAgICAgIHByaW9yaXR5PSZxdW90O2xvdyZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5TYW1wbGVSZXNvbHZlciZxdW90OyZndDsKLSAgICAgICZsdDsvcmVzb2x2ZXJFeHRlbnNpb24mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2NvZGUmZ3Q7Ci1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZXNvbHZlcgotJmx0Oy9jb2RlJmd0OwotcHJvdmlkZXMgYW4gVVJJIHJlc29sdmVyIHRoYXQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBhIHByb2plY3Qgd2l0aCBtdWx0aXBsZSBjb21wb25lbnRzCi0mbHQ7Y29kZSZndDsKLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uCi0mbHQ7L2NvZGUmZ3Q7Ci1wcm92aWRlcyBhbiBVUkkgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGEgY2FjaGUKLSZsdDtjb2RlJmd0Owotb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uCi0mbHQ7L2NvZGUmZ3Q7Ci1wcm92aWRlcyBhbiBVUkkgcmVzb2x2ZXIgdGhhdCByZXNvbHZlcyByZWZlcmVuY2VzIGZyb20gYW4gWE1MIGNhdGFsb2cKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL0V4dGVuc2libGVVUklSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL0V4dGVuc2libGVVUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWIyYzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9FeHRlbnNpYmxlVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQGF1dGhvciBjc2FsdGVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2libGVVUklSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBsb2dFeGNlcHRpb25zID0gZmFsc2U7Ci0KLQkvL3Byb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCi0JLy9UT0RPLi4uIGNvbnNpZGVyIGN0b3IgdGhhdCB0YWtlcyBhIHByb2plY3QgYXJnCi0JLy9wdWJsaWMgRXh0ZW5zaWJsZVVSSVJlc29sdmVyKElQcm9qZWN0IHByb2plY3QpCi0JLy97Ci0JLy8JdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkvL30KLQotCXB1YmxpYyBFeHRlbnNpYmxlVVJJUmVzb2x2ZXIoKQotCXsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JewotCQlTdHJpbmcgcmVzdWx0ID0gc3lzdGVtSWQ7Ci0KLQkJLy8gY29tcHV0ZSB0aGUgcHJvamVjdCB0aGF0IGhvbGRzIHRoZSByZXNvdXJjZQotCQkvLwotICAgIElGaWxlIGZpbGUgPSBjb21wdXRlRmlsZShiYXNlTG9jYXRpb24pOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gIGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbDsKLQotCQlVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHJlc29sdmVyUmVnaXN0cnkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LmdldEludGFuY2UoKTsKLQkJTGlzdCBsaXN0ID0gcmVzb2x2ZXJSZWdpc3RyeS5nZXRFeHRlbnNpb25EZXNjcmlwdG9ycyhwcm9qZWN0KTsKLQotCQkvLyBnZXQgdGhlIGxpc3Qgb2YgYXBwbGljYWJsZSBwcmUtbm9ybWFsaXplZCByZXNvbHZlcnMgZnJvbSB0aGUKLQkJLy8gZXh0ZW5zaW9uIHJlZ2lzdHJ5Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0TWF0Y2hpbmdVUklSZXNvbHZlcnMobGlzdCwgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QUkVOT1JNQUxJWkFUSU9OKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCVVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0ZW1wcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShmaWxlLCBiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCByZXN1bHQpOwotCQkJaWYodGVtcHJlc3VsdCAhPSBudWxsKQotCQkJewotCQkJICByZXN1bHQgPSB0ZW1wcmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJLy8gbm9ybWFsaXplIHRoZSB1cmkKLQkJLy8KLQkJcmVzdWx0ID0gbm9ybWFsaXplKGJhc2VMb2NhdGlvbiwgcmVzdWx0KTsKLQotCQkvLyBnZXQgdGhlIGxpc3Qgb2YgYXBwbGljYWJsZSBwb3N0LW5vcm1hbGl6ZWQgcmVzb2x2ZXJzIGZyb20gdGhlCi0JCS8vIGV4dGVuc2lvbiByZWdpc3RyeQotCQkvLwkJCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0TWF0Y2hpbmdVUklSZXNvbHZlcnMobGlzdCwgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QT1NUTk9STUFMSVpBVElPTikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7IAotCQkJVVJJUmVzb2x2ZXJFeHRlbnNpb24gcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXJFeHRlbnNpb24pIGkubmV4dCgpOwotCQkJU3RyaW5nIHRlbXByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGZpbGUsIGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHJlc3VsdCk7Ci0JCQlpZih0ZW1wcmVzdWx0ICE9IG51bGwpCi0JCQl7Ci0JCQkgIHJlc3VsdCA9IHRlbXByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVQaHlzaWNhbExvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvZ2ljYWxMb2NhdGlvbikKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gbG9naWNhbExvY2F0aW9uOwotICAgICAgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSByZXNvbHZlclJlZ2lzdHJ5ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5nZXRJbnRhbmNlKCk7Ci0gICAgICBJRmlsZSBmaWxlID0gY29tcHV0ZUZpbGUoYmFzZUxvY2F0aW9uKTsKLSAgICAgIAotICAgICAgLy8gY29tcHV0ZSB0aGUgcHJvamVjdCB0aGF0IGhvbGRzIHRoZSByZXNvdXJjZQotICAgICAgLy8gICAgICAKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSAgZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsOyAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gcmVzb2x2ZXJSZWdpc3RyeS5nZXRFeHRlbnNpb25EZXNjcmlwdG9ycyhwcm9qZWN0KTsgICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0TWF0Y2hpbmdVUklSZXNvbHZlcnMobGlzdCwgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QSFlTSUNBTCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAgICAgIAotICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgYXBwbGljYWJsZSBwaHlzaWNhbCByZXNvbHZlcnMgZnJvbSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5Ci0gICAgICAgIC8vCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgdGVtcHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoZmlsZSwgYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgcmVzdWx0KTsKLSAgICAgICAgICBpZih0ZW1wcmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdGVtcHJlc3VsdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgc3lzdGVtSWQpCi0JewotCSAgLy8gSWYgbm8gc3lzdGVtSWQgaGFzIGJlZW4gc3BlY2lmaWVkIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLQkgIC8vIHNvIHJldHVybiBudWxsOwotCSAgaWYoc3lzdGVtSWQgPT0gbnVsbCkKLQkgICAgcmV0dXJuIG51bGw7Ci0JICBTdHJpbmcgcmVzdWx0ID0gc3lzdGVtSWQ7Ci0gICAgICAKLSAgICAgIC8vIGNzIDogc29tZXRpbWVzIG5vcm1hbGl6aW5nIHRoZSBVUkkgd2lsbCBjYXVzZSBhbiBleGNlcHRpb24gdG8gZ2V0IHRocm93bgotICAgICAgLy8gZm9yIGV4YW1wbGUgdGhlICdiYWQnIHZlcnNpb24gb2YgdGhlIFVSSSBiZWxvdyAuLi4KLSAgICAgIC8vCi0gICAgICAvLyAgIGdvb2QgPSAiamFyOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvV2ViQ29udGVudC9XRUItSU5GL2xpYi9nZW5lcmF0b3IuamFyIS9NRVRBLUlORi9zY2hlbWEvY29uZmlnLmR0ZCIKLSAgICAgIC8vICAgYmFkICA9ICJqYXI6L3Jlc291cmNlL3Byb2plY3QtbmFtZS9XZWJDb250ZW50L1dFQi1JTkYvbGliL2dlbmVyYXRvci5qYXIvTUVUQS1JTkYvc2NoZW1hL2NvbmZpZy5kdGQiCi0gICAgICAvLwotICAgICAgLy8gSGVyZSB3ZSBlbmNsb3NlIHRoZSBub3JtYWxpemF0aW9uIGluIGEgdHJ5L2NhdGNoIGJsb2NrIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgY2FsbGVyCi0gICAgICAvLyAoaS5lLiB0aGUgJ3Jlc29sdmUnIG1ldGhvZCkgaXNuJ3QgaW50ZXJlc3RlZCBpbiBoYW5kbGluZyB0aGlzIGV4Y2VwdGlvbi4gICAgICAgIAotCSAgdHJ5Ci0JICB7Ci0JICAgIC8vIG5vcm1hbGl6ZSB0aGUgVVJJCi0JICAgIFVSSSBzeXN0ZW1VUkkgPSBVUkkuY3JlYXRlVVJJKHN5c3RlbUlkKTsKLQkgICAgaWYgKHN5c3RlbVVSSS5pc1JlbGF0aXZlKCkpCi0JICAgIHsKLQkgICAgICBiYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb24ucmVwbGFjZSgnXFwnLCcvJyk7Ci0JICAgICAgVVJJIGJhc2VVUkkgPSBVUkkuY3JlYXRlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETyAoY3MpIHdlIHNob3VsZCBhZGQgbW9yZSBjb21tZW50cyB0byBleHBsYWluIHRoaXMgaW4gYSBiaXQgbW9yZSBkZXRhaWwKLQkgICAgICB0cnkKLQkgICAgICB7Ci0JICAgICAgICByZXN1bHQgPSBzeXN0ZW1VUkkucmVzb2x2ZShiYXNlVVJJKS50b1N0cmluZygpOwotCSAgICAgIH0KLQkgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBVUklSZXNvbHZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpOwotCSAgICAgICAgSVN0YXR1cyBzdGF0dXNPYmogPSBudWxsOwotCSAgICAgICAgamF2YS5uZXQuVVJJIGJhc2VVUkkyID0gbnVsbDsKLQkgICAgICAgIHRyeSB7Ci0JICAgICAgICAgIGJhc2VVUkkyID0gamF2YS5uZXQuVVJJLmNyZWF0ZShiYXNlTG9jYXRpb24pOwotCSAgICAgICAgfQotCSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlMikgewotCSAgICAgICAgICBpZihsb2dFeGNlcHRpb25zKSB7Ci0JICAgICAgICAgICAgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsICJQcm9ibGVtIGluIGNyZWF0aW5nIGphdmEubmV0LlVSSSBpbiBFeHRlbnNpYmxlVVJJUmVzb2x2ZXI6IiArIGUyLmdldE1lc3NhZ2UoKSwgZTIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIHRyeSB7Ci0JICAgICAgICAgIGlmKGJhc2VVUkkyICE9IG51bGwpIHsKLQkgICAgICAgICAgICBqYXZhLm5ldC5VUkkgcmVzdWx0VVJJID0gYmFzZVVSSTIucmVzb2x2ZShzeXN0ZW1JZCk7Ci0JICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0VVJJLnRvU3RyaW5nKCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTIpIHsKLQkgICAgICAgICAgaWYobG9nRXhjZXB0aW9ucykgewotCSAgICAgICAgICAgIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCAiUHJvYmxlbSBpbiByZXNvbHZpbmcgd2l0aCBqYXZhLm5ldC5VUkkgaW4gRXh0ZW5zaWJsZVVSSVJlc29sdmVyOiIgKyBlMi5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAgICAgUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHsgICAgIAotICAgICAgICAvLyBqdXN0IGVhdCB0aGUgZXhjZXB0aW9uIGFuZCByZXR1cm4gYmFjayB0aGUgb3JpZ2luYWwgc3lzdGVtSWQKLQkgIH0KLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0gIHByb3RlY3RlZCBJRmlsZSBjb21wdXRlRmlsZShTdHJpbmcgYmFzZUxvY2F0aW9uKQotICB7Ci0gICAgSUZpbGUgZmlsZSA9IG51bGw7Ci0gICAgaWYgKGJhc2VMb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXR0ZXJuID0gImZpbGU6Ly8vIjsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKHBhdHRlcm4pKQotICAgICAgewotICAgICAgICBiYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb24uc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgfQotICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0gICAgICBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRkMjBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSksIGFzIHNwZWNpZmllZCBieQotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQiPlJGQyAyMzk2PC9hPiwgd2l0aCBjZXJ0YWluCi0gKiBlbmhhbmNlbWVudHMuICBBIDxjb2RlPlVSSTwvY29kZT4gaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgYnkgc3BlY2lmeWluZwotICogdmFsdWVzIGZvciBpdHMgY29tcG9uZW50cywgb3IgYnkgcHJvdmlkaW5nIGEgc2luZ2xlIFVSSSBzdHJpbmcsIHdoaWNoIGlzCi0gKiBwYXJzZWQgaW50byBpdHMgY29tcG9uZW50cy4gIFN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgd2hvc2UgbmFtZXMgYmVnaW4KLSAqIHdpdGggImNyZWF0ZSIgYXJlIHVzZWQgZm9yIGJvdGggZm9ybXMgb2Ygb2JqZWN0IGNyZWF0aW9uLiAgTm8gcHVibGljIG9yCi0gKiBwcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFyZSBwcm92aWRlZDsgdGhpcyBjbGFzcyBjYW4gbm90IGJlIHN1YmNsYXNzZWQuCi0gKgotICogPHA+TGlrZSA8Y29kZT5TdHJpbmc8L2NvZGU+LCA8Y29kZT5VUkk8L2NvZGU+IGlzIGFuIGltbXV0YWJsZSBjbGFzczsKLSAqIGEgPGNvZGU+VVJJPC9jb2RlPiBpbnN0YW5jZSBvZmZlcnMgc2V2ZXJhbCBieS12YWx1ZSBtZXRob2RzIHRoYXQgcmV0dXJuIGEKLSAqIG5ldyA8Y29kZT5VUkk8L2NvZGU+IG9iamVjdCBiYXNlZCBvbiBpdHMgY3VycmVudCBzdGF0ZS4gIE1vc3QgdXNlZnVsLAotICogYSByZWxhdGl2ZSA8Y29kZT5VUkk8L2NvZGU+IGNhbiBiZSB7QGxpbmsgI3Jlc29sdmUoVVJJKSByZXNvbHZlfWQgYWdhaW5zdAotICogYSBiYXNlIGFic29sdXRlIDxjb2RlPlVSSTwvY29kZT4gLS0gdGhlIGxhdHRlciB0eXBpY2FsbHkgaWRlbnRpZmllcyB0aGUKLSAqIGRvY3VtZW50IGluIHdoaWNoIHRoZSBmb3JtZXIgYXBwZWFycy4gIFRoZSBpbnZlcnNlIHRvIHRoaXMgaXMge0BsaW5rCi0gKiAjZGVyZXNvbHZlKFVSSSkgZGVyZXNvbHZlfSwgd2hpY2ggYW5zd2VycyB0aGUgcXVlc3Rpb24sICJ3aGF0IHJlbGF0aXZlCi0gKiBVUkkgd2lsbCByZXNvbHZlLCBhZ2FpbnN0IHRoZSBnaXZlbiBiYXNlLCB0byB0aGlzIGFic29sdXRlIFVSST8iCi0gKgotICogPHA+SW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkM8L2E+LCBtdWNoCi0gKiBhdHRlbnRpb24gaXMgZm9jdXNlZCBvbiBhIGhpZXJhcmNoaWNhbCBuYW1pbmcgc3lzdGVtIHVzZWQgd2lkZWx5IHRvCi0gKiBsb2NhdGUgcmVzb3VyY2VzIHZpYSBjb21tb24gcHJvdG9jb2xzIHN1Y2ggYXMgSFRUUCwgRlRQLCBhbmQgR29waGVyLCBhbmQKLSAqIHRvIGlkZW50aWZ5IGZpbGVzIG9uIGEgbG9jYWwgZmlsZSBzeXN0ZW0uICBBY29yZGluZ2x5LCBtb3N0IG9mIHRoaXMKLSAqIGNsYXNzJ3MgZnVuY3Rpb25hbGl0eSBpcyBmb3IgaGFuZGxpbmcgc3VjaCBVUklzLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZAotICogdmlhIHtAbGluayAjaXNIaWVyYXJjaGljYWwgaXNIaWVyYXJjaGljYWx9LgotICoKLSAqIDxwPjxhIG5hbWU9ImRldmljZV9leHBsYW5hdGlvbiI+Ci0gKiBUaGUgcHJpbWFyeSBlbmhhbmNlbWVudCBiZXlvbmQgdGhlIFJGQyBkZXNjcmlwdGlvbiBpcyBhbiBvcHRpb25hbAotICogZGV2aWNlIGNvbXBvbmVudC4gIEluc3RlYWQgb2YgdHJlYXRpbmcgdGhlIGRldmljZSBhcyBqdXN0IGFub3RoZXIgc2VnbWVudAotICogaW4gdGhlIHBhdGgsIGl0IGNhbiBiZSBzdG9yZWQgYXMgYSBzZXBhcmF0ZSBjb21wb25lbnQgKGFsbW9zdCBhCi0gKiBzdWItYXV0aG9yaXR5KSwgd2l0aCB0aGUgcm9vdCBiZWxvdyBpdC4gIEZvciBleGFtcGxlLCByZXNvbHZpbmcKLSAqIDxjb2RlPi9iYXI8L2NvZGU+IGFnYWluc3QgPGNvZGU+ZmlsZTovLy9jOi9mb288L2NvZGU+IHdvdWxkIHJlc3VsdCBpbgotICogPGNvZGU+ZmlsZTovLy9jOi9iYXI8L2NvZGU+IGJlaW5nIHJldHVybmVkLiAgQWxzbywgeW91IGNhbm5vdCB0YWtlCi0gKiB0aGUgcGFyZW50IG9mIGEgZGV2aWNlLCBzbyByZXNvbHZpbmcgPGNvZGU+Li48L2NvZGU+IGFnYWluc3QKLSAqIDxjb2RlPmZpbGU6Ly8vYzovPC9jb2RlPiB3b3VsZCBub3QgeWllbGQgPGNvZGU+ZmlsZTovLy88L2NvZGU+LCBhcyB5b3UKLSAqIG1pZ2h0IGV4cGVjdC4gIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGggZmlsZS1zY2hlbWUKLSAqIFVSSXMsIGFzIGRldmljZXMgZG8gbm90IHR5cGljYWxseSBvY2N1ciBpbiBwcm90b2NvbC1iYXNlZCBvbmVzLiAgQQotICogZGV2aWNlLWVuYWJsZWQgPGNvZGU+VVJJPC9jb2RlPiBpcyBjcmVhdGVkIGJ5IHBhcnNpbmcgYSBzdHJpbmcgd2l0aAotICoge0BsaW5rICNjcmVhdGVVUkkoU3RyaW5nKSBjcmVhdGVVUkl9OyBpZiB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgcGF0aAotICogZW5kcyB3aXRoIHRoZSA8Y29kZT46PC9jb2RlPiBjaGFyYWN0ZXIsIGl0IGlzIHN0b3JlZCAoaW5jbHVkaW5nIHRoZSBjb2xvbikKLSAqIGFzIHRoZSBkZXZpY2UsIGluc3RlYWQuICBBbHRlcm5hdGVseSwgZWl0aGVyIHRoZSB7QGxpbmsKLSAqICNjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpIG5vLXBhdGh9Ci0gKiBvciB0aGUge0BsaW5rICNjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nW10sCi0gKiBTdHJpbmcsIFN0cmluZykgYWJzb2x1dGUtcGF0aH0gZm9ybSBvZiA8Y29kZT5jcmVhdGVIaWVyYXJjaGljYWxVUkkoKTwvY29kZT4KLSAqIGNhbiBiZSB1c2VkLCBpbiB3aGljaCBhIG5vbi1udWxsIDxjb2RlPmRldmljZTwvY29kZT4gcGFyYW1ldGVyIGNhbiBiZQotICogc3BlY2lmaWVkLgotICoKLSAqIDxwPjxhIG5hbWU9ImFyY2hpdmVfZXhwbGFuYXRpb24iPiAKLSAqIFRoZSBvdGhlciBlbmhhbmNlbWVudCBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgYWxtb3N0LWhpZXJhcmNoaWNhbAotICogZm9ybSB1c2VkIGZvciBmaWxlcyB3aXRoaW4gYXJjaGl2ZXMsIHN1Y2ggYXMgdGhlIEpBUiBzY2hlbWUsIGRlZmluZWQKLSAqIGZvciB0aGUgSmF2YSBQbGF0Zm9ybSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ige0BsaW5rCi0gKiBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9ufS4gQnkgZGVmYXVsdCwgdGhpcyBzdXBwb3J0IGlzIGVuYWJsZWQgZm9yCi0gKiBhYnNvbHV0ZSBVUklzIHdpdGggc2NoZW1lIGVxdWFsIHRvICJqYXIiLCAiemlwIiwgb3IgImFyY2hpdmUiIChpZ25vcmluZyBjYXNlKSwgYW5kCi0gKiBpcyBpbXBsZW1lbnRlZCBieSBhIGhpZXJhcmNoaWNhbCBVUkksIHdob3NlIGF1dGhvcml0eSBpbmNsdWRlcyB0aGUKLSAqIGVudGlyZSBVUkkgb2YgdGhlIGFyY2hpdmUsIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIDxjb2RlPiE8L2NvZGU+Ci0gKiBjaGFyYWN0ZXIuICBUaGUgVVJJIG9mIHRoZSBhcmNoaXZlIG11c3QgaGF2ZSBubyBmcmFnbWVudC4gIFRoZSB3aG9sZQotICogYXJjaGl2ZSBVUkkgbXVzdCBoYXZlIG5vIGRldmljZSBhbmQgYW4gYWJzb2x1dGUgcGF0aC4gIFNwZWNpYWwgaGFuZGxpbmcKLSAqIGlzIHN1cHBvcnRlZCBmb3Ige0BsaW5rICNjcmVhdGVVUkkgY3JlYXRpbmd9LCB7QGxpbmsKLSAqICN2YWxpZEFyY2hpdmVBdXRob3JpdHkgdmFsaWRhdGluZ30sIHtAbGluayAjZGV2aWNlUGF0aCBnZXR0aW5nIHRoZSBwYXRofQotICogZnJvbSwgYW5kIHtAbGluayAjdG9TdHJpbmcgZGlzcGxheWluZ30gYXJjaGl2ZSBVUklzLiBJbiBhbGwgb3RoZXIKLSAqIG9wZXJhdGlvbnMsIGluY2x1ZGluZyB7QGxpbmsgI3Jlc29sdmUoVVJJKSByZXNvbHZpbmd9IGFuZCB7QGxpbmsKLSAqICNkZXJlc29sdmUoVVJJKSBkZXJlc29sdmluZ30sIHRoZXkgYXJlIGhhbmRsZWQgbGlrZSBhbnkgb3JkaW5hcnkgVVJJLgotICoKLSAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaW1wb3NlIHRoZSBhbGwgb2YgdGhlIHJlc3RyaWN0aW9ucyBvbgotICogY2hhcmFjdGVyIHZhbGlkaXR5IHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgUkZDLiAgU3RhdGljIG1ldGhvZHMgd2hvc2UKLSAqIG5hbWVzIGJlZ2luIHdpdGggInZhbGlkIiBhcmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBnaXZlbiBzdHJpbmcgaXMgdmFsaWQKLSAqIHZhbHVlIGZvciB0aGUgdmFyaW91cyBVUkkgY29tcG9uZW50cy4gIFByZXNlbnRseSwgdGhlc2UgdGVzdHMgcGxhY2Ugbm8KLSAqIHJlc3RyaWN0aW9ucyBiZXlvbmQgd2hhdCB3b3VsZCBoYXZlIGJlZW4gcmVxdWlyZWQgaW4gb3JkZXIgZm9yIHtAbGluawotICogY3JlYXRlVVJJKFN0cmluZykgY3JlYXRlVVJJfSB0byBoYXZlIHBhcnNlZCB0aGVtIGNvcnJlY3RseSBmcm9tIGEgc2luZ2xlCi0gKiBVUkkgc3RyaW5nLiAgSWYgbmVjZXNzYXJ5IGluIHRoZSBmdXR1cmUsIHRoZXNlIHRlc3RzIG1heSBiZSBtYWRlIG1vcmUKLSAqIHN0cmljdCwgdG8gYmV0dGVyIGNvZm9ybSB0byB0aGUgUkZDLgotICogCi0gKiA8cD5Bbm90aGVyIGdyb3VwIG9mIHN0YXRpYyBtZXRob2RzLCB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICJlbmNvZGUiLCB1c2UKLSAqIHBlcmNlbnQgZXNjYXBpbmcgdG8gZW5jb2RlIGFueSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gdGhlCi0gKiB2YXJpb3VzIFVSSSBjb21wb25lbnRzLiBBbm90aGVyIHN0YXRpYyBtZXRob2QgaXMgcHJvdmlkZWQgdG8ge0BsaW5rCi0gKiAjZGVjb2RlIGRlY29kZX0gZW5jb2RlZCBzdHJpbmdzLiAgQW4gZXNjYXBlZCBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgYXMKLSAqIGEgcGVyY2VudCBzeWJvbCAoPGNvZGU+JTwvY29kZT4pLCBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cyB0aGF0IHNwZWNpZnkKLSAqIHRoZSBjaGFyYWN0ZXIgY29kZS4gIFRoZXNlIGVuY29kaW5nIG1ldGhvZHMgYXJlIG1vcmUgc3RyaWN0IHRoYW4gdGhlCi0gKiB2YWxpZGF0aW9uIG1ldGhvZHMgZGVzY3JpYmVkIGFib3ZlLiAgVGhleSBlbnN1cmUgdmFsaWRpdHkgYWNjb3JkaW5nIHRvIHRoZQotICogUkZDLCB3aXRoIG9uZSBleGNlcHRpb246IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgotICoKLSAqIDxwPlRoZSBSRkMgYWxsb3dzIG9ubHkgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gNy1iaXQgVVMtQVNDSUkKLSAqIHJlcHJlc2VudGF0aW9ucy4gIE5vbi1BU0NJSSwgc2luZ2xlLWJ5dGUgY2hhcmFjdGVycyBjYW4gYmUgdXNlZCBvbmx5IHZpYQotICogcGVyY2VudCBlc2NhcGluZywgYXMgZGVzY3JpYmVkIGFib3ZlLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIEphdmEncwotICogVW5pY29kZSA8Y29kZT5jaGFyPC9jb2RlPiBhbmQgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRhdGlvbnMsIGFuZAotICogbWFrZXMgbm8gYXR0ZW1wdCB0byBlbmNvZGUgY2hhcmFjdGVycyAweEEwIGFuZCBhYm92ZS4gIENoYXJhY3RlcnMgaW4gdGhlCi0gKiByYW5nZSAweDgwLTB4OUYgYXJlIHN0aWxsIGVzY2FwZWQuICBJbiB0aGlzIHJlc3BlY3QsIHRoaXMgbm90aW9uIG9mIGEgVVJJCi0gKiBpcyBhY3R1YWxseSBtb3JlIGxpa2UgYW4gSVJJIChJbnRlcm5hdGlvbmFsaXplZCBSZXNvdXJjZSBJZGVudGlmaWVyKSwgZm9yCi0gKiB3aGljaCBhbiBSRkMgaXMgbm93IGluIDxocmVmPSJodHRwOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL2lyaS1lZGl0L2RyYWZ0LWR1ZXJzdC1pcmktMDkudHh0Ij5kcmFmdAotICogZm9ybTwvYT4uCi0gKgotICogPHA+RmluYWxseSwgbm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgPGNvZGU+bnVsbDwvY29kZT4gcGFyYW1ldGVyIHRvCi0gKiB0aGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kcyBhbmQgYW4gZW1wdHkgc3RyaW5nLiAgVGhlIGZvcm1lciBzaWduaWZpZXMgdGhlCi0gKiBhYnNlbnNlIG9mIGEgZ2l2ZW4gVVJJIGNvbXBvbmVudCwgd2hpbGUgdGhlIGxhdHRlciBzaW1wbHkgbWFrZXMgdGhlCi0gKiBjb21wb25lbnQgYmxhbmsuICBUaGlzIGNhbiBoYXZlIGEgc2lnbmlmaWNhbnQgZWZmZWN0IHdoZW4gcmVzb2x2aW5nLiAgRm9yCi0gKiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHR3byBVUklzOiA8Y29kZT4vYmFyPC9jb2RlPiAod2l0aCBubwotICogYXV0aG9yaXR5KSBhbmQgPGNvZGU+Ly8vYmFyPC9jb2RlPiAod2l0aCBhIGJsYW5rIGF1dGhvcml0eSkuICBJbWFnaW5lCi0gKiByZXNvbHZpbmcgdGhlbSBhZ2FpbnN0IGEgYmFzZSB3aXRoIGFuIGF1dGhvcml0eSwgc3VjaCBhcwotICogPGNvZGU+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L2NvZGU+LiAgVGhlIGZvcm1lciBjYXNlIHdpbGwgeWllbGQKLSAqIDxjb2RlPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYmFyPC9jb2RlPiwgYXMgdGhlIGJhc2UgYXV0aG9yaXR5IHdpbGwgYmUKLSAqIHByZXNlcnZlZC4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGVtcHR5IGF1dGhvcml0eSB3aWxsIG92ZXJyaWRlIHRoZQotICogYmFzZSBhdXRob3JpdHksIHJlc3VsdGluZyBpbiA8Y29kZT5odHRwOi8vL2JhcjwvY29kZT4hCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVUkkKLXsKLSAgLy8gQ29tbW9uIHRvIGFsbCBVUkkgdHlwZXMuCi0gIHByaXZhdGUgZmluYWwgaW50IGhhc2hDb2RlOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGllcmFyY2hpY2FsOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBzY2hlbWU7ICAvLyBudWxsIC0+IHJlbGF0aXZlIFVSSSByZWZlcmVuY2UKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXV0aG9yaXR5OwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBmcmFnbWVudDsKLSAgcHJpdmF0ZSBVUkkgY2FjaGVkVHJpbUZyYWdtZW50OwotICBwcml2YXRlIFN0cmluZyBjYWNoZWRUb1N0cmluZzsKLSAgLy9wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXJpOwotICAvL3ByaXZhdGUgVVJJIGNhY2hlZEFTQ0lJVVJJOwotCi0gIC8vIEFwcGxpY2FibGUgb25seSB0byBhIGhpZXJhcmNoaWNhbCBVUkkuCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGRldmljZTsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFic29sdXRlUGF0aDsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBzZWdtZW50czsgLy8gZW1wdHkgbGFzdCBzZWdtZW50IC0+IHRyYWlsaW5nIHNlcGFyYXRvcgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBxdWVyeTsKLQotICAvLyBBIGNhY2hlIG9mIFVSSXMsIGtleWVkIGJ5IHRoZSBzdHJpbmdzIGZyb20gd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQuCi0gIC8vIFRoZSBmcmFnbWVudCBvZiBhbnkgVVJJIGlzIHJlbW92ZWQgYmVmb3JlIGNhY2hpbmcgaXQgaGVyZSwgdG8gbWluaW1pemUKLSAgLy8gdGhlIHNpemUgb2YgdGhlIGNhY2hlIGluIHRoZSB1c3VhbCBjYXNlIHdoZXJlIG1vc3QgVVJJcyBvbmx5IGRpZmZlciBieQotICAvLyB0aGUgZnJhZ21lbnQuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCB1cmlDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLQotICAvLyBUaGUgbG93ZXItY2FzZWQgc2NoZW1lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSBhcmNoaXZlIFVSSXMuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBhcmNoaXZlU2NoZW1lczsKLQotICAvLyBJZGVudGlmaWVzIGEgZmlsZS10eXBlIGFic29sdXRlIFVSSS4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9GSUxFID0gImZpbGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0pBUiA9ICJqYXIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX1pJUCA9ICJ6aXAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7Ci0KLSAgLy8gU3BlY2lhbCBzZWdtZW50IHZhbHVlcyBpbnRlcnByZXRlZCBhdCByZXNvbHZlIGFuZCByZXNvbHZlIHRpbWUuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX0VNUFRZID0gIiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX1NFTEYgPSAiLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUdNRU5UX1BBUkVOVCA9ICIuLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PX1NFR01FTlRTID0gbmV3IFN0cmluZ1swXTsKLQotICAvLyBTZXBhcmF0b3JzIGZvciBwYXJzaW5nIGEgVVJJIHN0cmluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTQ0hFTUVfU0VQQVJBVE9SID0gJzonOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZX1NFUEFSQVRPUiA9ICIvLyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgREVWSUNFX0lERU5USUZJRVIgPSAnOic7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0VHTUVOVF9TRVBBUkFUT1IgPSAnLyc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVFUllfU0VQQVJBVE9SID0gJz8nOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZSQUdNRU5UX1NFUEFSQVRPUiA9ICcjJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBVU0VSX0lORk9fU0VQQVJBVE9SID0gJ0AnOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFBPUlRfU0VQQVJBVE9SID0gJzonOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJTEVfRVhURU5TSU9OX1NFUEFSQVRPUiA9ICcuJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBUkNISVZFX0lERU5USUZJRVIgPSAnISc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX1NFUEFSQVRPUiA9ICIhLyI7Ci0KLSAgLy8gQ2hhcmFjdGVycyB0byB1c2UgaW4gZXNjYXBpbmcuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRVNDQVBFID0gJyUnOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUyA9IHsKLSAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicgfTsKLQotICAvLyBTb21lIGNoYXJhY3RlciBjbGFzc2VzLCBhcyBkZWZpbmVkIGluIFJGQyAyMzk2J3MgQk5GIGZvciBVUkkuCi0gIC8vIFRoZXNlIGFyZSAxMjgtYml0IGJpdG1hc2tzLCBzdG9yZWQgYXMgdHdvIGxvbmdzLCB3aGVyZSB0aGUgTnRoIGJpdCBpcyBzZXQKLSAgLy8gaWZmIHRoZSBBU0NJSSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSBOIGlzIGluY2x1ZGVkIGluIHRoZSBzZXQuICBUaGVzZSBhcmUKLSAgLy8gY3JlYXRlZCB3aXRoIHRoZSBoaWdoQml0bWFzaygpIGFuZCBsb3dCaXRtYXNrKCkgbWV0aG9kcyBkZWZpbmVkIGJlbG93LAotICAvLyBhbmQgYSBjaGFyYWN0ZXIgaXMgdGVzdGVkIGFnYWluc3QgdGhlbSB1c2luZyBtYXRjaGVzKCkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxQSEFfSEkgPSBoaWdoQml0bWFzaygnYScsICd6JykgfCBoaWdoQml0bWFzaygnQScsICdaJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxQSEFfTE8gPSBsb3dCaXRtYXNrKCdhJywgJ3onKSAgfCBsb3dCaXRtYXNrKCdBJywgJ1onKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBESUdJVF9ISSA9IGhpZ2hCaXRtYXNrKCcwJywgJzknKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBESUdJVF9MTyA9IGxvd0JpdG1hc2soJzAnLCAnOScpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMUEhBTlVNX0hJID0gQUxQSEFfSEkgfCBESUdJVF9ISTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBTFBIQU5VTV9MTyA9IEFMUEhBX0xPIHwgRElHSVRfTE87Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSEVYX0hJID0gRElHSVRfSEkgfCBoaWdoQml0bWFzaygnQScsICdGJykgfCBoaWdoQml0bWFzaygnYScsICdmJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgSEVYX0xPID0gRElHSVRfTE8gfCBsb3dCaXRtYXNrKCdBJywgJ0YnKSAgfCBsb3dCaXRtYXNrKCdhJywgJ2YnKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVTlJFU0VSVkVEX0hJID0gQUxQSEFOVU1fSEkgfCBoaWdoQml0bWFzaygiLV8uIX4qJygpIik7IAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVOUkVTRVJWRURfTE8gPSBBTFBIQU5VTV9MTyB8IGxvd0JpdG1hc2soIi1fLiF+KicoKSIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFJFU0VSVkVEX0hJID0gaGlnaEJpdG1hc2soIjsvPzpAJj0rJCwiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVNFUlZFRF9MTyA9IGxvd0JpdG1hc2soIjsvPzpAJj0rJCwiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUklDX0hJID0gUkVTRVJWRURfSEkgfCBVTlJFU0VSVkVEX0hJOyAgLy8gfCB1Y3NjaGFyIHwgZXNjYXBlZAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVSSUNfTE8gPSBSRVNFUlZFRF9MTyB8IFVOUkVTRVJWRURfTE87Ci0KLSAgLy8gQWRkaXRpb25hbCB1c2VmdWwgY2hhcmFjdGVyIGNsYXNzZXMsIGluY2x1ZGluZyBjaGFyYWN0ZXJzIHZhbGlkIGluIGNlcnRhaW4KLSAgLy8gVVJJIGNvbXBvbmVudHMgYW5kIHNlcGFyYXRvcnMgdXNlZCBpbiBwYXJzaW5nIHRoZW0gb3V0IG9mIGEgc3RyaW5nLiAKLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRUdNRU5UX0NIQVJfSEkgPSBVTlJFU0VSVkVEX0hJIHwgaGlnaEJpdG1hc2soIjs6QCY9KyQsIik7ICAvLyB8IHVjc2NoYXIgfCBlc2NhcGVkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0VHTUVOVF9DSEFSX0xPID0gVU5SRVNFUlZFRF9MTyB8IGxvd0JpdG1hc2soIjs6QCY9KyQsIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEFUSF9DSEFSX0hJID0gU0VHTUVOVF9DSEFSX0hJIHwgaGlnaEJpdG1hc2soJy8nKTsgIC8vIHwgdWNzY2hhciB8IGVzY2FwZWQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQQVRIX0NIQVJfTE8gPSBTRUdNRU5UX0NIQVJfTE8gfCBsb3dCaXRtYXNrKCcvJyk7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTQ0hFTUVfQ0hBUl9ISSA9IEFMUEhBTlVNX0hJIHwgaGlnaEJpdG1hc2soIistLiIpOwotLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0NIRU1FX0NIQVJfTE8gPSBBTFBIQU5VTV9MTyB8IGxvd0JpdG1hc2soIistLiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BSk9SX1NFUEFSQVRPUl9ISSA9IGhpZ2hCaXRtYXNrKCI6Lz8jIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFKT1JfU0VQQVJBVE9SX0xPID0gbG93Qml0bWFzaygiOi8/IyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFR01FTlRfRU5EX0hJID0gaGlnaEJpdG1hc2soIi8/IyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFR01FTlRfRU5EX0xPID0gbG93Qml0bWFzaygiLz8jIik7Ci0KLSAgLy8gU3RhdGljIGluaXRpYWxpemVyIGZvciBhcmNoaXZlU2NoZW1lcy4KLSAgc3RhdGljCi0gIHsKLSAgICBTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICBzZXQuYWRkKFNDSEVNRV9KQVIpOwotICAgIHNldC5hZGQoU0NIRU1FX1pJUCk7Ci0gICAgc2V0LmFkZChTQ0hFTUVfQVJDSElWRSk7Ci0gICAgCi0gICAgCi0gICAgYXJjaGl2ZVNjaGVtZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoc2V0KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGxvd2VyIGhhbGYgYml0bWFzayBmb3IgdGhlIGdpdmVuIEFTQ0lJIGNoYXJhY3Rlci4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb3dCaXRtYXNrKGNoYXIgYykKLSAgewotICAgIHJldHVybiBjIDwgNjQgPyAxTCA8PCBjIDogMEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB1cHBlciBoYWxmIGJpdG1hc2sgZm9yIHRoZSBnaXZlbiBBQ1NJSSBjaGFyYWN0ZXIuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgaGlnaEJpdG1hc2soY2hhciBjKQotICB7Ci0gICAgcmV0dXJuIGMgPj0gNjQgJiYgYyA8IDEyOCA/IDFMIDw8IChjIC0gNjQpIDogMEw7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBsb3dlciBoYWxmIGJpdG1hc2sgZm9yIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHR3bwotICAvLyBnaXZlbiBjaGFyYWN0ZXJzLCBpbmNsdXNpdmUuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgbG93Qml0bWFzayhjaGFyIGZyb20sIGNoYXIgdG8pCi0gIHsKLSAgICBsb25nIHJlc3VsdCA9IDBMOwotICAgIGlmIChmcm9tIDwgNjQgJiYgZnJvbSA8PSB0bykKLSAgICB7Ci0gICAgICB0byA9IHRvIDwgNjQgPyB0byA6IDYzOwotICAgICAgZm9yIChjaGFyIGMgPSBmcm9tOyBjIDw9IHRvOyBjKyspCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCB8PSAoMUwgPDwgYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSB1cHBlciBoYWxmIGJpdG1hc2sgZm9yIGFsbCBBc0NJSSBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHR3bwotICAvLyBnaXZlbiBjaGFyYWN0ZXJzLCBpbmNsdXNpdmUuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgaGlnaEJpdG1hc2soY2hhciBmcm9tLCBjaGFyIHRvKQotICB7Ci0gICAgcmV0dXJuIHRvIDwgNjQgPyAwIDogbG93Qml0bWFzaygoY2hhcikoZnJvbSA8IDY0ID8gMCA6IGZyb20gLSA2NCksIChjaGFyKSh0byAtIDY0KSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBsb3dlciBoYWxmIGJpdG1hc2sgZm9yIGFsbCB0aGUgQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4KLSAgLy8gc3RyaW5nLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGxvd0JpdG1hc2soU3RyaW5nIGNoYXJzKQotICB7Ci0gICAgbG9uZyByZXN1bHQgPSAwTDsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gY2hhcnMubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBjaGFycy5jaGFyQXQoaSk7Ci0gICAgICBpZiAoYyA8IDY0KSByZXN1bHQgfD0gKDFMIDw8IGMpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdXBwZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgdGhlIEFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuCi0gIC8vIHN0cmluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBoaWdoQml0bWFzayhTdHJpbmcgY2hhcnMpCi0gIHsKLSAgICBsb25nIHJlc3VsdCA9IDBMOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBjaGFycy5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IGNoYXJzLmNoYXJBdChpKTsKLSAgICAgIGlmIChjID49IDY0ICYmIGMgPCAxMjgpIHJlc3VsdCB8PSAoMUwgPDwgKGMgLSA2NCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgaW4gdGhlIHNldCBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuCi0gIC8vIGJpdG1hc2suCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMsIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaykKLSAgewotICAgIGlmIChjID49IDEyOCkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBjIDwgNjQgPwotICAgICAgKCgxTCA8PCBjKSAmIGxvd0JpdG1hc2spICE9IDAgOgotICAgICAgKCgxTCA8PCAoYyAtIDY0KSkgJiBoaWdoQml0bWFzaykgIT0gMDsKLSAgfQotCi0gIC8vIERlYnVnZ2luZyBtZXRob2Q6IGNvbnZlcnRzIHRoZSBnaXZlbiBsb25nIHRvIGEgc3RyaW5nIG9mIGJpbmFyeSBkaWdpdHMuCi0vKgotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9CaXRzKGxvbmcgbCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKQotICAgIHsKLSAgICAgIGJvb2xlYW4gYiA9IChsICYgMUwpICE9IDA7Ci0gICAgICByZXN1bHQuaW5zZXJ0KDAsIGIgPyAnMScgOiAnMCcpOwotICAgICAgbCA+Pj0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0qLwotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGEgZ2VuZXJpYywgbm9uLWhpZXJhcmNoaWNhbCBVUkkuICBUaGVyZSBpcyBubwotICAgKiBjb25jZXB0IG9mIGEgcmVsYXRpdmUgbm9uLWhpZXJhcmNoaWNhbCBVUkk7IHN1Y2ggYW4gb2JqZWN0IGNhbm5vdCBiZQotICAgKiBjcmVhdGVkLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcwotICAgKiBudWxsLCBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlCi0gICAqIFVSSTwvYT4gc2NoZW1lLCBvciBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+LCA8Y29kZT5vcGFxdWVQYXJ0PC9jb2RlPiwgb3IKLSAgICogPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZQotICAgKiB2YWxpZFNjaGVtZX0sIHtAbGluayAjdmFsaWRPcGFxdWVQYXJ0IHZhbGlkT3BhcXVlUGFydH0sIG9yIHtAbGluawotICAgKiAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgcmVzcGVjdGl2ZWx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlR2VuZXJpY1VSSShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgb3BhcXVlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoc2NoZW1lID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVsYXRpdmUgbm9uLWhpZXJhcmNoaWNhbCBVUkkiKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLWhpZXJhcmNoaWNhbCBhcmNoaXZlIFVSSSIpOwotICAgIH0KLQotICAgIHZhbGlkYXRlVVJJKGZhbHNlLCBzY2hlbWUsIG9wYXF1ZVBhcnQsIG51bGwsIGZhbHNlLCBOT19TRUdNRU5UUywgbnVsbCwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKGZhbHNlLCBzY2hlbWUsIG9wYXF1ZVBhcnQsIG51bGwsIGZhbHNlLCBOT19TRUdNRU5UUywgbnVsbCwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggbm8gcGF0aC4gIFRoZQotICAgKiBVUkkgd2lsbCBiZSByZWxhdGl2ZSBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIG5vbi1udWxsLCBhbmQgYWJzb2x1dGUKLSAgICogb3RoZXJ3aXNlLiAgQW4gYWJzb2x1dGUgVVJJIHdpdGggbm8gcGF0aCByZXF1aXJlcyBhIG5vbi1udWxsCi0gICAqIDxjb2RlPmF1dGhvcml0eTwvY29kZT4gYW5kL29yIDxjb2RlPmRldmljZTwvY29kZT4uCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzCi0gICAqIG5vbi1udWxsIHdoaWxlIDxjb2RlPmF1dGhvcml0eTwvY29kZT4gYW5kIDxjb2RlPmRldmljZTwvY29kZT4gYXJlIG51bGwsCi0gICAqIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMgYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUKLSAgICogVVJJPC9hPiBzY2hlbWUsIG9yIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4sIDxjb2RlPmF1dGhvcml0eTwvY29kZT4sCi0gICAqIDxjb2RlPmRldmljZTwvY29kZT4sIDxjb2RlPnF1ZXJ5PC9jb2RlPiwgb3IgPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdAotICAgKiB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZSB2YWxpZFNoZW1lfSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LAotICAgKiB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwKLSAgICogcmVzcGVjdGl2ZWx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoc2NoZW1lICE9IG51bGwgJiYgYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImFic29sdXRlIGhpZXJhcmNoaWNhbCBVUkkgd2l0aG91dCBhdXRob3JpdHksIGRldmljZSwgcGF0aCIpOwotICAgIH0KLQotICAgIGlmIChpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhcmNoaXZlIFVSSSB3aXRoIG5vIHBhdGgiKTsKLSAgICB9Ci0KLSAgICB2YWxpZGF0ZVVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBmYWxzZSwgTk9fU0VHTUVOVFMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgZmFsc2UsIE5PX1NFR01FTlRTLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYWJzb2x1dGUgcGF0aC4KLSAgICogVGhlIFVSSSB3aWxsIGJlIHJlbGF0aXZlIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMgbm9uLW51bGwsIGFuZAotICAgKiBhYnNvbHV0ZSBvdGhlcndpc2UuIAotICAgKgotICAgKiBAcGFyYW0gc2VnbWVudHMgYW4gYXJyYXkgb2Ygbm9uLW51bGwgc3RyaW5ncywgZWFjaCByZXByZXNlbnRpbmcgb25lCi0gICAqIHNlZ21lbnQgb2YgdGhlIHBhdGguICBBcyBhbiBhYnNvbHV0ZSBwYXRoLCBpdCBpcyBhdXRvbWF0aWNhbGx5Ci0gICAqIHByZWNlZWRlZCBieSBhIDxjb2RlPi88L2NvZGU+IHNlcGFyYXRvci4gIElmIGRlc2lyZWQsIGEgdHJhaWxpbmcKLSAgICogc2VwYXJhdG9yIHNob3VsZCBiZSByZXByZXNlbnRlZCBieSBhbiBlbXB0eS1zdHJpbmcgc2VnbWVudCBhcyB0aGUgbGFzdAotICAgKiBlbGVtZW50IG9mIHRoZSBhcnJheS4gCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzCi0gICAqIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT4gc2NoZW1lIGFuZCAKLSAgICogPGNvZGU+ZGV2aWNlPC9jb2RlPiBpcyBub24tbnVsbCwgb3IgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiwKLSAgICogPGNvZGU+YXV0aG9yaXR5PC9jb2RlPiwgPGNvZGU+ZGV2aWNlPC9jb2RlPiwgPGNvZGU+c2VnbWVudHM8L2NvZGU+LAotICAgKiA8Y29kZT5xdWVyeTwvY29kZT4sIG9yIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvCi0gICAqIHtAbGluayAjdmFsaWRTY2hlbWUgdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fQotICAgKiBvciB7QGxpbmsgI3ZhbGlkQXJjaGl2ZUF1dGhvcml0eSB2YWxpZEFyY2hpdmVBdXRob3JpdHl9LCB7QGxpbmsKLSAgICogI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsKLSAgICogI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgYXMKLSAgICogYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVIaWVyYXJjaGljYWxVUkkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2UsIFN0cmluZ1tdIHNlZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkgJiYgZGV2aWNlICE9IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJjaGl2ZSBVUkkgd2l0aCBkZXZpY2UiKTsKLSAgICB9Ci0KLSAgICBzZWdtZW50cyA9IGZpeChzZWdtZW50cyk7Ci0gICAgdmFsaWRhdGVVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgdHJ1ZSwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgdHJ1ZSwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGZvciBhIHJlbGF0aXZlIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCByZWxhdGl2ZQotICAgKiBwYXRoLgotICAgKgotICAgKiBAcGFyYW0gc2VnbWVudHMgYW4gYXJyYXkgb2Ygbm9uLW51bGwgc3RyaW5ncywgZWFjaCByZXByZXNlbnRpbmcgb25lCi0gICAqIHNlZ21lbnQgb2YgdGhlIHBhdGguICBBIHRyYWlsaW5nIHNlcGFyYXRvciBpcyByZXByZXNlbnRlZCBieSBhbgotICAgKiBlbXB0eS1zdHJpbmcgc2VnbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNlZ21lbnRzPC9jb2RlPiwKLSAgICogPGNvZGU+cXVlcnk8L2NvZGU+LCBvciA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byAKLSAgICoge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yCi0gICAqIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgcmVzcGVjdGl2ZWx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZ1tdIHNlZ21lbnRzLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBzZWdtZW50cyA9IGZpeChzZWdtZW50cyk7Ci0gICAgdmFsaWRhdGVVUkkodHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIENvbnZlcnRzIG51bGwgdG8gbGVuZ3RoLXplcm8gYXJyYXksIGFuZCBjbG9uZXMgYXJyYXkgdG8gZW5zdXJlCi0gIC8vIGltbXV0YWJpbGl0eS4KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZml4KFN0cmluZ1tdIHNlZ21lbnRzKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzID09IG51bGwgPyBOT19TRUdNRU5UUyA6IChTdHJpbmdbXSlzZWdtZW50cy5jbG9uZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSBVUkkgc3RyaW5nLCB3aXRoIAotICAgKiA8YSBocmVmPSIjZGV2aWNlX2V4cGxhbmF0aW9uIj5leHBsaWNpdCBkZXZpY2Ugc3VwcG9ydDwvYT4gYW5kIGhhbmRsaW5nCi0gICAqIGZvciA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUklzPC9hPiBlbmFibGVkLiBUaGUKLSAgICogc3BlY2lmaWVkIHN0cmluZyBpcyBwYXJzZWQgYXMgZGVzY3JpYmVkIGluIDxhCi0gICAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMgMjM5NjwvYT4sIGFuZCBhbgotICAgKiBhcHByb3ByaWF0ZSA8Y29kZT5VUkk8L2NvZGU+IGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLiAgTm90ZSB0aGF0Ci0gICAqIHZhbGlkaXR5IHRlc3RpbmcgaXMgbm90IGFzIHN0cmljdCBhcyBpbiB0aGUgUkZDOyBlc3NlbnRpYWxseSwgb25seQotICAgKiBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZC4gIFNvLCBmb3IgZXhhbXBsZSwgbm9uLUxhdGluCi0gICAqIGFscGhhYmV0IGNoYXJhY3RlcnMgYXBwZWFyaW5nIGluIHRoZSBzY2hlbWUgd291bGQgbm90IGJlIGNvbnNpZGVyZWQgYW4KLSAgICogZXJyb3IuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIDxjb2RlPnVyaTwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lCi0gICAqIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZE9wYXF1ZVBhcnQgdmFsaWRPcGFxdWVQYXJ0fSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5Ci0gICAqIHZhbGlkQXJjaGl2ZUF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCB7QGxpbmsKLSAgICogI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rCi0gICAqICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCBhcyBhcHByb3ByaWF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVSSVdpdGhDYWNoZSh1cmkpOyAKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgdGhhdCBlbmNvZGVzIGFuZCBwYXJzZXMgdGhlIGdpdmVuIFVSSSBzdHJpbmcuCi0gICAqIEFwcHJvcHJpYXRlIGVuY29kaW5nIGlzIHBlcmZvcm1lZCBmb3IgZWFjaCBjb21wb25lbnQgb2YgdGhlIFVSSS4KLSAgICogSWYgbW9yZSB0aGFuIG9uZSA8Y29kZT4jPC9jb2RlPiBpcyBpbiB0aGUgc3RyaW5nLCB0aGUgbGFzdCBvbmUgaXMKLSAgICogYXNzdW1lZCB0byBiZSB0aGUgZnJhZ21lbnQncyBzZXBhcmF0b3IsIGFuZCBhbnkgb3RoZXJzIGFyZSBlbmNvZGVkLgotICAgKiAgCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gPGNvZGU+dXJpPC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUKLSAgICogdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkT3BhcXVlUGFydCB2YWxpZE9wYXF1ZVBhcnR9LCB7QGxpbmsKLSAgICogI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZEFyY2hpdmVBdXRob3JpdHkKLSAgICogdmFsaWRBcmNoaXZlQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIHtAbGluawotICAgKiAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsKLSAgICogI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIGFzIGFwcHJvcHJpYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBjcmVhdGVVUklXaXRoQ2FjaGUoZW5jb2RlVVJJKHVyaSwgaWdub3JlRXNjYXBlZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgVVJJIHN0cmluZywgd2l0aCAKLSAgICogPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZXhwbGljaXQgZGV2aWNlIHN1cHBvcnQ8L2E+IGVuYWJsZWQuICAKLSAgICogTm90ZSB0aGF0IHZhbGlkaXR5IHRlc3RpbmcgaXMgbm90IGEgc3RyaWN0IGFzIGluIHRoZSBSRkM7IGVzc2VudGlhbGx5LAotICAgKiBvbmx5IHNlcGFyYXRvciBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkLiAgU28sIGZvciBleGFtcGxlLCBub24tTGF0aW4KLSAgICogYWxwaGFiZXQgY2hhcmFjdGVycyBhcHBlYXJpbmcgaW4gdGhlIHNjaGVtZSB3b3VsZCBub3QgYmUgY29uc2lkZXJlZCBhbgotICAgKiBlcnJvci4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gPGNvZGU+dXJpPC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUKLSAgICogdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkT3BhcXVlUGFydCB2YWxpZE9wYXF1ZVBhcnR9LCB7QGxpbmsKLSAgICogI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZEFyY2hpdmVBdXRob3JpdHkKLSAgICogdmFsaWRBcmNoaXZlQXV0aG9yaXR5fSwge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIHtAbGluawotICAgKiAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsKLSAgICogI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIGFzIGFwcHJvcHJpYXRlLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNjcmVhdGVVUkkgY3JlYXRlVVJJfSwgd2hpY2ggbm93IGhhcyBleHBsaWNpdAotICAgKiBkZXZpY2Ugc3VwcG9ydCBlbmFibGVkLiBUaGUgdHdvIG1ldGhvZHMgbm93IG9wZXJhdGUgaWRlbnRpY2FsbHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVEZXZpY2VVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiBjcmVhdGVVUklXaXRoQ2FjaGUodXJpKTsKLSAgfQotCi0gIC8vIFVzZXMgYSBjYWNoZSB0byBzcGVlZCB1cCBjcmVhdGlvbiBvZiBhIFVSSSBmcm9tIGEgc3RyaW5nLiAgVGhlIGNhY2hlCi0gIC8vIGlzIGNvbnN1bHRlZCB0byBzZWUgaWYgdGhlIFVSSSwgbGVzcyBhbnkgZnJhZ21lbnQsIGhhcyBhbHJlYWR5IGJlZW4KLSAgLy8gY3JlYXRlZC4gIElmIG5lZWRlZCwgdGhlIGZyYWdtZW50IGlzIHJlLWFwcGVuZGVkIHRvIHRoZSBjYWNoZWQgVVJJLAotICAvLyB3aGljaCBpcyBjb25zaWRlcmFibHkgbW9yZSBlZmZpY2llbnQgdGhhbiBjcmVhdGluZyB0aGUgd2hvbGUgVVJJIGZyb20KLSAgLy8gc2NyYXRjaC4gIElmIHRoZSBVUkkgd2Fzbid0IGZvdW5kIGluIHRoZSBjYWNoZSwgaXQgaXMgY3JlYXRlZCB1c2luZwotICAvLyBwYXJzZUludG9VUkkoKSBhbmQgdGhlbiBjYWNoZWQuICBUaGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIHVzZWQKLSAgLy8gYnkgc3RyaW5nLXBhcnNpbmcgZmFjdG9yeSBtZXRob2RzLCBpbnN0ZWFkIG9mIHBhcnNlSW50b1VSSSgpIGRpcmVjdGx5LgotICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2FzIGluY2x1ZGVkIGluIHRoZSBwdWJsaWMgQVBJIGJ5IG1pc3Rha2UuCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHtAbGluayAjY3JlYXRlVVJJIGNyZWF0ZVVSSX0gaW5zdGVhZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSVdpdGhDYWNoZShTdHJpbmcgdXJpKQotICB7Ci0gICAgaW50IGkgPSB1cmkuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IpOwotICAgIFN0cmluZyBiYXNlID0gaSA9PSAtMSA/IHVyaSA6IHVyaS5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgU3RyaW5nIGZyYWdtZW50ID0gaSA9PSAtMSA/IG51bGwgOiB1cmkuc3Vic3RyaW5nKGkgKyAxKTsKLQotICAgIFVSSSByZXN1bHQgPSAoVVJJKXVyaUNhY2hlLmdldChiYXNlKTsKLQotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwYXJzZUludG9VUkkoYmFzZSk7Ci0gICAgICB1cmlDYWNoZS5wdXQoYmFzZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSByZXN1bHQuYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gU3RyaW5nLXBhcnNpbmcgaW1wbGVtZW50YXRpb24uCi0gIHByaXZhdGUgc3RhdGljIFVSSSBwYXJzZUludG9VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gaGllcmFyY2hpY2FsID0gdHJ1ZTsKLSAgICBTdHJpbmcgc2NoZW1lID0gbnVsbDsKLSAgICBTdHJpbmcgYXV0aG9yaXR5ID0gbnVsbDsKLSAgICBTdHJpbmcgZGV2aWNlID0gbnVsbDsKLSAgICBib29sZWFuIGFic29sdXRlUGF0aCA9IGZhbHNlOwotICAgIFN0cmluZ1tdIHNlZ21lbnRzID0gTk9fU0VHTUVOVFM7Ci0gICAgU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLSAgICBTdHJpbmcgZnJhZ21lbnQgPSBudWxsOwotCi0gICAgaW50IGkgPSAwOwotICAgIGludCBqID0gZmluZCh1cmksIGksIE1BSk9SX1NFUEFSQVRPUl9ISSwgTUFKT1JfU0VQQVJBVE9SX0xPKTsKLQotICAgIGlmIChqIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaikgPT0gU0NIRU1FX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBzY2hlbWUgPSB1cmkuc3Vic3RyaW5nKGksIGopOwotICAgICAgaSA9IGogKyAxOwotICAgIH0KLQotICAgIGJvb2xlYW4gYXJjaGl2ZVNjaGVtZSA9IGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpOwotICAgIGlmIChhcmNoaXZlU2NoZW1lKQotICAgIHsKLSAgICAgIGogPSB1cmkubGFzdEluZGV4T2YoQVJDSElWRV9TRVBBUkFUT1IpOwotICAgICAgaWYgKGogPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIGFyY2hpdmUgc2VwYXJhdG9yIik7Ci0gICAgICB9Ci0gICAgICBoaWVyYXJjaGljYWwgPSB0cnVlOwotICAgICAgYXV0aG9yaXR5ID0gdXJpLnN1YnN0cmluZyhpLCArK2opOwotICAgICAgaSA9IGo7Ci0gICAgfQotICAgIGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEFVVEhPUklUWV9TRVBBUkFUT1IsIGkpKQotICAgIHsKLSAgICAgIGkgKz0gQVVUSE9SSVRZX1NFUEFSQVRPUi5sZW5ndGgoKTsKLSAgICAgIGogPSBmaW5kKHVyaSwgaSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLSAgICAgIGF1dGhvcml0eSA9IHVyaS5zdWJzdHJpbmcoaSwgaik7Ci0gICAgICBpID0gajsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2NoZW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAoaSA9PSB1cmkubGVuZ3RoKCkgfHwgdXJpLmNoYXJBdChpKSAhPSBTRUdNRU5UX1NFUEFSQVRPUikpCi0gICAgewotICAgICAgaGllcmFyY2hpY2FsID0gZmFsc2U7Ci0gICAgICBqID0gdXJpLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SLCBpKTsKLSAgICAgIGlmIChqID09IC0xKSBqID0gdXJpLmxlbmd0aCgpOwotICAgICAgYXV0aG9yaXR5ID0gdXJpLnN1YnN0cmluZyhpLCBqKTsKLSAgICAgIGkgPSBqOwotICAgIH0KLQotICAgIGlmICghYXJjaGl2ZVNjaGVtZSAmJiBpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgewotICAgICAgaiA9IGZpbmQodXJpLCBpICsgMSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLSAgICAgIFN0cmluZyBzID0gdXJpLnN1YnN0cmluZyhpICsgMSwgaik7Ci0gICAgICAKLSAgICAgIGlmIChzLmxlbmd0aCgpID4gMCAmJiBzLmNoYXJBdChzLmxlbmd0aCgpIC0gMSkgPT0gREVWSUNFX0lERU5USUZJRVIpCi0gICAgICB7Ci0gICAgICAgIGRldmljZSA9IHM7Ci0gICAgICAgIGkgPSBqOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgewotICAgICAgaSsrOwotICAgICAgYWJzb2x1dGVQYXRoID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoc2VnbWVudHNSZW1haW4odXJpLCBpKSkKLSAgICB7Ci0gICAgICBMaXN0IHNlZ21lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICB3aGlsZSAoc2VnbWVudHNSZW1haW4odXJpLCBpKSkKLSAgICAgIHsKLSAgICAgICAgaiA9IGZpbmQodXJpLCBpLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotICAgICAgICBzZWdtZW50TGlzdC5hZGQodXJpLnN1YnN0cmluZyhpLCBqKSk7Ci0gICAgICAgIGkgPSBqOwotCi0gICAgICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXNlZ21lbnRzUmVtYWluKHVyaSwgKytpKSkgc2VnbWVudExpc3QuYWRkKFNFR01FTlRfRU1QVFkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZWdtZW50cyA9IG5ldyBTdHJpbmdbc2VnbWVudExpc3Quc2l6ZSgpXTsKLSAgICAgIHNlZ21lbnRMaXN0LnRvQXJyYXkoc2VnbWVudHMpOwotICAgIH0KLQotICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpICYmIHVyaS5jaGFyQXQoaSkgPT0gUVVFUllfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIGogPSB1cmkuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IsICsraSk7Ci0gICAgICBpZiAoaiA9PSAtMSkgaiA9IHVyaS5sZW5ndGgoKTsKLSAgICAgIHF1ZXJ5ID0gdXJpLnN1YnN0cmluZyhpLCBqKTsKLSAgICAgIGkgPSBqOwotICAgIH0KLQotICAgIGlmIChpIDwgdXJpLmxlbmd0aCgpKSAvLyAmJiB1cmkuY2hhckF0KGkpID09IEZSQUdNRU5UX1NFUEFSQVRPUiAoaW1wbGllZCkKLSAgICB7Ci0gICAgICBmcmFnbWVudCA9IHVyaS5zdWJzdHJpbmcoKytpKTsKLSAgICB9Ci0KLSAgICB2YWxpZGF0ZVVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gICAgcmV0dXJuIG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIHN0cmluZyBjb250YWlucyBhbnkgbW9yZSBzZWdtZW50cyBhZnRlciB0aGUgb25lIHRoYXQKLSAgLy8gc3RhcnRzIGF0IHBvc2l0aW9uIGkuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VnbWVudHNSZW1haW4oU3RyaW5nIHVyaSwgaW50IGkpCi0gIHsKLSAgICByZXR1cm4gaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpICE9IFFVRVJZX1NFUEFSQVRPUiAmJgotICAgICAgdXJpLmNoYXJBdChpKSAhPSBGUkFHTUVOVF9TRVBBUkFUT1I7Ci0gIH0KLQotICAvLyBGaW5kcyB0aGUgbmV4dCBvY2N1cmFuY2Ugb2Ygb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzZXQgcmVwcmVzZW50ZWQKLSAgLy8gYnkgdGhlIGdpdmVuIGJpdG1hc2sgaW4gdGhlIGdpdmVuIHN0cmluZywgYmVnaW5uaW5nIGF0IGluZGV4IGkuIFRoZSBpbmRleAotICAvLyBvZiB0aGUgZmlyc3QgZm91bmQgY2hhcmFjdGVyLCBvciBzLmxlbmd0aCgpIGlmIHRoZXJlIGlzIG5vbmUsIGlzCi0gIC8vIHJldHVybmVkLiAgQmVmb3JlIHNlYXJjaGluZywgaSBpcyBsaW1pdGVkIHRvIHRoZSByYW5nZSBbMCwgcy5sZW5ndGgoKV0uCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGludCBmaW5kKFN0cmluZyBzLCBpbnQgaSwgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrKQotICB7Ci0gICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4gbGVuOwotCi0gICAgZm9yIChpID0gaSA+IDAgPyBpIDogMDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtYXRjaGVzKHMuY2hhckF0KGkpLCBoaWdoQml0bWFzaywgbG93Qml0bWFzaykpIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIHtAbGluayBqYXZhLmlvLkZpbGV9IHBhdGgKLSAgICogc3RyaW5nLiAgVGhlIDxjb2RlPnBhdGhOYW1lPC9jb2RlPiBpcyBjb252ZXJ0ZWQgaW50byBhbiBhcHByb3ByaWF0ZQotICAgKiBmb3JtLCBhcyBmb2xsb3dzOiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvcnMgYXJlIGNvbnZlcnRlZCB0bwotICAgKiA8Y29kZT4vPGNvZGU+OyB0aGUgcGF0aCBpcyBlbmNvZGVkOyBhbmQgYSAiZmlsZSIgc2NoZW1lIGFuZCwgaWYgbWlzc2luZywKLSAgICogYSBsZWFkaW5nIDxjb2RlPi88L2NvZGU+LCBhcmUgYWRkZWQgdG8gYW4gYWJzb2x1dGUgcGF0aC4gIFRoZSByZXN1bHQKLSAgICogaXMgdGhlbiBwYXJzZWQgdXNpbmcge0BsaW5rICNjcmVhdGVVUkkoU3RyaW5nKSBjcmVhdGVVUkl9LgotICAgKgotICAgKiA8cD5UaGUgZW5jb2Rpbmcgc3RlcCBlc2NhcGVzIGFsbCBzcGFjZXMsIDxjb2RlPiM8L2NvZGU+IGNoYXJhY3RlcnMsIGFuZAotICAgKiBvdGhlciBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gVVJJcywgYXMgd2VsbCBhcyA8Y29kZT4/PC9jb2RlPiwgd2hpY2gKLSAgICogd291bGQgZGVsaW1pdCBhIHBhdGggZnJvbSBhIHF1ZXJ5LiAgRGVjb2RpbmcgaXMgYXV0b21hdGljYWxseSBwZXJmb3JtZWQKLSAgICogYnkge0BsaW5rICN0b0ZpbGVTdHJpbmcgdG9GaWxlU3RyaW5nfSwgYW5kIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSB2YWx1ZXMKLSAgICogcmV0dXJuZWQgYnkgb3RoZXIgYWNjZXNzb3JzIGJ5IHZpYSB0aGUgc3RhdGljIHtAbGluayAjZGVjb2RlKFN0cmluZykKLSAgICogZGVjb2RlfSBtZXRob2QuCi0gICAqCi0gICAqIDxwPkEgcmVsYXRpdmUgcGF0aCB3aXRoIGEgc3BlY2lmaWVkIGRldmljZSAoc29tZXRoaW5nIGxpa2UKLSAgICogPGNvZGU+QzpteWZpbGUudHh0PC9jb2RlPikgY2Fubm90IGJlIGV4cHJlc3NlZCBhcyBhIHZhbGlkIFVSSS4KLSAgICogCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5wYXRoTmFtZTwvY29kZT4KLSAgICogc3BlY2lmaWVzIGEgZGV2aWNlIGFuZCBhIHJlbGF0aXZlIHBhdGgsIG9yIGlmIGFueSBjb21wb25lbnQgb2YgdGhlIHBhdGgKLSAgICogaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkQXV0aG9yaXR5IHZhbGlkQXV0aG9yaXR5fSwge0BsaW5rCi0gICAqICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIG9yIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwKLSAgICoge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVGaWxlVVJJKFN0cmluZyBwYXRoTmFtZSkKLSAgewotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGhOYW1lKTsKLSAgICBTdHJpbmcgdXJpID0gRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJyA/IHBhdGhOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCBTRUdNRU5UX1NFUEFSQVRPUikgOiBwYXRoTmFtZTsKLSAgICB1cmkgPSBlbmNvZGUodXJpLCBQQVRIX0NIQVJfSEksIFBBVEhfQ0hBUl9MTywgZmFsc2UpOwotICAgIGlmIChmaWxlLmlzQWJzb2x1dGUoKSkKLSAgICB7Ci0gICAgICBVUkkgcmVzdWx0ID0gY3JlYXRlVVJJKCh1cmkuY2hhckF0KDApID09IFNFR01FTlRfU0VQQVJBVE9SID8gImZpbGU6IiA6ICJmaWxlOi8iKSArIHVyaSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVVJJIHJlc3VsdCA9IGNyZWF0ZVVSSSh1cmkpOwotICAgICAgaWYgKHJlc3VsdC5zY2hlbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHJlbGF0aXZlIHBhdGhOYW1lOiAiICsgcGF0aE5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSBwbGF0Zm9ybS1yZWxhdGl2ZSBwYXRoIHN0cmluZy4KLSAgICoKLSAgICogPHA+VGhlIDxjb2RlPnBhdGhOYW1lPC9jb2RlPiBtdXN0IGJlIG9mIHRoZSBmb3JtOgotICAgKiA8cHJlPgotICAgKiAgIC9wcm9qZWN0LW5hbWUvcGF0aDwvcHJlPgotICAgKgotICAgKiA8cD5QbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvcnMgd2lsbCBiZSBjb252ZXJ0ZXJ0ZWQgdG8gc2xhc2hlcy4KLSAgICogSWYgbm90IGluY2x1ZGVkLCB0aGUgbGVhZGluZyBwYXRoIHNlcGFyYXRvciB3aWxsIGJlIGFkZGVkLiAgVGhlCi0gICAqIHJlc3VsdCB3aWxsIGJlIG9mIHRoaXMgZm9ybSwgd2hpY2ggaXMgcGFyc2VkIHVzaW5nIHtAbGluayAjY3JlYXRlVVJJCi0gICAqIGNyZWF0ZVVSSX06Ci0gICAqIDxwcmU+Ci0gICAqICAgcGxhdGZvcm06L3Jlc291cmNlL3Byb2plY3QtbmFtZS9wYXRoPC9wcmU+Ci0gICAqCi0gICAqIAotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNvbXBvbmVudCBwYXJzZWQKLSAgICogZnJvbSB0aGUgcGF0aCBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LAotICAgKiB7QGxpbmsgI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3IKLSAgICoge0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LgotICAgKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybSNyZXNvbHZlCi0gICAqIEBzZWUgI2NyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoU3RyaW5nLCBib29sZWFuKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShTdHJpbmcgcGF0aE5hbWUpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShwYXRoTmFtZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgcGxhdGZvcm0tcmVsYXRpdmUgcGF0aCBzdHJpbmcsCi0gICAqIHdpdGggYW4gb3B0aW9uIHRvIGVuY29kZSB0aGUgY3JlYXRlZCBVUkkuCi0gICAqCi0gICAqIDxwPlRoZSA8Y29kZT5wYXRoTmFtZTwvY29kZT4gbXVzdCBiZSBvZiB0aGUgZm9ybToKLSAgICogPHByZT4KLSAgICogICAvcHJvamVjdC1uYW1lL3BhdGg8L3ByZT4KLSAgICoKLSAgICogPHA+UGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3JzIHdpbGwgYmUgY29udmVydGVydGVkIHRvIHNsYXNoZXMuCi0gICAqIElmIG5vdCBpbmNsdWRlZCwgdGhlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3Igd2lsbCBiZSBhZGRlZC4gIFRoZQotICAgKiByZXN1bHQgd2lsbCBiZSBvZiB0aGlzIGZvcm0sIHdoaWNoIGlzIHBhcnNlZCB1c2luZyB7QGxpbmsgI2NyZWF0ZVVSSQotICAgKiBjcmVhdGVVUkl9OgotICAgKiA8cHJlPgotICAgKiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvcGF0aDwvcHJlPgotICAgKgotICAgKiA8cD5UaGlzIHNjaGVtZSBzdXBwb3J0cyByZWxvY2F0YWJsZSBwcm9qZWN0cyBpbiBFY2xpcHNlIGFuZCBpbgotICAgKiBzdGFuZC1hbG9uZSAuCi0gICAqCi0gICAqIDxwPkRlcGVuZGluZyBvbiB0aGUgPGNvZGU+ZW5jb2RlPC9jb2RlPiBhcmd1bWVudCwgdGhlIHBhdGggbWF5IGJlCi0gICAqIGF1dG9tYXRpY2FsbHkgZW5jb2RlZCB0byBlc2NhcGUgYWxsIHNwYWNlcywgPGNvZGU+IzwvY29kZT4gY2hhcmFjdGVycywKLSAgICogYW5kIG90aGVyIGNoYXJhY3RlcnMgZGlzYWxsb3dlZCBpbiBVUklzLCBhcyB3ZWxsIGFzIDxjb2RlPj88L2NvZGU+LAotICAgKiB3aGljaCB3b3VsZCBkZWxpbWl0IGEgcGF0aCBmcm9tIGEgcXVlcnkuICBEZWNvZGluZyBjYW4gYmUgcGVyZm9ybWVkIHdpdGgKLSAgICogdGhlIHN0YXRpYyB7QGxpbmsgI2RlY29kZShTdHJpbmcpIGRlY29kZX0gbWV0aG9kLgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gdGhlIHBhdGggaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwKLSAgICoge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yCi0gICAqIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fS4KLSAgICoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0jcmVzb2x2ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShTdHJpbmcgcGF0aE5hbWUsIGJvb2xlYW4gZW5jb2RlKQotICB7Ci0gICAgaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSBTRUdNRU5UX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBwYXRoTmFtZSA9IHBhdGhOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCBTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgfQotCi0gICAgaWYgKGVuY29kZSkKLSAgICB7Ci0gICAgICBwYXRoTmFtZSA9IGVuY29kZShwYXRoTmFtZSwgUEFUSF9DSEFSX0hJLCBQQVRIX0NIQVJfTE8sIGZhbHNlKTsKLSAgICB9Ci0gICAgVVJJIHJlc3VsdCA9IGNyZWF0ZVVSSSgocGF0aE5hbWUuY2hhckF0KDApID09IFNFR01FTlRfU0VQQVJBVE9SID8gInBsYXRmb3JtOi9yZXNvdXJjZSIgOiAicGxhdGZvcm06L3Jlc291cmNlLyIpICsgcGF0aE5hbWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8vIFByaXZhdGUgY29uc3RydWN0b3IgZm9yIHVzZSBvZiBzdGF0aWMgZmFjdG9yeSBtZXRob2RzLgotICBwcml2YXRlIFVSSShib29sZWFuIGhpZXJhcmNoaWNhbCwgU3RyaW5nIHNjaGVtZSwgU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgICAgU3RyaW5nIGRldmljZSwgYm9vbGVhbiBhYnNvbHV0ZVBhdGgsIFN0cmluZ1tdIHNlZ21lbnRzLAotICAgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGludCBoYXNoQ29kZSA9IDA7Ci0gICAgLy9ib29sZWFuIGlyaSA9IGZhbHNlOwotCi0gICAgaWYgKGhpZXJhcmNoaWNhbCkKLSAgICB7Ci0gICAgICArK2hhc2hDb2RlOwotICAgIH0KLSAgICBpZiAoYWJzb2x1dGVQYXRoKQotICAgIHsKLSAgICAgIGhhc2hDb2RlICs9IDI7Ci0gICAgfQotICAgIGlmIChzY2hlbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBzY2hlbWUudG9Mb3dlckNhc2UoKS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gYXV0aG9yaXR5Lmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKGF1dGhvcml0eSk7Ci0gICAgfQotICAgIGlmIChkZXZpY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBkZXZpY2UuaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkoZGV2aWNlKTsKLSAgICB9Ci0gICAgaWYgKHF1ZXJ5ICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gcXVlcnkuaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkocXVlcnkpOwotICAgIH0KLSAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBmcmFnbWVudC5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShmcmFnbWVudCk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IHNlZ21lbnRzW2ldLmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0KLSAgICB0aGlzLmhhc2hDb2RlID0gaGFzaENvZGU7Ci0gICAgLy90aGlzLmlyaSA9IGlyaTsKLSAgICB0aGlzLmhpZXJhcmNoaWNhbCA9IGhpZXJhcmNoaWNhbDsKLSAgICB0aGlzLnNjaGVtZSA9IHNjaGVtZSA9PSBudWxsID8gbnVsbCA6IHNjaGVtZS5pbnRlcm4oKTsKLSAgICB0aGlzLmF1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICB0aGlzLmRldmljZSA9IGRldmljZTsKLSAgICB0aGlzLmFic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aDsKLSAgICB0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7Ci0gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5OwotICAgIHRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKLSAgfQotICAKLSAgLy8gVmFsaWRhdGVzIGFsbCBvZiB0aGUgVVJJIGNvbXBvbmVudHMuICBGYWN0b3J5IG1ldGhvZHMgc2hvdWxkIGNhbGwgdGhpcwotICAvLyBiZWZvcmUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yLCB0aG91Z2ggdGhleSBtdXN0IGVuc3VyZSB0aGF0IHRoZQotICAvLyBpbnRlci1jb21wb25lbnQgcmVxdWlyZW1lbnRzIGRlc2NyaWJlZCBpbiB0aGVpciBvd24gSmF2YWRvY3MgYXJlIGFsbAotICAvLyBzYXRpc2ZpZWQsIHRoZW1zZWx2ZXMuICBJZiBhIG5ldyBVUkkgaXMgYmVpbmcgY29uc3RydWN0ZWQgb3V0IG9mCi0gIC8vIGFuIGV4aXN0aW5nIFVSSSwgdGhpcyBuZWVkIG5vdCBiZSBjYWxsZWQuICBJbnN0ZWFkLCBqdXN0IHRoZSBuZXcKLSAgLy8gY29tcG9uZW50cyBtYXkgYmUgdmFsaWRhdGVkIGluZGl2aWR1YWxseS4KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVVSSShib29sZWFuIGhpZXJhcmNoaWNhbCwgU3RyaW5nIHNjaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHksIFN0cmluZyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFic29sdXRlUGF0aCwgU3RyaW5nW10gc2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnksIFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGlmICghdmFsaWRTY2hlbWUoc2NoZW1lKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHNjaGVtZTogIiArIHNjaGVtZSk7Ci0gICAgfQotICAgIGlmICghaGllcmFyY2hpY2FsICYmICF2YWxpZE9wYXF1ZVBhcnQoYXV0aG9yaXR5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG9wYXF1ZVBhcnQ6ICIgKyBhdXRob3JpdHkpOwotICAgIH0KLSAgICBpZiAoaGllcmFyY2hpY2FsICYmICFpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKSAmJiAhdmFsaWRBdXRob3JpdHkoYXV0aG9yaXR5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGF1dGhvcml0eTogIiArIGF1dGhvcml0eSk7Ci0gICAgfQotICAgIGlmIChoaWVyYXJjaGljYWwgJiYgaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkgJiYgIXZhbGlkQXJjaGl2ZUF1dGhvcml0eShhdXRob3JpdHkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgYXV0aG9yaXR5OiAiICsgYXV0aG9yaXR5KTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZERldmljZShkZXZpY2UpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZGV2aWNlOiAiICsgZGV2aWNlKTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZFNlZ21lbnRzKHNlZ21lbnRzKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcyA9IHNlZ21lbnRzID09IG51bGwgPyAiaW52YWxpZCBzZWdtZW50czogIiArIHNlZ21lbnRzIDoKLSAgICAgICAgImludmFsaWQgc2VnbWVudDogIiArIGZpcnN0SW52YWxpZFNlZ21lbnQoc2VnbWVudHMpOwotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzKTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZFF1ZXJ5KHF1ZXJ5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHF1ZXJ5OiAiICsgcXVlcnkpOwotICAgIH0KLSAgICBpZiAoIXZhbGlkRnJhZ21lbnQoZnJhZ21lbnQpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZnJhZ21lbnQ6ICIgKyBmcmFnbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWx0ZXJuYXRlLCBzdHJpY3RlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZvbGxvd2luZyB2YWxpZGF0aW9uIG1ldGhvZHMKLSAgLy8gYXJlIHByb3ZpZGVkLCBjb21tZW50ZWQgb3V0LCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZS4uLgotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBzY2hlbWUgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHNjaGVtZSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlCi0gICAqIGZvbGxvd2luZzogPGNvZGU+OiAvID8gIzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFNjaGVtZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAhY29udGFpbnModmFsdWUsIE1BSk9SX1NFUEFSQVRPUl9ISSwgTUFKT1JfU0VQQVJBVE9SX0xPKTsgIAotCi0gIC8vIDxwPkEgdmFsaWQgc2NoZW1lIG1heSBiZSBudWxsLCBvciBjb25zaXN0IG9mIGEgc2luZ2xlIGxldHRlciBmb2xsb3dlZAotICAvLyBieSBhbnkgbnVtYmVyIG9mIGxldHRlcnMsIG51bWJlcnMsIGFuZCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6Ci0gIC8vIDxjb2RlPisgLSAuPC9jb2RlPgotCi0gICAgLy9pZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgLy9yZXR1cm4gdmFsdWUubGVuZ3RoKCkgIT0gMCAmJgotICAgIC8vICBtYXRjaGVzKHZhbHVlLmNoYXJBdCgwKSwgQUxQSEFfSEksIEFMUEhBX0xPKSAmJgotICAgIC8vICB2YWxpZGF0ZSh2YWx1ZSwgU0NIRU1FX0NIQVJfSEksIFNDSEVNRV9DSEFSX0xPLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIG9wYXF1ZSBwYXJ0IGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBvcGFxdWUgcGFydCBtdXN0IGJlIG5vbi1udWxsLCBub24tZW1wdHksIGFuZCBub3QgY29udGFpbiB0aGUKLSAgICogPGNvZGU+IzwvY29kZT4gY2hhcmFjdGVyLiAgSW4gYWRkaXRpb24sIGl0cyBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBub3QgYmUKLSAgICogPGNvZGU+LzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZE9wYXF1ZVBhcnQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdmFsdWUuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IpID09IC0xICYmCi0gICAgdmFsdWUubGVuZ3RoKCkgPiAwICYmIHZhbHVlLmNoYXJBdCgwKSAhPSBTRUdNRU5UX1NFUEFSQVRPUjsKLQotICAvLyA8cD5BIHZhbGlkIG9wYXF1ZSBwYXJ0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1lbXB0eS4gSXQgbWF5IGNvbnRhaW4KLSAgLy8gYW55IGFsbG93ZWQgVVJJIGNoYXJhY3RlcnMsIGJ1dCBpdHMgZmlyc3QgY2hhcmFjdGVyIG1heSBub3QgYmUKLSAgLy8gPGNvZGU+LzwvY29kZT4gCi0KLSAgICAvL3JldHVybiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpICE9IDAgJiYKLSAgICAvLyAgdmFsdWUuY2hhckF0KDApICE9IFNFR01FTlRfU0VQQVJBVE9SICYmCi0gICAgLy8gIHZhbGlkYXRlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBhdXRob3JpdHkgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIGF1dGhvcml0eSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IKLSAgICogdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/ICM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRBdXRob3JpdHkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIWNvbnRhaW5zKHZhbHVlLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotCi0gIC8vIEEgdmFsaWQgYXV0aG9yaXR5IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGFsbG93ZWQgVVJJIGNoYXJhY3RlcnMgZXhjZXB0Ci0gIC8vIGZvciB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID88L2NvZGU+Ci0KLSAgICAvL3JldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbGlkYXRlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBvZiBhbiA8YQotICAgKiBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+OyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5UbyBiZSB2YWxpZCwgdGhlIGF1dGhvcml0eSwgaXRzZWxmLCBtdXN0IGJlIGEgVVJJIHdpdGggbm8gZnJhZ21lbnQsCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBjaGFyYWN0ZXIgPGNvZGU+ITwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRBcmNoaXZlQXV0aG9yaXR5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCAmJgotICAgICAgICB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoKCkgLSAxKSA9PSBBUkNISVZFX0lERU5USUZJRVIpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSSSBhcmNoaXZlVVJJID0gY3JlYXRlVVJJKHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgcmV0dXJuICFhcmNoaXZlVVJJLmhhc0ZyYWdtZW50KCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIGRldmljZSBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgZGV2aWNlIG1heSBiZSBudWxsIG9yIG5vbi1lbXB0eSwgY29udGFpbmluZyBhbnkgY2hhcmFjdGVycwotICAgKiBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPyAjPC9jb2RlPiAgSW4gYWRkaXRpb24sIGl0cyBsYXN0Ci0gICAqIGNoYXJhY3RlciBtdXN0IGJlIDxjb2RlPjo8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWREZXZpY2UoU3RyaW5nIHZhbHVlKQotICB7ICAgIAotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICBpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgcmV0dXJuIGxlbiA+IDAgJiYgdmFsdWUuY2hhckF0KGxlbiAtIDEpID09IERFVklDRV9JREVOVElGSUVSICYmCi0gICAgICAhY29udGFpbnModmFsdWUsIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0KLSAgLy8gPHA+QSB2YWxpZCBkZXZpY2UgbWF5IGJlIG51bGwgb3Igbm9uLWVtcHR5LCBjb250YWluaW5nIGFueSBhbGxvd2VkIFVSSQotICAvLyBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/PC9jb2RlPiAgSW4gYWRkaXRpb24sIGl0cwotICAvLyBsYXN0IGNoYXJhY3RlciBtdXN0IGJlIDxjb2RlPjo8L2NvZGU+Ci0KLSAgICAvL2lmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICAvL2ludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAvL3JldHVybiBsZW4gPiAwICYmIHZhbGlkYXRlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgdHJ1ZSwgdHJ1ZSkgJiYKLSAgICAvLyAgdmFsdWUuY2hhckF0KGxlbiAtIDEpID09IERFVklDRV9JREVOVElGSUVSOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogYSB2YWxpZCBwYXRoIHNlZ21lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgcGF0aCBzZWdtZW50IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vdCBjb250YWluIGFueSBvZiB0aGUKLSAgICogZm9sbG93aW5nIGNoYXJhY3RlcnM6IDxjb2RlPi8gPyAjPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkU2VnbWVudChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhY29udGFpbnModmFsdWUsIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0KLSAgLy8gPHA+QSB2YWxpZCBwYXRoIHNlZ21lbnQgbXVzdCBiZSBub24tbnVsbCBhbmQgbWF5IGNvbnRhaW4gYW55IGFsbG93ZWQgVVJJCi0gIC8vIGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID88L2NvZGU+IAotCi0gICAgLy9yZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB2YWxpZGF0ZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogYSB2YWxpZCBwYXRoIHNlZ21lbnQgYXJyYXkgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgcGF0aCBzZWdtZW50IGFycmF5IG11c3QgYmUgbm9uLW51bGwgYW5kIGNvbnRhaW4gb25seSBwYXRoCi0gICAqIHNlZ2VtZW50cyB0aGF0IGFyZSB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNlZ21lbnQgdmFsaWRTZWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFNlZ21lbnRzKFN0cmluZ1tdIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKCF2YWxpZFNlZ21lbnQodmFsdWVbaV0pKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gUmV0dXJucyBudWxsIGlmIHRoZSBzcGVjaWNpZWQgdmFsdWUgaXMgbnVsbCBvciB3b3VsZCBiZSBhIHZhbGlkIHBhdGgKLSAgLy8gc2VnbWVudCBhcnJheSBvZiBhIFVSSTsgb3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludmFsaWQKLSAgLy8gc2VnbWVudC4gCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaXJzdEludmFsaWRTZWdtZW50KFN0cmluZ1tdIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXZhbGlkU2VnbWVudCh2YWx1ZVtpXSkpIHJldHVybiB2YWx1ZVtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgcXVlcnkgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHF1ZXJ5IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMgZXhjZXB0IGZvcgotICAgKiA8Y29kZT4jPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkUXVlcnkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUuaW5kZXhPZihGUkFHTUVOVF9TRVBBUkFUT1IpID09IC0xOwotCi0gIC8vIDxwPkEgdmFsaWQgcXVlcnkgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgYWxsb3dlZCBVUkkgY2hhcmFjdGVycy4KLQotICAgIC8vcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsaWRhdGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIHRydWUsIHRydWUpOwotfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBmcmFnbWVudCBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgZnJhZ21lbnQgaXMgdGFrZW4gdG8gYmUgdW5jb25kaXRpb25hbGx5IHZhbGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRnJhZ21lbnQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gPHA+QSB2YWxpZCBmcmFnbWVudCBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBhbGxvd2VkIFVSSSBjaGFyYWN0ZXJzLgotCi0gICAgLy9yZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWxpZGF0ZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvLyBTZWFyY2hlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBmb3IgYW55IGNoYXJhY3RlcnMgaW4gdGhlIHNldCByZXByZXNudGVkCi0gIC8vIGJ5IHRoZSAxMjgtYml0IGJpdG1hc2suICBSZXR1cm5zIHRydWUgaWYgYW55IG9jY3VyLCBvciBmYWxzZSBvdGhlcndpc2UuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHMsIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaykKLSAgewotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKG1hdGNoZXMocy5jaGFyQXQoaSksIGhpZ2hCaXRtYXNrLCBsb3dCaXRtYXNrKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFRlc3RzIHRoZSBub24tbnVsbCBzdHJpbmcgdmFsdWUgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIG9ubHkgQVNDSUkKLSAgLy8gY2hhcmFjdGVycyBpbiB0aGUgc2V0IHJlcHJlc2VudGVkIGJ5IHRoZSBzcGVjaWZpZWQgMTI4LWJpdCBiaXRtYXNrLAotICAvLyBhcyB3ZWxsIGFzLCBvcHRpb25hbGx5LCBub24tQVNDSUkgY2hhcmFjdGVycyAweEEwIGFuZCBhYm92ZSwgYW5kLAotICAvLyBhbHNvIG9wdGlvbmFsbHksIGVzY2FwZSBzZXF1ZW5jZXMgb2YgJSBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cy4KLSAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgdGhlIG5ldywgc3RyaWN0IFVSSSB2YWxpZGF0aW9uIHRoYXQgaXMgbm90Ci0gIC8vIG5vdCBjdXJyZW50bHkgaW4gcGxhY2UuCi0vKgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlKFN0cmluZyB2YWx1ZSwgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dOb25BU0NJSSwgYm9vbGVhbiBhbGxvd0VzY2FwZWQpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7IAotICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwotCi0gICAgICBpZiAobWF0Y2hlcyhjLCBoaWdoQml0bWFzaywgbG93Qml0bWFzaykpIGNvbnRpbnVlOwotICAgICAgaWYgKGFsbG93Tm9uQVNDSUkgJiYgYyA+PSAxNjApIGNvbnRpbnVlOwotICAgICAgaWYgKGFsbG93RXNjYXBlZCAmJiBpc0VzY2FwZWQodmFsdWUsIGkpKQotICAgICAgewotICAgICAgICBpICs9IDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotKi8KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcmVsYXRpdmUgVVJJLCBvcgotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgYW4gYWJzb2x1dGUgVVJJLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1lID09IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGEgYSBoaWVyYXJjaGljYWwgVVJJLCBvcgotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgb2YgdGhlIGdlbmVyaWMgZm9ybS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiBoaWVyYXJjaGljYWw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2ljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5Ci0gICAqIGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNBdXRob3JpdHkoKQotICB7Ci0gICAgcmV0dXJuIGhpZXJhcmNoaWNhbCAmJiBhdXRob3JpdHkgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBub24taGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuCi0gICAqIG9wYXF1ZSBwYXJ0IGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc09wYXF1ZVBhcnQoKQotICB7Ci0gICAgLy8gbm90ZTogaGllcmFyY2hpY2FsIC0+IGF1dGhvcml0eSAhPSBudWxsCi0gICAgcmV0dXJuICFoaWVyYXJjaGljYWw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgZGV2aWNlCi0gICAqIGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0RldmljZSgpCi0gIHsKLSAgICAvLyBub3RlOiBkZXZpY2UgIT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gZGV2aWNlICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuCi0gICAqIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGg7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNQYXRoKCkKLSAgewotICAgIC8vIG5vdGU6IChhYnNvbHV0ZVBhdGggfHwgYXV0aG9yaXR5ID09IG51bGwpIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhYnNvbHV0ZVBhdGggfHwgKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4KLSAgICogYWJzb2x1dGUgcGF0aCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vbi1oaWVyYXJjaGljYWwsIGhhcyBubwotICAgKiBwYXRoLCBvciBoYXMgYSByZWxhdGl2ZSBwYXRoLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQWJzb2x1dGVQYXRoKCkKLSAgewotICAgIC8vIG5vdGU6IGFic29sdXRlUGF0aCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gYWJzb2x1dGVQYXRoOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHJlbGF0aXZlCi0gICAqIHBhdGgsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub24taGllcmFyY2hpY2FsLCBoYXMgbm8gcGF0aCwgb3IKLSAgICogaGFzIGFuIGFic29sdXRlIHBhdGguCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZWxhdGl2ZVBhdGgoKQotICB7Ci0gICAgLy8gbm90ZTogYXV0aG9yaXR5ID09IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuIGVtcHR5Ci0gICAqIHJlbGF0aXZlIHBhdGg7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuICAKLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IDxjb2RlPiFoYXNFbXB0eSgpPC9jb2RlPiBkb2VzIDxlbT5ub3Q8L2VtPiBpbXBseSB0aGF0IHRoaXMKLSAgICogVVJJIGhhcyBhbnkgcGF0aCBzZWdtZW50czsgaG93ZXZlciwgPGNvZGU+aGFzUmVsYXRpdmVQYXRoICYmCi0gICAqICFoYXNFbXB0eVBhdGgoKTwvY29kZT4gZG9lcy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0VtcHR5UGF0aCgpCi0gIHsKLSAgICAvLyBub3RlOiBhdXRob3JpdHkgPT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCAmJgotICAgICAgc2VnbWVudHMubGVuZ3RoID09IDA7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcXVlcnkKLSAgICogY29tcG9uZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUXVlcnkoKQotICB7Ci0gICAgLy8gbm90ZTogcXVlcnkgIT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gcXVlcnkgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgVVJJIGhhcyBhIGZyYWdtZW50IGNvbXBvbmVudDsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiBmcmFnbWVudCAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlOyB0aGF0Ci0gICAqIGlzLCBpZiBpdCBpcyBhIHJlbGF0aXZlIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBubyBhdXRob3JpdHksIGRldmljZSBvcgotICAgKiBxdWVyeSBjb21wb25lbnRzLCBhbmQgbm8gcGF0aCBzZWdtZW50czsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkCi0gICAqIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ3VycmVudERvY3VtZW50UmVmZXJlbmNlKCkKLSAgewotICAgIC8vIG5vdGU6IGF1dGhvcml0eSA9PSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoICYmCi0gICAgICBzZWdtZW50cy5sZW5ndGggPT0gMCAmJiBxdWVyeSA9PSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHtAbGluawotICAgKiAjaXNDdXJyZW50RG9jdW1lbnRSZWZlcmVuY2UoKSBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZX0gd2l0aCBubwotICAgKiBmcmFnbWVudCBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIEBzZWUgI2lzQ3VycmVudERvY3VtZW50UmVmZXJlbmNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICB7Ci0gICAgLy8gbm90ZTogYXV0aG9yaXR5ID09IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGggJiYKLSAgICAgIHNlZ21lbnRzLmxlbmd0aCA9PSAwICYmIHF1ZXJ5ID09IG51bGwgJiYgZnJhZ21lbnQgPT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHRoYXQgbWF5IHJlZmVyCi0gICAqIGRpcmVjdGx5IHRvIGEgbG9jYWxseSBhY2Nlc3NpYmxlIGZpbGUuICBUaGlzIGlzIGNvbnNpZGVyZWQgdG8gYmUgdGhlCi0gICAqIGNhc2UgZm9yIGEgZmlsZS1zY2hlbWUgYWJzb2x1dGUgVVJJLCBvciBmb3IgYSByZWxhdGl2ZSBVUkkgd2l0aCBubyBxdWVyeTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gaXNIaWVyYXJjaGljYWwoKSAmJgotICAgICAgKChpc1JlbGF0aXZlKCkgJiYgIWhhc1F1ZXJ5KCkpIHx8IFNDSEVNRV9GSUxFLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBhcmNoaXZlIFVSSS4gIElmIHNvLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKLSAgLy8gaXQgaXMgYWxzbyBoaWVyYXJjaGljYWwsIHdpdGggYW4gYXV0aG9yaXR5IChjb25zaXN0aW5nIG9mIGFuIGFic29sdXRlCi0gIC8vIFVSSSBmb2xsb3dlZCBieSAiISIpLCBubyBkZXZpY2UsIGFuZCBhbiBhYnNvbHV0ZSBwYXRoLgotICBwcml2YXRlIGJvb2xlYW4gaXNBcmNoaXZlKCkKLSAgewotICAgIHJldHVybiBpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBzY2hlbWUgb2YgYW4gPGEKLSAgICogaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPjsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FyY2hpdmVTY2hlbWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgYXJjaGl2ZVNjaGVtZXMuY29udGFpbnModmFsdWUudG9Mb3dlckNhc2UoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUuCi0gICAqLwotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgewotICAgIHJldHVybiBoYXNoQ29kZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPm9iajwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2YKLSAgICogPGNvZGU+VVJJPC9jb2RlPiBlcXVhbCB0byB0aGlzIG9uZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+RXF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBzdHJpY3RseSBieSBjb21wYXJpbmcgY29tcG9uZW50cywgbm90IGJ5Ci0gICAqIGF0dGVtcHRpbmcgdG8gaW50ZXJwcmV0IHdoYXQgcmVzb3VyY2UgaXMgYmVpbmcgaWRlbnRpZmllZC4gIFRoZQotICAgKiBjb21wYXJpc29uIG9mIHNjaGVtZXMgaXMgY2FzZS1pbnNlbnNpdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotICB7Ci0gICAgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBVUkkpKSByZXR1cm4gZmFsc2U7Ci0gICAgVVJJIHVyaSA9IChVUkkpIG9iajsKLQotICAgIHJldHVybiBoYXNoQ29kZSA9PSB1cmkuaGFzaENvZGUoKSAmJgotICAgICAgaGllcmFyY2hpY2FsID09IHVyaS5pc0hpZXJhcmNoaWNhbCgpICYmCi0gICAgICBhYnNvbHV0ZVBhdGggPT0gdXJpLmhhc0Fic29sdXRlUGF0aCgpICYmCi0gICAgICBlcXVhbHMoc2NoZW1lLCB1cmkuc2NoZW1lKCksIHRydWUpICYmCi0gICAgICBlcXVhbHMoYXV0aG9yaXR5LCBoaWVyYXJjaGljYWwgPyB1cmkuYXV0aG9yaXR5KCkgOiB1cmkub3BhcXVlUGFydCgpKSAmJgotICAgICAgZXF1YWxzKGRldmljZSwgdXJpLmRldmljZSgpKSAmJgotICAgICAgZXF1YWxzKHF1ZXJ5LCB1cmkucXVlcnkoKSkgJiYgCi0gICAgICBlcXVhbHMoZnJhZ21lbnQsIHVyaS5mcmFnbWVudCgpKSAmJgotICAgICAgc2VnbWVudHNFcXVhbCh1cmkpOwotICB9Ci0KLSAgLy8gVGVzdHMgd2hldGhlciB0aGlzIFVSSSdzIHBhdGggc2VnbWVudCBhcnJheSBpcyBlcXVhbCB0byB0aGF0IG9mIHRoZQotICAvLyBnaXZlbiB1cmkuCi0gIHByaXZhdGUgYm9vbGVhbiBzZWdtZW50c0VxdWFsKFVSSSB1cmkpCi0gIHsKLSAgICBpZiAoc2VnbWVudHMubGVuZ3RoICE9IHVyaS5zZWdtZW50Q291bnQoKSkgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXNlZ21lbnRzW2ldLmVxdWFscyh1cmkuc2VnbWVudChpKSkpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBUZXN0cyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHksIHRvbGVyYXRpbmcgbnVsbHM7IG51bGwgaXMgY29uc2lkZXJlZAotICAvLyB0byBiZSBhIHZhbGlkIHZhbHVlIHRoYXQgaXMgb25seSBlcXVhbCB0byBpdHNlbGYuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICB7Ci0gICAgcmV0dXJuIG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKTsKLSAgfQotCi0gIC8vIFRlc3RzIHR3byBzdHJpbmdzIGZvciBlcXVhbGl0eSwgdG9sZXJhdGluZyBudWxscyBhbmQgb3B0aW9uYWxseQotICAvLyBpZ25vcmluZyBjYXNlLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgczEsIFN0cmluZyBzMiwgYm9vbGVhbiBpZ25vcmVDYXNlKQotICB7Ci0gICAgcmV0dXJuIHMxID09IG51bGwgPyBzMiA9PSBudWxsIDoKLSAgICAgIGlnbm9yZUNhc2UgPyBzMS5lcXVhbHNJZ25vcmVDYXNlKHMyKSA6IHMxLmVxdWFscyhzMik7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBVUkksIHJldHVybnMgdGhlIHNjaGVtZSBjb21wb25lbnQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc2NoZW1lKCkKLSAgewotICAgIHJldHVybiBzY2hlbWU7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIG5vbi1oaWVyYXJjaGljYWwgVVJJLCByZXR1cm5zIHRoZSBvcGFxdWUgcGFydCBjb21wb25lbnQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgb3BhcXVlUGFydCgpCi0gIHsKLSAgICByZXR1cm4gaXNIaWVyYXJjaGljYWwoKSA/IG51bGwgOiBhdXRob3JpdHk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50LCByZXR1cm5zIGl0OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGF1dGhvcml0eSgpCi0gIHsKLSAgICByZXR1cm4gaXNIaWVyYXJjaGljYWwoKSA/IGF1dGhvcml0eSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50IHRoYXQgaGFzIGEKLSAgICogdXNlciBpbmZvIHBvcnRpb24sIHJldHVybnMgaXQ7IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdXNlckluZm8oKQotICB7IAotICAgIGlmICghaGFzQXV0aG9yaXR5KCkpIHJldHVybiBudWxsOwotICAgCi0gICAgaW50IGkgPSBhdXRob3JpdHkuaW5kZXhPZihVU0VSX0lORk9fU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaSA8IDAgPyBudWxsIDogYXV0aG9yaXR5LnN1YnN0cmluZygwLCBpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuIGF1dGhvcml0eSBjb21wb25lbnQgdGhhdCBoYXMgYQotICAgKiBob3N0IHBvcnRpb24sIHJldHVybnMgaXQ7IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgaG9zdCgpCi0gIHsKLSAgICBpZiAoIWhhc0F1dGhvcml0eSgpKSByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBpbnQgaSA9IGF1dGhvcml0eS5pbmRleE9mKFVTRVJfSU5GT19TRVBBUkFUT1IpOwotICAgIGludCBqID0gYXV0aG9yaXR5LmluZGV4T2YoUE9SVF9TRVBBUkFUT1IpOwotICAgIHJldHVybiBqIDwgMCA/IGF1dGhvcml0eS5zdWJzdHJpbmcoaSArIDEpIDogYXV0aG9yaXR5LnN1YnN0cmluZyhpICsgMSwgaik7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50IHRoYXQgaGFzIGEKLSAgICogcG9ydCBwb3J0aW9uLCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHBvcnQoKQotICB7Ci0gICAgaWYgKCFoYXNBdXRob3JpdHkoKSkgcmV0dXJuIG51bGw7Ci0KLSAgICBpbnQgaSA9IGF1dGhvcml0eS5pbmRleE9mKFBPUlRfU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaSA8IDAgPyBudWxsIDogYXV0aG9yaXR5LnN1YnN0cmluZyhpICsgMSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIGRldmljZSBjb21wb25lbnQsIHJldHVybnMgaXQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZGV2aWNlKCkKLSAgewotICAgIHJldHVybiBkZXZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHBhdGgsIHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZwotICAgKiB0aGUgc2VnbWVudHMgb2YgdGhlIHBhdGg7IGFuIGVtcHR5IGFycmF5IG90aGVyd2lzZS4gIFRoZSBsZWFkaW5nCi0gICAqIHNlcGFyYXRvciBpbiBhbiBhYnNvbHV0ZSBwYXRoIGlzIG5vdCByZXByZXNlbnRlZCBpbiB0aGlzIGFycmF5LCBidXQgYQotICAgKiB0cmFpbGluZyBzZXBhcmF0b3IgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHktc3RyaW5nIHNlZ21lbnQgYXMgdGhlCi0gICAqIGZpbmFsIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gc2VnbWVudHMoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlzZWdtZW50cy5jbG9uZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBzZWdtZW50cyBhcyB0aGUgYXJyYXkKLSAgICogcmV0dXJuZWQgYnkge0BsaW5rICNzZWdtZW50cyBzZWdtZW50c30uCi0gICAqLwotICBwdWJsaWMgTGlzdCBzZWdtZW50c0xpc3QoKQotICB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChzZWdtZW50cykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2VnbWVudCBhcnJheSB0aGF0IHdvdWxkIGJlCi0gICAqIHJldHVybmVkIGJ5IHtAbGluayAjc2VnbWVudHMgc2VnbWVudHN9LgotICAgKi8KLSAgcHVibGljIGludCBzZWdtZW50Q291bnQoKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aDsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBmYXN0LCBpbmRleGVkIGFjY2VzcyB0byBpbmRpdmlkdWFsIHNlZ21lbnRzIGluIHRoZSBwYXRoCi0gICAqIHNlZ21lbnQgYXJyYXkuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgPGNvZGU+aSA8IDA8L2NvZGU+IG9yCi0gICAqIDxjb2RlPmkgPj0gc2VnbWVudENvdW50KCk8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBzZWdtZW50KGludCBpKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzW2ldOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxhc3Qgc2VnbWVudCBpbiB0aGUgc2VnbWVudCBhcnJheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGxhc3RTZWdtZW50KCkKLSAgewotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gc2VnbWVudHNbbGVuIC0gMV07Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHBhdGgsIHJldHVybnMgYSBzdHJpbmcKLSAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGg7IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4gIFRoZSBwYXRoCi0gICAqIGNvbnNpc3RzIG9mIGEgbGVhZGluZyBzZWdtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIgKGEgc2xhc2gpLCBpZiB0aGUKLSAgICogcGF0aCBpcyBhYnNvbHV0ZSwgZm9sbG93ZWQgYnkgdGhlIHNsYXNoLXNlcGFyYXRlZCBwYXRoIHNlZ21lbnRzLiAgSWYKLSAgICogdGhpcyBVUkkgaGFzIGEgc2VwYXJhdGUgPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZGV2aWNlCi0gICAqIGNvbXBvbmVudDwvYT4sIGl0IGlzIDxlbT5ub3Q8L2VtPiBpbmNsdWRlZCBpbiB0aGUgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcGF0aCgpCi0gIHsKLSAgICBpZiAoIWhhc1BhdGgoKSkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBwYXRoLCByZXR1cm5zIGEgc3RyaW5nCi0gICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGF1dGhvcml0eSBhbmQgdGhlIAotICAgKiA8YSBocmVmPSIjZGV2aWNlX2V4cGxhbmF0aW9uIj5kZXZpY2UgY29tcG9uZW50PC9hPjsgCi0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4gIAotICAgKgotICAgKiA8cD5JZiB0aGVyZSBpcyBubyBhdXRob3JpdHksIHRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgYW4gYXV0aG9yaXR5LCBpdCBpczoKLSAgICogPHByZT4KLSAgICogICAvL2F1dGhvcml0eS9kZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKgotICAgKiA8cD5Gb3IgYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPiwgaXQncyBqdXN0OgotICAgKiA8cHJlPgotICAgKiAgIGF1dGhvcml0eS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGRldmljZVBhdGgoKQotICB7Ci0gICAgaWYgKCFoYXNQYXRoKCkpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGlmIChoYXNBdXRob3JpdHkoKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzQXJjaGl2ZSgpKSByZXN1bHQuYXBwZW5kKEFVVEhPUklUWV9TRVBBUkFUT1IpOwotICAgICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotCi0gICAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgIH0KLQotICAgIGlmIChoYXNEZXZpY2UoKSkgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQsIHJldHVybnMgaXQ7Ci0gICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcXVlcnkoKQotICB7Ci0gICAgcmV0dXJuIHF1ZXJ5OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBmcm9tIHRoaXMgVVJJIGFuZCB0aGUgZ2l2ZW4gcXVlcnkuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZgotICAgKiA8Y29kZT5xdWVyeTwvY29kZT4gaXMgbm90IGEgdmFsaWQgcXVlcnkgKHBvcnRpb24pIGFjY29yZGluZwotICAgKiB0byB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZFF1ZXJ5KFN0cmluZyBxdWVyeSkKLSAgewotICAgIGlmICghdmFsaWRRdWVyeShxdWVyeSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImludmFsaWQgcXVlcnkgcG9ydGlvbjogIiArIHF1ZXJ5KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOyAKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBoYXMgYSBub24tbnVsbCB7QGxpbmsgI3F1ZXJ5IHF1ZXJ5fSwgcmV0dXJucyB0aGUgVVJJCi0gICAqIGZvcm1lZCBieSByZW1vdmluZyBpdDsgdGhpcyBVUkkgdW5jaGFuZ2VkLCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1RdWVyeSgpCi0gIHsKLSAgICBpZiAocXVlcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgbnVsbCwgZnJhZ21lbnQpOyAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgaGFzIGEgZnJhZ21lbnQgY29tcG9uZW50LCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPgotICAgKiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiBmcmFnbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGZyb20gdGhpcyBVUkkgYW5kIHRoZSBnaXZlbiBmcmFnbWVudC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmCi0gICAqIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QgYSB2YWxpZCBmcmFnbWVudCAocG9ydGlvbikgYWNjb3JkaW5nCi0gICAqIHRvIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kRnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKCF2YWxpZEZyYWdtZW50KGZyYWdtZW50KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiaW52YWxpZCBmcmFnbWVudCBwb3J0aW9uOiAiICsgZnJhZ21lbnQpOwotICAgIH0KLSAgICBVUkkgcmVzdWx0ID0gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7IAotCi0gICAgaWYgKCFoYXNGcmFnbWVudCgpKQotICAgIHsKLSAgICAgIHJlc3VsdC5jYWNoZWRUcmltRnJhZ21lbnQgPSB0aGlzOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIGhhcyBhIG5vbi1udWxsIHtAbGluayAjZnJhZ21lbnQgZnJhZ21lbnR9LCByZXR1cm5zIHRoZSBVUkkKLSAgICogZm9ybWVkIGJ5IHJlbW92aW5nIGl0OyB0aGlzIFVSSSB1bmNoYW5nZWQsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgdHJpbUZyYWdtZW50KCkKLSAgewotICAgIGlmIChmcmFnbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICBlbHNlIGlmIChjYWNoZWRUcmltRnJhZ21lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjYWNoZWRUcmltRnJhZ21lbnQgPSBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIG51bGwpOyAKLSAgICB9Ci0KLSAgICByZXR1cm4gY2FjaGVkVHJpbUZyYWdtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc29sdmVzIHRoaXMgVVJJIHJlZmVyZW5jZSBhZ2FpbnN0IGEgPGNvZGU+YmFzZTwvY29kZT4gYWJzb2x1dGUKLSAgICogaGllcmFyY2hpY2FsIFVSSSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgYWJzb2x1dGUgVVJJLiAgSWYgYWxyZWFkeQotICAgKiBhYnNvbHV0ZSwgdGhlIFVSSSBpdHNlbGYgaXMgcmV0dXJuZWQuICBVUkkgcmVzb2x1dGlvbiBpcyBkZXNjcmliZWQgaW4KLSAgICogZGV0YWlsIGluIHNlY3Rpb24gNS4yIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMKLSAgICogMjM5NjwvYT4sICJSZXNvbHZpbmcgUmVsYXRpdmUgUmVmZXJlbmNlcyB0byBBYnNvbHV0ZSBGb3JtLiIKLSAgICoKLSAgICogPHA+RHVyaW5nIHJlc29sdXRpb24sIGVtcHR5IHNlZ21lbnRzLCBzZWxmIHJlZmVyZW5jZXMgKCIuIiksIGFuZCBwYXJlbnQKLSAgICogcmVmZXJlbmNlcyAoIi4uIikgYXJlIGludGVycHJldGVkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgICogcGF0aC4gIFN0ZXAgNihnKSBnaXZlcyBhIGNob2ljZSBvZiBob3cgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHBhcmVudAotICAgKiByZWZlcmVuY2VzIHBvaW50IHRvIGEgcGF0aCBhYm92ZSB0aGUgcm9vdDogdGhlIG9mZmVuZGluZyBzZWdtZW50cyBjYW4KLSAgICogYmUgcHJlc2VydmVkIG9yIGRpc2NhcmRlZC4gIFRoaXMgbWV0aG9kIHByZXNlcnZlcyB0aGVtLiAgVG8gaGF2ZSB0aGVtCi0gICAqIGRpc2NhcmRlZCwgcGxlYXNlIHVzZSB0aGUgdHdvLXBhcmFtZXRlciBmb3JtIG9mIHtAbGluawotICAgKiAjcmVzb2x2ZShVUkksIGJvb2xlYW4pIHJlc29sdmV9LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgcmVzb2x2ZShVUkkgYmFzZSkKLSAgewotICAgIHJldHVybiByZXNvbHZlKGJhc2UsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc29sdmVzIHRoaXMgVVJJIHJlZmVyZW5jZSBhZ2FpbnN0IGEgPGNvZGU+YmFzZTwvY29kZT4gYWJzb2x1dGUKLSAgICogaGllcmFyY2hpY2FsIFVSSSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgYWJzb2x1dGUgVVJJLiAgSWYgYWxyZWFkeQotICAgKiBhYnNvbHV0ZSwgdGhlIFVSSSBpdHNlbGYgaXMgcmV0dXJuZWQuICBVUkkgcmVzb2x1dGlvbiBpcyBkZXNjcmliZWQgaW4KLSAgICogZGV0YWlsIGluIHNlY3Rpb24gNS4yIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMKLSAgICogMjM5NjwvYT4sICJSZXNvbHZpbmcgUmVsYXRpdmUgUmVmZXJlbmNlcyB0byBBYnNvbHV0ZSBGb3JtLiIKLSAgICoKLSAgICogPHA+RHVyaW5nIHJlc3VsdGlvbiwgZW1wdHkgc2VnbWVudHMsIHNlbGYgcmVmZXJlbmNlcyAoIi4iKSwgYW5kIHBhcmVudAotICAgKiByZWZlcmVuY2VzICgiLi4iKSBhcmUgaW50ZXJwcmV0ZWQsIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZQotICAgKiBwYXRoLiAgU3RlcCA2KGcpIGdpdmVzIGEgY2hvaWNlIG9mIGhvdyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcGFyZW50Ci0gICAqIHJlZmVyZW5jZXMgcG9pbnQgdG8gYSBwYXRoIGFib3ZlIHRoZSByb290OiB0aGUgb2ZmZW5kaW5nIHNlZ21lbnRzIGNhbgotICAgKiBiZSBwcmVzZXJ2ZWQgb3IgZGlzY2FyZGVkLiAgVGhpcyBtZXRob2QgY2FuIGRvIGVpdGhlci4KLSAgICoKLSAgICogQHBhcmFtIHByZXNlcnZlUm9vdFBhcmVudHMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2VnbWVudHMgcmVmZXJpbmcgdG8gdGhlCi0gICAqIHBhcmVudCBvZiB0aGUgcm9vdCBwYXRoIGFyZSB0byBiZSBwcmVzZXJ2ZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5Ci0gICAqIGFyZSB0byBiZSBkaXNjYXJkZWQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcwotICAgKiBub24taGllcmFyY2hpY2FsIG9yIGlzIHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIFVSSSByZXNvbHZlKFVSSSBiYXNlLCBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoIWJhc2UuaXNIaWVyYXJjaGljYWwoKSB8fCBiYXNlLmlzUmVsYXRpdmUoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAicmVzb2x2ZSBhZ2FpbnN0IG5vbi1oaWVyYXJjaGljYWwgb3IgcmVsYXRpdmUgYmFzZSIpOwotICAgIH0KLQotICAgIC8vIGFuIGFic29sdXRlIFVSSSBuZWVkcyBubyByZXNvbHZpbmcKLSAgICBpZiAoIWlzUmVsYXRpdmUoKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICAvLyBub3RlOiBpc1JlbGF0aXZlKCkgLT4gaGllcmFyY2hpY2FsCi0KLSAgICBTdHJpbmcgbmV3QXV0aG9yaXR5ID0gYXV0aG9yaXR5OwotICAgIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2U7Ci0gICAgYm9vbGVhbiBuZXdBYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBzZWdtZW50czsKLSAgICBTdHJpbmcgbmV3UXVlcnkgPSBxdWVyeTsKLSAgICAvLyBub3RlOiBpdCdzIG9rYXkgZm9yIHR3byBVUklzIHRvIHNoYXJlIGEgc2VnbWVudHMgYXJyYXksIHNpbmNlCi0gICAgLy8gbmVpdGhlciB3aWxsIGV2ZXIgbW9kaWZ5IGl0Ci0gICAgCi0gICAgaWYgKGF1dGhvcml0eSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIG5vIGF1dGhvcml0eTogdXNlIGJhc2UncwotICAgICAgbmV3QXV0aG9yaXR5ID0gYmFzZS5hdXRob3JpdHkoKTsKLQotICAgICAgaWYgKGRldmljZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBubyBkZXZpY2U6IHVzZSBiYXNlJ3MKLSAgICAgICAgbmV3RGV2aWNlID0gYmFzZS5kZXZpY2UoKTsKLQotICAgICAgICBpZiAoaGFzRW1wdHlQYXRoKCkgJiYgcXVlcnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlOiB1c2UgYmFzZSBwYXRoIGFuZCBxdWVyeQotICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGJhc2UuaGFzQWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBiYXNlLnNlZ21lbnRzKCk7Ci0gICAgICAgICAgbmV3UXVlcnkgPSBiYXNlLnF1ZXJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyByZWxhdGl2ZSBwYXRoOiBtZXJnZSB3aXRoIGJhc2UgYW5kIGtlZXAgcXVlcnkgKG5vdGU6IGlmIHRoZQotICAgICAgICAgIC8vIGJhc2UgaGFzIG5vIHBhdGggYW5kIHRoaXMgYSBub24tZW1wdHkgcmVsYXRpdmUgcGF0aCwgdGhlcmUgaXMKLSAgICAgICAgICAvLyBhbiBpbXBsaWVkIHJvb3QgaW4gdGhlIHJlc3VsdGluZyBwYXRoKSAKLSAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBiYXNlLmhhc0Fic29sdXRlUGF0aCgpIHx8ICFoYXNFbXB0eVBhdGgoKTsKLSAgICAgICAgICBuZXdTZWdtZW50cyA9IG5ld0Fic29sdXRlUGF0aCA/IG1lcmdlUGF0aChiYXNlLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICAgICAgICAgICAgOiBOT19TRUdNRU5UUzsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIGFic29sdXRlIHBhdGg6IGtlZXAgaXQgYW5kIHF1ZXJ5Ci0gICAgICB9Ci0gICAgICAvLyBlbHNlIGtlZXAgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLSAgICB9Ci0gICAgLy8gZWxzZSBrZWVwIGF1dGhvcml0eSwgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLSAgICAKLSAgICAvLyBhbHdheXMga2VlcCBmcmFnbWVudCwgZXZlbiBpZiBudWxsLCBhbmQgdXNlIHNjaGVtZSBmcm9tIGJhc2U7Ci0gICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQgc2luY2UgYWxsIGNvbXBvbmVudHMgYXJlIGZyb20gZXhpc3RpbmcgVVJJcwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIGJhc2Uuc2NoZW1lKCksIG5ld0F1dGhvcml0eSwgbmV3RGV2aWNlLAotICAgICAgICAgICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCwgbmV3U2VnbWVudHMsIG5ld1F1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBNZXJnZXMgdGhpcyBVUkkncyByZWxhdGl2ZSBwYXRoIHdpdGggdGhlIGJhc2Ugbm9uLXJlbGF0aXZlIHBhdGguICBJZgotICAvLyBiYXNlIGhhcyBubyBwYXRoLCB0cmVhdCBpdCBhcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLCB1bmxlc3MgdGhpcyBoYXMKLSAgLy8gbm8gcGF0aCBlaXRoZXIuCi0gIHByaXZhdGUgU3RyaW5nW10gbWVyZ2VQYXRoKFVSSSBiYXNlLCBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoYmFzZS5oYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXJnZSBhZ2FpbnN0IHJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0gICAgaWYgKCFoYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtZXJnZSBub24tcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLQotICAgIGludCBiYXNlU2VnbWVudENvdW50ID0gYmFzZS5zZWdtZW50Q291bnQoKTsKLSAgICBpbnQgc2VnbWVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotICAgIFN0cmluZ1tdIHN0YWNrID0gbmV3IFN0cmluZ1tiYXNlU2VnbWVudENvdW50ICsgc2VnbWVudENvdW50XTsKLSAgICBpbnQgc3AgPSAwOwotCi0gICAgLy8gdXNlIGEgc3RhY2sgdG8gYWNjdW11bGF0ZSBzZWdtZW50cyBvZiBiYXNlLCBleGNlcHQgZm9yIHRoZSBsYXN0Ci0gICAgLy8gKGkuZS4gc2tpcCB0cmFpbGluZyBzZXBhcmF0b3IgYW5kIGFueXRoaW5nIGZvbGxvd2luZyBpdCksIGFuZCBvZgotICAgIC8vIHJlbGF0aXZlIHBhdGgKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VTZWdtZW50Q291bnQgLSAxOyBpKyspCi0gICAgewotICAgICAgc3AgPSBhY2N1bXVsYXRlKHN0YWNrLCBzcCwgYmFzZS5zZWdtZW50KGkpLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRDb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHNwID0gYWNjdW11bGF0ZShzdGFjaywgc3AsIHNlZ21lbnRzW2ldLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgcmVsYXRpdmUgcGF0aCBpcyBlbXB0eSBvciBlbmRzIGluIGFuIGVtcHR5IHNlZ21lbnQsIGEgcGFyZW50IAotICAgIC8vIHJlZmVyZW5jZSwgb3IgYSBzZWxmIHJlZmVyZW5mY2UsIGFkZCBhIHRyYWlsaW5nIHNlcGFyYXRvciB0byBhCi0gICAgLy8gbm9uLWVtcHR5IHBhdGgKLSAgICBpZiAoc3AgPiAwICYmICAoc2VnbWVudENvdW50ID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgIFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkgfHwKLSAgICAgICAgICAgICAgICAgICAgU0VHTUVOVF9TRUxGLmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkpKQotICAgIHsKLSAgICAgIHN0YWNrW3NwKytdID0gU0VHTUVOVF9FTVBUWTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gYSBjb3JyZWN0bHkgc2l6ZWQgcmVzdWx0Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzcF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzdGFjaywgMCwgcmVzdWx0LCAwLCBzcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIEFkZHMgYSBzZWdtZW50IHRvIGEgc3RhY2ssIHNraXBwaW5nIGVtcHR5IHNlZ21lbnRzIGFuZCBzZWxmIHJlZmVyZW5jZXMsCi0gIC8vIGFuZCBpbnRlcnByZXRpbmcgcGFyZW50IHJlZmVyZW5jZXMuCi0gIHByaXZhdGUgc3RhdGljIGludCBhY2N1bXVsYXRlKFN0cmluZ1tdIHN0YWNrLCBpbnQgc3AsIFN0cmluZyBzZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMpCi0gIHsKLSAgICBpZiAoU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnQpKQotICAgIHsKLSAgICAgIGlmIChzcCA9PSAwKQotICAgICAgewotICAgICAgICAvLyBzcGVjaWFsIGNhcmUgbXVzdCBiZSB0YWtlbiBmb3IgYSByb290J3MgcGFyZW50IHJlZmVyZW5jZTogaXQgaXMKLSAgICAgICAgLy8gZWl0aGVyIGlnbm9yZWQgb3IgdGhlIHN5bWJvbGljIHJlZmVyZW5jZSBpdHNlbGYgaXMgcHVzaGVkCi0gICAgICAgIGlmIChwcmVzZXJ2ZVJvb3RQYXJlbnRzKSBzdGFja1tzcCsrXSA9IHNlZ21lbnQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHVubGVzcyB3ZSdyZSBhbHJlYWR5IGFjY3VtdWxhdGluZyByb290IHBhcmVudCByZWZlcmVuY2VzLAotICAgICAgICAvLyBwYXJlbnQgcmVmZXJlbmNlcyBzaW1wbHkgcG9wIHRoZSBsYXN0IHNlZ21lbnQgZGVzY2VuZGVkCi0gICAgICAgIGlmIChTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc3RhY2tbc3AgLSAxXSkpIHN0YWNrW3NwKytdID0gc2VnbWVudDsKLSAgICAgICAgZWxzZSBzcC0tOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudCkgJiYgIVNFR01FTlRfU0VMRi5lcXVhbHMoc2VnbWVudCkpCi0gICAgewotICAgICAgLy8gc2tpcCBlbXB0eSBzZWdtZW50cyBhbmQgc2VsZiByZWZlcmVuY2VzOyBwdXNoIGV2ZXJ5dGhpbmcgZWxzZQotICAgICAgc3RhY2tbc3ArK10gPSBzZWdtZW50OwotICAgIH0KLSAgICByZXR1cm4gc3A7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIHNob3J0ZXN0IHJlbGF0aXZlIG9yLCBpZiBuZWNlc3NhcnksIHRoZSBhYnNvbHV0ZSBVUkkgdGhhdCwKLSAgICogd2hlbiByZXNvbHZlZCBhZ2FpbnN0IHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPiBhYnNvbHV0ZSBoaWVyYXJjaGljYWwKLSAgICogVVJJIHVzaW5nIHtAbGluayAjcmVzb2x2ZShVUkkpIHJlc29sdmV9LCB3aWxsIHlpZWxkIHRoaXMgYWJzb2x1dGUgVVJJLiAgCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcwotICAgKiBub24taGllcmFyY2hpY2FsIG9yIGlzIHJlbGF0aXZlLgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+dGhpczwvY29kZT4gaXMKLSAgICogcmVsYXRpdmUuCi0gICAqLwotICBwdWJsaWMgVVJJIGRlcmVzb2x2ZShVUkkgYmFzZSkKLSAgewotICAgIHJldHVybiBkZXJlc29sdmUoYmFzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIGFuIGFic29sdXRlIFVSSSB0aGF0LCB3aGVuIHJlc29sdmVkIGFnYWluc3QgdGhlIGdpdmVuCi0gICAqIDxjb2RlPmJhc2U8L2NvZGU+IGFic29sdXRlIGhpZXJhcmNoaWNhbCBVUkkgdXNpbmcge0BsaW5rCi0gICAqICNyZXNvbHZlKFVSSSwgYm9vbGVhbikgcmVzb2x2ZX0sIHdpbGwgeWllbGQgdGhpcyBhYnNvbHV0ZSBVUkkuCi0gICAqCi0gICAqIEBwYXJhbSBwcmVzZXJ2ZVJvb3RQYXJlbnRzIHRoZSBib29sZWFuIGFyZ3VtZW50IHRvIDxjb2RlPnJlc29sdmUoVVJJLAotICAgKiBib29sZWFuKTwvY29kZT4gZm9yIHdoaWNoIHRoZSByZXR1cm5lZCBVUkkgc2hvdWxkIHJlc29sdmUgdG8gdGhpcyBVUkkuCi0gICAqIEBwYXJhbSBhbnlSZWxQYXRoIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmV0dXJuZWQgVVJJJ3MgcGF0aCAoaWYKLSAgICogYW55KSB3aWxsIGJlIHJlbGF0aXZlLCBpZiBwb3NzaWJsZS4gIElmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGZvcm0gb2YKLSAgICogdGhlIHJlc3VsdCdzIHBhdGggd2lsbCBkZXBlbmQgdXBvbiB0aGUgbmV4dCBwYXJhbWV0ZXIuCi0gICAqIEBwYXJhbSBzaG9ydGVyUmVsUGF0aCBpZiA8Y29kZT5hbnlSZWxQYXRoPC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogYW5kIHRoaXMgcGFyYW1ldGVyIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmV0dXJuZWQgVVJJJ3MgcGF0aCAoaWYKLSAgICogYW55KSB3aWxsIGJlIHJlbGF0aXZlLCBpZiBvbmUgY2FuIGJlIGZvdW5kIHRoYXQgaXMgbm8gbG9uZ2VyIChieSBudW1iZXIKLSAgICogb2Ygc2VnbWVudHMpIHRoYW4gdGhlIGFic29sdXRlIHBhdGguICBJZiBib3RoIDxjb2RlPmFueVJlbFBhdGg8L2NvZGU+Ci0gICAqIGFuZCB0aGlzIHBhcmFtZXRlciBhcmUgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpdCB3aWxsIGJlIGFic29sdXRlLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPnRoaXM8L2NvZGU+IGlzCi0gICAqIHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIFVSSSBkZXJlc29sdmUoVVJJIGJhc2UsIGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbnlSZWxQYXRoLCBib29sZWFuIHNob3J0ZXJSZWxQYXRoKQotICB7Ci0gICAgaWYgKCFiYXNlLmlzSGllcmFyY2hpY2FsKCkgfHwgYmFzZS5pc1JlbGF0aXZlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImRlcmVzb2x2ZSBhZ2FpbnN0IG5vbi1oaWVyYXJjaGljYWwgb3IgcmVsYXRpdmUgYmFzZSIpOwotICAgIH0KLSAgICBpZiAoaXNSZWxhdGl2ZSgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRlcmVzb2x2ZSByZWxhdGl2ZSBVUkkiKTsKLSAgICB9Ci0KLSAgICAvLyBub3RlOiB0aGVzZSBhc3NlcnRpb25zIGltcGx5IHRoYXQgbmVpdGhlciB0aGlzIG5vciB0aGUgYmFzZSBVUkkgaGFzIGEKLSAgICAvLyByZWxhdGl2ZSBwYXRoOyB0aHVzLCBib3RoIGhhdmUgZWl0aGVyIGFuIGFic29sdXRlIHBhdGggb3Igbm8gcGF0aAotICAgIAotICAgIC8vIGRpZmZlcmVudCBzY2hlbWU6IG5lZWQgY29tcGxldGUsIGFic29sdXRlIFVSSQotICAgIGlmICghc2NoZW1lLmVxdWFsc0lnbm9yZUNhc2UoYmFzZS5zY2hlbWUoKSkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gc2luY2UgYmFzZSBtdXN0IGJlIGhpZXJhcmNoaWNhbCwgYW5kIHNpbmNlIGEgbm9uLWhpZXJhcmNoaWNhbCBVUkkKLSAgICAvLyBtdXN0IGhhdmUgYm90aCBzY2hlbWUgYW5kIG9wYXF1ZSBwYXJ0LCB0aGUgY29tcGxldGUgYWJzb2x1dGUgVVJJIGlzCi0gICAgLy8gbmVlZGVkIHRvIHJlc29sdmUgdG8gYSBub24taGllcmFyY2hpY2FsIFVSSQotICAgIGlmICghaXNIaWVyYXJjaGljYWwoKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmcgbmV3QXV0aG9yaXR5ID0gYXV0aG9yaXR5OwotICAgIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2U7Ci0gICAgYm9vbGVhbiBuZXdBYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBzZWdtZW50czsKLSAgICBTdHJpbmcgbmV3UXVlcnkgPSBxdWVyeTsKLQotICAgIGlmIChlcXVhbHMoYXV0aG9yaXR5LCBiYXNlLmF1dGhvcml0eSgpKSAmJgotICAgICAgICAoaGFzRGV2aWNlKCkgfHwgaGFzUGF0aCgpIHx8ICghYmFzZS5oYXNEZXZpY2UoKSAmJiAhYmFzZS5oYXNQYXRoKCkpKSkKLSAgICB7Ci0gICAgICAvLyBtYXRjaGluZyBhdXRob3JpdGllcyBhbmQgbm8gZGV2aWNlIG9yIHBhdGggcmVtb3ZhbAotICAgICAgbmV3QXV0aG9yaXR5ID0gbnVsbDsKLQotICAgICAgaWYgKGVxdWFscyhkZXZpY2UsIGJhc2UuZGV2aWNlKCkpICYmIChoYXNQYXRoKCkgfHwgIWJhc2UuaGFzUGF0aCgpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbWF0Y2hpbmcgZGV2aWNlcyBhbmQgbm8gcGF0aCByZW1vdmFsCi0gICAgICAgIG5ld0RldmljZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gZXhjZXB0aW9uIGlmICghaGFzUGF0aCgpICYmIGJhc2UuaGFzUGF0aCgpKQotCi0gICAgICAgIGlmICghYW55UmVsUGF0aCAmJiAhc2hvcnRlclJlbFBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB1c2VyIHJlamVjdHMgYSByZWxhdGl2ZSBwYXRoOiBrZWVwIGFic29sdXRlIG9yIG5vIHBhdGgKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChoYXNQYXRoKCkgPT0gYmFzZS5oYXNQYXRoKCkgJiYgc2VnbWVudHNFcXVhbChiYXNlKSAmJgotICAgICAgICAgICAgICAgICBlcXVhbHMocXVlcnksIGJhc2UucXVlcnkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZToga2VlcCBubyBwYXRoIG9yIHF1ZXJ5Ci0gICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gZmFsc2U7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBOT19TRUdNRU5UUzsKLSAgICAgICAgICBuZXdRdWVyeSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIWhhc1BhdGgoKSAmJiAhYmFzZS5oYXNQYXRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBubyBwYXRoczoga2VlcCBxdWVyeSBvbmx5Ci0gICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gZmFsc2U7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBOT19TRUdNRU5UUzsKLSAgICAgICAgfQotICAgICAgICAvLyBleGNlcHRpb24gaWYgKCFoYXNBYnNvbHV0ZVBhdGgoKSkKLSAgICAgICAgZWxzZSBpZiAoaGFzQ29sbGFwc2FibGVTZWdtZW50cyhwcmVzZXJ2ZVJvb3RQYXJlbnRzKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIHBhdGggZm9ybSBkZW1hbmRzIGFuIGFic29sdXRlIHBhdGg6IGtlZXAgaXQgYW5kIHF1ZXJ5Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8ga2VlcCBxdWVyeSBhbmQgc2VsZWN0IHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggYmFzZWQgb24gbGVuZ3RoCi0gICAgICAgICAgU3RyaW5nW10gcmVsID0gZmluZFJlbGF0aXZlUGF0aChiYXNlLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICAgICAgICBpZiAoYW55UmVsUGF0aCB8fCBzZWdtZW50cy5sZW5ndGggPiByZWwubGVuZ3RoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVzZXIgZGVtYW5kcyBhIHJlbGF0aXZlIHBhdGggb3IgdGhlIGFic29sdXRlIHBhdGggaXMgbG9uZ2VyCi0gICAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBmYWxzZTsKLSAgICAgICAgICAgIG5ld1NlZ21lbnRzID0gcmVsOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBlbHNlIGtlZXAgc2hvcnRlciBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGVsc2Uga2VlcCBkZXZpY2UsIHBhdGgsIGFuZCBxdWVyeQotICAgIH0KLSAgICAvLyBlbHNlIGtlZXAgYXV0aG9yaXR5LCBkZXZpY2UsIHBhdGgsIGFuZCBxdWVyeQotCi0gICAgLy8gYWx3YXlzIGluY2x1ZGUgZnJhZ21lbnQsIGV2ZW4gaWYgbnVsbDsKLSAgICAvLyBubyB2YWxpZGF0aW9uIG5lZWRlZCBzaW5jZSBhbGwgY29tcG9uZW50cyBhcmUgZnJvbSBleGlzdGluZyBVUklzCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgbnVsbCwgbmV3QXV0aG9yaXR5LCBuZXdEZXZpY2UsIG5ld0Fic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgbmV3UXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9uLXJlbGF0aXZlIHBhdGggaW5jbHVkZXMgc2VnbWVudHMgdGhhdCB3b3VsZCBiZQotICAvLyBjb2xsYXBzZWQgd2hlbiByZXNvbHZpbmc7IGZhbHNlIG90aGVyd2lzZS4gIElmIHByZXNlcnZlUm9vdFBhcmVudHMgaXMKLSAgLy8gdHJ1ZSwgY29sbGFwc2FibGUgc2VnbWVudHMgaW5jbHVkZSBhbnkgZW1wdHkgc2VnbWVudHMsIGV4Y2VwdCBmb3IgdGhlCi0gIC8vIGxhc3Qgc2VnbWVudCwgYXMgd2VsbCBhcyBhbmQgcGFyZW50IGFuZCBzZWxmIHJlZmVyZW5jZXMuICBJZgotICAvLyBwcmVzZXJ2ZVJvb3RzUGFyZW50cyBpcyBmYWxzZSwgcGFyZW50IHJlZmVyZW5jZXMgYXJlIG5vdCBjb2xsYXBzYWJsZSBpZgotICAvLyB0aGV5IGFyZSB0aGUgZmlyc3Qgc2VnbWVudCBvciBwcmVjZWVkZWQgb25seSBieSBvdGhlciBwYXJlbnQKLSAgLy8gcmVmZXJlbmNlcy4KLSAgcHJpdmF0ZSBib29sZWFuIGhhc0NvbGxhcHNhYmxlU2VnbWVudHMoYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlc3QgY29sbGFwc2FiaWxpdHkgb2YgcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VnbWVudCA9IHNlZ21lbnRzW2ldOwotICAgICAgaWYgKChpIDwgbGVuIC0gMSAmJiBTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50KSkgfHwKLSAgICAgICAgICBTRUdNRU5UX1NFTEYuZXF1YWxzKHNlZ21lbnQpIHx8Ci0gICAgICAgICAgU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnQpICYmICgKLSAgICAgICAgICAgICFwcmVzZXJ2ZVJvb3RQYXJlbnRzIHx8ICgKLSAgICAgICAgICAgICAgaSAhPSAwICYmICFTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc2VnbWVudHNbaSAtIDFdKSkpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2hvcnRlc3QgcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHRoZSB0aGUgbm9uLXJlbGF0aXZlIHBhdGggb2YKLSAgLy8gdGhlIGdpdmVuIGJhc2UgYW5kIHRoaXMgYWJzb2x1dGUgcGF0aC4gIElmIHRoZSBiYXNlIGhhcyBubyBwYXRoLCBpdCBpcwotICAvLyB0cmVhdGVkIGFzIHRoZSByb290IGFic29sdXRlIHBhdGguCi0gIHByaXZhdGUgU3RyaW5nW10gZmluZFJlbGF0aXZlUGF0aChVUkkgYmFzZSwgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGJhc2UuaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImZpbmQgcmVsYXRpdmUgcGF0aCBhZ2FpbnN0IGJhc2Ugd2l0aCByZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotICAgIGlmICghaGFzQWJzb2x1dGVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImZpbmQgcmVsYXRpdmUgcGF0aCBvZiBub24tYWJzb2x1dGUgcGF0aCIpOwotICAgIH0KLQotICAgIC8vIHRyZWF0IGFuIGVtcHR5IGJhc2UgcGF0aCBhcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoCi0gICAgU3RyaW5nW10gc3RhcnRQYXRoID0gYmFzZS5jb2xsYXBzZVNlZ21lbnRzKHByZXNlcnZlUm9vdFBhcmVudHMpOwotICAgIFN0cmluZ1tdIGVuZFBhdGggPSBzZWdtZW50czsKLQotICAgIC8vIGRyb3AgbGFzdCBzZWdtZW50IGZyb20gYmFzZSwgYXMgaW4gcmVzb2x2aW5nCi0gICAgaW50IHN0YXJ0Q291bnQgPSBzdGFydFBhdGgubGVuZ3RoID4gMCA/IHN0YXJ0UGF0aC5sZW5ndGggLSAxIDogMDsKLSAgICBpbnQgZW5kQ291bnQgPSBlbmRQYXRoLmxlbmd0aDsKLQotICAgIC8vIGluZGV4IG9mIGZpcnN0IHNlZ21lbnQgdGhhdCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBlbmRQYXRoIGFuZCBzdGFydFBhdGgKLSAgICBpbnQgZGlmZiA9IDA7Ci0KLSAgICAvLyBpZiBlbmRQYXRoIGlzIHNob3J0ZXIgdGhhbiBzdGFydFBhdGgsIHRoZSBsYXN0IHNlZ21lbnQgb2YgZW5kUGF0aCBtYXkKLSAgICAvLyBub3QgYmUgY29tcGFyZWQ6IGJlY2F1c2Ugc3RhcnRQYXRoIGhhcyBiZWVuIGNvbGxhcHNlZCBhbmQgaGFkIGl0cwotICAgIC8vIGxhc3Qgc2VnbWVudCByZW1vdmVkLCBhbGwgcHJlY2VlZGluZyBzZWdtZW50cyBjYW4gYmUgY29uc2lkZXJlZCBub24tCi0gICAgLy8gZW1wdHkgYW5kIGZvbGxvd2VkIGJ5IGEgc2VwYXJhdG9yLCB3aGlsZSB0aGUgbGFzdCBzZWdtZW50IG9mIGVuZFBhdGgKLSAgICAvLyB3aWxsIGVpdGhlciBiZSBub24tZW1wdHkgYW5kIG5vdCBmb2xsb3dlZCBieSBhIHNlcGFyYXRvciwgb3IganVzdCBlbXB0eQotICAgIGZvciAoaW50IGNvdW50ID0gc3RhcnRDb3VudCA8IGVuZENvdW50ID8gc3RhcnRDb3VudCA6IGVuZENvdW50IC0gMTsKLSAgICAgICAgIGRpZmYgPCBjb3VudCAmJiBzdGFydFBhdGhbZGlmZl0uZXF1YWxzKGVuZFBhdGhbZGlmZl0pOyBkaWZmKyspOwotCi0gICAgaW50IHVwQ291bnQgPSBzdGFydENvdW50IC0gZGlmZjsKLSAgICBpbnQgZG93bkNvdW50ID0gZW5kQ291bnQgLSBkaWZmOwotCi0gICAgLy8gYSBzaW5nbGUgc2VwYXJhdG9yLCBwb3NzaWJseSBwcmVjZWVkZWQgYnkgc29tZSBwYXJlbnQgcmVmZXJlbmNlCi0gICAgLy8gc2VnbWVudHMsIGlzIHJlZHVuZGFudAotICAgIGlmIChkb3duQ291bnQgPT0gMSAmJiBTRUdNRU5UX0VNUFRZLmVxdWFscyhlbmRQYXRoW2VuZENvdW50IC0gMV0pKQotICAgIHsKLSAgICAgIGRvd25Db3VudCA9IDA7Ci0gICAgfQotCi0gICAgLy8gYW4gZW1wdHkgcGF0aCBuZWVkcyB0byBiZSByZXBsYWNlZCBieSBhIHNpbmdsZSAiLiIgaWYgdGhlcmUgaXMgbm8KLSAgICAvLyBxdWVyeSwgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhIGN1cnJlbnQgZG9jdW1lbnQgcmVmZXJlbmNlCi0gICAgaWYgKHVwQ291bnQgKyBkb3duQ291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocXVlcnkgPT0gbnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFNFR01FTlRfU0VMRiB9OwotICAgICAgcmV0dXJuIE5PX1NFR01FTlRTOwotICAgIH0KLQotICAgIC8vIHJldHVybiBhIGNvcnJlY3RseSBzaXplZCByZXN1bHQKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3VwQ291bnQgKyBkb3duQ291bnRdOwotICAgIEFycmF5cy5maWxsKHJlc3VsdCwgMCwgdXBDb3VudCwgU0VHTUVOVF9QQVJFTlQpOwotICAgIFN5c3RlbS5hcnJheWNvcHkoZW5kUGF0aCwgZGlmZiwgcmVzdWx0LCB1cENvdW50LCBkb3duQ291bnQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBDb2xsYXBzZXMgbm9uLWVuZGluZyBlbXB0eSBzZWdtZW50cywgcGFyZW50IHJlZmVyZW5jZXMsIGFuZCBzZWxmCi0gIC8vIHJlZmVyZW5jZXMgaW4gYSBub24tcmVsYXRpdmUgcGF0aCwgcmV0dXJuaW5nIHRoZSBzYW1lIHBhdGggdGhhdCB3b3VsZAotICAvLyBiZSBwcm9kdWNlZCBmcm9tIHRoZSBiYXNlIGhpZXJhcmNoaWNhbCBVUkkgYXMgcGFydCBvZiBhIHJlc29sdmUuCi0gIFN0cmluZ1tdIGNvbGxhcHNlU2VnbWVudHMoYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbGxhcHNlIHJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBpZiAoIWhhc0NvbGxhcHNhYmxlU2VnbWVudHMocHJlc2VydmVSb290UGFyZW50cykpIHJldHVybiBzZWdtZW50cygpOwotCi0gICAgLy8gdXNlIGEgc3RhY2sgdG8gYWNjdW11bGF0ZSBzZWdtZW50cwotICAgIGludCBzZWdtZW50Q291bnQgPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgU3RyaW5nW10gc3RhY2sgPSBuZXcgU3RyaW5nW3NlZ21lbnRDb3VudF07Ci0gICAgaW50IHNwID0gMDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudENvdW50OyBpKyspCi0gICAgewotICAgICAgc3AgPSBhY2N1bXVsYXRlKHN0YWNrLCBzcCwgc2VnbWVudHNbaV0sIHByZXNlcnZlUm9vdFBhcmVudHMpOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vbi1lbXB0eSBhbmQgb3JpZ2luYWxseSBlbmRlZCBpbiBhbiBlbXB0eSBzZWdtZW50LCBhCi0gICAgLy8gcGFyZW50IHJlZmVyZW5jZSwgb3IgYSBzZWxmIHJlZmVyZW5jZSwgYWRkIGEgdHJhaWxpbmcgc2VwYXJhdG9yCi0gICAgaWYgKHNwID4gMCAmJiAoU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSB8fAotICAgICAgICAgICAgICAgICAgIFNFR01FTlRfU0VMRi5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgc3RhY2tbc3ArK10gPSBTRUdNRU5UX0VNUFRZOwotICAgIH0KLQotICAgIC8vIHJldHVybiBhIGNvcnJlY3RseSBzaXplZCByZXN1bHQKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3NwXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHN0YWNrLCAwLCByZXN1bHQsIDAsIHNwKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSSS4gIEZvciBhIGdlbmVyaWMsCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgVVJJLCB0aGlzIGxvb2tzIGxpa2U6Ci0gICAqIDxwcmU+Ci0gICAqICAgc2NoZW1lOm9wYXF1ZVBhcnQjZnJhZ21lbnQ8L3ByZT4KLSAgICogCi0gICAqIDxwPkZvciBhIGhpZXJhcmNoaWNhbCBVUkksIGl0IGxvb2tzIGxpa2U6Ci0gICAqIDxwcmU+Ci0gICAqICAgc2NoZW1lOi8vYXV0aG9yaXR5L2RldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uP3F1ZXJ5I2ZyYWdtZW50PC9wcmU+Ci0gICAqCi0gICAqIDxwPkZvciBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+LCBpdCdzIGp1c3Q6Ci0gICAqIDxwcmU+Ci0gICAqICAgc2NoZW1lOmF1dGhvcml0eS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uP3F1ZXJ5I2ZyYWdtZW50PC9wcmU+Ci0gICAqIDxwPk9mIGNvdXJzZSwgYWJzZW50IGNvbXBvbmVudHMgYW5kIHRoZWlyIHNlcGFyYXRvcnMgd2lsbCBiZSBvbWl0dGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoY2FjaGVkVG9TdHJpbmcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgaWYgKCFpc1JlbGF0aXZlKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc2NoZW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChTQ0hFTUVfU0VQQVJBVE9SKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzSGllcmFyY2hpY2FsKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChoYXNBdXRob3JpdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNBcmNoaXZlKCkpIHJlc3VsdC5hcHBlbmQoQVVUSE9SSVRZX1NFUEFSQVRPUik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0RldmljZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0Fic29sdXRlUGF0aCgpKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaSAhPSAwKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNRdWVyeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChRVUVSWV9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQocXVlcnkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGhhc0ZyYWdtZW50KCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoRlJBR01FTlRfU0VQQVJBVE9SKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmcmFnbWVudCk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRUb1N0cmluZyA9IHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gY2FjaGVkVG9TdHJpbmc7Ci0gIH0KLQotICAvLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVVJJIGZvciBkZWJ1Z2dpbmcsIGV4cGxpY2l0bHkKLSAgLy8gc2hvd2luZyBlYWNoIG9mIHRoZSBjb21wb25lbnRzLgotICBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBpbmNsdWRlU2ltcGxlRm9ybSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKGluY2x1ZGVTaW1wbGVGb3JtKSByZXN1bHQuYXBwZW5kKHRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuIGhpZXJhcmNoaWNhbDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChoaWVyYXJjaGljYWwpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICAgIHNjaGVtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChzY2hlbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgIGF1dGhvcml0eTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICAgIGRldmljZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuIGFic29sdXRlUGF0aDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChhYnNvbHV0ZVBhdGgpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICBzZWdtZW50czogIik7Ci0gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PSAwKSByZXN1bHQuYXBwZW5kKCI8ZW1wdHk+Iik7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCkgcmVzdWx0LmFwcGVuZCgiXG4gICAgICAgICAgICAgICAiKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudHNbaV0pOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgICAgcXVlcnk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocXVlcnkpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuICAgICBmcmFnbWVudDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChmcmFnbWVudCk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIG1heSByZWZlciBkaXJlY3RseSB0byBhIGxvY2FsbHkgYWNjZXNzaWJsZSBmaWxlLCBhcwotICAgKiBkZXRlcm1pbmVkIGJ5IHtAbGluayAjaXNGaWxlIGlzRmlsZX0sIHtAbGluayBkZWNvZGUgZGVjb2Rlc30gYW5kIGZvcm1hdHMgIAotICAgKiB0aGUgVVJJIGFzIGEgcGF0aG5hbWUgdG8gdGhhdCBmaWxlOyByZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5JZiB0aGVyZSBpcyBubyBhdXRob3JpdHksIHRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmcgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgYW4gYXV0aG9yaXR5LCBpdCBpczoKLSAgICogPHByZT4KLSAgICogICAvL2F1dGhvcml0eS9kZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKiAKLSAgICogPHA+SG93ZXZlciwgdGhlIGNoYXJhY3RlciB1c2VkIGFzIGEgc2VwYXJhdG9yIGlzIHN5c3RlbS1kZXBlbmRhbnQgYW5kCi0gICAqIG9idGFpbmVkIGZyb20ge0BsaW5rIGphdmEuaW8uRmlsZSNzZXBhcmF0b3JDaGFyfS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9GaWxlU3RyaW5nKCkKLSAgewotICAgIGlmICghaXNGaWxlKCkpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBjaGFyIHNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotICAgIGlmIChoYXNBdXRob3JpdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICByZXN1bHQuYXBwZW5kKGF1dGhvcml0eSk7Ci0KLSAgICAgIGlmIChoYXNEZXZpY2UoKSkgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotICAgIH0KLQotICAgIGlmIChoYXNEZXZpY2UoKSkgcmVzdWx0LmFwcGVuZChkZXZpY2UpOwotICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2VnbWVudHNbaV0pOwotICAgIH0KLQotICAgIHJldHVybiBkZWNvZGUocmVzdWx0LnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBvbiB0byB0aGUgZW5kCi0gICAqIG9mIHRoZSBwYXRoIG9mIHRoaXMgVVJJLCBpZiBoaWVyYXJjaGljYWw7IHRoaXMgVVJJIHVuY2hhbmdlZCwKLSAgICogb3RoZXJ3aXNlLiAgSWYgdGhpcyBVUkkgaGFzIGFuIGF1dGhvcml0eSBhbmQvb3IgZGV2aWNlLCBidXQgbm8gcGF0aCwKLSAgICogdGhlIHNlZ21lbnQgYmVjb21lcyB0aGUgZmlyc3QgdW5kZXIgdGhlIHJvb3QgaW4gYW4gYWJzb2x1dGUgcGF0aC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNlZ21lbnQ8L2NvZGU+Ci0gICAqIGlzIG5vdCBhIHZhbGlkIHNlZ21lbnQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTZWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kU2VnbWVudChTdHJpbmcgc2VnbWVudCkKLSAgewotICAgIGlmICghdmFsaWRTZWdtZW50KHNlZ21lbnQpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc2VnbWVudDogIiArIHNlZ21lbnQpOwotICAgIH0KLQotICAgIGlmICghaXNIaWVyYXJjaGljYWwoKSkgcmV0dXJuIHRoaXM7Ci0KLSAgICAvLyBhYnNvbHV0ZSBwYXRoIG9yIG5vIHBhdGggLT4gYWJzb2x1dGUgcGF0aAotICAgIGJvb2xlYW4gbmV3QWJzb2x1dGVQYXRoID0gIWhhc1JlbGF0aXZlUGF0aCgpOwotCi0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbbGVuICsgMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbik7Ci0gICAgbmV3U2VnbWVudHNbbGVuXSA9IHNlZ21lbnQ7Ci0KLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBuZXdBYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgdGhlIHNwZWNpZmllZCBzZWdtZW50cyBvbiB0byB0aGUKLSAgICogZW5kIG9mIHRoZSBwYXRoIG9mIHRoaXMgVVJJLCBpZiBoaWVyYXJjaGljYWw7IHRoaXMgVVJJIHVuY2hhbmdlZCwKLSAgICogb3RoZXJ3aXNlLiAgSWYgdGhpcyBVUkkgaGFzIGFuIGF1dGhvcml0eSBhbmQvb3IgZGV2aWNlLCBidXQgbm8gcGF0aCwKLSAgICogdGhlIHNlZ21lbnRzIGFyZSBtYWRlIHRvIGZvcm0gYW4gYWJzb2x1dGUgcGF0aC4KLSAgICoKLSAgICogQHBhcmFtIHNlZ21lbnRzIGFuIGFycmF5IG9mIG5vbi1udWxsIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIG9uZQotICAgKiBzZWdtZW50IG9mIHRoZSBwYXRoLiAgSWYgZGVzaXJlZCwgYSB0cmFpbGluZyBzZXBhcmF0b3Igc2hvdWxkIGJlCi0gICAqIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5LXN0cmluZyBzZWdtZW50IGFzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCi0gICAqIGFycmF5LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2VnbWVudHM8L2NvZGU+Ci0gICAqIGlzIG5vdCBhIHZhbGlkIHNlZ21lbnQgYXJyYXkgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTZWdtZW50c30uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZFNlZ21lbnRzKFN0cmluZ1tdIHNlZ21lbnRzKQotICB7Ci0gICAgaWYgKCF2YWxpZFNlZ21lbnRzKHNlZ21lbnRzKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcyA9IHNlZ21lbnRzID09IG51bGwgPyAiaW52YWxpZCBzZWdtZW50czogIiArIHNlZ21lbnRzIDoKLSAgICAgICAgImludmFsaWQgc2VnbWVudDogIiArIGZpcnN0SW52YWxpZFNlZ21lbnQoc2VnbWVudHMpOwotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzKTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gYWJzb2x1dGUgcGF0aCBvciBubyBwYXRoIC0+IGFic29sdXRlIHBhdGgKLSAgICBib29sZWFuIG5ld0Fic29sdXRlUGF0aCA9ICFoYXNSZWxhdGl2ZVBhdGgoKTsgCi0KLSAgICBpbnQgbGVuID0gdGhpcy5zZWdtZW50cy5sZW5ndGg7Ci0gICAgaW50IHNlZ21lbnRzQ291bnQgPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbiArIHNlZ21lbnRzQ291bnRdOwotICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5zZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbik7Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIGxlbiwgc2VnbWVudHNDb3VudCk7Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgbmV3QWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgdHJpbW1pbmcgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2VnbWVudHMKLSAgICogKGluY2x1ZGluZyBlbXB0eSBzZWdtZW50cywgc3VjaCBhcyBvbmUgcmVwcmVzZW50aW5nIGEgdHJhaWxpbmcKLSAgICogc2VwYXJhdG9yKSBmcm9tIHRoZSBlbmQgb2YgdGhlIHBhdGggb2YgdGhpcyBVUkksIGlmIGhpZXJhcmNoaWNhbDsKLSAgICogb3RoZXJ3aXNlLCB0aGlzIFVSSSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCBpZiBhbGwgc2VnbWVudHMgYXJlIHRyaW1tZWQgZnJvbSBhbiBhYnNvbHV0ZSBwYXRoLCB0aGUKLSAgICogcm9vdCBhYnNvbHV0ZSBwYXRoIHJlbWFpbnMuCi0gICAqIAotICAgKiBAcGFyYW0gaSB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRvIGJlIHRyaW1tZWQgaW4gdGhlIHJldHVybmVkIFVSSS4gIElmCi0gICAqIGxlc3MgdGhhbiAxLCB0aGlzIFVSSSBpcyByZXR1cm5lZCB1bmNoYW5nZWQ7IGlmIGVxdWFsIHRvIG9yIGdyZWF0ZXIKLSAgICogdGhhbiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoaXMgVVJJJ3MgcGF0aCwgYWxsIHNlZ21lbnRzIGFyZQotICAgKiB0cmltbWVkLiAgCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1TZWdtZW50cyhpbnQgaSkKLSAgewotICAgIGlmICghaXNIaWVyYXJjaGljYWwoKSB8fCBpIDwgMSkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IE5PX1NFR01FTlRTOwotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGggLSBpOwotICAgIGlmIChsZW4gPiAwKQotICAgIHsKLSAgICAgIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW5dOwotICAgICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbik7Ci0gICAgfQotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHRoYXQgaGFzIGEgcGF0aAotICAgKiB0aGF0IGVuZHMgd2l0aCBhIHRyYWlsaW5nIHNlcGFyYXRvcjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB0cmFpbGluZyBzZXBhcmF0b3IgaXMgcmVwcmVzZW50ZWQgYXMgYW4gZW1wdHkgc2VnbWVudCBhcyB0aGUKLSAgICogbGFzdCBzZWdtZW50IGluIHRoZSBwYXRoOyBub3RlIHRoYXQgdGhpcyBkZWZpbml0aW9uIGRvZXMgPGVtPm5vdDwvZW0+Ci0gICAqIGluY2x1ZGUgdGhlIGxvbmUgc2VwYXJhdG9yIGluIHRoZSByb290IGFic29sdXRlIHBhdGguCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA+IDAgJiYgCi0gICAgICBTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2hvc2UgcGF0aCBpbmNsdWRlcyBhIGZpbGUgZXh0ZW5zaW9uLAotICAgKiB0aGF0IGZpbGUgZXh0ZW5zaW9uIGlzIHJldHVybmVkOyBudWxsIG90aGVyd2lzZS4gIFdlIGRlZmluZSBhIGZpbGUKLSAgICogZXh0ZW5zaW9uIGFzIGFueSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0IHBlcmlvZCAoIi4iKSBpbiB0aGUgZmluYWwKLSAgICogcGF0aCBzZWdtZW50LiAgSWYgdGhlcmUgaXMgbm8gcGF0aCwgdGhlIHBhdGggZW5kcyBpbiBhIHRyYWlsaW5nCi0gICAqIHNlcGFyYXRvciwgb3IgdGhlIGZpbmFsIHNlZ21lbnQgY29udGFpbnMgbm8gcGVyaW9kLCB0aGVuIHdlIGNvbnNpZGVyCi0gICAqIHRoZXJlIHRvIGJlIG5vIGZpbGUgZXh0ZW5zaW9uLiAgSWYgdGhlIGZpbmFsIHNlZ21lbnQgZW5kcyBpbiBhIHBlcmlvZCwKLSAgICogdGhlbiB0aGUgZmlsZSBleHRlbnNpb24gaXMgYW4gZW1wdHkgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaWxlRXh0ZW5zaW9uKCkKLSAgewotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZyBsYXN0U2VnbWVudCA9IHNlZ21lbnRzW2xlbiAtIDFdOwotICAgIGludCBpID0gbGFzdFNlZ21lbnQubGFzdEluZGV4T2YoRklMRV9FWFRFTlNJT05fU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaSA8IDAgPyBudWxsIDogbGFzdFNlZ21lbnQuc3Vic3RyaW5nKGkgKyAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyBhIHBlcmlvZCAoIi4iKSBmb2xsb3dlZCBieSB0aGUKLSAgICogc3BlY2lmaWVkIGZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBsYXN0IHBhdGggc2VnbWVudCBvZiB0aGlzIFVSSSwgaWYgaXQgaXMKLSAgICogaGllcmFyY2hpY2FsIHdpdGggYSBub24tZW1wdHkgcGF0aCBlbmRpbmcgaW4gYSBub24tZW1wdHkgc2VnbWVudDsKLSAgICogb3RoZXJ3aXNlLCB0aGlzIFVSSSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0KLSAgICogPHA+VGhlIGV4dGVuc2lvbiBpcyBhcHBlbmRlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHNlZ21lbnQgYWxyZWFkeQotICAgKiBjb250YWlucyBhbiBleHRlbnNpb24uCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZgotICAgKiA8Y29kZT5maWxlRXh0ZW5zaW9uPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBzZWdtZW50IChwb3J0aW9uKSBhY2NvcmRpbmcKLSAgICogdG8ge0BsaW5rICN2YWxpZFNlZ21lbnR9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRGaWxlRXh0ZW5zaW9uKFN0cmluZyBmaWxlRXh0ZW5zaW9uKQotICB7Ci0gICAgaWYgKCF2YWxpZFNlZ21lbnQoZmlsZUV4dGVuc2lvbikpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImludmFsaWQgc2VnbWVudCBwb3J0aW9uOiAiICsgZmlsZUV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBpZiAobGVuID09IDApIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIGxhc3RTZWdtZW50ID0gc2VnbWVudHNbbGVuIC0gMV07Ci0gICAgaWYgKFNFR01FTlRfRU1QVFkuZXF1YWxzKGxhc3RTZWdtZW50KSkgcmV0dXJuIHRoaXM7Ci0gICAgU3RyaW5nQnVmZmVyIG5ld0xhc3RTZWdtZW50ID0gbmV3IFN0cmluZ0J1ZmZlcihsYXN0U2VnbWVudCk7Ci0gICAgbmV3TGFzdFNlZ21lbnQuYXBwZW5kKEZJTEVfRVhURU5TSU9OX1NFUEFSQVRPUik7Ci0gICAgbmV3TGFzdFNlZ21lbnQuYXBwZW5kKGZpbGVFeHRlbnNpb24pOwotCi0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbl07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbiAtIDEpOwotICAgIG5ld1NlZ21lbnRzW2xlbiAtIDFdID0gbmV3TGFzdFNlZ21lbnQudG9TdHJpbmcoKTsKLSAgICAKLSAgICAvLyBub3RlOiBzZWdtZW50cy5sZW5ndGggPiAwIC0+IGhpZXJhcmNoaWNhbAotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsgCi0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgaGFzIGEgbm9uLW51bGwge0BsaW5rICNmaWxlRXh0ZW5zaW9uIGZpbGVFeHRlbnNpb259LAotICAgKiByZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IHJlbW92aW5nIGl0OyB0aGlzIFVSSSB1bmNoYW5nZWQsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgdHJpbUZpbGVFeHRlbnNpb24oKQotICB7Ci0gICAgaW50IGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBpZiAobGVuID09IDApIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIGxhc3RTZWdtZW50ID0gc2VnbWVudHNbbGVuIC0gMV07Ci0gICAgaW50IGkgPSBsYXN0U2VnbWVudC5sYXN0SW5kZXhPZihGSUxFX0VYVEVOU0lPTl9TRVBBUkFUT1IpOwotICAgIGlmIChpIDwgMCkgcmV0dXJuIHRoaXM7Ci0KLSAgICBTdHJpbmcgbmV3TGFzdFNlZ21lbnQgPSBsYXN0U2VnbWVudC5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbl07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgMCwgbmV3U2VnbWVudHMsIDAsIGxlbiAtIDEpOwotICAgIG5ld1NlZ21lbnRzW2xlbiAtIDFdID0gbmV3TGFzdFNlZ21lbnQ7Ci0KLSAgICAvLyBub3RlOiBzZWdtZW50cy5sZW5ndGggPiAwIC0+IGhpZXJhcmNoaWNhbAotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsgCi0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB0aGF0IGVuZHMgaW4gYQotICAgKiBzbGFzaDsgdGhhdCBpcywgaXQgaGFzIGEgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3Igb3IgaXMgdGhlIHJvb3QKLSAgICogYWJzb2x1dGUgcGF0aCwgYW5kIGhhcyBubyBxdWVyeSBhbmQgbm8gZnJhZ21lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBpcyByZXR1cm5lZCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gaGllcmFyY2hpY2FsICYmIHF1ZXJ5ID09IG51bGwgJiYgZnJhZ21lbnQgPT0gbnVsbCAmJgotICAgICAgKGhhc1RyYWlsaW5nUGF0aFNlcGFyYXRvcigpIHx8IChhYnNvbHV0ZVBhdGggJiYgc2VnbWVudHMubGVuZ3RoID09IDApKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSByZWZlcmVuY2UgYW5kIDxjb2RlPm9sZFByZWZpeDwvY29kZT4gaXMgYQotICAgKiBwcmVmaXggb2YgaXQsIHRoaXMgcmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSByZXBsYWNpbmcgaXQgYnkKLSAgICogPGNvZGU+bmV3UHJlZml4PC9jb2RlPjsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5JbiBvcmRlciB0byBiZSBhIHByZWZpeCwgdGhlIDxjb2RlPm9sZFByZWZpeDwvY29kZT4ncwotICAgKiB7QGxpbmsgI2lzUHJlZml4IGlzUHJlZml4fSBtdXN0IHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiwgYW5kIGl0IG11c3QKLSAgICogbWF0Y2ggdGhpcyBVUkkncyBzY2hlbWUsIGF1dGhvcml0eSwgYW5kIGRldmljZS4gIEFsc28sIHRoZSBwYXRocyBtdXN0Ci0gICAqIG1hdGNoLCB1cCB0byBwcmVmaXgncyBlbmQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBlaXRoZXIKLSAgICogPGNvZGU+b2xkUHJlZml4PC9jb2RlPiBvciA8Y29kZT5uZXdQcmVmaXg8L2NvZGU+IGlzIG5vdCBhIHByZWZpeCBVUkkKLSAgICogYWNjb3JkaW5nIHRvIHtAbGluayAjaXNQcmVmaXh9LgotICAgKi8KLSAgcHVibGljIFVSSSByZXBsYWNlUHJlZml4KFVSSSBvbGRQcmVmaXgsIFVSSSBuZXdQcmVmaXgpCi0gIHsKLSAgICBpZiAoIW9sZFByZWZpeC5pc1ByZWZpeCgpIHx8ICFuZXdQcmVmaXguaXNQcmVmaXgoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgd2hpY2ggPSBvbGRQcmVmaXguaXNQcmVmaXgoKSA/ICJuZXciIDogIm9sZCI7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tcHJlZml4ICIgKyB3aGljaCArICIgdmFsdWUiKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgd2hhdCdzIGxlZnQgb2YgdGhlIHNlZ21lbnRzIGFmdGVyIHRyaW1taW5nIHRoZSBwcmVmaXguCi0gICAgU3RyaW5nW10gdGFpbFNlZ21lbnRzID0gZ2V0VGFpbFNlZ21lbnRzKG9sZFByZWZpeCk7Ci0gICAgaWYgKHRhaWxTZWdtZW50cyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIC8vIElmIHRoZSBuZXcgcHJlZml4IGhhcyBzZWdtZW50cywgaXQgaXMgbm90IHRoZSByb290IGFic29sdXRlIHBhdGgsCi0gICAgLy8gYW5kIHdlIG5lZWQgdG8gZHJvcCB0aGUgdHJhaWxpbmcgZW1wdHkgc2VnbWVudCBhbmQgYXBwZW5kIHRoZSB0YWlsCi0gICAgLy8gc2VnbWVudHMuCi0gICAgU3RyaW5nW10gbWVyZ2VkU2VnbWVudHMgPSB0YWlsU2VnbWVudHM7Ci0gICAgaWYgKG5ld1ByZWZpeC5zZWdtZW50Q291bnQoKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBzZWdtZW50c1RvS2VlcCA9IG5ld1ByZWZpeC5zZWdtZW50Q291bnQoKSAtIDE7Ci0gICAgICBtZXJnZWRTZWdtZW50cyA9IG5ldyBTdHJpbmdbc2VnbWVudHNUb0tlZXAgKyB0YWlsU2VnbWVudHMubGVuZ3RoXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3UHJlZml4LnNlZ21lbnRzKCksIDAsIG1lcmdlZFNlZ21lbnRzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50c1RvS2VlcCk7Ci0KLSAgICAgIGlmICh0YWlsU2VnbWVudHMubGVuZ3RoICE9IDApCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGFpbFNlZ21lbnRzLCAwLCBtZXJnZWRTZWdtZW50cywgc2VnbWVudHNUb0tlZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGFpbFNlZ21lbnRzLmxlbmd0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQgc2luY2UgYWxsIGNvbXBvbmVudHMgYXJlIGZyb20gZXhpc3RpbmcgVVJJcwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIG5ld1ByZWZpeC5zY2hlbWUoKSwgbmV3UHJlZml4LmF1dGhvcml0eSgpLAotICAgICAgICAgICAgICAgICAgIG5ld1ByZWZpeC5kZXZpY2UoKSwgbmV3UHJlZml4Lmhhc0Fic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgIG1lcmdlZFNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgcmVmZXJlbmNlIGFuZCBwcmVmaXggaXMgYSBwcmVmaXggb2YgaXQsCi0gIC8vIHJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHBhdGggcmVtYWluaW5nIGFmdGVyIHRoYXQgcHJlZml4IGhhcyBiZWVuCi0gIC8vIHRyaW1tZWQ7IG51bGwgb3RoZXJ3aXNlLgotICBwcml2YXRlIFN0cmluZ1tdIGdldFRhaWxTZWdtZW50cyhVUkkgcHJlZml4KQotICB7Ci0gICAgaWYgKCFwcmVmaXguaXNQcmVmaXgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tcHJlZml4IHRyaW0iKTsKLSAgICB9Ci0KLSAgICAvLyBEb24ndCBldmVuIGNvbnNpZGVyIGl0IHVubGVzcyB0aGlzIGlzIGhpZXJhcmNoaWNhbCBhbmQgaGFzIHNjaGVtZSwKLSAgICAvLyBhdXRob3JpdHksIGRldmljZSBhbmQgcGF0aCBhYnNvbHV0ZW5lc3MgZXF1YWwgdG8gdGhvc2Ugb2YgdGhlIHByZWZpeC4KLSAgICBpZiAoIWhpZXJhcmNoaWNhbCB8fAotICAgICAgICAhZXF1YWxzKHNjaGVtZSwgcHJlZml4LnNjaGVtZSgpLCB0cnVlKSB8fAotICAgICAgICAhZXF1YWxzKGF1dGhvcml0eSwgcHJlZml4LmF1dGhvcml0eSgpKSB8fAotICAgICAgICAhZXF1YWxzKGRldmljZSwgcHJlZml4LmRldmljZSgpKSB8fAotICAgICAgICBhYnNvbHV0ZVBhdGggIT0gcHJlZml4Lmhhc0Fic29sdXRlUGF0aCgpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBwcmVmaXggaGFzIG5vIHNlZ21lbnRzLCB0aGVuIGl0IGlzIHRoZSByb290IGFic29sdXRlIHBhdGgsIGFuZAotICAgIC8vIHdlIGtub3cgdGhpcyBpcyBhbiBhYnNvbHV0ZSBwYXRoLCB0b28uCi0gICAgaWYgKHByZWZpeC5zZWdtZW50Q291bnQoKSA9PSAwKSByZXR1cm4gc2VnbWVudHM7Ci0KLSAgICAvLyBUaGlzIG11c3QgaGF2ZSBubyBmZXdlciBzZWdtZW50cyB0aGFuIHRoZSBwcmVmaXguICBTaW5jZSB0aGUgcHJlZml4Ci0gICAgLy8gaXMgbm90IHRoZSByb290IGFic29sdXRlIHBhdGgsIGl0cyBsYXN0IHNlZ21lbnQgaXMgZW1wdHk7IGFsbCBvdGhlcnMKLSAgICAvLyBtdXN0IG1hdGNoLgotICAgIGludCBpID0gMDsKLSAgICBpbnQgc2VnbWVudHNUb0NvbXBhcmUgPSBwcmVmaXguc2VnbWVudENvdW50KCkgLSAxOwotICAgIGlmIChzZWdtZW50cy5sZW5ndGggPD0gc2VnbWVudHNUb0NvbXBhcmUpIHJldHVybiBudWxsOwotCi0gICAgZm9yICg7IGkgPCBzZWdtZW50c1RvQ29tcGFyZTsgaSsrKQotICAgIHsKLSAgICAgIGlmICghc2VnbWVudHNbaV0uZXF1YWxzKHByZWZpeC5zZWdtZW50KGkpKSkgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gVGhlIHByZWZpeCByZWFsbHkgaXMgYSBwcmVmaXggb2YgdGhpcy4gIElmIHRoaXMgaGFzIGp1c3Qgb25lIG1vcmUsCi0gICAgLy8gZW1wdHkgc2VnbWVudCwgdGhlIHBhdGhzIGFyZSB0aGUgc2FtZS4KLSAgICBpZiAoaSA9PSBzZWdtZW50cy5sZW5ndGggLSAxICYmIFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnRzW2ldKSkKLSAgICB7Ci0gICAgICByZXR1cm4gTk9fU0VHTUVOVFM7Ci0gICAgfQotICAgIAotICAgIC8vIE90aGVyd2lzZSwgdGhlIHBhdGggbmVlZHMgb25seSB0aGUgcmVtYWluaW5nIHNlZ21lbnRzLgotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tzZWdtZW50cy5sZW5ndGggLSBpXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNlZ21lbnRzLCBpLCBuZXdTZWdtZW50cywgMCwgbmV3U2VnbWVudHMubGVuZ3RoKTsKLSAgICByZXR1cm4gbmV3U2VnbWVudHM7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyBhIHN0cmluZyBzbyBhcyB0byBwcm9kdWNlIGEgdmFsaWQgb3BhcXVlIHBhcnQgdmFsdWUsIGFzIGRlZmluZWQKLSAgICogYnkgdGhlIFJGQy4gIEFsbCBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwKLSAgICogYXJlIGVzY2FwZWQsIGFzIGlzIDxjb2RlPi88L2NvZGU+IGlmIGl0IGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVPcGFxdWVQYXJ0KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGVuY29kZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCk7Ci0gICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDAgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PSBTRUdNRU5UX1NFUEFSQVRPUiA/Ci0gICAgICAiJTJGIiArIHJlc3VsdC5zdWJzdHJpbmcoMSkgOgotICAgICAgcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIGF1dGhvcml0eSwgYXMgZGVmaW5lZCBieSB0aGUKLSAgICogUkZDLiAgQWxsIGV4Y2x1ZGVkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgc3BhY2UgYW5kIDxjb2RlPiM8L2NvZGU+LAotICAgKiBhcmUgZXNjYXBlZCwgYXMgYXJlIDxjb2RlPi88L2NvZGU+IGFuZCA8Y29kZT4/PC9jb2RlPgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQXV0aG9yaXR5KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIHNlZ21lbnQsIGFzIGRlZmluZWQgYnkgdGhlCi0gICAqIFJGQy4gIEFsbCBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwKLSAgICogYXJlIGVzY2FwZWQsIGFzIGFyZSA8Y29kZT4vPC9jb2RlPiBhbmQgPGNvZGU+PzwvY29kZT4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVNlZ21lbnQoU3RyaW5nIHZhbHVlLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCBTRUdNRU5UX0NIQVJfSEksIFNFR01FTlRfQ0hBUl9MTywgaWdub3JlRXNjYXBlZCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyBhIHN0cmluZyBzbyBhcyB0byBwcm9kdWNlIGEgdmFsaWQgcXVlcnksIGFzIGRlZmluZWQgYnkgdGhlIFJGQy4KLSAgICogT25seSBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwgYXJlIGVzY2FwZWQuCi0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVRdWVyeShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBlbmNvZGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIGZyYWdtZW50LCBhcyBkZWZpbmVkIGJ5IHRoZQotICAgKiBSRkMuICBPbmx5IGV4Y2x1ZGVkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgc3BhY2UgYW5kIDxjb2RlPiM8L2NvZGU+LCBhcmUKLSAgICogZXNjYXBlZC4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUZyYWdtZW50KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCk7Ci0gIH0KLQotICAvLyBFbmNvZGVzIGEgY29tcGxldGUgVVJJLCBvcHRpb25hbGx5IGxlYXZpbmcgJSBjaGFyYWN0ZXJzIHVuZXNjYXBlZCB3aGVuCi0gIC8vIGJlZ2lubmluZyBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UuICBXZSBhc3N1bWUgdGhhdCB0aGUKLSAgLy8gbGFzdCAjIGJlZ2lucyB0aGUgZnJhZ21lbnQuCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGVVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBpbnQgaSA9IHVyaS5pbmRleE9mKFNDSEVNRV9TRVBBUkFUT1IpOwotICAgIGlmIChpICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuc3Vic3RyaW5nKDAsIGkpOwotICAgICAgcmVzdWx0LmFwcGVuZChzY2hlbWUpOwotICAgICAgcmVzdWx0LmFwcGVuZChTQ0hFTUVfU0VQQVJBVE9SKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGogPSB1cmkubGFzdEluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKTsKLSAgICBpZiAoaiAhPSAtMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3NwYXJ0ID0gdXJpLnN1YnN0cmluZygrK2ksIGopOwotICAgICAgcmVzdWx0LmFwcGVuZChlbmNvZGUoc3NwYXJ0LCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKEZSQUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICAgIFN0cmluZyBmcmFnbWVudCA9IHVyaS5zdWJzdHJpbmcoKytqKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RlKGZyYWdtZW50LCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgc3NwYXJ0ID0gdXJpLnN1YnN0cmluZygrK2kpOwotICAgICAgcmVzdWx0LmFwcGVuZChlbmNvZGUoc3NwYXJ0LCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIEVuY29kZXMgdGhlIGdpdmVuIHN0cmluZywgcmVwbGFjaW5nIGVhY2ggQVNDSUkgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGluCi0gIC8vIHRoZSBzZXQgc3BlY2lmaWVkIGJ5IHRoZSAxMjgtYml0IGJpdG1hc2sgYW5kIGVhY2ggbm9uLUFTQ0lJIGNoYXJhY3RlcgotICAvLyBiZWxvdyAweEEwIGJ5IGFuIGVzY2FwZSBzZXF1ZW5jZSBvZiAlIGZvbGxvd2VkIGJ5IHR3byBoZXggZGlnaXRzLiAgSWYKLSAgLy8gJSBpcyBub3QgaW4gdGhlIHNldCBidXQgaWdub3JlRXNjYXBlZCBpcyB0cnVlLCB0aGVuICUgd2lsbCBub3QgYmUgZW5jb2RlZAotICAvLyBpZmYgaXQgYWxyZWFkeSBiZWdpbnMgYSB2YWxpZCBlc2NhcGUgc2VxdWVuY2UuCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2ssIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwotCi0gICAgICBpZiAoIW1hdGNoZXMoYywgaGlnaEJpdG1hc2ssIGxvd0JpdG1hc2spICYmIGMgPCAxNjAgJiYKLSAgICAgICAgICAoIWlnbm9yZUVzY2FwZWQgfHwgIWlzRXNjYXBlZCh2YWx1ZSwgaSkpKQotICAgICAgewotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLnN1YnN0cmluZygwLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXBwZW5kRXNjYXBlZChyZXN1bHQsIChieXRlKWMpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IHZhbHVlIDogcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBUZXN0cyB3aGV0aGVyIGFuIGVzY2FwZSBvY2N1cnMgaW4gdGhlIGdpdmVuIHN0cmluZywgc3RhcnRpbmcgYXQgaW5kZXggaS4KLSAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlIGlzIGEgJSBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cy4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VzY2FwZWQoU3RyaW5nIHMsIGludCBpKQotICB7Ci0gICAgcmV0dXJuIHMuY2hhckF0KGkpID09IEVTQ0FQRSAmJiBzLmxlbmd0aCgpID4gaSArIDIgJiYKLSAgICAgIG1hdGNoZXMocy5jaGFyQXQoaSArIDEpLCBIRVhfSEksIEhFWF9MTykgJiYKLSAgICAgIG1hdGNoZXMocy5jaGFyQXQoaSArIDIpLCBIRVhfSEksIEhFWF9MTyk7Ci0gIH0KLQotICAvLyBDb21wdXRlcyBhIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UgZm9yIHRoZSBieXRlLCBhcHBlbmRpbmcKLSAgLy8gaXQgdG8gdGhlIFN0cmluZ0J1ZmZlci4gIE9ubHkgY2hhcmFjdGVycyB1cCB0byAweEZGIHNob3VsZCBiZSBlc2NhcGVkOwotICAvLyBhbGwgYnV0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIHdpbGwgYmUgaWdub3JlZC4KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRFc2NhcGVkKFN0cmluZ0J1ZmZlciByZXN1bHQsIGJ5dGUgYikKLSAgewotICAgIHJlc3VsdC5hcHBlbmQoRVNDQVBFKTsKLQotICAgIC8vIFRoZSBieXRlIGlzIGF1dG9tYXRpY2FsbHkgd2lkZW5lZCBpbnRvIGFuIGludCwgd2l0aCBzaWduIGV4dGVuc2lvbiwKLSAgICAvLyBmb3Igc2hpZnRpbmcuICBUaGlzIGNhbiBpbnRyb2R1Y2UgMSdzIHRvIHRoZSBsZWZ0IG9mIHRoZSBieXRlLCB3aGljaAotICAgIC8vIG11c3QgYmUgY2xlYXJlZCBieSBtYXNraW5nIGJlZm9yZSBsb29raW5nIHVwIHRoZSBoZXggZGlnaXQuCi0gICAgLy8KLSAgICByZXN1bHQuYXBwZW5kKEhFWF9ESUdJVFNbKGIgPj4gNCkgJiAweDBGXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChIRVhfRElHSVRTW2IgJiAweDBGXSk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlcyB0aGUgZ2l2ZW4gc3RyaW5nLCByZXBsYWNpbmcgZWFjaCB0aHJlZS1kaWdpdCBlc2NhcGUgc2VxdWVuY2UgYnkKLSAgICogdGhlIGNoYXJhY3RlciB0aGF0IGl0IHJlcHJlc2VudHMuICBJbmNvbXBsZXRlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlCi0gICAqIGlnbm9yZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaXNFc2NhcGVkKHZhbHVlLCBpKSkgCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKHVuZXNjYXBlKHZhbHVlLmNoYXJBdChpICsgMSksIHZhbHVlLmNoYXJBdChpICsgMikpKTsKLSAgICAgICAgaSArPSAyOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodmFsdWUuY2hhckF0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gdmFsdWUgOiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGNoYXJhY3RlciBlbmNvZGVkIGJ5ICUgZm9sbG93ZWQgYnkgdGhlIHR3byBnaXZlbiBoZXggZGlnaXRzLAotICAvLyB3aGljaCBpcyBhbHdheXMgMHhGRiBvciBsZXNzLCBzbyBjYW4gc2FmZWx5IGJlIGNhc3RlZCB0byBhIGJ5dGUuICBJZgotICAvLyBlaXRoZXIgY2hhcmFjdGVyIGlzIG5vdCBhIGhleCBkaWdpdCwgYSBib2d1cyByZXN1bHQgd2lsbCBiZSByZXR1cm5lZC4KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciB1bmVzY2FwZShjaGFyIGhpZ2hIZXhEaWdpdCwgY2hhciBsb3dIZXhEaWdpdCkKLSAgewotICAgIHJldHVybiAoY2hhcikoKHZhbHVlT2YoaGlnaEhleERpZ2l0KSA8PCA0KSB8IHZhbHVlT2YobG93SGV4RGlnaXQpKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIGludCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gaGV4IGRpZ2l0LgotICBwcml2YXRlIHN0YXRpYyBpbnQgdmFsdWVPZihjaGFyIGhleERpZ2l0KQotICB7Ci0gICAgaWYgKGhleERpZ2l0ID49ICdBJyAmJiBoZXhEaWdpdCA8PSAnRicpCi0gICAgewotICAgICAgcmV0dXJuIGhleERpZ2l0IC0gJ0EnICsgMTA7Ci0gICAgfQotICAgIGlmIChoZXhEaWdpdCA+PSAnYScgJiYgaGV4RGlnaXQgPD0gJ2YnKQotICAgIHsKLSAgICAgIHJldHVybiBoZXhEaWdpdCAtICdhJyArIDEwOwotICAgIH0KLSAgICBpZiAoaGV4RGlnaXQgPj0gJzAnICYmIGhleERpZ2l0IDw9ICc5JykKLSAgICB7Ci0gICAgICByZXR1cm4gaGV4RGlnaXQgLSAnMCc7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCB0YWtlcyB0d28gVVJJcywgdGhlIGZpcnN0IG9uZSByZWxhdGl2ZSwgdGhlIHNlY29uZCBhYnNvbHV0ZS4gSXQKLSAgICogdHJpZXMgdG8gcmVzb2x2ZSB0aGUgZmlyc3QgVVJJIChtYWtpbmcgaXQgYWJzb2x1dGUpIGJ5IHVzaW5nIHRoZSBzZWNvbmQgb25lLgotICAgKiBJZiB0aGUgVVJJIGNhbm5vdCBiZSByZXNvbHZlZCwgdGhlIHJlbGF0aXZlIG9uZSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIHJlbGF0aXZlVVJJCi0gICAqIEBwYXJhbSBhYnNvbHV0ZVVSSQotICAgKiBAcmV0dXJuIHJlbGF0aXZlVVJJIHJlc29sdmVkIChhYnNvbHV0ZSkgb3IgcmVsYXRpdmVVUkkgdW5tb2RpZmllZCBpZiBpdCBjYW5ub3QKLSAgICogYmUgcmVzb2x2ZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlUmVsYXRpdmVVUkkoU3RyaW5nIHJlbGF0aXZlVVJJLCBTdHJpbmcgYWJzb2x1dGVVUkkpIHsKLQotCSAgU3RyaW5nIHJlc3VsdCA9IHJlbGF0aXZlVVJJOwotCi0JICB0cnkgewotICAgICAgCVVSSSByZWxhdGl2ZSA9IFVSSS5jcmVhdGVVUkkocmVsYXRpdmVVUkkpOwotICAgICAgIAlVUkkgYWJzb2x1dGUgPSBVUkkuY3JlYXRlVVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAJVVJJIHJlc29sdmVkUmVsYXRpdmUgPSByZWxhdGl2ZS5yZXNvbHZlKGFic29sdXRlKTsKLSAgICAgICAJcmVzdWx0ID0gcmVzb2x2ZWRSZWxhdGl2ZS50b1N0cmluZygpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAKLSAgLyoKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIFVSSSBjb250YWlucyBub24tQVNDSUkgY2hhcmFjdGVyczsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogVGhpcyB1bnVzZWQgY29kZSBpcyBpbmNsdWRlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZS4uLiAKLSAgICovCi0vKgotICBwdWJsaWMgYm9vbGVhbiBpc0lSSSgpCi0gIHsKLSAgICByZXR1cm4gaXJpOyAKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGNvbnRhaW5zIGFueSBub24tQVNDSUkgY2hhcmFjdGVyczsKLSAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTm9uQVNDSUkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKHZhbHVlLmNoYXJBdChpKSA+IDEyNykgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotKi8KLQotICAvKgotICAgKiBJZiB0aGlzIGlzIGFuIHtAbGluayAjaXNJUkkgSVJJfSwgY29udmVydHMgaXQgdG8gYSBzdHJpY3QgQVNDSUkgVVJJLAotICAgKiB1c2luZyB0aGUgcHJvY2VkdXJlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMSBvZiB0aGUKLSAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9pcmktZWRpdC9kcmFmdC1kdWVyc3QtaXJpLTA5LnR4dCI+SVJJCi0gICAqIERyYWZ0IFJGQzwvYT4uICBPdGhlcndpc2UsIHRoaXMgVVJJLCBpdHNlbGYsIGlzIHJldHVybmVkLgotICAgKgotICAgKiBUaGlzIHVudXNlZCBjb2RlIGlzIGluY2x1ZGVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlLi4uCi0gICAqLwotLyoKLSAgcHVibGljIFVSSSB0b0FTQ0lJVVJJKCkKLSAgewotICAgIGlmICghaXJpKSByZXR1cm4gdGhpczsKLQotICAgIGlmIChjYWNoZWRBU0NJSVVSSSA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBlQXV0aG9yaXR5ID0gZW5jb2RlQXNBU0NJSShhdXRob3JpdHkpOwotICAgICAgU3RyaW5nIGVEZXZpY2UgPSBlbmNvZGVBc0FTQ0lJKGRldmljZSk7Ci0gICAgICBTdHJpbmcgZVF1ZXJ5ID0gZW5jb2RlQXNBU0NJSShxdWVyeSk7Ci0gICAgICBTdHJpbmcgZUZyYWdtZW50ID0gZW5jb2RlQXNBU0NJSShmcmFnbWVudCk7Ci0gICAgICBTdHJpbmdbXSBlU2VnbWVudHMgPSBuZXcgU3RyaW5nW3NlZ21lbnRzLmxlbmd0aF07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBlU2VnbWVudHNbaV0gPSBlbmNvZGVBc0FTQ0lJKHNlZ21lbnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIGNhY2hlZEFTQ0lJVVJJID0gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgZUF1dGhvcml0eSwgZURldmljZSwgYWJzb2x1dGVQYXRoLCBlU2VnbWVudHMsIGVRdWVyeSwgZUZyYWdtZW50KTsgCi0KLSAgICB9Ci0gICAgcmV0dXJuIGNhY2hlZEFTQ0lJVVJJOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIHN0cmljdCBBU0NJSSBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gdmFsdWUuICBFYWNoIG5vbi1BU0NJSQotICAvLyBjaGFyYWN0ZXIgaXMgY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIFVURi04IGVuY29kaW5nLCB3aGljaCBhcmUgdGhlbgotICAvLyByZXByZXNudGVkIHVzaW5nICUgZXNjYXBpbmcuCi0gIHByaXZhdGUgU3RyaW5nIGVuY29kZUFzQVNDSUkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7Ci0KLSAgICAgIGlmIChjID49IDEyOCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBieXRlW10gZW5jb2RlZCA9IChuZXcgU3RyaW5nKG5ldyBjaGFyW10geyBjIH0pKS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgICBmb3IgKGludCBqID0gMCwgZW5jTGVuID0gZW5jb2RlZC5sZW5ndGg7IGogPCBlbmNMZW47IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhcHBlbmRFc2NhcGVkKHJlc3VsdCwgZW5jb2RlZFtqXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYyk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gdmFsdWUgOiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWxpZCwgY29uc2VjdXRpdmUsIHRocmVlLWNoYXJhY3RlciBlc2NhcGUKLSAgLy8gc2VxdWVuY2VzIGluIHRoZSBnaXZlbiBzdHJpbmcsIHN0YXJ0aW5nIGF0IGluZGV4IGkuCi0gIHByaXZhdGUgc3RhdGljIGludCBjb3VudEVzY2FwZWQoU3RyaW5nIHMsIGludCBpKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICBmb3IgKGludCBsZW4gPSBzLmxlbmd0aCgpOyBpIDwgbGVuOyBpICs9IDMpCi0gICAgewotICAgICAgaWYgKGlzRXNjYXBlZChzLCBpKSkgcmVzdWx0Kys7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2ZhMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBIFVSSSByZXNvbHZlciBleHRlbnNpb24gZGVzY3JpcHRvciBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0Ci0gKiBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyLiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGFsbG93cyBmb3IgdGhlCi0gKiBleHRlbnNpb24gcmVzb2x2ZXIgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgdGltZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IKLXsKLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXJFeHRlbnNpb24gcmVzb2x2ZXI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVUeXBlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7Ci0KLQlwdWJsaWMgTGlzdCBwcm9qZWN0TmF0dXJlSWRzOwotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVR5cGU7Ci0KLQlwcm90ZWN0ZWQgaW50IHN0YWdlID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QT1NUTk9STUFMSVpBVElPTjsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJpb3JpdHkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlBSSU9SSVRZX01FRElVTTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MgbmFtZS4KLQkgKiBAcGFyYW0gcGx1Z2luSWQgVGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCBjb250YWlucyB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlciBjbGFzcy4KLQkgKiBAcGFyYW0gcHJvamVjdE5hdHVyZUlkcyBUaGUgcHJvamVjdCBuYXR1cmUgSURzIGZvciB3aGljaCB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1bi4KLQkgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSB0eXBlIG9mIHJlc291cmNlIGZvciB3aGljaCB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1bi4KLQkgKiBAcGFyYW0gc3RhZ2UgVGhlIHN0YWdlIG9mIHRoZSByZXNvbHZlci4gRWl0aGVyIHByZW5vcm1hbGl6YXRpb24gb3IgcG9zdG5vcm1hbGl6YXRpb24uCi0JICogQHBhcmFtIHByaW9yaXR5IFRoZSByZXNvbHZlcidzIHByaW9yaXR5LiBoaWdoLCBtZWRpdW0sIG9yIGxvdy4KLQkgKi8KLQlwdWJsaWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBwbHVnaW5JZCwKLQkJCUxpc3QgcHJvamVjdE5hdHVyZUlkcywgU3RyaW5nIHJlc291cmNlVHlwZSwgaW50IHN0YWdlLCBTdHJpbmcgcHJpb3JpdHkpCi0JewotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCQl0aGlzLnByb2plY3ROYXR1cmVJZHMgPSBwcm9qZWN0TmF0dXJlSWRzOwotCQl0aGlzLnJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKLQkJdGhpcy5zdGFnZSA9IHN0YWdlOwotCQl0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0JICovCi0JcHVibGljIFVSSVJlc29sdmVyRXh0ZW5zaW9uIGdldFJlc29sdmVyKCkKLQl7Ci0KLQkJaWYgKHJlc29sdmVyID09IG51bGwgJiYgY2xhc3NOYW1lICE9IG51bGwgJiYgIWVycm9yKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQkvLyBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPwotCQkJCS8vIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUNsYXNzIHRoZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCXJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJZXJyb3IgPSB0cnVlOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHJlc29sdmVyIHNob3VsZCBydW4gaW4gdGhlIGN1cnJlbnQgc2NlbmFyaW8gZ2l2ZW4KLQkgKiB0aGUgcHJvamVjdCBuYXR1cmUgSUQsIHJlc291cmNlIHR5cGUsIGFuZCBzdGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hdHVyZUlkIFRoZSBwcm9qZWN0IG5hdHVyZSBJRCB0byBjaGVjayBhZ2FpbnN0LgotCSAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHJlc291cmNlIHR5cGUgdG8gY2hlY2sgYWdhaW5zdC4KLQkgKiBAcGFyYW0gc3RhZ2UgVGhlIHN0YWdlIHRvIGNoZWNrIGFnYWluc3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNvbHZlciBzaG91bGQgcnVuLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcHJvamVjdE5hdHVyZUlkLCBTdHJpbmcgcmVzb3VyY2VUeXBlLCBpbnQgc3RhZ2UpCi0JewotCQlpZiAocHJvamVjdE5hdHVyZUlkcy5jb250YWlucyhwcm9qZWN0TmF0dXJlSWQpKQotCQl7Ci0JCQlyZXR1cm4gbWF0Y2hlcyh0aGlzLnJlc291cmNlVHlwZSwgcmVzb3VyY2VUeXBlKSAmJiB0aGlzLnN0YWdlID09IHN0YWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHN0cmluZyBhIG1hdGNoZXMgc3RyaW5nIGIuCi0JICogVE9ETzogV2h5IGlzIHRoaXMgcmVxdWlyZWQgaW5zdGVhZCBvZiBqdXN0IHVzaW5nIFN0cmluZy5lcXVhbHM/Ci0JICogCi0JICogQHBhcmFtIGEgU3RyaW5nIGZvciBjb21wYXJpc29uLgotCSAqIEBwYXJhbSBiIFN0cmluZyBmb3IgY29tcGFyaXNvbi4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZ3MgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgYSwgU3RyaW5nIGIpCi0JewotCQlyZXR1cm4gKGEgIT0gbnVsbCkgPyBhLmVxdWFscyhiKSA6IGEgPT0gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjMjJlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIFVSSSByZXNvbHZlciBleHRlbnNpb24gcmVnaXN0cnkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKLSAqIGFsbCBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0JcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcm90ZWN0ZWQgTGlzdCByZXNvbHZlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFHRV9QUkVOT1JNQUxJWkFUSU9OID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUdFX1BPU1ROT1JNQUxJWkFUSU9OID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQUdFX1BIWVNJQ0FMID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX0xPVyA9ICJsb3ciOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfTUVESVVNID0gIm1lZGl1bSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9ISUdIID0gImhpZ2giOwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlVMTF9QUk9KRUNUX05BVFVSRV9JRCA9ICIiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IGluc3RhbmNlOwotCi0JcHJpdmF0ZSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5KCkKLQl7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSBnZXRJbnRhbmNlKCkKLQl7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YW5jZSA9IG5ldyBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQluZXcgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihpbnN0YW5jZSkucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBleHRlbnNpb24gcmVzb2x2ZXIgdG8gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MuCi0JICogQHBhcmFtIHBsdWdpbklkIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MuCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVJZHMgQSBsaXN0IG9mIHByb2plY3QgbmF0dXJlcyBJRHMgZm9yIHdoaWNoIHRoZSByZXNvbHZlciBzaG91bGQgcnVuLgotCSAqIEBwYXJhbSByZXNvdXJjZVR5cGUgVGhlIHR5cGUgb2YgcmVzb3VyZSBmb3Igd2hpY2ggYW4gZXh0ZW5zaW9uIHJlc291cmNlIHNob3VsZCBydW4uCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSB0byBydW4uIEVpdGhlciBwcmVub3JtYWxpemF0aW9uIG9yIHBvc3Rub3JtYWxpemF0aW9uLgotCSAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIHJlc29sdmVyLiBWYWxpZCB2YWx1ZXMgYXJlIGhpZ2gsIG1lZGl1bSwgYW5kIGxvdy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHBsdWdpbklkLCBMaXN0IHByb2plY3ROYXR1cmVJZHMsCi0JCQlTdHJpbmcgcmVzb3VyY2VUeXBlLCBpbnQgc3RhZ2UsIFN0cmluZyBwcmlvcml0eSkKLQl7Ci0JCWlmIChwcm9qZWN0TmF0dXJlSWRzID09IG51bGwpCi0JCQlwcm9qZWN0TmF0dXJlSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvamVjdE5hdHVyZUlkcy5pc0VtcHR5KCkpCi0JCXsKLQkJCXByb2plY3ROYXR1cmVJZHMuYWRkKE5VTExfUFJPSkVDVF9OQVRVUkVfSUQpOwotCQl9Ci0JCVVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvciBpbmZvID0gbmV3IFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvcigKLQkJCQljbGFzc05hbWUsIHBsdWdpbklkLCBwcm9qZWN0TmF0dXJlSWRzLCByZXNvdXJjZVR5cGUsIHN0YWdlLCBwcmlvcml0eSk7Ci0KLQkJcmVzb2x2ZXJMaXN0LmFkZChpbmZvKTsKLQkJCi0JCUl0ZXJhdG9yIGlkc0l0ZXIgPSBwcm9qZWN0TmF0dXJlSWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpZHNJdGVyLmhhc05leHQoKSkKLQkJewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGlkc0l0ZXIubmV4dCgpOwotCi0JCQlIYXNoTWFwIHByaW9yaXR5TWFwID0gKEhhc2hNYXApIG1hcC5nZXQoa2V5KTsKLQkJCWlmIChwcmlvcml0eU1hcCA9PSBudWxsKQotCQkJewotCQkJCXByaW9yaXR5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQltYXAucHV0KGtleSwgcHJpb3JpdHlNYXApOwotCQkJCXByaW9yaXR5TWFwLnB1dChQUklPUklUWV9ISUdILCBuZXcgQXJyYXlMaXN0KCkpOwotCQkJCXByaW9yaXR5TWFwLnB1dChQUklPUklUWV9NRURJVU0sIG5ldyBBcnJheUxpc3QoKSk7Ci0JCQkJcHJpb3JpdHlNYXAucHV0KFBSSU9SSVRZX0xPVywgbmV3IEFycmF5TGlzdCgpKTsKLQkJCX0KLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBwcmlvcml0eU1hcC5nZXQocHJpb3JpdHkpOwotCQkJbGlzdC5hZGQoaW5mbyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvciBvYmplY3RzIHRoYXQgYXBwbHkgdG8gdGhpcwotCSAqIHByb2plY3QuIFRoZSBsaXN0IGlzIGluIHRoZSBwcmlvcml0eSBvcmRlciBoaWdoLCBtZWRpdW0sIGxvdy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBmb3Igd2hpY2ggeW91IGFyZSByZXF1ZXN0aW5nIHJlc29sdmVycy4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBVUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3Igb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25EZXNjcmlwdG9ycyhJUHJvamVjdCBwcm9qZWN0KQotCXsKLQkgIGlmKHByb2plY3QgIT0gbnVsbCkgewotCQkgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIExpc3QgbG93UHJpb3JpdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIExpc3QgbWVkaXVtUHJpb3JpdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIExpc3QgaGlnaFByaW9yaXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgCi0JCSAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJICB7Ci0JCSAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCSAgICB0cnkKLQkJICAgIHsKLQkJICAgICAgaWYgKGtleSA9PSBOVUxMX1BST0pFQ1RfTkFUVVJFX0lEIHx8IHByb2plY3QuaGFzTmF0dXJlKGtleSkpCi0JCSAgICAgIHsKLQkJICAgICAgICBoaWdoUHJpb3JpdHlMaXN0LmFkZEFsbCgoTGlzdCkgKChIYXNoTWFwKSBtYXAuZ2V0KGtleSkpLmdldChQUklPUklUWV9ISUdIKSk7Ci0JCSAgICAgICAgbWVkaXVtUHJpb3JpdHlMaXN0LmFkZEFsbCgoTGlzdCkgKChIYXNoTWFwKSBtYXAuZ2V0KGtleSkpLmdldChQUklPUklUWV9NRURJVU0pKTsKLQkJICAgICAgICBsb3dQcmlvcml0eUxpc3QuYWRkQWxsKChMaXN0KSAoKEhhc2hNYXApIG1hcC5nZXQoa2V5KSkuZ2V0KFBSSU9SSVRZX0xPVykpOwotCQkgICAgICB9Ci0JCSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCSAgICB7Ci0JCSAgICB9Ci0JCSAgfQotCQkgIHJlc3VsdC5hZGRBbGwoaGlnaFByaW9yaXR5TGlzdCk7Ci0JCSAgcmVzdWx0LmFkZEFsbChtZWRpdW1Qcmlvcml0eUxpc3QpOwotCQkgIHJlc3VsdC5hZGRBbGwobG93UHJpb3JpdHlMaXN0KTsKLQkJICByZXR1cm4gcmVzdWx0OwotCSAgfSBlbHNlIHsKLQkJICByZXR1cm4gcmVzb2x2ZXJMaXN0OwotCSAgfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgVVJJUmVzb2x2ZXIgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBzdGFnZS4KLQkgKiBUT0RPOiBUaGlzIHNlZW1zIGxpa2UgYW4gb2RkIG1ldGhvZCB0byBob3VzZSBoZXJlLiBJdCBtYXkgbmVlZCB0byBiZSBtb3ZlZAotCSAqICAgICAgIG9yIHJlbW92ZWQgaWYgdGhlIHN0YWdlIGF0dHJpYnV0ZSBkaXNzYXBlYXJzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvbHZlckluZm9MaXN0IEEgbGlzdCBvZiByZXNvbHZlcnMgdG8gcHJ1bmUuCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSByZXF1ZXN0ZWQuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgVVJJUmVzb2x2ZXIgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBzdGFnZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNYXRjaGluZ1VSSVJlc29sdmVycyhMaXN0IHJlc29sdmVySW5mb0xpc3QsIGludCBzdGFnZSkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlckluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yIGluZm8gPSAoVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yKSBpCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5zdGFnZSA9PSBzdGFnZSkKLQkJCXsKLQkJCQlPYmplY3QgcmVzb2x2ZXIgPSBpbmZvLmdldFJlc29sdmVyKCk7Ci0JCQkJaWYgKHJlc29sdmVyICE9IG51bGwpCi0JCQkJewotCQkJCQlyZXN1bHQuYWRkKHJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxMDIyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgVVJJIHJlc29sdmVyIGV4dGVuc2lvbiBwb2ludCBhbmQgcmVnaXN0ZXJzIGV4dGVuc2lvbgotICogcmVzb2x2ZXJzIHdpdGggdGhlIFVSSSByZXNvbHZlciByZWdpc3RyeS4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJyZXNvbHZlckV4dGVuc2lvbnMiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAicmVzb2x2ZXJFeHRlbnNpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUFJPSkVDVF9OQVRVUkVfSUQgPSAicHJvamVjdE5hdHVyZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZVR5cGUiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TVEFHRSA9ICJzdGFnZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfU1RBR0VfUFJFID0gInByZW5vcm1hbGl6YXRpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX1NUQUdFX1BPU1QgPSAicG9zdG5vcm1hbGl6YXRpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX1NUQUdFX1BIWVNJQ0FMID0gInBoeXNpY2FsIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwotCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlwdWJsaWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChVUklSZXNvbHZlclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkKLQkJewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6Ci0JICogCi0JICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbnRlbnRtb2RlbC51dGlsX2ltcGxlbWVudGF0aW9uIj4KLQkgKiA8dXRpbF9pbXBsZW1lbnRhdGlvbiBjbGFzcyA9Ci0JICogb3JnLmVjbGlwc2Uud3N0LmJhc2V1dGlsLkNNVXRpbEltcGxlbWVudGF0aW9uSW1wbCAvPiA8L2V4dGVuc2lvbj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotCQl7Ci0JCQkvLyBTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQkvLyBTdHJpbmcgcHJvamVjdE5hdHVyZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BST0pFQ1RfTkFUVVJFX0lEKTsKLQkJCVN0cmluZyByZXNvdXJjZVR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUkVTT1VSQ0VfVFlQRSk7Ci0JCQlTdHJpbmcgc3RhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU1RBR0UpOwotCQkJaWYgKHN0YWdlID09IG51bGwgfHwgc3RhZ2UuZXF1YWxzKCIiKSkKLQkJCXsKLQkJCSAgICBzdGFnZSA9IFZBTF9TVEFHRV9QT1NUOwotCQkJfQotCQkJU3RyaW5nIHByaW9yaXR5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKTsKLQkJCWlmIChwcmlvcml0eSA9PSBudWxsIHx8IHByaW9yaXR5LmVxdWFscygiIikpCi0JCQl7Ci0JCQkJcHJpb3JpdHkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlBSSU9SSVRZX01FRElVTTsKLQkJCX0KLQkJCUxpc3QgcHJvamVjdE5hdHVyZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGlkcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRUxFTV9QUk9KRUNUX05BVFVSRV9JRCk7Ci0JCQlpbnQgbnVtaWRzID0gaWRzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtaWRzOyBpKyspCi0JCQl7Ci0JCQkJU3RyaW5nIHRlbXBpZCA9IGlkc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX1ZBTFVFKTsKLQotCQkJCWlmICh0ZW1waWQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXByb2plY3ROYXR1cmVJZHMuYWRkKHRlbXBpZCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0KLQkJCQkJaW50IHN0YWdlaW50ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QT1NUTk9STUFMSVpBVElPTjsKLQkJCQkJaWYgKHN0YWdlLmVxdWFsc0lnbm9yZUNhc2UoVkFMX1NUQUdFX1BSRSkpCi0JCQkJCXsKLQkJCQkJCXN0YWdlaW50ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QUkVOT1JNQUxJWkFUSU9OOwotCQkJCQl9IGVsc2UgaWYgKHN0YWdlLmVxdWFsc0lnbm9yZUNhc2UoVkFMX1NUQUdFX1BIWVNJQ0FMKSkKLQkJCQkJewotCQkJCQkJc3RhZ2VpbnQgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BIWVNJQ0FMOwotCQkJCQl9Ci0JCQkJCXJlZ2lzdHJ5LnB1dChjbGFzc05hbWUsIHBsdWdpbklkLCBwcm9qZWN0TmF0dXJlSWRzLCByZXNvdXJjZVR5cGUsCi0JCQkJCQkJc3RhZ2VpbnQsIHByaW9yaXR5KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBVUklSZXNvbHZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyggc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBhNGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIEEgVVJJUmVzb2x2ZXIgaXMgdXNlZCB0byByZXNvbHZlIFVSSSByZWZlcmVuY2VzIHRvIHJlc291cmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBVUklSZXNvbHZlciB7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpIAotCSAqIEBwYXJhbSBwdWJsaWNJZCAtIGFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lCi0JICogQHBhcmFtIHN5c3RlbUlkIC0gYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUgCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50aW9uIHRoZSAnbG9naWNhbCcgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmkgCi0gICAgICogQHBhcmFtIHB1YmxpY0lkIC0gYW4gb3B0aW9uYWwgcHVibGljIGlkZW50aWZpZXIgKGkuZS4gbmFtZXNwYWNlIG5hbWUpLCBvciBudWxsIGlmIG5vbmUKLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQgLSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkksIG9yIG51bGwgaWYgbm9uZSAKLSAgICAgKiBAcmV0dXJuIGFuIGFic29sdXRlIFVSSSByZXByZXNlbnRpb24gdGhlICdwaHlzaWNhbCcgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBsb2dpY2FsTG9jYXRpb24pOyAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDYxZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotLyoqCi0gKiBBbiBleHRlbnNpb24gdG8gYXVnbWVudCB0aGUgYmVoYXZpb3VyIG9mIGEgVVJJUmVzb2x2ZXIuICBFeHRlbnNpb25zIGFyZSBwcm9qZWN0IGF3YXJlCi0gKiBzbyB0aGF0IHRoZXkgY2FuIGFwcGx5IHNwZWNpYWxpemVkIHByb2plY3Qgc3BlY2lmaWMgcmVzb2x2aW5nIHJ1bGVzLiAKLSAqLwotcHVibGljIGludGVyZmFjZSBVUklSZXNvbHZlckV4dGVuc2lvbiB7Ci0JLyoqCi0JICogQHBhcmFtIGZpbGUgdGhlIGluLXdvcmtzcGFjZSBiYXNlIHJlc291cmNlLCBpZiBvbmUgZXhpc3RzCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpCi0JICogQHBhcmFtIHB1YmxpY0lkIC0gYW4gb3B0aW9uYWwgcHVibGljIGlkZW50aWZpZXIgKGkuZS4gbmFtZXNwYWNlIG5hbWUpLCBvciBudWxsIGlmIG5vbmUKLQkgKiBAcGFyYW0gc3lzdGVtSWQgLSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkksIG9yIG51bGwgaWYgbm9uZSAKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIFVSSSBvciBudWxsIGlmIHRoaXMgZXh0ZW5zaW9uIGNhbiBub3QgcmVzb2x2ZSB0aGlzIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjYzNjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5FeHRlbnNpYmxlVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBVUklSZXNvbHZlclBsdWdpbiBpbnN0YW5jZTsJCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgeG1sUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeTsKLQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQlwdWJsaWMgVVJJUmVzb2x2ZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9CQotCQotCQkJCQkKLQlwdWJsaWMgc3RhdGljIFVSSVJlc29sdmVyIGNyZWF0ZVJlc29sdmVyKCkKLQl7Ci0JCXJldHVybiBjcmVhdGVSZXNvbHZlcihudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVUklSZXNvbHZlciBjcmVhdGVSZXNvbHZlcihNYXAgcHJvcGVydGllcykKLQl7Ci0JCS8vIFRPRE8uLi4gdXRpbGl6ZSBwcm9wZXJ0aWVzCi0JCXJldHVybiBuZXcgRXh0ZW5zaWJsZVVSSVJlc29sdmVyKCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUVuY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjN2M5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7Ci0KLS8qKgotICogIFRoaXMgY2xhc3MgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGphdmEubGFuZy5VUkxFbmNvZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVVJJRW5jb2RlciAKLXsKLSAgc3RhdGljIEJpdFNldCBkb250TmVlZEVuY29kaW5nOwotICBzdGF0aWMgZmluYWwgaW50IGNhc2VEaWZmID0gKCdhJyAtICdBJyk7Ci0gIHN0YXRpYyBTdHJpbmcgZGZsdEVuY05hbWUgPSBudWxsOwotICAKLQotICBzdGF0aWMgCi0gIHsgICAgICAgICAgICAKLQkgIGRvbnROZWVkRW5jb2RpbmcgPSBuZXcgQml0U2V0KDI1Nik7Ci0JICBpbnQgaTsKLQkgIGZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykgCi0gICAgewotCSAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLQkgIH0KLQkgIGZvciAoaSA9ICdBJzsgaSA8PSAnWic7IGkrKykgCi0gICAgewotCSAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLQkgIH0KLQkgIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7IGkrKykgCi0gICAgewotCSAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLQkgIH0KLQotCSAgLy9kb250TmVlZEVuY29kaW5nLnNldCgnICcpOyAvLyBjcy4uIHJlbW92ZWQgc28gdGhhdCBzcGFjZSBjaGFyYWN0ZXIgd2lsbCBiZSByZXBsYWNlZCBieSAlMjAKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCctJyk7Ci0JICBkb250TmVlZEVuY29kaW5nLnNldCgnXycpOwotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJy4nKTsKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCcqJyk7Ci0JICBkb250TmVlZEVuY29kaW5nLnNldCgnOicpOyAgIC8vIGNzLi4gYWRkZWQgCi0JICBkb250TmVlZEVuY29kaW5nLnNldCgnLycpOyAgIC8vIGNzLi4gYWRkZWQgc28gdGhhdCBzbGFzaGVzIGRvbid0IGdldCBlbmNvZGVkIGFzICUyRgotCi0gIAkvLyBkZmx0RW5jTmFtZSA9IChTdHJpbmcpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IEdldFByb3BlcnR5QWN0aW9uKCJmaWxlLmVuY29kaW5nIikpOwotICAJLy8gQXMgZGlzY3Vzc2VkIHdpdGggU2FuZHksIHdlIHNob3VsZCBlbmNvZGUgVVJJcyB3aXRoIFVURjgKLSAgIGRmbHRFbmNOYW1lID0gIlVURjgiOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJkZmx0RW5jTmFtZSAiICsgZGZsdEVuY05hbWUpOwotICAgfQotCi0gIC8qKgotICAgKiBZb3UgY2FuJ3QgY2FsbCB0aGUgY29uc3RydWN0b3IuCi0gICAqLwotICBwcml2YXRlIFVSSUVuY29kZXIoKSB7IH0KLQotICAvKioKLSAgICogVHJhbnNsYXRlcyBhIHN0cmluZyBpbnRvIDxjb2RlPngtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4KLSAgICogZm9ybWF0LiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgZW5jb2RpbmcKLSAgICogYXMgdGhlIGVuY29kaW5nIHNjaGVtZSB0byBvYnRhaW4gdGhlIGJ5dGVzIGZvciB1bnNhZmUgY2hhcmFjdGVycy4KLSAgICoKLSAgICogQHBhcmFtICAgcyAgIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgdHJhbnNsYXRlZC4KLSAgICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBzdHJpbmcgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSdzCi0gICAqICAgICAgICAgICAgIGRlZmF1bHQgZW5jb2RpbmcuIEluc3RlYWQsIHVzZSB0aGUgZW5jb2RlKFN0cmluZyxTdHJpbmcpCi0gICAqICAgICAgICAgICAgIG1ldGhvZCB0byBzcGVjaWZ5IHRoZSBlbmNvZGluZy4KLSAgICogQHJldHVybiAgdGhlIHRyYW5zbGF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgCi0gIHsKLQkgIFN0cmluZyBzdHIgPSBudWxsOwotCSAgdHJ5IAotICAgIHsKLQkgICAgc3RyID0gZW5jb2RlKHMsIGRmbHRFbmNOYW1lKTsKLQkgIH0gCi0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgCi0gICAgewotCSAgICAvLyBUaGUgc3lzdGVtIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgcGxhdGZvcm0gZGVmYXVsdAotCSAgfQotCSAgcmV0dXJuIHN0cjsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFuc2xhdGVzIGEgc3RyaW5nIGludG8gPGNvZGU+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPgotICAgKiBmb3JtYXQgdXNpbmcgYSBzcGVjaWZpYyBlbmNvZGluZyBzY2hlbWUuIFRoaXMgbWV0aG9kIHVzZXMgdGhlCi0gICAqIHN1cHBsaWVkIGVuY29kaW5nIHNjaGVtZSB0byBvYnRhaW4gdGhlIGJ5dGVzIGZvciB1bnNhZmUKLSAgICogY2hhcmFjdGVycy4KLSAgICogPHA+Ci0gICAqIDxlbT48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSA8YSBocmVmPQotICAgKiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwL2FwcGVuZGl4L25vdGVzLmh0bWwjbm9uLWFzY2lpLWNoYXJzIj4KLSAgICogV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBSZWNvbW1lbmRhdGlvbjwvYT4gc3RhdGVzIHRoYXQKLSAgICogVVRGLTggc2hvdWxkIGJlIHVzZWQuIE5vdCBkb2luZyBzbyBtYXkgaW50cm9kdWNlCi0gICAqIGluY29tcGF0aWJpbGl0ZXMuPC9lbT4KLSAgICoKLSAgICogQHBhcmFtICAgcyAgIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgdHJhbnNsYXRlZC4KLSAgICogQHBhcmFtICAgZW5jICAgVGhlIG5hbWUgb2YgYSBzdXBwb3J0ZWQgCi0gICAqICAgIDxhIGhyZWY9Ii4uL2xhbmcvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjY2hhcmVuYyI+Y2hhcmFjdGVyCi0gICAqICAgIGVuY29kaW5nPC9hPi4KLSAgICogQHJldHVybiAgdGhlIHRyYW5zbGF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLSAgICogQGV4Y2VwdGlvbiAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgKiAgICAgICAgICAgICBJZiB0aGUgbmFtZWQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZAotICAgKiBAc2VlIGphdmEubmV0LlVSTERlY29kZXIjZGVjb2RlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIAotICB7Ci0JICBib29sZWFuIG5lZWRUb0NoYW5nZSA9IGZhbHNlOwotCSAgYm9vbGVhbiB3cm90ZVVuZW5jb2RlZENoYXIgPSBmYWxzZTsgCi0JICBpbnQgbWF4Qnl0ZXNQZXJDaGFyID0gMTA7IC8vIHJhdGhlciBhcmJpdHJhcnkgbGltaXQsIGJ1dCBzYWZlIGZvciBub3cKLSAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heEJ5dGVzUGVyQ2hhcik7Ci0JICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIGVuYykpOwotCi0JICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgCi0gICAgewotCSAgICBpbnQgYyA9IHMuY2hhckF0KGkpOwotCSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRXhhbWluaW5nIGNoYXJhY3RlcjogIiArIGMpOwotCSAgICBpZiAoZG9udE5lZWRFbmNvZGluZy5nZXQoYykpCi0gICAgICB7Ci0JCSAgIC8vaWYgKGMgPT0gJyAnKQotICAgICAgIC8vewotCQkgICAvLyAgYyA9ICcrJzsKLQkJICAgLy8gIG5lZWRUb0NoYW5nZSA9IHRydWU7Ci0JCSAgIC8vfQotCQkgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU3RvcmluZzogIiArIGMpOwotCQkgICBvdXQuYXBwZW5kKChjaGFyKWMpOwotCQkgICB3cm90ZVVuZW5jb2RlZENoYXIgPSB0cnVlOwotCSAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JCSAgICAvLyBjb252ZXJ0IHRvIGV4dGVybmFsIGVuY29kaW5nIGJlZm9yZSBoZXggY29udmVyc2lvbgotCQkgICAgdHJ5Ci0gICAgICAgIHsKLQkJICAgICAgaWYgKHdyb3RlVW5lbmNvZGVkQ2hhcikgCi0gICAgICAgICAgeyAvLyBGaXggZm9yIDQ0MDc2MTAKLQkJICAgIAkgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZiwgZW5jKSk7Ci0JCQkgICAgICB3cm90ZVVuZW5jb2RlZENoYXIgPSBmYWxzZTsKLQkJICAgICAgfQotCQkgICAgICB3cml0ZXIud3JpdGUoYyk7Ci0JCSAgICAgICAgCi0JCSAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgVW5pY29kZQotCQkgICAgICAvLyBzdXJyb2dhdGUgcGFpciwgdGhlbiBwYXNzIGluIHR3byBjaGFyYWN0ZXJzLiBJdCdzIG5vdAotCQkgICAgICAvLyBjbGVhciB3aGF0IHNob3VsZCBiZSBkb25lIGlmIGEgYnl0ZXMgcmVzZXJ2ZWQgaW4gdGhlIAotCQkgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMgcmFuZ2Ugb2NjdXJzIG91dHNpZGUgb2YgYSBsZWdhbAotCQkgICAgICAvLyBzdXJyb2dhdGUgcGFpci4gRm9yIG5vdywganVzdCB0cmVhdCBpdCBhcyBpZiBpdCB3ZXJlIAotCQkgICAgICAvLyBhbnkgb3RoZXIgY2hhcmFjdGVyLgotCQkgICAgICAvLyAKLQkJICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICAvLyAgU3lzdGVtLm91dC5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcoYykgKyAiIGlzIGhpZ2ggc3Vycm9nYXRlIik7CQkJICAgICAgCi0JCQkgICAgICBpZiAoIChpKzEpIDwgcy5sZW5ndGgoKSkgCi0gICAgICAgICAgICB7Ci0JCQkgICAgICAgIGludCBkID0gcy5jaGFyQXQoaSsxKTsKLQkJCSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdEV4YW1pbmluZyAiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSk7CQkJICAgICAgCi0JCQkgICAgICAgIGlmIChkID49IDB4REMwMCAmJiBkIDw9IDB4REZGRikgCi0gICAgICAgICAgICAgIHsKLQkJCQkgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSArICIgaXMgbG93IHN1cnJvZ2F0ZSIpOwkJCQkKLQkJCQkgICAgICAgIHdyaXRlci53cml0ZShkKTsKLQkJCQkgICAgICAgIGkrKzsKLQkJCSAgICAgICAgfQotCQkJICAgICAgfQotCQkgICAgICB9Ci0JCSAgICAgIHdyaXRlci5mbHVzaCgpOwotCQkgICAgfSAKLSAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLQkJICAgICAgYnVmLnJlc2V0KCk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQkgICAgYnl0ZVtdIGJhID0gYnVmLnRvQnl0ZUFycmF5KCk7Ci0KLQkJICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmEubGVuZ3RoOyBqKyspIAotICAgICAgICB7Ci0JCSAgICAgIG91dC5hcHBlbmQoJyUnKTsKLQkJICAgICAgY2hhciBjaCA9IENoYXJhY3Rlci5mb3JEaWdpdCgoYmFbal0gPj4gNCkgJiAweEYsIDE2KTsKLQkJICAgICAgLy8gY29udmVydGluZyB0byB1c2UgdXBwZXJjYXNlIGxldHRlciBhcyBwYXJ0IG9mCi0JCSAgICAgIC8vIHRoZSBoZXggdmFsdWUgaWYgY2ggaXMgYSBsZXR0ZXIuCi0JCSAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICBjaCAtPSBjYXNlRGlmZjsKLQkJICAgICAgfQotCQkgICAgICBvdXQuYXBwZW5kKGNoKTsKLQkJICAgICAgY2ggPSBDaGFyYWN0ZXIuZm9yRGlnaXQoYmFbal0gJiAweEYsIDE2KTsKLQkJICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaCkpIAotICAgICAgICAgIHsKLQkJCSAgICAgIGNoIC09IGNhc2VEaWZmOwotCQkgICAgICB9Ci0JCSAgICAgIG91dC5hcHBlbmQoY2gpOwotCQkgICAgfQotCQkgICAgYnVmLnJlc2V0KCk7Ci0JCSAgICBuZWVkVG9DaGFuZ2UgPSB0cnVlOwotCSAgICB9Ci0JICB9Ci0JICByZXR1cm4gKG5lZWRUb0NoYW5nZT8gb3V0LnRvU3RyaW5nKCkgOiBzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2NzQwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogMjAwNzEyMDUgICAyMTEyNjIgZXJpY2RwQGNhLmlibS5jb20gLSBFcmljIFBldGVycywgQ29weVdTRExUcmVlQ29tbWFuZCBmYWlscyB0byBjb3B5ID93c2RsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotCi1wdWJsaWMgY2xhc3MgVVJJSGVscGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MID0gInBsYXRmb3JtOi9yZXNvdXJjZS8iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9QQVRURVJOID0gIjoiOyAKLSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbnN1cmVVUklQcm90b2NvbEZvcm1hdChTdHJpbmcgdXJpKSB7Ci0JICBTdHJpbmcgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCh1cmkpOwotCSAgaWYgKHByb3RvY29sICE9IG51bGwpIHsKLQkJICBpZiAocHJvdG9jb2wuZXF1YWxzKEZJTEVfUFJPVE9DT0wpKSB7Ci0JCQkgIHJldHVybiBlbnN1cmVGaWxlVVJJUHJvdG9jb2xGb3JtYXQodXJpKTsKLQkJICB9Ci0JICB9Ci0JIHJldHVybiB1cmk7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgdGFrZXMgYSBmaWxlIFVSSSBpbiBTdHJpbmcgZm9ybWF0IGFuZCBlbnN1cmVzIHRoZSBwcm90b2NvbCBpcyBmb2xsb3dlZCBieSB0aHJlZSBzbGFzaGVzLgotICAgKiBGb3IgZXhhbXBsZSwgZmlsZXMgImZpbGU6RDovWFhYIiwgImZpbGU6L0Q6L1hYWCIgYW5kICJmaWxlOi8vRDovWFhYIiBhcmUgY29ycmVjdGVkIHRvOgotICAgKiAiZmlsZTovLy9EOi9YWFgiLgotICAgKiBJZiB0aGUgaW5wdXQgaXMgbm90IGEgZmlsZSBVUkkgKGRvZXMgbm90IHN0YXJ0IHdpdGggImZpbGU6IiksIHRoZSBTdHJpbmcgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuc3VyZUZpbGVVUklQcm90b2NvbEZvcm1hdChTdHJpbmcgdXJpKSB7Ci0gICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkgJiYgIXVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wgKyAiLy8vIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgIAlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCArICIvLyIpKSB7Ci0gICAgICAJCXVyaSA9IEZJTEVfUFJPVE9DT0wgKyAiLyIgKyB1cmkuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAJfSBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MICsgIi8iKSkgewotICAgICAgCQl1cmkgPSBGSUxFX1BST1RPQ09MICsgIi8vIiArIHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAl9IGVsc2UgewotICAgICAgCQl1cmkgPSBGSUxFX1BST1RPQ09MICsgIi8vLyIgKyB1cmkuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAJfQotICAgICAgfQotICAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHByb3RvY29sID0gZ2V0UHJvdG9jb2wodXJpKTsKLSAgICAgIFN0cmluZyBmaWxlID0gdXJpOwotICAgICAgICAgICAKLSAgICAgIGlmIChwcm90b2NvbCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgeyAgIAotICAgICAgICAgIC8vIAotICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7IAotICAgICAgICAgIC8vIHdlIHVzZSBhICdQYXRoJyBvbiB0aGUgJ2ZpbGUnIHBhcnQgb2YgdGhlIHVybCBpbiBvcmRlciB0byBub3JtYWxpemUgdGhlICcuJyBhbmQgJy4uJyBzZWdtZW50cwotICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aCh1cmwuZ2V0RmlsZSgpKTsgCi0gICAgICAgICAgVVJMIHVybDIgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBwYXRoLnRvU3RyaW5nKCkpOwotICAgICAgICAgIHVyaSA9IHVybDIudG9TdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7ICAKLSAgICAgICAgfQotICAgICAgfSAgIAotICAgICAgZWxzZQotICAgICAgeyAgICAgIAotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZSk7Ci0gICAgICAgIHVyaSA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIGEgJ251bGwnIHJvb3RMb2NhdGlvbiBhcmd1bWVudCB3aWxsIGNhdXNlcyB1cmkgdGhhdCBiZWdpbnMgd2l0aCBhICcvJyB0byBiZSB0cmVhdGVkIGFzIGEgd29ya3NwYWNlIHJlbGF0aXZlIHJlc291cmNlCi0gICAqIChpLmUuIHRoZSBzdHJpbmcgInBsYXRmb3JtOi9yZXNvdXJjZSIgaXMgcHJlcGVuZGVkIGFuZCB0aGUgdXJpIGlzIHJlc29sdmVkIHZpYSB0aGUgUGxhdGZvcm0gb2JqZWN0KQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB1cmksIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgcm9vdExvY2F0aW9uKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgeyAKLSAgICAgIC8vIGlzIHRoZSB1cmkgYSB1cmwKLSAgICAgIGlmIChoYXNQcm90b2NvbCh1cmkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaXNQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVQbGF0Zm9ybVVybCh1cmkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHVyaTsKLSAgICAgICAgfQotICAgICAgfQotICAgCi0gICAgICAvLyBpcyB1cmkgYWJzb2x1dGUKLSAgICAgIC8vCi0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmkuaW5kZXhPZigiOiIpICE9IC0xIHx8IHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmVzdWx0ID0gdXJpOwotICAgICAgICB9Ci0gICAgICB9Ci0gIAotICAgICAgLy8gaWYgdXJpIGlzIHJlbGF0aXZlIHRvIHRoZSByZXNvdXJjZUxvY2F0aW9uCi0gICAgICAvLwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgCi0gICAgICAgIGlmIChyZXNvdXJjZUxvY2F0aW9uLmVuZHNXaXRoKCIvIikpCi0gICAgICAgIHsKLQkJCSAgICByZXN1bHQgPSByZXNvdXJjZUxvY2F0aW9uICsgdXJpOwotICAgICAgICB9Ci0JCSAgICBlbHNlCi0gICAgICAgIHsKLQkJCSAgICByZXN1bHQgPSByZXNvdXJjZUxvY2F0aW9uICsgIi8uLi8iICsgdXJpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdXJpOwotICAgICAgfQotICAKLSAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZShyZXN1bHQpOwotICAgIH0KLQotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJub3JtYWxpemUoIiArIHVyaSArICIsICIgKyByZXNvdXJjZUxvY2F0aW9uICsgIiwgIiArIHJvb3RMb2NhdGlvbiArICIpID0gIiArIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVVJMKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdXJpLmluZGV4T2YoIjovIikgPiAyOyAvLyB0ZXN0IHRoYXQgdGhlIGluZGV4IGlzID4gMiBzbyB0aGF0IEM6LyBpcyBub3QgY29uc2lkZXJlZCBhIHByb3RvY29sCi0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhc3RTZWdtZW50KFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOwotICAgIGludCBpbmRleCA9IE1hdGgubWF4KHVyaS5sYXN0SW5kZXhPZigiLyIpLCB1cmkubGFzdEluZGV4T2YoIlxcIikpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGludCBkb3RJbmRleCA9IGdldEV4dGVuc2lvbkRvdEluZGV4KHVyaSk7Ci0gICAgICAgICAgICAgICAKLSAgICBpZiAoZG90SW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZyhkb3RJbmRleCArIDEpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZpbGVFeHRlbnNpb24oU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGludCBkb3RJbmRleCA9IGdldEV4dGVuc2lvbkRvdEluZGV4KHVyaSk7Ci0KLSAgICBpZiAoZG90SW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZygwLCBkb3RJbmRleCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgIAotICAgICAgICAgICAgIAotCi0gIC8vIGhlcmUgd2UgdXNlIHRoZSBQbGF0Zm9ybSB0byByZXNvbHZlIGEgd29ya3NwYWNlIHJlbGF0aXZlIHBhdGggdG8gYW4gYWN0dWFsIHVybAotICAvLwotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyByZXNvbHZlUGxhdGZvcm1VcmwoU3RyaW5nIHVybHNwZWMpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB1cmxzcGVjID0gdXJsc3BlYy5yZXBsYWNlKCdcXCcsICcvJyk7IAotICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJsc3BlYyk7Ci0gICAgICBVUkwgcmVzb2x2ZWRVUkwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0gICAgICByZXN1bHQgPSByZXNvbHZlZFVSTC50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRFeHRlbnNpb25Eb3RJbmRleChTdHJpbmcgdXJpKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotICAgIGludCBkb3RJbmRleCA9IHVyaS5sYXN0SW5kZXhPZigiLiIpOwotICAgIGludCBzbGFzaEluZGV4ID0gTWF0aC5tYXgodXJpLmxhc3RJbmRleE9mKCIvIiksIHVyaS5sYXN0SW5kZXhPZigiXFwiKSk7Ci0KLSAgICBpZiAoZG90SW5kZXggIT0gLTEgJiYgZG90SW5kZXggPiBzbGFzaEluZGV4KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRvdEluZGV4OwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmkgIT0gbnVsbCAmJiB1cmkuc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkKLSAgICB7Ci0gICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MLmxlbmd0aCgpKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmk7Ci0gIH0gICAgICAgICAgICAKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgaWYgKHVyaSAhPSBudWxsICYmICF1cmkuc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCkpCi0gICAgewotICAgICAgdXJpID0gUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wgKyB1cmk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdXJpOwotICB9IAotICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVwZW5kRmlsZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIGlmICh1cmkgIT0gbnVsbCAmJiAhdXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpCi0gICAgewotICAgICAgdXJpID0gRklMRV9QUk9UT0NPTCArIHVyaTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmk7Ci0gIH0gCi0gICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4pOwotICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdCB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWJzb2x1dGUoU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgfHwgdXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSW1wbGllZEZpbGVQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBpZiAoIWhhc1Byb3RvY29sKHVyaSkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHByZWZpeCA9IEZJTEVfUFJPVE9DT0w7Ci0gICAgICBwcmVmaXggKz0gdXJpLnN0YXJ0c1dpdGgoIi8iKSA/ICIvLyIgOiAiLy8vIjsKLSAgICAgIHVyaSA9IHByZWZpeCArIHVyaTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAgICAgICAgICAgIAotICAvLyB0b2RvLi4uIG5lZWQgdG8gcmV2aXNpdCB0aGlzIGJlZm9yZSB3ZSBwdWJsaWNpemUgaXQKLSAgLy8gCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4pOwotICAgICAgaWYgKGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdCB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEgcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZygwLCBpbmRleCArIFBST1RPQ09MX1BBVFRFUk4ubGVuZ3RoKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4pOwotICAgICAgaWYgKGluZGV4ID4gMikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhpbmRleCArIFBST1RPQ09MX1BBVFRFUk4ubGVuZ3RoKCkpOyAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQcm90b2NvbEZpbGVPck51bGwoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBwcm90b2NvbCA9IGdldFByb3RvY29sKHVyaSk7ICAgCi0gICAgcmV0dXJuIHByb3RvY29sID09IG51bGwgfHwgcHJvdG9jb2wuZXF1YWxzKEZJTEVfUFJPVE9DT0wpOwotICB9ICAKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm90b2NvbEZpbGUoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgcmV0dXJuIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpOwotICB9ICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ1Byb3RvY29sKFN0cmluZyB1cmkxLCBTdHJpbmcgdXJpMikKLSAgeyAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgCi0KLSAgICBTdHJpbmcgcHJvdG9jb2wxID0gZ2V0UHJvdG9jb2wodXJpMSk7Ci0gICAgU3RyaW5nIHByb3RvY29sMiA9IGdldFByb3RvY29sKHVyaTIpOwotCi0gICAgaWYgKGlzUHJvdG9jb2xGaWxlT3JOdWxsKHByb3RvY29sMSkgJiYgaXNQcm90b2NvbEZpbGVPck51bGwocHJvdG9jb2wyKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICB9IAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwcm90b2NvbDEgIT0gbnVsbCAmJiBwcm90b2NvbDIgIT0gbnVsbCAmJiBwcm90b2NvbDEuZXF1YWxzKHByb3RvY29sMik7Ci0gICAgfSAgICAgICAgICAgICAKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogd2FybmluZy4uLiB0aGlzIG1ldGhvZCBub3QgZnVsbHkgdGVzdGVkIHlldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7ICAKLSAgICBpZiAoaXNNYXRjaGluZ1Byb3RvY29sKHVyaSwgcmVzb3VyY2VMb2NhdGlvbikpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldFJlbGF0aXZlVVJJKG5ldyBQYXRoKHJlbW92ZVByb3RvY29sKHVyaSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgocmVtb3ZlUHJvdG9jb2wocmVzb3VyY2VMb2NhdGlvbikpKTsKLSAgICB9ICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIHdhcm5pbmcuLi4gdGhpcyBtZXRob2Qgbm90IGZ1bGx5IHRlc3RlZCB5ZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlVVJJKElQYXRoIHVyaSwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikKLSAgeyAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGludCBuTWF0Y2hpbmdTZWdtZW50cyA9IDA7ICAgICAgIAotICAgIHJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIGEgPSB1cmkuc2VnbWVudChuTWF0Y2hpbmdTZWdtZW50cyk7IAotICAgICAgU3RyaW5nIGIgPSByZXNvdXJjZUxvY2F0aW9uLnNlZ21lbnQobk1hdGNoaW5nU2VnbWVudHMpOyAKLSAgICAgIGlmIChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKQotICAgICAgewotICAgICAgICBuTWF0Y2hpbmdTZWdtZW50cysrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAKLQotICAgIGlmIChuTWF0Y2hpbmdTZWdtZW50cyA9PSAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHVyaS50b09TU3RyaW5nKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgIAotICAgICAgcmVzdWx0ID0gIiI7ICAgCi0gICAgICBib29sZWFuIGlzRmlyc3QgPSB0cnVlOwotICAgICAgU3RyaW5nW10gc2VnbWVudHMgPSByZXNvdXJjZUxvY2F0aW9uLnNlZ21lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gbk1hdGNoaW5nU2VnbWVudHM7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgKz0gaXNGaXJzdCA/ICIuLiIgOiAiLy4uIjsgICAgIAotICAgICAgICBpZiAoaXNGaXJzdCkKLSAgICAgICAgewotICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgICAvLyAKLSAgICAgIHNlZ21lbnRzID0gdXJpLnNlZ21lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gbk1hdGNoaW5nU2VnbWVudHM7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCArPSBpc0ZpcnN0ID8gc2VnbWVudHNbaV0gOiAoIi8iICsgc2VnbWVudHNbaV0pOyAgICAgCi0gICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICB7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9IAotICAgICAgfQotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybVVSSShJUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGZ1bGxQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgIGlmIChmdWxsUGF0aC5zdGFydHNXaXRoKCIvIikpCi0gICAgewotICAgICAgZnVsbFBhdGggPSBmdWxsUGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgfQotICAgIHJldHVybiBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCArIGZ1bGxQYXRoOwotICB9Ci0gIAotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgaXMgdXNlZCBhcyBhIHF1aWNrIHRlc3QgdG8gc2VlIGlmIGEgdXJpIGNhbiBiZSByZXNvbHZlZCB0byBhbiBleGlzdGluZyByZXNvdXJjZS4gICAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRhYmxlVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gdGVzdFJlbW90ZVVSSSkKLSAgeyAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsgICAKLSAgICAgIHRyeQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdXJpID0gbm9ybWFsaXplKHVyaSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGlmIChpc1Byb3RvY29sRmlsZU9yTnVsbCh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgdXJpID0gcmVtb3ZlUHJvdG9jb2wodXJpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5VUkkuZGVjb2RlKHVyaSkpOwotICAgICAgICAgIHJlc3VsdCA9IGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1BsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTm90ZSAtIElmIHdlIGFyZSBoZXJlLCB1cmkgaGFzIGJlZW4gZmFpbGVkIHRvIHJlc29sdmUKLSAgICAgICAgICAvLyByZWxhdGl2ZSB0byB0aGUgUGxhdGZvcm0uIFNlZSBub3JtYWxpemUoKSB0byBmaW5kIHdoeS4KLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZXN0UmVtb3RlVVJJKQotICAgICAgICB7Ci0gICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAvLyB0aGUgdXJpIGlzIHJlYWRhYmxlIGlmIHdlIHJlYWNoIGhlcmUuCi0gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvLyB1cmkgaXMgbnVsbAotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAKLQotICAvKioKLSAgICogcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIHVyaQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRVUkkoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICB0cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHsKLSAgICAgIG5ldyBVUkkodXJpKTsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogcmV0dXJucyBhbiBhY2NlcHRhYmxlIFVSSSBmb3IgYSBmaWxlIHBhdGgKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSSUZvckZpbGVQYXRoKFN0cmluZyBmaWxlUGF0aCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBhZGRJbXBsaWVkRmlsZVByb3RvY29sKGZpbGVQYXRoKTsKLSAgICBpZiAoIWlzVmFsaWRVUkkocmVzdWx0KSkKLSAgICB7Ci0gICAgCXRyeQotICAgIAl7Ci0gICAgICAgIHJlc3VsdCA9IFVSSUVuY29kZXIuZW5jb2RlKHJlc3VsdCwgIlVURjgiKTsKLSAgICAJfQotICAgIAljYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgCXsKLSAgICAJCS8vIERvIG5vdGhpbmcgYXMgbG9uZyBhcyBVVEY4IGlzIHVzZWQuIFRoaXMgaXMgc3VwcG9ydGVkLgotICAgIAl9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTUzMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1jYWNoZS5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTg4ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2QxYTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNXZWQgTWFyIDE1IDE3OjI3OjMzIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwMjRiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jV2VkIE1hciAxNSAxNzoyNzozMyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZiNDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJV9QTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlX1BMVUdJTl9QUk9WSURFUgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDQzZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGV4c2QvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2V4c2QvY2FjaGVyZXNvdXJjZS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvZXhzZC9jYWNoZXJlc291cmNlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGRkMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvZXhzZC9jYWNoZXJlc291cmNlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUiIGlkPSJjYWNoZXJlc291cmNlIiBuYW1lPSJDYWNoZSBSZXNvdXJjZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBEZXByZWNhdGVkLiBObyBsb25nZXIgdXNlZCBpbiBXVFAsIGFuZCB3aWxsIGJlIHJlbW92ZWQuIAotCi1UaGUgY2FjaGUgcmVzb3VyY2UgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIHNwZWNpZnkgcmVzb3VyY2VzIHRoYXQgbWF5IGJlIGNhY2hlZCB0aGF0IHJlcXVpcmUgbGljZW5zZXMgdG8gYmUgYWNjZXB0ZWQgcHJpb3IgdG8gY2FjaGluZy4KLQotRGVwcmVjYXRlZC4gTm8gbG9uZ2VyIHVzZWQgaW4gV1RQLCBhbmQgd2lsbCBiZSByZW1vdmVkLiAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2FjaGVyZXNvdXJjZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2FjaGVyZXNvdXJjZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVybCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBjYWNoZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWNlbnNlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsaWNlbnNlIG9mIHRoZSByZXNvdXJjZSB0byBjYWNoZS4gVGhlIGxpY2Vuc2UgaXMgc3BlY2lmaWVkIGFzIGEgVVJMIHRoYXQgcmVzb2x2ZXMgdG8gYSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGxpY2Vuc2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjYWNoZSByZXNvdXJjZSBjb250cmlidXRpb246Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmNhY2hlcmVzb3VyY2UmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7Y2FjaGVyZXNvdXJjZQotICAgICAgICAgICAgbGljZW5zZT0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2UuaHRtbCZxdW90OwotICAgICAgICAgICAgdXJsPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTNkZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLV9QTFVHSU5fUFJPVklERVIgICAgICAgICAgICAgICAgICAgICAgID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLV9QTFVHSU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ2FjaGUgVVJJIFJlc29sdmVyIFBsdWctaW4KLQotY2FjaGVSZXNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDYWNoZSBSZXNvdXJjZQotX1VJX0NBQ0hFX1BSRUZFUkVOQ0VfUEFHRV9USVRMRSAgICAgICAgPSBDYWNoZQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYWVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWNhY2hlUmVzb3VyY2UiIGlkPSJjYWNoZXJlc291cmNlIiBzY2hlbWE9ImV4c2QvY2FjaGVyZXNvdXJjZS5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVfVUlfQ0FDSEVfUFJFRkVSRU5DRV9QQUdFX1RJVExFIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DYWNoZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DYWNoZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLm5ldC5OZXRQcmVmZXJlbmNlcyI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplciI+Ci0gICAgICA8L2luaXRpYWxpemVyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zIj4KLSAgICAgIDxyZXNvbHZlckV4dGVuc2lvbgotICAgICAgICAgICAgc3RhZ2U9InBoeXNpY2FsIgotICAgICAgICAgICAgcHJpb3JpdHk9ImxvdyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbiI+Ci0gICAgICA8L3Jlc29sdmVyRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5ZjQyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoZSBjYWNoZSBob2xkcyByZWZlcmVuY2VzIHRvIHJlbW90ZSByZXNvdXJjZXMuIFRoZSBjYWNoZSBjYW4gc3RvcmUgcmVzb3VyY2VzLAotICogcmV0cmlldmUgcmVzb3VyY2VzLCBhbmQgZGVsZXRlIHJlc291cmNlcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZSAKLXsKLSAgLyoqCi0gICAqIFN0cmluZyBpbnN0YW5jZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJID0gInVyaSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ImxvY2F0aW9uIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVFJZID0gImVudHJ5IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFID0gImNhY2hlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfTU9ESUZJRUQgPSAibGFzdE1vZGlmaWVkIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUElSQVRJT05fVElNRSA9ICJleHBpcmF0aW9uVGltZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6Ly8vIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0ZJTEUgPSAiY2FjaGUueG1sIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VYVEVOU0lPTiA9ICIuY2FjaGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfUFJFRklYID0gInd0cGNhY2hlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NVRkZJWCA9IG51bGw7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB0aW1lb3V0IGZvciBhIGNhY2hlIGVudHJ5IGlzIDEgZGF5LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUID0gODY0MDAwMDA7Ci0JCi0gIC8qKgotICAgKiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBjYWNoZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIENhY2hlIGNhY2hlSW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFRoZSBjYWNoZSBpcyBzdG9yZWQgaW4gYSBoYXNodGFibGUuCi0gICAqLwotICBwcml2YXRlIEhhc2h0YWJsZSBjYWNoZTsKLSAgCi0gIC8qKgotICAgKiBBIHNldCBvZiB1bmNhY2hlZCByZXNvdXJjZXMuIFRoZSBjYWNoZSB3YXMgbm90IGFibGUgdG8gY2FjaGUgcmVzb3VyY2VzCi0gICAqIGluIHRoaXMgbGlzdC4gVGhpcyBsaXN0IGFsbG93cyBxdWlja2x5IHNraXBwaW5nIG92ZXIgdGhlc2UgcmVzb3VyY2VzIGluCi0gICAqIGZ1dHVyZSByZXF1ZXN0cy4gCi0gICAqLwotICBwcml2YXRlIFNldCB1bmNhY2hlZDsKLSAgCi0gIC8qKgotICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNhY2hlCi0gICAqLwotICBwcml2YXRlIEZpbGUgY2FjaGVMb2NhdGlvbiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBDYWNoZShJUGF0aCBjYWNoZUxvY2F0aW9uKQotICB7Ci0JICB0aGlzLmNhY2hlTG9jYXRpb24gPSBjYWNoZUxvY2F0aW9uLnRvRmlsZSgpOy8vUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkpLnRvRmlsZSgpOwotICAgIGNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHVuY2FjaGVkID0gbmV3IEhhc2hTZXQoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBjYWNoZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgY2FjaGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENhY2hlIGdldEluc3RhbmNlKCkKLSAgewotLy8JICBpZihjYWNoZUluc3RhbmNlID09IG51bGwpCi0vLwkgIHsKLS8vCQkgIGNhY2hlSW5zdGFuY2UgPSBuZXcgQ2FjaGUoY2FjaGVMb2NhdGlvbik7Ci0vLwkJICBjYWNoZUluc3RhbmNlLm9wZW4oY2FjaGVMb2NhdGlvbik7Ci0vLwkgIH0KLQkgIHJldHVybiBjYWNoZUluc3RhbmNlOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsb2NhbCByZXNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCB1cmkuIElmIHRoZXJlIGlzIG5vIHJlc291cmNlCi0gICAqIHRoZSBjYWNoZSB3aWxsIGF0dGVtcHQgdG8gZG93bmxvYWQgYW5kIGNhY2hlIHRoZSByZXNvdXJjZSBiZWZvcmUgcmV0dXJuaW5nLgotICAgKiBJZiBhIHJlbW90ZSByZXNvdXJjZSBjYW5ub3QgYmUgY2FjaGVkIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgZm9yIHdoaWNoIGEgcmVzb3VyY2UgaXMgcmVxdWVzdGVkLgotICAgKiBAcmV0dXJuIFRoZSBsb2NhbCByZXNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCBVUkkgb3IgbnVsbCBpZiBhIHJlbW90ZSByZXNvdXJjZSBjYW5ub3QgYmUgY2FjaGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZShTdHJpbmcgdXJpKQotICB7Ci0JICBpZih1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JICBDYWNoZUVudHJ5IHJlc3VsdCA9IChDYWNoZUVudHJ5KWNhY2hlLmdldCh1cmkpOwotCSAgCi0JICAvLyBJZiBubyByZXN1bHQgaXMgaW4gdGhlIGNhY2hlIGFuZCB0aGUgVVJJIGlzIG9mIGFuIGFsbG93ZWQgdHlwZQotCSAgLy8gcmV0cmlldmUgaXQgYW5kIHN0b3JlIGl0IGluIHRoZSBjYWNoZS4KLQkgIGlmKHJlc3VsdCA9PSBudWxsKQotCSAgewotICAgICAgCi0gICAgICAgIGlmKCF1bmNhY2hlZC5jb250YWlucyh1cmkpKQotCSAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gY2FjaGVSZXNvdXJjZSh1cmkpOyAKLSAgICAgICAgfQotCSAgfQotCSAgLy8gUmV0cmVpdmUgYSBmcmVzaCBjb3B5IG9mIHRoZSByZXN1bHQgaWYgaXQgaGFzIHRpbWVkIG91dC4KLQkgIGVsc2UgaWYocmVzdWx0Lmhhc0V4cGlyZWQoKSkKLQkgIHsKLQkJcmVzdWx0ID0gcmVmcmVzaENhY2hlRW50cnkocmVzdWx0KTsKLQkgIH0KLQkgIGlmKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5nZXRMb2NhbEZpbGUoKSA9PSBudWxsKQotCSAgewotCQlyZXR1cm4gbnVsbDsKLQkgIH0KLQkgIHJldHVybiBGSUxFX1BST1RPQ09MICsgY2FjaGVMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgcmVzdWx0LmdldExvY2FsRmlsZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIHVuY2FjaGVkIHJlc291cmNlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdW5jYWNoZWQgcmVzb3VyY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFVuY2FjaGVkVVJJcygpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKXVuY2FjaGVkLnRvQXJyYXkobmV3IFN0cmluZ1t1bmNhY2hlZC5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENsZWFyIHRoZSBsaXN0IG9mIHVuY2FjaGVkIHJlc291cmNlcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyVW5jYWNoZWRVUklzKCkKLSAgewotICAgIHVuY2FjaGVkLmNsZWFyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYW4gdW5jYWNoZWQgcmVzb3VyY2UgdG8gdGhlIGxpc3QgYW5kIHN0YXJ0IHRoZSAKLSAgICogdW5jYWNoZWQgam9iIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRVbmNhY2hlZFVSSShTdHJpbmcgdXJpKQotICB7Ci0JQ2FjaGVKb2Iuc3RhcnRKb2IoKTsKLSAgICB1bmNhY2hlZC5hZGQodXJpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhY2hlIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZQotICAgKiByZW1vdGUgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHJlc291cmNlIHJlZmVyZW5jZSB0byB0aGUgY2FjaGUuIElmIHRoZSByZXNvdXJjZQotICAgKiBjYW5ub3QgYmUgYWNjZXNzZWQgaXQgaXMgbm90IGFkZGVkIGFuZCBudWxsIGlzIHJldHVybmVkLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgcmVtb3RlIFVSSSB0byBjYWNoZS4KLSAgICogQHJldHVybiBBIG5ldyBDYWNoZUVudHJ5IHJlcHJlc2VudGluZyB0aGUgY2FjaGVkIHJlc291cmNlIG9yIG51bGwgaWYgdGhlIHJlbW90ZQotICAgKiAgICAgICAgIHJlc291cmNlIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2FjaGVFbnRyeSBjYWNoZVJlc291cmNlKFN0cmluZyB1cmkpCi0gIHsKLQkgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IG51bGw7Ci0JICBVUkxDb25uZWN0aW9uIGNvbm4gPSBudWxsOwotCSAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCSAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkgIHRyeQotCSAgewotCQkgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCSAgY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkgIGNvbm4uY29ubmVjdCgpOwotCQkgIC8vIERldGVybWluZSBpZiB0aGlzIHJlc291cmNlIGNhbiBiZSBjYWNoZWQuCi0JCSAgaWYoY29ubi5nZXRVc2VDYWNoZXMoKSkKLQkJICB7Ci0JCSAgICBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsvL3VybC5vcGVuU3RyZWFtKCk7Ci0JCSAgCi0JCSAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHJhbmQubmV4dEludCgpICsgQ0FDSEVfRVhURU5TSU9OOwotCQkgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoY2FjaGVMb2NhdGlvbiwgZmlsZU5hbWUpOwotCQkgICAgLy8gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGZpbGUgbmFtZS4KLQkJICAgIHdoaWxlKCFmaWxlLmNyZWF0ZU5ld0ZpbGUoKSkKLQkJICAgIHsKLQkJCSAgZmlsZU5hbWUgPSByYW5kLm5leHRJbnQoKSArIENBQ0hFX0VYVEVOU0lPTjsKLQkJCSAgZmlsZSA9IG5ldyBGaWxlKGNhY2hlTG9jYXRpb24sZmlsZU5hbWUpOwotCQkgICAgfQotCQkgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwMjRdOwotCQkgICAgaW50IGJ5dGVsZW5ndGg7Ci0JCSAgICB3aGlsZSgoYnl0ZWxlbmd0aCA9IGlzLnJlYWQoYnl0ZXMpKSAhPSAtMSkKLQkJICAgIHsKLQkJCSAgb3Mud3JpdGUoYnl0ZXMsIDAsIGJ5dGVsZW5ndGgpOwotCQkgICAgfQotCQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBjb25uLmdldExhc3RNb2RpZmllZCgpOwotCQkgICAgbG9uZyBleHBpcmF0aW9uID0gY29ubi5nZXRFeHBpcmF0aW9uKCk7Ci0JCQlpZihleHBpcmF0aW9uID09IDApCi0JCQl7Ci0JCQkgIGV4cGlyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7Ci0JCQl9Ci0JCSAgICBjYWNoZUVudHJ5ID0gbmV3IENhY2hlRW50cnkodXJpLCBmaWxlTmFtZSwgbGFzdE1vZGlmaWVkLCBleHBpcmF0aW9uKTsKLQkJICAgIGNhY2hlLnB1dCh1cmksY2FjaGVFbnRyeSk7Ci0JCSAgfQotCi0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gdCkKLQkgIHsKLQkJICAvLyBQdXQgdGhlIGVudHJ5IGluIHRoZSB1bmNhY2hlZCBsaXN0IHNvIHRoZSByZXNvbHV0aW9uIHdvcmsgd2lsbCBub3QgYmUgcGVyZm9ybWVkIGFnYWluLgotICAgICAgLy8gVE9ETzogQWRkIGluIGEgdGltZW91dCBmb3IgdGhlIG5vbi1sb2NhdGVkIHVyaXMuCi0gICAgICBhZGRVbmNhY2hlZFVSSSh1cmkpOwotCSAgfQotCSAgZmluYWxseQotCSAgewotCQkgIGlmKGlzICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIGlzLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLgotCQkJICB9Ci0JCSAgfQotCQkgIGlmKG9zICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIG9zLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJCS8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLiAKLQkJCSAgfQotCQkgIH0KLQkgIH0KLQkgIHJldHVybiBjYWNoZUVudHJ5OwotICB9Ci0gIAotICAvKioKLSAgICogUmVmcmVzaCB0aGUgY2FjaGUgZW50cnkgaWYgbmVjZXNzYXJ5LiBUaGUgY2FjaGUgZW50cnkgd2lsbCBiZSByZWZyZXNoZWQKLSAgICogaWYgdGhlIHJlbW90ZSByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlIGFuZCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZQotICAgKiByZW1vdGUgcmVzb3VyY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlIGNhY2hlZAotICAgKiByZXNvdXJjZS4KLSAgICogCi0gICAqIEBwYXJhbSBjYWNoZUVudHJ5IFRoZSBjYWNoZSBlbnRyeSB0byByZWZyZXNoLgotICAgKiBAcmV0dXJuIFRoZSByZWZyZXNoZWQgY2FjaGUgZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2FjaGVFbnRyeSByZWZyZXNoQ2FjaGVFbnRyeShDYWNoZUVudHJ5IGNhY2hlRW50cnkpCi0gIHsKLQkgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCSAgdHJ5Ci0JICB7Ci0JCSAgVVJMIHVybCA9IG5ldyBVUkwoY2FjaGVFbnRyeS5nZXRVUkkoKSk7Ci0JCSAgY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkgIGNvbm4uY29ubmVjdCgpOwotCQkgIAotCQkgIGxvbmcgbGFzdE1vZGlmaWVkID0gY29ubi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkgICAgICBpZihsYXN0TW9kaWZpZWQgPiBjYWNoZUVudHJ5LmdldExhc3RNb2RpZmllZCgpKQotCQkgIHsKLQkJCWxvbmcgZXhwaXJhdGlvbiA9IGNvbm4uZ2V0RXhwaXJhdGlvbigpOwotCQkgICAgaWYoZXhwaXJhdGlvbiA9PSAwKQotCQkJewotCQkJICBleHBpcmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBUSU1FT1VUOwotCQkJfQotCQkJCi0JCSAgICBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQotCQkJU3RyaW5nIGxvY2FsRmlsZSA9IGNhY2hlRW50cnkuZ2V0TG9jYWxGaWxlKCk7Ci0gIAotCQkgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoQ0FDSEVfUFJFRklYLCBDQUNIRV9TVUZGSVgpOwotCQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0KLQkJICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotCQkgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAyNF07Ci0JCSAgICBpbnQgYnl0ZWxlbmd0aDsKLQkJICAgIHdoaWxlKChieXRlbGVuZ3RoID0gaXMucmVhZChieXRlcykpICE9IC0xKQotCQkgICAgewotCQkJICBvcy53cml0ZShieXRlcywgMCwgYnl0ZWxlbmd0aCk7Ci0JCSAgICB9Ci0JCQlpcy5jbG9zZSgpOwotCQkJb3MuY2xvc2UoKTsKLQkJCWRlbGV0ZUZpbGUoY2FjaGVFbnRyeS5nZXRVUkkoKSk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShjYWNoZUxvY2F0aW9uLCBsb2NhbEZpbGUpOwotCQkJdGVtcEZpbGUucmVuYW1lVG8oZik7Ci0JCQljYWNoZUVudHJ5LnNldEV4cGlyYXRpb24oZXhwaXJhdGlvbik7Ci0JCQljYWNoZUVudHJ5LnNldExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpOwotCQkgIH0KLQkJICAvLyBUaGUgY2FjaGUgZW50cnkgaGFzbid0IGNoYW5nZWQuIEp1c3QgdXBkYXRlIHRoZSBleHBpcmF0aW9uIHRpbWUuCi0JICAgICAgZWxzZQotCQkgIHsKLQkJCWxvbmcgZXhwaXJhdGlvbiA9IGNvbm4uZ2V0RXhwaXJhdGlvbigpOwotCQkJaWYoZXhwaXJhdGlvbiA9PSAwKQotCQkJewotCQkJICBleHBpcmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBUSU1FT1VUOwotCQkJfQotCQkJY2FjaGVFbnRyeS5zZXRFeHBpcmF0aW9uKGV4cGlyYXRpb24pOwotCQkgIH0KLQotCSAgfQotCSAgY2F0Y2goRXhjZXB0aW9uIGUpCi0JICB7Ci0gICAgICAvLyBEbyBub3RoaW5nLgotCSAgfQotCSAgZmluYWxseQotCSAgewotCQkgIGlmKGlzICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIGlzLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLgotCQkJICB9Ci0JCSAgfQotCQkgIGlmKG9zICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIG9zLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJCS8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLiAKLQkJCSAgfQotCQkgIH0KLQkgIH0KLQkgIHJldHVybiBjYWNoZUVudHJ5OwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBjYWNoZWQgVVJJcy4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdGhlIGNhY2hlZCBVUklzLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldENhY2hlZFVSSXMoKQotICB7Ci0JU2V0IGtleXNldCA9IGNhY2hlLmtleVNldCgpOwotCXJldHVybiAoU3RyaW5nW10pa2V5c2V0LnRvQXJyYXkobmV3IFN0cmluZ1trZXlzZXQuc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgY2FjaGUuIENsb3NpbmcgdGhlIGNhY2hlIGludm9sdmVzIHNlcmlhbGl6aW5nIHRoZSBkYXRhIHRvIGFuIFhNTCBmaWxlCi0gICAqIGluIHRoZSBwbHVnaW4gc3RhdGUgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpCi0gIHsKLQkgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgY2FjaGVkb2MgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0JCUVsZW1lbnQgcm9vdGVsZW0gPSBjYWNoZWRvYy5jcmVhdGVFbGVtZW50KENBQ0hFKTsKLQkJY2FjaGVkb2MuYXBwZW5kQ2hpbGQocm9vdGVsZW0pOwotCQkKLQkgIEVudW1lcmF0aW9uIHVyaXMgPSBjYWNoZS5rZXlzKCk7Ci0JICB3aGlsZSh1cmlzLmhhc01vcmVFbGVtZW50cygpKQotCSAgewotCQkgIFN0cmluZyBrZXkgPSAoU3RyaW5nKXVyaXMubmV4dEVsZW1lbnQoKTsKLQkJICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSAoQ2FjaGVFbnRyeSljYWNoZS5nZXQoa2V5KTsKLQkJICBpZihjYWNoZUVudHJ5ICE9IG51bGwpCi0JCSAgewotCQkJICBFbGVtZW50IGVudHJ5ID0gY2FjaGVkb2MuY3JlYXRlRWxlbWVudChFTlRSWSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShVUkksIGtleSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShMT0NBVElPTiwgY2FjaGVFbnRyeS5nZXRMb2NhbEZpbGUoKSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShFWFBJUkFUSU9OX1RJTUUsIFN0cmluZy52YWx1ZU9mKGNhY2hlRW50cnkuZ2V0RXhwaXJhdGlvblRpbWUoKSkpOwotCQkJICBlbnRyeS5zZXRBdHRyaWJ1dGUoTEFTVF9NT0RJRklFRCwgU3RyaW5nLnZhbHVlT2YoY2FjaGVFbnRyeS5nZXRMYXN0TW9kaWZpZWQoKSkpOwotCQkJICByb290ZWxlbS5hcHBlbmRDaGlsZChlbnRyeSk7Ci0JCSAgfQotCSAgfQotCSAgCi0JICAvLyBXcml0ZSB0aGUgY2FjaGUgZW50cnkuCi0JICBUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBTb3VyY2UgaW5wdXQgPSBuZXcgRE9NU291cmNlKGNhY2hlZG9jKTsKLQkgIElQYXRoIHN0YXRlTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSk7Ci0gICAgICBSZXN1bHQgb3V0cHV0ID0gbmV3IFN0cmVhbVJlc3VsdChzdGF0ZUxvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBDQUNIRV9GSUxFKTsKLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShpbnB1dCwgb3V0cHV0KTsKLQotICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKQotCSAgewotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIHN0b3JlIGludGVybmV0IGNhY2hlLiIpOwotCSAgfQotCSAgY2FjaGVJbnN0YW5jZSA9IG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBPcGVuIHRoZSBjYWNoZS4gT3BlbmluZyB0aGUgY2FjaGUgaW52b2x2ZXMgcGFyc2luZyB0aGUgY2FjaGUgWE1MIGZpbGUgaW4KLSAgICogdGhlIHBsdWdpbiBzdGF0ZSBsb2NhdGlvbiBpZiBpdCBjYW4gYmUgcmVhZC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBvcGVuKElQYXRoIGNhY2hlTG9jYXRpb24pCi0gIHsKLSAgICBjYWNoZUluc3RhbmNlID0gbmV3IENhY2hlKGNhY2hlTG9jYXRpb24pOwotCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgdHJ5IHsKLQkJICAKLQkJSVBhdGggc3RhdGVMb2NhdGlvbiA9IGNhY2hlTG9jYXRpb247Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgY2FjaGVkb2MgPSBidWlsZGVyLnBhcnNlKHN0YXRlTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIENBQ0hFX0ZJTEUpOwotCQlFbGVtZW50IHJvb3RlbGVtID0gY2FjaGVkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGVudHJpZXMgPSByb290ZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBudW1FbnRyaWVzID0gZW50cmllcy5nZXRMZW5ndGgoKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykKLQkJewotCQkJTm9kZSBlbnRyeSA9IGVudHJpZXMuaXRlbShpKTsKLQkJCWlmKGVudHJ5IGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCXsKLQkJCQlFbGVtZW50IGUgPSAoRWxlbWVudCllbnRyeTsKLQkJCQlpZihlLmdldE5vZGVOYW1lKCkuZXF1YWxzKEVOVFJZKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyB1cmkgPSBlLmdldEF0dHJpYnV0ZShVUkkpOwotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBlLmdldEF0dHJpYnV0ZShMT0NBVElPTik7Ci0JCQkJCVN0cmluZyBsbSA9IGUuZ2V0QXR0cmlidXRlKExBU1RfTU9ESUZJRUQpOwotCQkJCQlTdHJpbmcgZXQgPSBlLmdldEF0dHJpYnV0ZShFWFBJUkFUSU9OX1RJTUUpOwotCQkJCQlsb25nIGxhc3RNb2RpZmllZCA9IC0xOwotCQkJCQlsb25nIGV4cGlyYXRpb25UaW1lID0gLTE7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlsYXN0TW9kaWZpZWQgPSBMb25nLnBhcnNlTG9uZyhsbSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLQkJCQkJewotCQkJCQl9Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlleHBpcmF0aW9uVGltZSA9IExvbmcucGFyc2VMb25nKGV0KTsKLQkJCQkJfQotCQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotCQkJCQl7Ci0JCQkJCX0KLQkJCQkJaWYodXJpICE9IG51bGwgJiYgbG9jYXRpb24gIT0gbnVsbCkKLQkJCQkJewotCQkJCQkgIGNhY2hlSW5zdGFuY2UuY2FjaGUucHV0KHVyaSwgbmV3IENhY2hlRW50cnkodXJpLCBsb2NhdGlvbiwgbGFzdE1vZGlmaWVkLCBleHBpcmF0aW9uVGltZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICB9Ci0JICBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLQkgIHsKLQkJLy8gSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbiB0aGVyZSBpcyBub3RoaW5nIHRvIGxvYWQuIERvIG5vdGhpbmcuCi0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZSkKLQkgIHsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBsb2FkIGNhY2hlLiIpOwotCSAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ2xlYXIgYWxsIG9mIHRoZSBlbnRyaWVzIGZyb20gdGhlIGNhY2hlLiBUaGlzIG1ldGhvZCBhbHNvIGRlbGV0ZXMgdGhlIGNhY2hlIGZpbGVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXIoKQotICB7Ci0JRW51bWVyYXRpb24ga2V5cyA9IGNhY2hlLmtleXMoKTsKLQl3aGlsZShrZXlzLmhhc01vcmVFbGVtZW50cygpKQotCXsKLQkgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLQkgIAotCSAgZGVsZXRlRmlsZShrZXkpOwotCX0KLQljYWNoZS5jbGVhcigpOwotICB9Ci0gIAotICAvKioKLSAgICogRGVsZXRlIHRoZSBjYWNoZSBlbnRyeSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFVSSS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIGVudHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBjYXRhbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZGVsZXRlRW50cnkoU3RyaW5nIHVyaSkKLSAgewotCSAgaWYodXJpID09IG51bGwpIHJldHVybjsKLQkgIAotCSAgZGVsZXRlRmlsZSh1cmkpOwotCSAgY2FjaGUucmVtb3ZlKHVyaSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gZGVsZXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZShTdHJpbmcgdXJpKQotICB7Ci0JICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSAoQ2FjaGVFbnRyeSljYWNoZS5nZXQodXJpKTsKLQkgIGlmKGNhY2hlRW50cnkgIT0gbnVsbCkKLQkgIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gY2FjaGVMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgY2FjaGVFbnRyeS5nZXRMb2NhbEZpbGUoKTsKLQkgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUobG9jYXRpb24pOwotCSAgICBpZighZmlsZS5kZWxldGUoKSkKLQkgICAgewotCSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICIgKyBsb2NhdGlvbiArICIgZnJvbSBjYWNoZS4iKTsKLQkgICAgfSAKLQkgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxN2VjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBIGNhY2hlIGVudHJ5IGNvbnRhaW5zIGEgVVJJLCBhIGxvY2FsIGZpbGUsIGFuZCBhIHRpbWVvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUVudHJ5IAotewotICBwcml2YXRlIFN0cmluZyB1cmk7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsRmlsZTsKLSAgcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZDsKLSAgcHJpdmF0ZSBsb25nIGV4cGlyYXRpb25UaW1lOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBjYWNoZSBlbnRyeS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIHJlbW90ZSBVUkkgb2YgdGhlIGNhY2hlIGVudHJ5LgotICAgKiBAcGFyYW0gbG9jYWxGaWxlIFRoZSBsb2NhbCBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNhY2hlZCBlbnRyeS4KLSAgICogQHBhcmFtIGxhc3RNb2RpZmllIFRoZSB0aW1lIHRoaXMgcmVzb3VyY2Ugd2FzIGxhc3QgbW9kaWZpZWQuCi0gICAqIEBwYXJhbSBleHBpcmF0aW9uVGltZSBUaGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IHRoaXMgY2FjaGUgZW50cnkgd2lsbAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlLgotICAgKi8KLSAgcHVibGljIENhY2hlRW50cnkoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsRmlsZSwgbG9uZyBsYXN0TW9kaWZpZWQsIGxvbmcgZXhwaXJhdGlvblRpbWUpCi0gIHsKLQl0aGlzLnVyaSA9IHVyaTsKLQl0aGlzLmxvY2FsRmlsZSA9IGxvY2FsRmlsZTsKLQl0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLQl0aGlzLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGUgY2FjaGUgZW50cnkgaXMgZXhwaXJlZCBpZiBpdHMgZXhwaXJhdGlvbiB0aW1lIGlzIGxlc3MgdGhlbiB0aGUKLSAgICogY3VycmVudCBzeXN0ZW0gdGltZSBhbmQgbm90IGVxdWFsIHRvIC0xLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgY2FjaGVkIGVudHJ5IGhhcyBleHBpcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFeHBpcmVkKCkKLSAgewotCSBpZihleHBpcmF0aW9uVGltZSAhPSAtMSAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+IGV4cGlyYXRpb25UaW1lKQotCSB7Ci0JICAgcmV0dXJuIHRydWU7Ci0JIH0KLQkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICogCi0gICAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICogICAgICAgICAgICAgICAgLTEgaW5kaWNhdGVzIHRoYXQgdGhpcyBlbnRyeSB3aWxsIG5vdCBleHBpcmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uKGxvbmcgZXhwaXJhdGlvblRpbWUpCi0gIHsKLQl0aGlzLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHRpbWUgYXQgd2hpY2ggdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHRpbWUgYXQgd2hpY2ggdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICovCi0gIHB1YmxpYyBsb25nIGdldEV4cGlyYXRpb25UaW1lKCkKLSAgewotCXJldHVybiBleHBpcmF0aW9uVGltZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgcmVtb3RlIFVSSSBmb3IgdGhpcyBjYWNoZSBlbnRyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHJlbW90ZSBVUkkgZm9yIHRoaXMgY2FjaGUgZW50cnkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLQlyZXR1cm4gdXJpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsb2NhbCBmaWxlIGZvciB0aGlzIGNhY2hlIGVudHJ5LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbG9jYWwgZmlsZSBmb3IgdGhpcyBjYWNoZSBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxGaWxlKCkKLSAgewotCXJldHVybiBsb2NhbEZpbGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxhc3QgdGltZSB0aGlzIGNhY2hlIGVudHJ5IHdhcyBtb2RpZmllZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxhc3QgdGltZSB0aGlzIGNhY2hlIGVudHJ5IHdhcyBtb2RpZmllZC4KLSAgICovCi0gIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpCi0gIHsKLQlyZXR1cm4gbGFzdE1vZGlmaWVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBsYXN0IHRpbWUgdGhpcyBjYWNoZSBlbnRyeSB3YXMgbW9kaWZpZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyBsYXN0TW9kaWZpZWQpCi0gIHsKLQl0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGMzOTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLQotLyoqCi0gKiBBIGNhY2hlIGpvYiBydW5zIG9uY2UgYW4gaG91ciB0byBjYWNoZSBhbnkgcHJlc3BlY2lmaWVkIHJlc291cmNlcyB3aGljaAotICogc2hvdWxkIGJlIGNhY2hlZCBhbmQgYW55IHJlc291cmNlcyBmb3Igd2hpY2ggYW4gYXR0ZW1wdCB3YXMgcHJldmlvdXNseSAKLSAqIG1hZGUgdG8gY2FjaGUgdGhlbSBidXQgdGhleSB3ZXJlIHVuYWJsZSB0byBiZSBjYWNoZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUpvYiBleHRlbmRzIEpvYgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNDSEVEVUxFX1RJTUUgPSAzNjAwMDAwOwotCi0gIHByaXZhdGUgc3RhdGljIENhY2hlSm9iIGpvYiA9IG51bGw7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBDYWNoZUpvYigpCi0gIHsKLSAgICBzdXBlcihDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9NT05JVE9SX05BTUUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLQlib29sZWFuIGFsbFN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgIENhY2hlIGNhY2hlID0gQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSB1bmNhY2hlZFVSSXMgPSBjYWNoZS5nZXRVbmNhY2hlZFVSSXMoKTsKLSAgICBpbnQgbnVtVW5jYWNoZWRVUklzID0gdW5jYWNoZWRVUklzLmxlbmd0aDsKLQotICAgIGNhY2hlLmNsZWFyVW5jYWNoZWRVUklzKCk7Ci0gICAgbW9uaXRvci5iZWdpblRhc2soQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfTU9OSVRPUl9OQU1FLCBudW1VbmNhY2hlZFVSSXMpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1VbmNhY2hlZFVSSXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yKGludCBqID0gaTsgaiA8IG51bVVuY2FjaGVkVVJJczsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhY2hlLmFkZFVuY2FjaGVkVVJJKHVuY2FjaGVkVVJJc1tqXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdXJpID0gdW5jYWNoZWRVUklzW2ldOwotICAgICAgICBtb25pdG9yLnNldFRhc2tOYW1lKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX01PTklUT1JfQ0FDSElORywgbmV3IE9iamVjdFtde3VyaX0pKTsKLSAgICAgICAKLSAgICAgICAgU3RyaW5nIGNhY2hlZFVSSSA9IGNhY2hlLmdldFJlc291cmNlKHVyaSk7Ci0gICAgICAgIGlmKGNhY2hlZFVSSSA9PSBudWxsKQotICAgIAl7Ci0gICAgCSAgYWxsU3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgIAl9Ci0gICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgfQotICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9IAotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICAvLyBJZiBhbGwgdGhlIHVuY2FjaGVkIFVSSXMgY291bGQgbm90IGJlIGNhY2hlZCAKLSAgICAgIC8vIHNjaGVkdWxlIHRoZSBuZXh0IHRpbWUgdGhlIGpvYiBzaG91bGQgcnVuLgotICAgICAgaWYoIWFsbFN1Y2Nlc3NmdWwpCi0gICAgICB7Ci0gICAgCSAgc3RhcnRKb2IoU0NIRURVTEVfVElNRSk7IAotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFN0YXJ0IHRoZSBjYWNoZSBqb2IuIFRoZSBjYWNoZSBqb2IgY2FjaGVzIHJlc291cmNlcyB0aGF0IHdlcmUgbm90IGFibGUgdG8gYmUgcHJldmlvdXNseQotICAgKiBkb3dubG9hZGVkLiBPbmx5IG9uZSBqb2IgaXMgcnVuIGF0IGEgdGltZS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzdGFydEpvYigpIAotICB7Ci0JaWYoam9iID09IG51bGwpCi0JewotCSAgc3RhcnRKb2IoMCk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogU3RhcnQgYSBuZXcgY2FjaGUgam9iIHdpdGggdGhlIHNwZWNpZmllZCBkZWxheS4KLSAgICogCi0gICAqIEBwYXJhbSBkZWxheQotICAgKiAJCVRoZSBzdGFydCBkZWxheSBmb3IgdGhlIGNhY2hlIGpvYi4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRKb2IobG9uZyBkZWxheSkKLSAgewotCWpvYiA9IG5ldyBDYWNoZUpvYigpOwotCWpvYi5zZXRQcmlvcml0eShDYWNoZUpvYi5ERUNPUkFURSk7Ci0Jam9iLnNjaGVkdWxlKGRlbGF5KTsgLy8gc3RhcnQgYXMgc29vbiBhcyBwb3NzaWJsZQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGhlIGN1cnJlbnQgY2FjaGUgam9iLiBUaGUgY2FjaGUgam9iIGNhY2hlcyByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBhYmxlIHRvIGJlIHByZXZpb3VzbHkKLSAgICogZG93bmxvYWRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzdG9wSm9iKCkgCi0gIHsKLQlpZiAoam9iICE9IG51bGwpIAotCXsKLQkgIGpvYi5jYW5jZWwoKTsKLQl9Ci0Jam9iID0gbnVsbDsKLSAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmZWUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgdGhlIGNhY2hlLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fQ0xFQVJfQ0FDSEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9ERUxFVEVfRU5UUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BSRUZfQ0FDSEVfRU5UUklFU19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9DQUNIRV9DQUNIRV9PUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BSRUZfQ0FDSEVfQUJPVVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BSRUZfUFJPTVBUX0ZPUl9ESVNBR1JFRURfTElDRU5TRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX01PTklUT1JfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfTU9OSVRPUl9DQUNISU5HOwotCi0JLy8gQ2FjaGUgbGljZW5zZSBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19JTlRFUk5BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19CUk9XU0VSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfQUdSRUVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfRElTQUdSRUVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xPQURJTkdfTElDRU5TRTsKLQotCS8vIENhY2hlIGxvZ2dpbmcgbWVzc2FnZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfTE9HX0lORk9fV1RQX05PX1VTRVJfSU5URVJBQ1RJT047Ci0KLQkvLyBXVFAgdGVzdCBubyB1c2VyIGludGVyYWN0aW9uIHN5c3RlbSBwcm9wZXJ0eQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUF9OT19VU0VSX0lOVEVSQUNUSU9OX1NZU1RFTV9QUk9QOyAgIAotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENhY2hlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNGYwZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIAotewotICAvKioKLSAgICogVGhlIElEIG9mIHRoaXMgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSI7Ci0KLSAgLyoqCi0gICAqIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBDYWNoZVBsdWdpbiBwbHVnaW47Ci0KLSAgLyoqCi0gICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBDYWNoZVBsdWdpbigpIAotICB7Ci0Jc3VwZXIoKTsKLQlwbHVnaW4gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCVRvQ2FjaGVSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLnJlYWRSZWdpc3RyeSgpOwotCUNhY2hlLm9wZW4oUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihnZXRCdW5kbGUoKSkpOwotCWlmIChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmNvbnRhaW5zKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCkpIAotCXsKLQkgIHNldENhY2hlRW5hYmxlZChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKSk7Ci0JfSAKLQllbHNlIAotCXsKLQkgIC8vIFRoZSBjYWNoZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotCSAgc2V0Q2FjaGVFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLy8gUmVzdG9yZSBsaWNlbnNlIHByZWZlcmVuY2VzCi0JUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCUxpY2Vuc2VSZWdpc3RyeSByZWdpc3RyeSA9IExpY2Vuc2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCVN0cmluZ1tdIGxpY2Vuc2VzID0gcmVnaXN0cnkuZ2V0TGljZW5zZXMoKTsKLQlpbnQgbnVtTGljZW5zZXMgPSBsaWNlbnNlcy5sZW5ndGg7Ci0JZm9yKGludCBpID0gMDsgaSA8IG51bUxpY2Vuc2VzOyBpKyspCi0JewotCSAgaW50IHN0YXRlID0gcHJlZnMuZ2V0SW50KGxpY2Vuc2VzW2ldKTsKLQkgIGlmKHN0YXRlID09IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0FHUkVFLmludFZhbHVlKCkpCi0JICB7Ci0JCXJlZ2lzdHJ5LmFncmVlTGljZW5zZShsaWNlbnNlc1tpXSk7Ci0JICB9Ci0JICBlbHNlIGlmKHN0YXRlID09IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0RJU0FHUkVFLmludFZhbHVlKCkpCi0JICB7Ci0JCXJlZ2lzdHJ5LmRpc2FncmVlTGljZW5zZShsaWNlbnNlc1tpXSk7Ci0JICB9Ci0JfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQkvLyBTYXZlIHRoZSBsaWNlbnNlIHN0YXRlIGluZm9ybWF0aW9uLgotCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQlMaWNlbnNlUmVnaXN0cnkgcmVnaXN0cnkgPSBMaWNlbnNlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmdbXSBsaWNlbnNlcyA9IHJlZ2lzdHJ5LmdldExpY2Vuc2VzKCk7Ci0JaW50IG51bUxpY2Vuc2VzID0gbGljZW5zZXMubGVuZ3RoOwotCWZvcihpbnQgaSA9IDA7IGkgPCBudW1MaWNlbnNlczsgaSsrKQotCXsKLQkgIEludGVnZXIgc3RhdGUgPSByZWdpc3RyeS5nZXRMaWNlbnNlU3RhdGUobGljZW5zZXNbaV0pOwotICAgICAgLy8gRm9yIHN0YXRlcyB0aGF0IGhhdmUgYmVlbiBkaXNhZ3JlZWQgdG8gdGhpcyBzZXNzaW9uIHN0b3JlCi0JICAvLyB0aGVtIGFzIGRpc2FncmVlLgotCSAgaWYoc3RhdGUgPT0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKQotCSAgewotCQlzdGF0ZSA9IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0RJU0FHUkVFOwotCSAgfQotCSAgcHJlZnMuc2V0VmFsdWUobGljZW5zZXNbaV0sIHN0YXRlLmludFZhbHVlKCkpOwotCX0KLQkKLQlDYWNoZS5nZXRJbnN0YW5jZSgpLmNsb3NlKCk7Ci0JQ2FjaGVKb2Iuc3RvcEpvYigpOwotCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JcGx1Z2luID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENhY2hlUGx1Z2luIGdldERlZmF1bHQoKSAKLSAgewotCXJldHVybiBwbHVnaW47Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSBjYWNoZSBpcyBlbmFibGVkLgotICAgKiAKLSAgICogQHBhcmFtIGVuYWJsZWQgSWYgdHJ1ZSB0aGUgY2FjaGUgaXMgZW5hYmxlZCwgaWYgZmFsc2UgaXQgaXMgbm90IGVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDYWNoZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSAKLSAgewotCWdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVELCBlbmFibGVkKTsKLQlDYWNoZUpvYi5zdG9wSm9iKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWNoZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNhY2hlIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2FjaGVFbmFibGVkKCkgCi0gIHsKLQlpZiAoZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5jb250YWlucyhQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpKQotCSAgcmV0dXJuIGdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpOwotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCBmb3IgbGljZW5zZXMgdG8gd2hpY2ggdGhleSAKLSAgICogaGF2ZSBwcmV2aW91c2x5IGRpc2FncmVlZC4KLSAgICogCi0gICAqIEBwYXJhbSBwcm9tcHQgSWYgdHJ1ZSB0aGUgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkLCBpZiBmYWxzZSB0aGUgdXNlciBzaG91bGQgbm90IGJlIHByb21wdGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvbXB0RGlzYWdyZWVkTGljZW5zZXMoYm9vbGVhbiBwcm9tcHQpIAotICB7Ci0JZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMsIHByb21wdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgZm9yIGxpY2Vuc2VzIHRvIHdoaWNoIHRoZXkKLSAgICogaGF2ZSBwcmV2aW91c2x5IGRpc2FncmVlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkUHJvbXB0KCkgCi0gIHsKLQlpZiAoZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5jb250YWlucyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMpKQotCSAgcmV0dXJuIGdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMpOwotCXJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzg4MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENhY2hlIHByZWZlcmVuY2UgcGFnZSBzdHJpbmdzLgotX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX1RJVExFICAgICAgICAgICAgID0gUmVtb3ZlIEFsbD8KLV9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19NRVNTQUdFICAgICAgICAgICA9IFJlbW92ZSBhbGwgY2FjaGUgZW50cmllcz8KLV9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfVElUTEUgICAgICA9IFJlbW92ZSBFbnRyaWVzPwotX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19NRVNTQUdFICAgID0gUmVtb3ZlIGFsbCBzZWxlY3RlZCBjYWNoZSBlbnRyaWVzPwotX1VJX0JVVFRPTl9DTEVBUl9DQUNIRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUmVtb3ZlICZBbGwKLV9VSV9CVVRUT05fREVMRVRFX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZSZW1vdmUKLV9VSV9QUkVGX0NBQ0hFX0VOVFJJRVNfVElUTEUgICAgICAgICAgICAgICAgICAgICA9ICZDYWNoZSBlbnRyaWVzOgotX1VJX1BSRUZfQ0FDSEVfQ0FDSEVfT1BUSU9OICAgICAgICAgICAgICAgICAgICAgID0gJkRpc2FibGUgY2FjaGluZwotX1VJX1BSRUZfQ0FDSEVfQUJPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTWFuYWdlIHRoZSBjYWNoZSBvZiByZW1vdGUgcmVzb3VyY2VzLCBzdWNoIGFzIHRob3NlIGRvd25sb2FkZWQgZnJvbSB0aGUgaW50ZXJuZXQuCi1fVUlfUFJFRl9QUk9NUFRfRk9SX0RJU0FHUkVFRF9MSUNFTlNFUyAgICAgICAgICAgPSAmUHJvbXB0IG1lIGZvciBhZ3JlZW1lbnQgZm9yIGxpY2Vuc2VzIGZvciB3aG9zZSB0ZXJtcyBJIGhhdmUgYWxyZWFkeSBkaXNhZ3JlZWQKLQotIyBDYWNoZSBtb25pdG9yIHN0cmluZ3MuCi1fVUlfQ0FDSEVfTU9OSVRPUl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDYWNoaW5nIFJlbW90ZSBSZXNvdXJjZXMKLV9VSV9DQUNIRV9NT05JVE9SX0NBQ0hJTkcgICAgICAgICAgICAgICAgICAgICAgICA9IENhY2hpbmcgezB9Ci0KLSMgQ2FjaGUgbGljZW5zZSBkaWFsb2cKLV9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQxICAgICAgICAgICAgICA9IEEgcmVxdWVzdCBoYXMgYmVlbiBtYWRlIHRvIGNhY2hlIHRoZSByZXNvdXJjZToKLV9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyICAgICAgICAgICAgICA9IEluIG9yZGVyIHRvIGNhY2hlIHRoZSByZXNvdXJjZSB5b3UgbXVzdCBhZ3JlZSB0byB0aGUgbGljZW5zZSBiZWxvdzoKLV9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0lOVEVSTkFMICA9IEluIG9yZGVyIHRvIGNhY2hlIHRoZSByZXNvdXJjZSB5b3UgbXVzdCBhZ3JlZSB0byB0aGUgbGljZW5zZSB3aGljaCBoYXMgYmVlbiBvcGVuZWQgaW4geW91ciBicm93c2VyLgotX1VJX0NBQ0hFX0RJQUxPR19MSUNFTlNFX1NUQVRFTUVOVDJfTk9fQlJPV1NFUiAgID0gVGhlIGxpY2Vuc2UgY2Fubm90IGJlIGRpc3BsYXllZCBpbiB0aGlzIGRpYWxvZy4gSW4gb3JkZXIgdG8gY2FjaGUgdGhlIHJlc291cmNlIHlvdSBtdXN0IGFncmVlIHRvIHRoZSBsaWNlbnNlIGxvY2F0ZWQgYXQgezB9LgotX1VJX0NBQ0hFX0RJQUxPR19BR1JFRV9CVVRUT04gICAgICAgICAgICAgICAgICAgID0gSSBBZ3JlZQotX1VJX0NBQ0hFX0RJQUxPR19ESVNBR1JFRV9CVVRUT04gICAgICAgICAgICAgICAgID0gSSBEaXNhZ3JlZQotX1VJX0NBQ0hFX0RJQUxPR19USVRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTGljZW5zZSBBZ3JlZW1lbnQKLV9VSV9MT0FESU5HX0xJQ0VOU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IExvYWRpbmcgbGljZW5zZQotCi0jIENhY2hlIGxvZ2dpbmcgbWVzc2FnZXMKLV9MT0dfSU5GT19XVFBfTk9fVVNFUl9JTlRFUkFDVElPTiAgICAgICAgICAgICAgICA9IHswfSBpcyBzZXQuIExpY2Vuc2VzIGRpYWxvZ3Mgd2lsbCBub3QgYmUgZGlzcGxheWVkLgotCi0jIFdUUCB0ZXN0IG5vIHVzZXIgaW50ZXJhY3Rpb24gc3lzdGVtIHByb3BlcnR5Ci0jIFRoaXMgcHJvcGVydHkgaXMgY2hlY2tlZCBieSB0aGUgY2FjaGUuIFRoaXMgc3RpbmcgaXMgbm90IHNob3duIHRvIHRoZSB1c2VyLgotV1RQX05PX1VTRVJfSU5URVJBQ1RJT05fU1lTVEVNX1BST1AgICAgICAgICAgICAgID0gd3RwLmF1dG90ZXN0Lm5vbmludGVyYWN0aXZlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1MThmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci0KLS8qKgotICogQSBjYWNoZSBVUkkgcmVzb2x2ZXIuIFRoaXMgcmVzb2x2ZXIgd2lsbCBjYWNoZSByZW1vdGUgcmVzb3VyY2VzIGFuZCByZXR1cm4KLSAqIHRoZSBsb2NhbCBjb3B5IGlmIHRoZXkgY2FuIGJlIGNhY2hlZC4gSWYgYSByZXNvdXJjZSBjYW5ub3QgYmUgY2FjaGVkIHRoZQotICogcmVzb3VyY2UgcmV0dXJucyBudWxsLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbiBpbXBsZW1lbnRzIFVSSVJlc29sdmVyRXh0ZW5zaW9uIAotewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbiNyZXNvbHZlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLQl7IAotICAgICAgaWYoQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzQ2FjaGVFbmFibGVkKCkpCi0gICAgICB7Ci0JCSAgU3RyaW5nIHJlc291cmNlID0gbnVsbDsKLQkJICBpZihzeXN0ZW1JZCAhPSBudWxsKQotCQkgIHsKLQkJICAgIHJlc291cmNlID0gVVJJSGVscGVyLm5vcm1hbGl6ZShzeXN0ZW1JZCwgYmFzZUxvY2F0aW9uLCBudWxsKTsKLQkJICB9IAotCQkgIAotCQkgIGlmKHJlc291cmNlICE9IG51bGwgJiYgKHJlc291cmNlLnN0YXJ0c1dpdGgoImh0dHA6IikgfHwgcmVzb3VyY2Uuc3RhcnRzV2l0aCgiZnRwOiIpKSkKLQkJICB7Ci0JCSAgICAvLyBIYW5kbGUgcmVzb3VyY2VzIHByZXNwZWNpZmllZCB0byBjYWNoZS4KLQkJICAgIFRvQ2FjaGVSZXNvdXJjZSB0b0NhY2hlUmVzb3VyY2UgPSBUb0NhY2hlUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZVRvQ2FjaGUocmVzb3VyY2UpOwotCQkgICAgaWYodG9DYWNoZVJlc291cmNlID09IG51bGwgfHwgTGljZW5zZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuaGFzTGljZW5zZUJlZW5BY2NlcHRlZChyZXNvdXJjZSwgdG9DYWNoZVJlc291cmNlLmdldExpY2Vuc2UoKSkpCi0JCSAgICB7IAkKLQkJICAgICAgcmV0dXJuIENhY2hlLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQkgICAgfQotCQkgIH0KLSAgICAgIH0KLQkgIHJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliYzNjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIGRpYWxvZyB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gYWNjZXB0IGEgbGljZW5zZSBhZ3JlZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZyBleHRlbmRzIEljb25BbmRNZXNzYWdlRGlhbG9nIAotewotICAvKioKLSAgICogSG9sZHMgYWxsIHRoZSBkaWFsb2dzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQga2V5ZWQgYnkgdGhlIGxpY2Vuc2UgVVJMLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGRpYWxvZ3NJblVzZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgCi0gIC8qKgotICAgKiBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHVybDsKLQotICAvKioKLSAgICogVGhlIFVSTCBvZiB0aGUgbGljZW5zZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGxpY2Vuc2VVUkw7Ci0gIAotICAvKioKLSAgICogVGhlIGFncmVlIGJ1dHRvbiBmb3IgdGhlIGRpYWxvZy4KLSAgICovCi0gIHByaXZhdGUgQnV0dG9uIGFncmVlQnV0dG9uID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGlzIGRpYWxvZy4KLSAgICogQHBhcmFtIHVybCBUaGUgbGljZW5zZSBVUkwuCi0gICAqLwotICBwcm90ZWN0ZWQgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZVVSTCkgCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotCXRoaXMudXJsID0gdXJsOwotCXRoaXMubGljZW5zZVVSTCA9IGxpY2Vuc2VVUkw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgc2hlbGwuc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfVElUTEUpOwotICAgIHNoZWxsLnNldEltYWdlKG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSAKLSAgewotCUNvbXBvc2l0ZSBidXR0b25CYXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDA7Ci0JbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JYnV0dG9uQmFyLnNldExheW91dChsYXlvdXQpOwotCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQlidXR0b25CYXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBhZ3JlZSBidXR0b24uCi0JYWdyZWVCdXR0b24gPSBjcmVhdGVCdXR0b24oYnV0dG9uQmFyLCBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5PSywgCi0JCQlDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfQUdSRUVfQlVUVE9OLCBmYWxzZSk7Ci0JYWdyZWVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCi0JLy8gQ3JlYXRlIHRoZSBkaXNhZ3JlZSBidXR0b24uCi0JY3JlYXRlQnV0dG9uKGJ1dHRvbkJhciwgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuQ0FOQ0VMLCAKLQkJCUNhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX0RJQUxPR19ESVNBR1JFRV9CVVRUT04sIGZhbHNlKTsKLQkKLQlyZXR1cm4gYnV0dG9uQmFyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAKLSAgewotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwpOwotCWdkLndpZHRoSGludCA9IDUwMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkvLyBEaXNwbGF5IGEgc3RhdGVtZW50IGFib3V0IHRoZSBsaWNlbnNlLgotCUxhYmVsIGxpY2Vuc2VUZXh0MSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsaWNlbnNlVGV4dDEuc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQxKTsKLQlMYWJlbCB1cmxUZXh0ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSk7Ci0JdXJsVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQl1cmxUZXh0LnNldFRleHQodXJsKTsKLQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7IC8vIFNwYWNpbmcgbGFiZWwuCi0JTGFiZWwgbGljZW5zZVRleHQyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSk7Ci0JbGljZW5zZVRleHQyLnNldExheW91dERhdGEoZ2QpOwotCQotCS8vIERpc3BsYXkgdGhlIGxpY2Vuc2UgaW4gYSBicm93c2VyLgotCXRyeQotCXsKLQkgIGZpbmFsIENvbXBvc2l0ZSBsaWNlbnNlVGV4dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JICBmaW5hbCBTdGFja0xheW91dCBzdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotCSAgbGljZW5zZVRleHRDb21wb3NpdGUuc2V0TGF5b3V0KHN0YWNrTGF5b3V0KTsKLQkgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JICBnZC5oZWlnaHRIaW50ID0gNDAwOwotCSAgbGljZW5zZVRleHRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICAvLyBDcmVhdGUgdGhlIGxvYWRpbmcgcHJvZ3Jlc3MgbW9uaXRvciBjb21wb3NpdGUgYW5kIHBhcnQuCi0JICBDb21wb3NpdGUgbW9uaXRvckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobGljZW5zZVRleHRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkgIG1vbml0b3JDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCSAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkgIGdkLmhlaWdodEhpbnQgPSA0MDA7Ci0JICBtb25pdG9yQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCSAgZmluYWwgUHJvZ3Jlc3NNb25pdG9yUGFydCBtb25pdG9yID0gbmV3IFByb2dyZXNzTW9uaXRvclBhcnQobW9uaXRvckNvbXBvc2l0ZSwgbmV3IEdyaWRMYXlvdXQoKSk7Ci0JICBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSk7Ci0JICBtb25pdG9yLnNldExheW91dERhdGEoZ2QpOwotCSAgbW9uaXRvci5iZWdpblRhc2soQ2FjaGVNZXNzYWdlcy5fVUlfTE9BRElOR19MSUNFTlNFLCAxMDApOwotCSAgc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1vbml0b3JDb21wb3NpdGU7Ci0JICAvLyBDcmVhdGUgdGhlIGJyb3dzZXIuCi0JICBmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihsaWNlbnNlVGV4dENvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JICBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCSAgLy9nZC5oZWlnaHRIaW50ID0gNDAwOwotCSAgCi0JICAvLyBJdCdzIGltcG9ydGFudCB0aGF0IHRoZSBsaWNlbnNlIFVSTCBpcyBzZXQgZXZlbiBpZiB3ZSByZWFkIAotCSAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSBsaWNlbnNlIGZpbGUgb3Vyc2VsdmVzIChzZWUgYmVsb3cpIGFzCi0JICAvLyBvdGhlcndpc2UgdGhlIHByb2dyZXNzIG1vbml0b3Igd2lsbCBub3QgYmUgY2FsbGVkIG9uIGNlcnRhaW4KLQkgIC8vIGxpbnV4IHN5c3RlbXMgd2l0aCBjZXJ0YWluIGJyb3dzZXJzLgotCSAgYnJvd3Nlci5zZXRVcmwobGljZW5zZVVSTCk7Ci0JICAKLQkgIC8vIFRoZSBicm93c2VyIHdpZGdldCBoYXMgcHJvYmxlbXMgbG9hZGluZyBmaWxlcyBzdG9yZWQgaW4gamFycwotCSAgLy8gc28gd2UgcmVhZCBmcm9tIHRoZSBqYXIgYW5kIHNldCB0aGUgYnJvd3NlciB0ZXh0IG91cnNlbHZlcy4KLQkgIC8vIFNlZSBidWcgMTU0NzIxLgotCSAgaWYobGljZW5zZVVSTC5zdGFydHNXaXRoKCJqYXI6IikpCi0JICB7Ci0JCSAgSW5wdXRTdHJlYW0gbGljZW5zZVN0cmVhbSA9IG51bGw7Ci0JCSAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyZWFkZXIgPSBudWxsOwotCQkgIEJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBudWxsOwotCQkgIHRyeQotCQkgIHsKLQkJICBVUkwgYnJvd3NlclVSTCA9IG5ldyBVUkwobGljZW5zZVVSTCk7Ci0JCSAgbGljZW5zZVN0cmVhbSA9IGJyb3dzZXJVUkwub3BlblN0cmVhbSgpOwotCQkgIGlzcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGxpY2Vuc2VTdHJlYW0pOwotCQkgIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyZWFkZXIpOwotCQkgIFN0cmluZyBzdHI7Ci0JCSAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkgIHdoaWxlKChzdHIgPSBicmVhZGVyLnJlYWRMaW5lKCkpIT1udWxsKXsKLQkJICAgICAgc2IuYXBwZW5kKHN0cik7Ci0JCSAgfQotCQkgIGJyb3dzZXIuc2V0VGV4dChzYi50b1N0cmluZygpKTsKLQkJICB9Ci0JCSAgZmluYWxseQotCQkgIHsKLQkJCSAgaWYobGljZW5zZVN0cmVhbSAhPSBudWxsKQotCQkJICB7Ci0JCQkJICBsaWNlbnNlU3RyZWFtLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgaWYoaXNyZWFkZXIgIT0gbnVsbCkKLQkJCSAgewotCQkJCSAgaXNyZWFkZXIuY2xvc2UoKTsKLQkJCSAgfQotCQkJICBpZihicmVhZGVyICE9IG51bGwpCi0JCQkgIHsKLQkJCQkgIGJyZWFkZXIuY2xvc2UoKTsKLQkJCSAgfQotCQkgIH0KLQkgIH0KLQkgIAotCSAgYnJvd3Nlci5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIGJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpewotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyI2NoYW5nZWQob3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgCi0JCXsKLQkJICBpZiAoZXZlbnQudG90YWwgIT0gMCkKLQkJICB7Ci0JCSAgICBtb25pdG9yLmludGVybmFsV29ya2VkKGV2ZW50LmN1cnJlbnQgKiAxMDAgLyBldmVudC50b3RhbCk7Ci0JCSAgfQotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIjY29tcGxldGVkKG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgCi0JCXsKLQkJICBtb25pdG9yLmRvbmUoKTsKLQkJCQotCQkgIHN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBicm93c2VyOwotCQkgIGFncmVlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCSAgbGljZW5zZVRleHRDb21wb3NpdGUubGF5b3V0KCk7Ci0JCX0KLQkgIH0pOwotCSAgCi0JICBsaWNlbnNlVGV4dDIuc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgLy8gVGhlIGJyb3dzZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4gCi0JICAvLyBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBjcmVhdGUgYW4gZXh0ZXJuYWwgYnJvd3Nlci4KLQkgIHRyeQotCSAgewotCSAgICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKS5nZXRFeHRlcm5hbEJyb3dzZXIoKS5vcGVuVVJMKG5ldyBVUkwobGljZW5zZVVSTCkpOwotCSAgICBsaWNlbnNlVGV4dDIuc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0lOVEVSTkFMKTsKLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiBleCkKLQkgIHsKLQkJLy8gSW4gdGhpcyBjYXNlIHRoZSBsaWNlbnNlIGNhbm5vdCBiZSBkaXNwbGF5LiBJbmZvcm0gdGhlIHVzZXIgb2YgdGhpcyBhbmQgZ2l2ZSB0aGVtIHRoZSBsaWNlbnNlIGxvY2F0aW9uLgotCQlsaWNlbnNlVGV4dDIuc2V0VGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdChDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0JST1dTRVIsIG5ldyBPYmplY3RbXXtsaWNlbnNlVVJMfSkpOwotCSAgfQotCX0KLQotCWNyZWF0ZUJ1dHRvbkJhcihjb21wb3NpdGUpOwotCQkKLQlyZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZyNnZXRJbWFnZSgpCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSAKLSAgewotCXJldHVybiBnZXRJbmZvSW1hZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9tcHQgdGhlIHVzZXIgdG8gYWNjZXB0IHRoZSBzcGVjaWZpZWQgbGljZW5zZS4gVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUKLSAgICogZGlhbG9nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhpcyBkaWFsb2cuCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIHRoZSBsaWNlbnNlIG11c3QgYmUgYWNjZXB0ZWQuCi0gICAqIEBwYXJhbSBsaWNlbnNlVVJMIFRoZSBsaWNlbnNlIFVSTC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsaWNlbnNlIGlzIGFjY2VwdGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0Rm9yTGljZW5zZShTaGVsbCBwYXJlbnQsIFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlVVJMKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWJvb2xlYW4gYWdyZWVkVG9MaWNlbnNlID0gZmFsc2U7Ci0JYm9vbGVhbiBuZXdEaWFsb2cgPSB0cnVlOwotCUxpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0JLy8gSWYgdGhlIGRpYWxvZyBpcyBhbHJlYWR5IGRpc3BsYXllZCBmb3IgdGhpcyBsaWNlbnNlIHVzZSBpdCBpbnN0ZWFkIG9mIAotCS8vIGRpc3BsYXlpbmcgYW5vdGhlciBkaWFsb2cuCi0JaWYoZGlhbG9nc0luVXNlLmNvbnRhaW5zS2V5KGxpY2Vuc2VVUkwpKQotCXsKLQkgIG5ld0RpYWxvZyA9IGZhbHNlOwotCSAgZGlhbG9nID0gKExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nKWRpYWxvZ3NJblVzZS5nZXQobGljZW5zZVVSTCk7Ci0JfQotCWVsc2UKLQl7Ci0JICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0KLQkgIHRyeQotCSAgewotCSAgICBVUkwgdXJsT2JqID0gbmV3IFVSTChsaWNlbnNlVVJMKTsKLQkgICAgaXMgPSB1cmxPYmoub3BlblN0cmVhbSgpOwotCi0JICAgIGRpYWxvZyA9IG5ldyBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZyhwYXJlbnQsIHVybCwgbGljZW5zZVVSTCk7Ci0JICAgIGRpYWxvZ3NJblVzZS5wdXQobGljZW5zZVVSTCwgZGlhbG9nKTsKLQkgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCSAgfQotCSAgY2F0Y2goRXhjZXB0aW9uIGUpCi0JICB7Ci0JCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIGxpY2Vuc2UgY2Fubm90IGJlIG9wZW5lZC4iKTsKLQkgIH0KLQkgIGZpbmFsbHkKLQkgIHsKLQkJaWYoaXMgIT0gbnVsbCkKLQkJewotCQkgIHRyeQotCQkgIHsKLQkJCWlzLmNsb3NlKCk7Ci0JCSAgfQotCQkgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0JCSAgewotCQkgICAgLy8gRG8gbm90aGluZy4KLQkJICB9Ci0JCX0KLQkgIH0KLQl9Ci0JaWYoZGlhbG9nICE9IG51bGwpCi0JewotCSAgZGlhbG9nLm9wZW4oKTsKLQkgIAotCSAgaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuT0spIAotCSAgewotCQlhZ3JlZWRUb0xpY2Vuc2UgPSB0cnVlOwotICAgICAgfQotCQkKLQkgIGlmKG5ld0RpYWxvZykKLQkgIHsKLSAgICAgICBkaWFsb2dzSW5Vc2UucmVtb3ZlKGxpY2Vuc2VVUkwpOwotCSAgfQotCX0KLQkgCi0JcmV0dXJuIGFncmVlZFRvTGljZW5zZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjbG9zZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIAotICB7Ci0JaWYoYWdyZWVCdXR0b24gIT0gbnVsbCkKLQl7Ci0JICBhZ3JlZUJ1dHRvbi5kaXNwb3NlKCk7Ci0JICBhZ3JlZUJ1dHRvbiA9IG51bGw7Ci0JfQotCXJldHVybiBzdXBlci5jbG9zZSgpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZmIyNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVGhlIGxpY2Vuc2UgcmVnaXN0cnkgaG9sZHMgYWxsIG9mIHRoZSByZWdpc3RlcmVkIGxpY2Vuc2VzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGV5Ci0gKiBoYXZlIGJlZW4gYWNjZXB0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlUmVnaXN0cnkgCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX1VOU1BFQ0lGSUVEID0gbmV3IEludGVnZXIoMCk7IC8vIFRoaXMgbmVlZHMgdG8gYmUgMCBmb3IgdGhlIHBsdWdpbiBwcmVmcy4KLSAgcHJvdGVjdGVkIHN0YXRpYyBJbnRlZ2VyIExJQ0VOU0VfQUdSRUUgPSBuZXcgSW50ZWdlcigxKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBJbnRlZ2VyIExJQ0VOU0VfRElTQUdSRUUgPSBuZXcgSW50ZWdlcigyKTsKLSAgLy8gU2lnbmlmaWVzIGEgbGljZW5zZSB0aGF0IGhhcyBiZWVuIGRpc2FncmVlZCB0byB0aGlzIHNlc3Npb24uCi0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0RJU0FHUkVFX1RISVNfU0VTU0lPTiA9IG5ldyBJbnRlZ2VyKDMpOwotICAKLSAgLyoqCi0gICAqIFRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBsaWNlbnNlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBMaWNlbnNlUmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIElmIHNldCB0byB0cnVlLCB0aGUgZG8gbm90IHByb21wdCBmbGFnIHdpbGwgcHJldmVudCB1c2VyIHByb21wdGluZy4gVXNlZCBmb3IgYXV0b21hdGVkIHRlc3RpbmcuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gRE9fTk9UX1BST01QVCA9IGZhbHNlOwotICAKLSAgLyoqCi0gICAqIFRoZSBsaWNlbnNlcyBoYXNodGFibGUgY29udGFpbnMgbGljZW5zZXMgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkndmUgYmVlbiBhY2NlcHRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBIYXNodGFibGUgbGljZW5zZXM7Ci0gIAotICBwcm90ZWN0ZWQgTGljZW5zZVJlZ2lzdHJ5KCkKLSAgewotCWxpY2Vuc2VzID0gbmV3IEhhc2h0YWJsZSgpOwotCQotCS8vIElmIHRoZSB3dHAgcXVpZXQgc3lzdGVtIHByb3BlcnR5IGlzIHNldCB0aGUgRE9fTk9UX1BST01QVCBmbGFnIGlzIHNldCB0byB0cnVlLgotCS8vIFRoaXMgaXMgdXNlZCBmb3IgYXV0b21hdGVkIHRlc3RpbmcuCi0JaWYoU3lzdGVtLmdldFByb3BlcnR5KENhY2hlTWVzc2FnZXMuV1RQX05PX1VTRVJfSU5URVJBQ1RJT05fU1lTVEVNX1BST1AsICJmYWxzZSIpLmVxdWFscygidHJ1ZSIpKQotCXsKLQkgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIENhY2hlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ2FjaGVNZXNzYWdlcy5fTE9HX0lORk9fV1RQX05PX1VTRVJfSU5URVJBQ1RJT04sIG5ldyBPYmplY3RbXXtDYWNoZU1lc3NhZ2VzLldUUF9OT19VU0VSX0lOVEVSQUNUSU9OX1NZU1RFTV9QUk9QfSksIG51bGwpKTsKLQkgIERPX05PVF9QUk9NUFQgPSB0cnVlOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBsaWNlbnNlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBsaWNlbnNlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMaWNlbnNlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0JaWYoaW5zdGFuY2UgPT0gbnVsbCkKLQl7Ci0JICBpbnN0YW5jZSA9IG5ldyBMaWNlbnNlUmVnaXN0cnkoKTsKLQl9Ci0JcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIHRoZSBzcGVjaWZpZWQgbGljZW5zZSB0byB0aGUgbGljZW5zZSByZWdpc3RyeS4gQSBsaWNlbnNlIGNhbiBvbmx5IGJlIGFkZGVkIHRvIHRoZQotICAgKiByZWdpc3RyeSBvbmNlLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRvIGFkZCB0byB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRMaWNlbnNlKFN0cmluZyB1cmwpCi0gIHsKLQlpZih1cmwgIT0gbnVsbCAmJiAhbGljZW5zZXMuY29udGFpbnNLZXkodXJsKSkKLQl7Ci0JICBsaWNlbnNlcy5wdXQodXJsLCBMSUNFTlNFX1VOU1BFQ0lGSUVEKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZ3JlZSB0byB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UuIFRoZSBsaWNlbnNlIGlzIGFncmVlZCB0byBvbmx5IGlmIGl0IGhhcyBhbHJlYWR5Ci0gICAqIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBhY2NlcHQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZ3JlZUxpY2Vuc2UoU3RyaW5nIHVybCkKLSAgewotCWlmKGxpY2Vuc2VzLmNvbnRhaW5zS2V5KHVybCkpCi0JewotCSAgbGljZW5zZXMucHV0KHVybCwgTElDRU5TRV9BR1JFRSk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogRGlzYWdyZWUgdG8gdGhlIHNwZWNpZmllZCBsaWNlbnNlLiBUaGUgbGljZW5zZSBpcyBkaXNhZ3JlZWQgdG8gb25seSBpZiBpdCBoYXMgYWxyZWFkeQotICAgKiBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYWNjZXB0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGlzYWdyZWVMaWNlbnNlKFN0cmluZyB1cmwpCi0gIHsKLQlpZihsaWNlbnNlcy5jb250YWluc0tleSh1cmwpKQotCXsKLQkgIGxpY2Vuc2VzLnB1dCh1cmwsIExJQ0VOU0VfRElTQUdSRUUpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIERpc2FncmVlIHRvIHRoZSBzcGVjaWZpZWQgbGljZW5zZSBmb3IgdGhpcyBzZXNzaW9uLiBUaGUgbGljZW5zZSBpcyBkaXNhZ3JlZWQgdG8gb25seSBpZiBpdCBoYXMgYWxyZWFkeQotICAgKiBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVnaXN0cnkuIAotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRvIGFjY2VwdC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBkaXNhZ3JlZUxpY2Vuc2VUaGlzU2Vzc2lvbihTdHJpbmcgdXJsKQotICB7Ci0JaWYobGljZW5zZXMuY29udGFpbnNLZXkodXJsKSkKLQl7Ci0JICBsaWNlbnNlcy5wdXQodXJsLCBMSUNFTlNFX0RJU0FHUkVFX1RISVNfU0VTU0lPTik7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBsaWNlbnNlIGhhcyBiZWVuIGFjY2VwdGVkLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBsaWNlbnNlCi0gICAqIGhhcyBiZWVuIGFjY2VwdGVkIG9yIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5IGFuZCBmYWxzZSBpZiBpdCBoYXMgbm90IGJlZW4gYWNjZXB0ZWQuIAotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggd2UgYXJlIGNoZWNraW5nIHRoZSBsaWNlbnNlLgotICAgKiBAcGFyYW0gbGljZW5zZVVSTCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0IGhhcyBiZWVuIGFjY2VwdGVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxpY2Vuc2UgaGFzIGJlZW4gYWNjZXB0ZWQgb3IgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVnaXN0cnksIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0xpY2Vuc2VCZWVuQWNjZXB0ZWQoU3RyaW5nIHVybCwgU3RyaW5nIGxpY2Vuc2VVUkwpCi0gIHsKLQlpZihET19OT1RfUFJPTVBUKQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLQkKLQlpZihsaWNlbnNlcy5jb250YWluc0tleShsaWNlbnNlVVJMKSkKLQl7Ci0JICBJbnRlZ2VyIGFncmVlZCA9IChJbnRlZ2VyKWxpY2Vuc2VzLmdldChsaWNlbnNlVVJMKTsKLQkgIGlmKGFncmVlZCA9PSBMSUNFTlNFX0FHUkVFKQotCSAgewotCQlyZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgIGVsc2UgaWYoYWdyZWVkID09IExJQ0VOU0VfRElTQUdSRUUpCi0JICB7Ci0JCWlmKCFDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuc2hvdWxkUHJvbXB0KCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlsaWNlbnNlcy5wdXQobGljZW5zZVVSTCwgTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04pOwotCSAgfQotCSAgLy8gVGhlIGxpY2Vuc2UgaGFzIGFscmVhZHkgYmVlbiBkaXNhZ3JlZWQgdG8gdGhpcyBzZXNzaW9uLiBEbyBub3QgcHJvbXB0LgotCSAgZWxzZSBpZihhZ3JlZWQgPT0gTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04pCi0JICB7Ci0JCXJldHVybiBmYWxzZTsKLQkgIH0KLQkJICAKLQkgIAotCSAgLy8gUHJvbXB0IHRoZSB1c2VyIHRvIGFjY2VwdCB0aGUgbGljZW5zZS4KLQkgIGludCBsaWNlbnNlQWNjZXB0YW5jZSA9IHByb21wdFRvQWNjZXB0TGljZW5zZSh1cmwsIGxpY2Vuc2VVUkwpOwotCSAgaWYobGljZW5zZUFjY2VwdGFuY2UgPT0gQWNjZXB0ZWQuQUNDRVBURUQpCi0JICB7Ci0JCWFncmVlTGljZW5zZShsaWNlbnNlVVJMKTsKLQkJcmV0dXJuIHRydWU7Ci0JICB9Ci0JICBlbHNlIGlmKGxpY2Vuc2VBY2NlcHRhbmNlID09IEFjY2VwdGVkLk5PVF9BQ0NFUFRFRCkKLQkgIHsKLQkgICAgZGlzYWdyZWVMaWNlbnNlVGhpc1Nlc3Npb24obGljZW5zZVVSTCk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy8gVGhlIGxpY2Vuc2UgaXMgbm90IHJlZ2lzdHJlZCB3aXRoIHRoZSByZWdpc3RyeS4KLQlyZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFByb21wdCB0aGUgdXNlciB0byBhY2NlcHQgdGhlIGxpY2Vuc2UuIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIHRoZSBsaWNlbnNlIG5lZWRzIHRvIGJlIGFjY2VwdGVkLgotICAgKiBAcGFyYW0gbGljZW5zZVVSTCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRvIGJlIGFjY2VwdGVkLiAKLSAgICogQHJldHVybiAwIGlmIGFjY2VwdGVkLCAxIGlmIG5vdCBhY2NlcHRlZCwgMiBpZiBub3QgYWJsZSB0byBhY2NlcHQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IHByb21wdFRvQWNjZXB0TGljZW5zZShmaW5hbCBTdHJpbmcgdXJsLCBmaW5hbCBTdHJpbmcgbGljZW5zZVVSTCkgCi0gIHsKLQlmaW5hbCBBY2NlcHRlZCBhY2NlcHRlZCA9IG5ldyBBY2NlcHRlZCgpOwotCSAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeQotCQkJCXsKLQkJCQkgIGlmKExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLnByb21wdEZvckxpY2Vuc2UobnVsbCwgdXJsLCBsaWNlbnNlVVJMKSkKLQkJCQkgIHsKLQkJCQkJYWNjZXB0ZWQuYWNjZXB0ZWQgPSBBY2NlcHRlZC5BQ0NFUFRFRDsKLQkJCQkgIH0KLQkJCQkgIGVsc2UKLQkJCQkgIHsKLQkJCQkJYWNjZXB0ZWQuYWNjZXB0ZWQgPSBBY2NlcHRlZC5OT1RfQUNDRVBURUQ7Ci0JCQkJICB9Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkgIGFjY2VwdGVkLmFjY2VwdGVkID0gQWNjZXB0ZWQuTk9UX0RFVEVSTUlORUQ7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQlyZXR1cm4gYWNjZXB0ZWQuYWNjZXB0ZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGxpY2Vuc2VzIGluIHRoZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gQXMgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGxpY2Vuc2VzIGluIHRoZSByZWdpc3RyeS4gCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TGljZW5zZXMoKQotICB7Ci0JcmV0dXJuIChTdHJpbmdbXSlsaWNlbnNlcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbbGljZW5zZXMua2V5U2V0KCkuc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBsaWNlbnNlLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlLgotICAgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB0aGUgbGljZW5zZS4KLSAgICovCi0gIHByb3RlY3RlZCBJbnRlZ2VyIGdldExpY2Vuc2VTdGF0ZShTdHJpbmcgdXJsKQotICB7Ci0JcmV0dXJuIChJbnRlZ2VyKWxpY2Vuc2VzLmdldCh1cmwpOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEEgY2xhc3MgdG8gaG9sZCBhY2NlcHRhbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvbXB0IG1ldGhvZC4KLSAgICovCi0gIHByaXZhdGUgY2xhc3MgQWNjZXB0ZWQKLSAgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VQVEVEID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfQUNDRVBURUQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9ERVRFUk1JTkVEID0gMjsKLQlwdWJsaWMgaW50IGFjY2VwdGVkID0gTk9UX0FDQ0VQVEVEOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE2NWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGUgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVycyByZWFkcyBFY2xpcHNlIGV4dGVuc2lvbnMgd2hpY2ggc3BlY2lmeQotICogcmVzb3VyY2VzIHRvIGNhY2hlLiBBbiBleHRlbnNpb24gcG9pbnQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLgotICogCi0gKiAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmNhY2hlcmVzb3VyY2UiPgotICogICAgPGNhY2hlcmVzb3VyY2UgdXJpPSJVUklfVE9fQ0FDSEUiIGxpY2Vuc2U9IlVSSV9PRl9MSUNFTlNFIi8+Ci0gKiAgPC9leHRlbnNpb24+IAotICoKLSAqLwotcHVibGljIGNsYXNzIFRvQ2FjaGVSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNhY2hlcmVzb3VyY2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVVJMID0gInVybCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9MSUNFTlNFID0gImxpY2Vuc2UiOwotIAotICBwcml2YXRlIHN0YXRpYyBUb0NhY2hlUmVnaXN0cnlSZWFkZXIgcmVnaXN0cnlSZWFkZXIgPSBudWxsOwotICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgcmVzb3VyY2VzVG9DYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeSByZWFkZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeSByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRvQ2FjaGVSZWdpc3RyeVJlYWRlciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZihyZWdpc3RyeVJlYWRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IFRvQ2FjaGVSZWdpc3RyeVJlYWRlcigpOwotICAgIH0KLSAgICByZXR1cm4gcmVnaXN0cnlSZWFkZXI7Ci0gIH0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIGhhbmRsZSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyB0aGF0IG1hdGNoCi0gICAqIHRoZSBzcGVkaWZpZWQgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFRvQ2FjaGVSZXNvdXJjZSB0b0NhY2hlUmVzb3VyY2UgPSByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICAgIGlmKHRvQ2FjaGVSZXNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb3VyY2VzVG9DYWNoZS5wdXQodG9DYWNoZVJlc291cmNlLmdldFVSTCgpLCB0b0NhY2hlUmVzb3VyY2UpOwotICAgICAgICAgIExpY2Vuc2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmFkZExpY2Vuc2UodG9DYWNoZVJlc291cmNlLmdldExpY2Vuc2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYW5kIGRlYWwgd2l0aCB0aGUgZXh0ZW5zaW9uIHBvaW50cy4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBleHRlbnNpb24gcG9pbnQgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBUb0NhY2hlUmVzb3VyY2UgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLQkKLSAgICBpZihlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRVhURU5TSU9OX1BPSU5UX0lEKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1VSTCk7Ci0gICAgICBpZih1cmwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAJU3RyaW5nIGxpY2Vuc2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTElDRU5TRSk7Ci0gICAgCQotICAgIAkvLyBJZiB0aGUgbGljZW5zZSBpcyByZWxhdGl2ZSByZXNvbHZlIHJlbGF0aXZlIHRvIHRoZQotICAgIAkvLyBwbHVnLWluIHRoYXQgZGVjbGFyZXMgaXQuCi0gICAgCXRyeQotICAgIAl7Ci0gICAgCSAgVVJJIGxpY2Vuc2VVUkkgPSBuZXcgVVJJKGxpY2Vuc2UpOwotICAgIAkgIGlmKCFsaWNlbnNlVVJJLmlzQWJzb2x1dGUoKSkKLSAgICAJICB7Ci0gICAgCQlCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotICAgIAkJVVJMIGxpY2Vuc2VVUkwgPSBwbHVnaW5CdW5kbGUuZ2V0RW50cnkobGljZW5zZSk7Ci0gICAgCQlpZihsaWNlbnNlVVJMICE9IG51bGwpCi0gICAgCQl7Ci0gICAgCSAgICAgIGxpY2Vuc2UgPSBGaWxlTG9jYXRvci5yZXNvbHZlKGxpY2Vuc2VVUkwpLnRvRXh0ZXJuYWxGb3JtKCk7ICAKLSAgICAJCX0KLSAgICAJICB9Ci0gICAgCX0KLSAgICAJY2F0Y2goVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgCXsKLSAgICAJICAvLyBVc2UgdGhlIGxpY2Vuc2UgYXMgc3BlY2lmaWVkLgotICAgIAl9Ci0gICAgCWNhdGNoKElPRXhjZXB0aW9uIGUpCi0gICAgCXsKLSAgICAJICAvLyBVc2UgdGhlIGxpY2Vuc2UgYXMgc3BlY2lmaWVkLgotICAgIAl9Ci0gICAgCXJldHVybiBuZXcgVG9DYWNoZVJlc291cmNlKHVybCwgbGljZW5zZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIFVSSXMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGZvciBjYWNoaW5nLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBVUklzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBmb3IgY2FjaGluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRVUklzVG9DYWNoZSgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKXJlc291cmNlc1RvQ2FjaGUua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW3Jlc291cmNlc1RvQ2FjaGUuc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHJlc291cmNlIHRvIGNhY2hlIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGNhY2hlLgotICAgKiBAcmV0dXJuIEEgVG9DYWNoZVJlc291cmNlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFVSTCBvciBudWxsIGlmIG5vbmUgaGFzIGJlZW4gc3BlY2lmaWVkLgotICAgKi8KLSAgcHVibGljIFRvQ2FjaGVSZXNvdXJjZSBnZXRSZXNvdXJjZVRvQ2FjaGUoU3RyaW5nIHVybCkKLSAgewotCXJldHVybiAoVG9DYWNoZVJlc291cmNlKXJlc291cmNlc1RvQ2FjaGUuZ2V0KHVybCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjY3NzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvVG9DYWNoZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBIHJlc291cmNlIHRoYXQgaXMgc3BlY2lmaWVkIHRvIGJlIGNhY2hlZC4gVGhlIHJlc291cmNlIGhhcyBhIFVSTCBhbmQgYW4gb3B0aW9uYWwKLSAqIGxpY2Vuc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb0NhY2hlUmVzb3VyY2UgCi17Ci0gIHByaXZhdGUgU3RyaW5nIHVybDsKLSAgcHJpdmF0ZSBTdHJpbmcgbGljZW5zZTsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY2FjaGVkLgotICAgKiBAcGFyYW0gbGljZW5zZSBUaGUgVVJMIG9mIHRoZSBvcHRpb25hbCBsaWNlbnNlIGZvciB0aGlzIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIFRvQ2FjaGVSZXNvdXJjZShTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZSkKLSAgewotCXRoaXMudXJsID0gdXJsOwotCXRoaXMubGljZW5zZSA9IGxpY2Vuc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY2FjaGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpCi0gIHsKLQlyZXR1cm4gdXJsOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaWNlbnNlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY2FjaGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGljZW5zZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZSgpCi0gIHsKLQlyZXR1cm4gbGljZW5zZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DYWNoZVByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NhY2hlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjOTY2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NhY2hlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBpcyBjb250cmlidXRlZCB0byB0aGUKLSAqIFByZWZlcmVuY2VzIGRpYWxvZy4gVGhpcyBwYWdlIGNvbnRhaW5zIG9wdGlvbnMgZm9yIHRoZSBjYWNoZS4gVGhlIGNhY2hlIGNhbgotICogYmUgZGlzYWJsZWQsIHRoZSBsaXN0IG9mIGVudHJpZXMgaW4gdGhlIGNhY2hlIGNhbiBiZSB2aWV3ZWQsIGFuZCBpbmRpdmlkdWFsCi0gKiBlbnRyaWVzIG9yIHRoZSBlbnRpcmUgY2FjaGUgY2FuIGJlIGRlbGV0ZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENhY2hlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0gICAgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0gIHByb3RlY3RlZCBCdXR0b24gY2xlYXJCdXR0b247Ci0KLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0KLSAgcHJvdGVjdGVkIEJ1dHRvbiBlbmFibGVkQnV0dG9uOwotICAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbjsKLQotICBwcm90ZWN0ZWQgTGlzdCBlbnRyaWVzOwotCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlID0gbnVsbDsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwpCi0gICAgewotICAgICAgY29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIENhY2hlUHJlZmVyZW5jZVBhZ2UoKQotICB7Ci0gICAgc2V0UHJlZmVyZW5jZVN0b3JlKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQotICAgIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyg0KTsKLSAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAKLSAgICBMYWJlbCBhYm91dExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIGFib3V0TGFiZWwuc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9QUkVGX0NBQ0hFX0FCT1VUKTsKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGFib3V0TGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5vbmUpOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIENyZWF0ZWQgdGhlIGRpc2FibGUgY2FjaGUgb3B0aW9uLgotICAgICAgZW5hYmxlZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICBlbmFibGVkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgZW5hYmxlZEJ1dHRvbi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX1BSRUZfQ0FDSEVfQ0FDSEVfT1BUSU9OKTsKLSAgICAgIGVuYWJsZWRCdXR0b24uc2V0U2VsZWN0aW9uKCFDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgICAgICAgICAuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpKTsKLSAgICAgIGVuYWJsZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBkaXNhYmxlZCA9IGVuYWJsZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENhY2hlRW5hYmxlZCghZGlzYWJsZWQpOwotICAgICAgICB9Ci0KLSAgICAgIH0pOwotICAgICAgCi0gICAgICBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfUFJFRl9QUk9NUFRfRk9SX0RJU0FHUkVFRF9MSUNFTlNFUyk7Ci0gICAgICBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0gICAgICAgICAgLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTKSk7Ci0gICAgICBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgICAgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHByb21wdCA9IGRpc2FncmVlZExpY2Vuc2VzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRQcm9tcHREaXNhZ3JlZWRMaWNlbnNlcyhwcm9tcHQpOwotICAgICAgICB9Ci0KLSAgICAgIH0pOwotCi0gICAgICAvLyBDcmVhdGUgdGhlIGVudGl0aWVzIGdyb3VwLgotICAgICAgTGFiZWwgZW50cmllc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgICAgZW50cmllc0xhYmVsLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfUFJFRl9DQUNIRV9FTlRSSUVTX1RJVExFKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgIGVudHJpZXNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgZW50cmllcyA9IG5ldyBMaXN0KGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVudHJpZXMsCi0gICAgICAgICAgQ29udGV4dElkcy5QUkVGX0VOVFJJRVMpOwotICAgICAgU3RyaW5nW10gY2FjaGVFbnRyaWVzID0gQ2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRDYWNoZWRVUklzKCk7Ci0gICAgICBBcnJheXMuc29ydChjYWNoZUVudHJpZXMpOwotICAgICAgZW50cmllcy5zZXRJdGVtcyhjYWNoZUVudHJpZXMpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLSAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgICAgZW50cmllcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGVudHJpZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIHNldFByZWZlcmVuY2VXaWRnZXRzKCk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OVUxMKTsKLSAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICBncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLSAgICAgIGdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotICAgICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IFNXVC5UT1ApOwotICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgLy8gQ3JlYXRlIHRoZSBEZWxldGUgYnV0dG9uCi0gICAgICBkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgZGVsZXRlQnV0dG9uLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQlVUVE9OX0RFTEVURV9FTlRSWSk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nCi0gICAgICAgICAgICAgIC5vcGVuQ29uZmlybSgKLSAgICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksCi0gICAgICAgICAgICAgICAgICBDYWNoZU1lc3NhZ2VzLl9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfVElUTEUsCi0gICAgICAgICAgICAgICAgICBDYWNoZU1lc3NhZ2VzLl9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfTUVTU0FHRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0ZWRFbnRyaWVzID0gZW50cmllcy5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGludCBudW1TZWxlY3RlZEVudHJpZXMgPSBzZWxlY3RlZEVudHJpZXMubGVuZ3RoOwotCi0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IENhY2hlLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlbGVjdGVkRW50cmllczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYWNoZS5kZWxldGVFbnRyeShzZWxlY3RlZEVudHJpZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nW10gY2FjaGVFbnRyaWVzID0gY2FjaGUuZ2V0Q2FjaGVkVVJJcygpOwotICAgICAgICAgICAgQXJyYXlzLnNvcnQoY2FjaGVFbnRyaWVzKTsKLSAgICAgICAgICAgIGVudHJpZXMuc2V0SXRlbXMoY2FjaGVFbnRyaWVzKTsKLSAgICAgICAgICAgIHNldFByZWZlcmVuY2VXaWRnZXRzKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgLy8gQ3JlYXRlIHRoZSBDbGVhciBDYWNoZSBidXR0b24KLSAgICAgIGNsZWFyQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgIGNsZWFyQnV0dG9uLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQlVUVE9OX0NMRUFSX0NBQ0hFKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGNsZWFyQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgY2xlYXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksCi0gICAgICAgICAgICAgIENhY2hlTWVzc2FnZXMuX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX1RJVExFLAotICAgICAgICAgICAgICBDYWNoZU1lc3NhZ2VzLl9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19NRVNTQUdFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDYWNoZSBjYWNoZSA9IENhY2hlLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBjYWNoZS5jbGVhcigpOwotICAgICAgICAgICAgU3RyaW5nW10gY2FjaGVFbnRyaWVzID0gY2FjaGUuZ2V0Q2FjaGVkVVJJcygpOwotICAgICAgICAgICAgQXJyYXlzLnNvcnQoY2FjaGVFbnRyaWVzKTsKLSAgICAgICAgICAgIGVudHJpZXMuc2V0SXRlbXMoY2FjaGVFbnRyaWVzKTsKLSAgICAgICAgICAgIHNldFByZWZlcmVuY2VXaWRnZXRzKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgICAgLy9UT0RPOiBMb2cgZXJyb3IKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgc2V0UHJlZmVyZW5jZVdpZGdldHMoKTsKLSAgICBhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBwcmVmZXJlbmNlIHBhZ2Ugd2lkZ2V0cy4gVGhlcmUgYXJlIGEgZmV3IHJ1bGVzLiAxLiBJZiBkaXNhYmxlZCwgYWxsCi0gICAqIG9mIHRoZSB3aWRnZXRzIGFyZSBkaWFibGVkIGV4Y2VwdCBmb3IgdGhlIGRpc2FibGVkIGNoZWNrIGJveC4gMi4gSWYKLSAgICogZW5hYmxlZCwgYWxsIHdpZGdldHMgYXJlIGVuYWJsZWQgZXhjZXB0IGEuIFRoZSBkZWxldGUgYnV0dG9uIGlzIGVuYWJsZWQKLSAgICogb25seSBpZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB0aGUgbGlzdC4gYi4gVGhlIGNsZWFyIGJ1dHRvbiBpcyBlbmFibGVkCi0gICAqIG9ubHkgaWYgdGhlcmUgYXJlIGl0ZW1zIGluIHRoZSBsaXN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVdpZGdldHMoKQotICB7Ci0gICAgaWYgKGNvbXBvc2l0ZSAhPSBudWxsICYmIGNvbXBvc2l0ZS5nZXRFbmFibGVkKCkpCi0gICAgewotICAgICAgaWYgKGVudHJpZXMuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgaWYgKGVudHJpZXMuZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgICAgewotICAgICAgICBjbGVhckJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2xlYXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBDb250ZXh0SWRzLlBSRUYpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTljYWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVQbHVnaW47Ci0KLS8qKgotICogQ29uc3RhbnQgaWRzIGZvciBjb250ZXh0IGhlbHAuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRiA9IENhY2hlUGx1Z2luLlBMVUdJTl9JRCArICIuY3ByMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTlRSSUVTID0gQ2FjaGVQbHVnaW4uUExVR0lOX0lEICsgIi5jcHIwMDAyIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFjNGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNvbnN0YW50cyAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfRU5BQkxFRCA9ICJjYWNoZUVuYWJsZWQiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUyA9ICJwcm9tcHREaXNhZ3JlZWRMaWNlbnNlcyI7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNGFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVQbHVnaW47Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciAKLXsKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIAotICB7Ci0JSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCwgdHJ1ZSk7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMsIGZhbHNlKTsKLSAgfQotfQo=